26#include "modules/common_msgs/sensor_msgs/gnss.pb.h"
27#include "modules/common_msgs/sensor_msgs/gnss_best_pose.pb.h"
28#include "modules/common_msgs/sensor_msgs/gnss_raw_observation.pb.h"
29#include "modules/common_msgs/sensor_msgs/heading.pb.h"
30#include "modules/common_msgs/sensor_msgs/imu.pb.h"
31#include "modules/common_msgs/sensor_msgs/ins.pb.h"
43#define Coder_Accel_Scale 12.0
44#define Coder_Rate_Scale 300.0
45#define Coder_MAG_Scale 1.0
46#define Coder_IFof_Rate_Scale 600.0
47#define Coder_Angle_Scale 360.0
48#define Coder_Temp_Scale 200.0
49#define Coder_Sensor_Scale 32768.0
50#define Coder_IFof_Sensor_Scale 2147483648.0
51#define Coder_EXP_E 2.718282.0
52#define Coder_Vel_Scale 100.0
53#define Coder_Pos_Scale 10000000000.0
65 bool PrepareMessage();
72 size_t header_length_ = 0;
73 size_t total_length_ = 0;
74 std::vector<uint8_t> buffer_;
94 if (
data_ ==
nullptr) {
98 if (buffer_.empty()) {
100 buffer_.push_back(*
data_);
103 }
else if (buffer_.size() == 1) {
105 buffer_.push_back(*
data_++);
109 }
else if (buffer_.size() == 2) {
111 buffer_.push_back(*
data_++);
116 }
else if (header_length_ > 0) {
117 if (buffer_.size() < header_length_) {
118 buffer_.push_back(*
data_++);
120 total_length_ = header_length_ +
126 }
else if (total_length_ > 0) {
127 if (buffer_.size() < total_length_) {
128 buffer_.push_back(*
data_++);
131 if (!PrepareMessage()) {
153 while (angle > 180.0) {
156 while (angle <= -180.0) {
161bool EnbroadParse::check_sum() {
164 size_t len = buffer_.size() - 3;
167 checksum += *
reinterpret_cast<int8_t*
>(buffer_.data() + i);
170 checksum = ~checksum;
171 checksum = checksum | 0x30;
172 compare = *
reinterpret_cast<char*
>(buffer_.data() + buffer_.size() - 3);
173 if (checksum == compare) {
180bool EnbroadParse::PrepareMessage() {
182 AWARN <<
"check sum failed. bad frame ratio";
185 uint8_t* message =
nullptr;
187 uint16_t message_length;
188 auto header =
reinterpret_cast<const enbroad::FrameHeader*
>(buffer_.data());
189 message = buffer_.data() +
sizeof(enbroad::FrameHeader);
190 message_id = header->message_id;
191 message_length = header->message_length;
192 switch (message_id) {
194 if (message_length !=
sizeof(enbroad::NAV_DATA_TypeDef)) {
195 AWARN <<
"Incorrect message_length";
199 reinterpret_cast<enbroad::NAV_DATA_TypeDef*
>(message))) {
200 AWARN <<
"HandleNavData fail";
205 if (message_length !=
sizeof(enbroad::NAV_SINS_TypeDef)) {
206 AWARN <<
"Incorrect message_length";
210 reinterpret_cast<enbroad::NAV_SINS_TypeDef*
>(message))) {
211 AWARN <<
"HandleSINSData fail";
216 if (message_length !=
sizeof(enbroad::NAV_IMU_TypeDef)) {
217 AWARN <<
"Incorrect message_length";
221 reinterpret_cast<enbroad::NAV_IMU_TypeDef*
>(message))) {
222 AWARN <<
"HandleIMUData fail";
227 if (message_length !=
sizeof(enbroad::NAV_GNSS_TypeDef)) {
228 AWARN <<
"Incorrect message_length";
232 reinterpret_cast<enbroad::NAV_GNSS_TypeDef*
>(message))) {
242bool EnbroadParse::HandleSINSData(
const enbroad::NAV_SINS_TypeDef* pSinsData) {
245 ins_.set_measurement_time(seconds);
247 ins_.mutable_euler_angles()->set_x(pSinsData->roll *
DEG_TO_RAD);
248 ins_.mutable_euler_angles()->set_y(pSinsData->pitch *
DEG_TO_RAD);
250 ins_.mutable_euler_angles()->set_z(
252 ins_.mutable_position()->set_lon(pSinsData->longitude);
253 ins_.mutable_position()->set_lat(pSinsData->latitude);
254 ins_.mutable_position()->set_height(pSinsData->altitude);
255 ins_.mutable_linear_velocity()->set_x(pSinsData->ve);
256 ins_.mutable_linear_velocity()->set_y(pSinsData->vn);
257 ins_.mutable_linear_velocity()->set_z(pSinsData->vu);
266 bestpos_.set_measurement_time(seconds);
267 bestpos_.set_longitude(pSinsData->longitude);
268 bestpos_.set_latitude(pSinsData->latitude);
269 bestpos_.set_height_msl(pSinsData->altitude);
272 bestpos_.set_datum_id(
275 bestpos_.set_latitude_std_dev(pSinsData->xigema_lat);
276 bestpos_.set_longitude_std_dev(pSinsData->xigema_lon);
277 bestpos_.set_height_std_dev(pSinsData->xigema_alt);
279 ins_stat_.mutable_header()->set_timestamp_sec(
cyber::Time::Now().ToSecond());
303bool EnbroadParse::HandleIMUData(
const enbroad::NAV_IMU_TypeDef* pImuData) {
304 float imu_measurement_span = 1.0f / 100.0f;
308 imu_.set_measurement_time(seconds);
309 imu_.set_measurement_span(imu_measurement_span);
310 imu_.mutable_linear_acceleration()->set_x(pImuData->accX);
311 imu_.mutable_linear_acceleration()->set_y(pImuData->accY);
312 imu_.mutable_linear_acceleration()->set_z(pImuData->accZ);
313 imu_.mutable_angular_velocity()->set_x(pImuData->gyroX *
DEG_TO_RAD);
314 imu_.mutable_angular_velocity()->set_y(pImuData->gyroY *
DEG_TO_RAD);
315 imu_.mutable_angular_velocity()->set_z(pImuData->gyroZ *
DEG_TO_RAD);
318bool EnbroadParse::HandleGNSSData(
const enbroad::NAV_GNSS_TypeDef* pGnssData) {
322 bestpos_.set_solution_age(pGnssData->age);
323 bestpos_.set_num_sats_tracked(pGnssData->satsNum);
324 bestpos_.set_num_sats_in_solution(pGnssData->satsNum);
325 bestpos_.set_num_sats_in_solution(pGnssData->satsNum);
326 bestpos_.set_num_sats_multi(pGnssData->satsNum);
330 heading_.set_measurement_time(seconds);
331 heading_.set_heading(pGnssData->heading);
332 heading_.set_baseline_length(pGnssData->baseline);
333 heading_.set_reserved(0);
337 heading_.set_satellite_tracked_number(pGnssData->satsNum);
338 heading_.set_satellite_soulution_number(pGnssData->satsNum);
339 heading_.set_satellite_number_obs(pGnssData->satsNum);
340 heading_.set_satellite_number_multi(pGnssData->satsNum);
357bool EnbroadParse::HandleNavData(
const enbroad::NAV_DATA_TypeDef* pNavData) {
358 static uint16_t rtkStatus;
359 static uint16_t Nav_Standard_flag;
360 static uint16_t Sate_Num;
361 static float baseline;
362 float imu_measurement_span = 1.0f / 100.0f;
365 ins_.set_measurement_time(seconds);
367 ins_.mutable_euler_angles()->set_x(
static_cast<double>(
369 ins_.mutable_euler_angles()->set_y(
static_cast<double>(
374 ins_.mutable_position()->set_lon(
376 ins_.mutable_position()->set_lat(
378 ins_.mutable_position()->set_height(
379 static_cast<double>(pNavData->alt / 1000.0));
380 ins_.mutable_linear_acceleration()->set_x(
static_cast<double>(
382 ins_.mutable_linear_acceleration()->set_y(
static_cast<double>(
384 ins_.mutable_linear_acceleration()->set_z(
static_cast<double>(
386 ins_.mutable_angular_velocity()->set_x(
390 ins_.mutable_angular_velocity()->set_y(
394 ins_.mutable_angular_velocity()->set_z(
398 ins_.mutable_linear_velocity()->set_x(
400 ins_.mutable_linear_velocity()->set_y(
402 ins_.mutable_linear_velocity()->set_z(
405 switch (pNavData->poll_type) {
409 rtkStatus = pNavData->poll_frame1;
414 Nav_Standard_flag = pNavData->poll_frame1;
417 Sate_Num = pNavData->poll_frame1;
418 baseline = pNavData->poll_frame2 / 1000.0;
423 imu_.set_measurement_time(seconds);
424 imu_.set_measurement_span(imu_measurement_span);
425 imu_.mutable_linear_acceleration()->set_x(
static_cast<double>(
427 imu_.mutable_linear_acceleration()->set_y(
static_cast<double>(
429 imu_.mutable_linear_acceleration()->set_z(
static_cast<double>(
431 imu_.mutable_angular_velocity()->set_x(
435 imu_.mutable_angular_velocity()->set_y(
439 imu_.mutable_angular_velocity()->set_z(
443 bestpos_.set_measurement_time(seconds);
444 bestpos_.set_longitude(
static_cast<double>(pNavData->lon /
Coder_Pos_Scale));
445 bestpos_.set_latitude(
static_cast<double>(pNavData->lat /
Coder_Pos_Scale));
446 bestpos_.set_height_msl(
static_cast<double>(pNavData->alt / 1000.0));
447 bestpos_.set_undulation(0.0);
448 bestpos_.set_datum_id(
450 bestpos_.set_latitude_std_dev(0.0);
451 bestpos_.set_longitude_std_dev(0.0);
452 bestpos_.set_height_std_dev(0.0);
453 bestpos_.set_base_station_id(
"0");
454 bestpos_.set_solution_age(0.0);
455 bestpos_.set_num_sats_tracked(Sate_Num);
456 bestpos_.set_num_sats_in_solution(Sate_Num);
457 bestpos_.set_num_sats_in_solution(Sate_Num);
458 bestpos_.set_num_sats_multi(Sate_Num);
460 bestpos_.set_galileo_beidou_used_mask(0);
461 bestpos_.set_gps_glonass_used_mask(0);
462 heading_.set_measurement_time(seconds);
469 heading_.set_baseline_length(baseline);
470 heading_.set_reserved(0);
471 heading_.set_heading_std_dev(0.0);
472 heading_.set_pitch_std_dev(0.0);
473 heading_.set_station_id(
"0");
474 heading_.set_satellite_tracked_number(Sate_Num);
475 heading_.set_satellite_soulution_number(Sate_Num);
476 heading_.set_satellite_number_obs(Sate_Num);
477 heading_.set_satellite_number_multi(Sate_Num);
478 heading_.set_solution_source(0);
479 heading_.set_extended_solution_status(0);
480 heading_.set_galileo_beidou_sig_mask(0);
481 heading_.set_gps_glonass_sig_mask(0);
482 ins_stat_.mutable_header()->set_timestamp_sec(
cyber::Time::Now().ToSecond());
static Time Now()
get the current time.
virtual void GetMessages(MessageInfoVec *messages)
static Parser * CreateEnbroad(const config::Config &config)
const uint8_t * data_end_
#define Coder_Sensor_Scale
#define Coder_Accel_Scale
#define Coder_Angle_Scale
@ E_NAV_STANDARD_PROCCSSED
@ E_NAV_STANDARD_PROCCSSING
@ E_NAV_STATUS_SYSTEM_STANDARD
::google::protobuf::Message * MessagePtr
constexpr size_t BUFFER_SIZE
double normalizeAngleTo180(double angle)
constexpr double DEG_TO_RAD
constexpr int SECONDS_PER_WEEK
constexpr double azimuth_deg_to_yaw_rad(double azimuth)
std::vector< MessageInfo > MessageInfoVec