23 MessageWrapper::MessageWrapper():
24 first_valid_utc_(false)
57 uint32_t device_timestamp_diff;
61 device_timestamp_diff = device_timestamp -
last_sbg_utc_.time_stamp;
63 nanoseconds = utc_to_epoch.
toNSec() +
static_cast<uint64_t
>(device_timestamp_diff) * 1000;
82 for (uint16_t yearIndex = 1970; yearIndex < ref_sbg_utc_msg.year; yearIndex++)
87 for (uint8_t monthIndex = 1; monthIndex < ref_sbg_utc_msg.month; monthIndex++)
92 days += ref_sbg_utc_msg.day - 1;
94 nanoseconds = days * 24;
95 nanoseconds = (nanoseconds + ref_sbg_utc_msg.hour) * 60;
96 nanoseconds = (nanoseconds + ref_sbg_utc_msg.min) * 60;
97 nanoseconds = nanoseconds + ref_sbg_utc_msg.sec;
98 nanoseconds = nanoseconds * 1000000000 + ref_sbg_utc_msg.nanosec;
107 sbg_driver::SbgEkfStatus ekf_status_message;
130 return ekf_status_message;
135 sbg_driver::SbgGpsPosStatus gps_pos_status_message;
147 return gps_pos_status_message;
152 sbg_driver::SbgGpsVelStatus gps_vel_status_message;
157 return gps_vel_status_message;
162 sbg_driver::SbgImuStatus imu_status_message;
177 return imu_status_message;
182 sbg_driver::SbgMagStatus mag_status_message;
196 return mag_status_message;
201 sbg_driver::SbgShipMotionStatus ship_motion_status_message;
208 return ship_motion_status_message;
213 sbg_driver::SbgStatusAiding status_aiding_message;
224 return status_aiding_message;
229 sbg_driver::SbgStatusCom status_com_message;
252 return status_com_message;
257 sbg_driver::SbgStatusGeneral status_general_message;
265 return status_general_message;
270 sbg_driver::SbgUtcTimeStatus utc_status_message;
278 return utc_status_message;
283 sbg_driver::SbgAirDataStatus air_data_status_message;
292 return air_data_status_message;
345 sbg_driver::SbgEkfEuler ekf_euler_message;
348 ekf_euler_message.time_stamp = ref_log_ekf_euler.
timeStamp;
353 ekf_euler_message.angle.x = ref_log_ekf_euler.
euler[0];
354 ekf_euler_message.angle.y = -ref_log_ekf_euler.
euler[1];
359 ekf_euler_message.angle.x = ref_log_ekf_euler.
euler[0];
360 ekf_euler_message.angle.y = ref_log_ekf_euler.
euler[1];
361 ekf_euler_message.angle.z = ref_log_ekf_euler.
euler[2];
364 ekf_euler_message.accuracy.x = ref_log_ekf_euler.
eulerStdDev[0];
365 ekf_euler_message.accuracy.y = ref_log_ekf_euler.
eulerStdDev[1];
366 ekf_euler_message.accuracy.z = ref_log_ekf_euler.
eulerStdDev[2];
368 return ekf_euler_message;
373 sbg_driver::SbgEkfNav ekf_nav_message;
376 ekf_nav_message.time_stamp = ref_log_ekf_nav.
timeStamp;
378 ekf_nav_message.undulation = ref_log_ekf_nav.
undulation;
380 ekf_nav_message.latitude = ref_log_ekf_nav.
position[0];
381 ekf_nav_message.longitude = ref_log_ekf_nav.
position[1];
382 ekf_nav_message.altitude = ref_log_ekf_nav.
position[2];
386 ekf_nav_message.velocity.x = ref_log_ekf_nav.
velocity[1];
387 ekf_nav_message.velocity.y = ref_log_ekf_nav.
velocity[0];
388 ekf_nav_message.velocity.z = -ref_log_ekf_nav.
velocity[2];
390 ekf_nav_message.velocity_accuracy.x = ref_log_ekf_nav.
velocityStdDev[1];
391 ekf_nav_message.velocity_accuracy.y = ref_log_ekf_nav.
velocityStdDev[0];
392 ekf_nav_message.velocity_accuracy.z = ref_log_ekf_nav.
velocityStdDev[2];
394 ekf_nav_message.position_accuracy.x = ref_log_ekf_nav.
positionStdDev[1];
395 ekf_nav_message.position_accuracy.y = ref_log_ekf_nav.
positionStdDev[0];
396 ekf_nav_message.position_accuracy.z = ref_log_ekf_nav.
positionStdDev[2];
400 ekf_nav_message.velocity.x = ref_log_ekf_nav.
velocity[0];
401 ekf_nav_message.velocity.y = ref_log_ekf_nav.
velocity[1];
402 ekf_nav_message.velocity.z = ref_log_ekf_nav.
velocity[2];
404 ekf_nav_message.velocity_accuracy.x = ref_log_ekf_nav.
velocityStdDev[0];
405 ekf_nav_message.velocity_accuracy.y = ref_log_ekf_nav.
velocityStdDev[1];
406 ekf_nav_message.velocity_accuracy.z = ref_log_ekf_nav.
velocityStdDev[2];
408 ekf_nav_message.position_accuracy.x = ref_log_ekf_nav.
positionStdDev[0];
409 ekf_nav_message.position_accuracy.y = ref_log_ekf_nav.
positionStdDev[1];
410 ekf_nav_message.position_accuracy.z = ref_log_ekf_nav.
positionStdDev[2];
413 return ekf_nav_message;
418 sbg_driver::SbgEkfQuat ekf_quat_message;
421 ekf_quat_message.time_stamp = ref_log_ekf_quat.
timeStamp;
424 ekf_quat_message.accuracy.x = ref_log_ekf_quat.
eulerStdDev[0];
425 ekf_quat_message.accuracy.y = ref_log_ekf_quat.
eulerStdDev[1];
426 ekf_quat_message.accuracy.z = ref_log_ekf_quat.
eulerStdDev[2];
430 static const tf2::Quaternion q_enu_to_nwu{0, 0, M_SQRT2 / 2, M_SQRT2 / 2};
436 ekf_quat_message.quaternion =
tf2::toMsg(q_enu_to_nwu * q_nwu);
445 ekf_quat_message.quaternion =
tf2::toMsg(q_ned);
448 return ekf_quat_message;
453 sbg_driver::SbgEvent event_message;
456 event_message.time_stamp = ref_log_event.
timeStamp;
464 event_message.time_offset_0 = ref_log_event.
timeOffset0;
465 event_message.time_offset_1 = ref_log_event.
timeOffset1;
466 event_message.time_offset_2 = ref_log_event.
timeOffset2;
467 event_message.time_offset_3 = ref_log_event.
timeOffset3;
469 return event_message;
474 sbg_driver::SbgGpsHdt gps_hdt_message;
477 gps_hdt_message.time_stamp = ref_log_gps_hdt.
timeStamp;
478 gps_hdt_message.status = ref_log_gps_hdt.
status;
479 gps_hdt_message.tow = ref_log_gps_hdt.
timeOfWeek;
482 gps_hdt_message.baseline = ref_log_gps_hdt.
baseline;
487 gps_hdt_message.pitch = -ref_log_gps_hdt.
pitch;
491 gps_hdt_message.true_heading = ref_log_gps_hdt.
heading;
492 gps_hdt_message.pitch = ref_log_gps_hdt.
pitch;
495 return gps_hdt_message;
500 sbg_driver::SbgGpsPos gps_pos_message;
503 gps_pos_message.time_stamp = ref_log_gps_pos.
timeStamp;
506 gps_pos_message.gps_tow = ref_log_gps_pos.
timeOfWeek;
507 gps_pos_message.undulation = ref_log_gps_pos.
undulation;
508 gps_pos_message.num_sv_used = ref_log_gps_pos.
numSvUsed;
509 gps_pos_message.base_station_id = ref_log_gps_pos.
baseStationId;
512 gps_pos_message.latitude = ref_log_gps_pos.
latitude;
513 gps_pos_message.longitude = ref_log_gps_pos.
longitude;
514 gps_pos_message.altitude = ref_log_gps_pos.
altitude;
529 return gps_pos_message;
534 sbg_driver::SbgGpsRaw gps_raw_message;
538 return gps_raw_message;
543 sbg_driver::SbgGpsVel gps_vel_message;
546 gps_vel_message.time_stamp = ref_log_gps_vel.
timeStamp;
548 gps_vel_message.gps_tow = ref_log_gps_vel.
timeOfWeek;
549 gps_vel_message.course_acc = ref_log_gps_vel.
courseAcc;
553 gps_vel_message.velocity.x = ref_log_gps_vel.
velocity[1];
554 gps_vel_message.velocity.y = ref_log_gps_vel.
velocity[0];
555 gps_vel_message.velocity.z = -ref_log_gps_vel.
velocity[2];
557 gps_vel_message.velocity_accuracy.x = ref_log_gps_vel.
velocityAcc[1];
558 gps_vel_message.velocity_accuracy.y = ref_log_gps_vel.
velocityAcc[0];
559 gps_vel_message.velocity_accuracy.z = ref_log_gps_vel.
velocityAcc[2];
565 gps_vel_message.velocity.x = ref_log_gps_vel.
velocity[0];
566 gps_vel_message.velocity.y = ref_log_gps_vel.
velocity[1];
567 gps_vel_message.velocity.z = ref_log_gps_vel.
velocity[2];
569 gps_vel_message.velocity_accuracy.x = ref_log_gps_vel.
velocityAcc[0];
570 gps_vel_message.velocity_accuracy.y = ref_log_gps_vel.
velocityAcc[1];
571 gps_vel_message.velocity_accuracy.z = ref_log_gps_vel.
velocityAcc[2];
573 gps_vel_message.course = ref_log_gps_vel.
course;
576 return gps_vel_message;
581 sbg_driver::SbgImuData imu_data_message;
584 imu_data_message.time_stamp = ref_log_imu_data.
timeStamp;
586 imu_data_message.temp = ref_log_imu_data.
temperature;
594 imu_data_message.gyro.x = ref_log_imu_data.
gyroscopes[0];
595 imu_data_message.gyro.y = -ref_log_imu_data.
gyroscopes[1];
596 imu_data_message.gyro.z = -ref_log_imu_data.
gyroscopes[2];
598 imu_data_message.delta_vel.x = ref_log_imu_data.
deltaVelocity[0];
599 imu_data_message.delta_vel.y = -ref_log_imu_data.
deltaVelocity[1];
600 imu_data_message.delta_vel.z = -ref_log_imu_data.
deltaVelocity[2];
602 imu_data_message.delta_angle.x = ref_log_imu_data.
deltaAngle[0];
603 imu_data_message.delta_angle.y = -ref_log_imu_data.
deltaAngle[1];
604 imu_data_message.delta_angle.z = -ref_log_imu_data.
deltaAngle[2];
612 imu_data_message.gyro.x = ref_log_imu_data.
gyroscopes[0];
613 imu_data_message.gyro.y = ref_log_imu_data.
gyroscopes[1];
614 imu_data_message.gyro.z = ref_log_imu_data.
gyroscopes[2];
616 imu_data_message.delta_vel.x = ref_log_imu_data.
deltaVelocity[0];
617 imu_data_message.delta_vel.y = ref_log_imu_data.
deltaVelocity[1];
618 imu_data_message.delta_vel.z = ref_log_imu_data.
deltaVelocity[2];
620 imu_data_message.delta_angle.x = ref_log_imu_data.
deltaAngle[0];
621 imu_data_message.delta_angle.y = ref_log_imu_data.
deltaAngle[1];
622 imu_data_message.delta_angle.z = ref_log_imu_data.
deltaAngle[2];
625 return imu_data_message;
630 sbg_driver::SbgMag mag_message;
633 mag_message.time_stamp = ref_log_mag.
timeStamp;
662 sbg_driver::SbgMagCalib mag_calib_message;
667 return mag_calib_message;
672 sbg_driver::SbgOdoVel odo_vel_message;
675 odo_vel_message.time_stamp = ref_log_odo.
timeStamp;
677 odo_vel_message.status = ref_log_odo.
status;
678 odo_vel_message.vel = ref_log_odo.
velocity;
680 return odo_vel_message;
685 sbg_driver::SbgShipMotion ship_motion_message;
688 ship_motion_message.time_stamp = ref_log_ship_motion.
timeStamp;
691 ship_motion_message.ship_motion.x = ref_log_ship_motion.
shipMotion[0];
692 ship_motion_message.ship_motion.y = ref_log_ship_motion.
shipMotion[1];
693 ship_motion_message.ship_motion.z = ref_log_ship_motion.
shipMotion[2];
695 ship_motion_message.acceleration.x = ref_log_ship_motion.
shipAccel[0];
696 ship_motion_message.acceleration.y = ref_log_ship_motion.
shipAccel[1];
697 ship_motion_message.acceleration.z = ref_log_ship_motion.
shipAccel[2];
699 ship_motion_message.velocity.x = ref_log_ship_motion.
shipVel[0];
700 ship_motion_message.velocity.y = ref_log_ship_motion.
shipVel[1];
701 ship_motion_message.velocity.z = ref_log_ship_motion.
shipVel[2];
703 return ship_motion_message;
708 sbg_driver::SbgStatus status_message;
711 status_message.time_stamp = ref_log_status.
timeStamp;
717 return status_message;
722 sbg_driver::SbgUtcTime utc_time_message;
725 utc_time_message.time_stamp = ref_log_utc.
timeStamp;
728 utc_time_message.year = ref_log_utc.
year;
729 utc_time_message.month = ref_log_utc.
month;
730 utc_time_message.day = ref_log_utc.
day;
731 utc_time_message.hour = ref_log_utc.
hour;
732 utc_time_message.min = ref_log_utc.
minute;
733 utc_time_message.sec = ref_log_utc.
second;
734 utc_time_message.nanosec = ref_log_utc.
nanoSecond;
739 if (utc_time_message.clock_status.clock_stable && utc_time_message.clock_status.clock_utc_sync)
744 ROS_INFO(
"A full valid UTC log has been detected, timestamp will be synchronized with the UTC data.");
754 return utc_time_message;
759 sbg_driver::SbgAirData air_data_message;
762 air_data_message.time_stamp = ref_air_data_log.
timeStamp;
764 air_data_message.pressure_abs = ref_air_data_log.
pressureAbs;
765 air_data_message.altitude = ref_air_data_log.
altitude;
766 air_data_message.pressure_diff = ref_air_data_log.
pressureDiff;
767 air_data_message.true_air_speed = ref_air_data_log.
trueAirspeed;
768 air_data_message.air_temperature = ref_air_data_log.
airTemperature;
770 return air_data_message;
775 sbg_driver::SbgImuShort imu_short_message;
778 imu_short_message.time_stamp = ref_short_imu_log.
timeStamp;
780 imu_short_message.temperature = ref_short_imu_log.
temperature;
784 imu_short_message.delta_velocity.x = ref_short_imu_log.
deltaVelocity[0];
785 imu_short_message.delta_velocity.y = -ref_short_imu_log.
deltaVelocity[1];
786 imu_short_message.delta_velocity.z = -ref_short_imu_log.
deltaVelocity[2];
788 imu_short_message.delta_angle.x = ref_short_imu_log.
deltaAngle[0];
789 imu_short_message.delta_angle.y = -ref_short_imu_log.
deltaAngle[1];
790 imu_short_message.delta_angle.z = -ref_short_imu_log.
deltaAngle[2];
794 imu_short_message.delta_velocity.x = ref_short_imu_log.
deltaVelocity[0];
795 imu_short_message.delta_velocity.y = ref_short_imu_log.
deltaVelocity[1];
796 imu_short_message.delta_velocity.z = ref_short_imu_log.
deltaVelocity[2];
798 imu_short_message.delta_angle.x = ref_short_imu_log.
deltaAngle[0];
799 imu_short_message.delta_angle.y = ref_short_imu_log.
deltaAngle[1];
800 imu_short_message.delta_angle.z = ref_short_imu_log.
deltaAngle[2];
803 return imu_short_message;
808 sensor_msgs::Imu imu_ros_message;
812 imu_ros_message.orientation = ref_sbg_quat_msg.quaternion;
813 imu_ros_message.angular_velocity = ref_sbg_imu_msg.delta_angle;
814 imu_ros_message.linear_acceleration = ref_sbg_imu_msg.delta_vel;
816 imu_ros_message.orientation_covariance[0] = pow(ref_sbg_quat_msg.accuracy.x, 2);
817 imu_ros_message.orientation_covariance[4] = pow(ref_sbg_quat_msg.accuracy.y, 2);
818 imu_ros_message.orientation_covariance[8] = pow(ref_sbg_quat_msg.accuracy.z, 2);
823 for (
size_t i = 0; i < 9; i++)
825 imu_ros_message.angular_velocity_covariance[i] = 0.0;
826 imu_ros_message.linear_acceleration_covariance[i] = 0.0;
829 return imu_ros_message;
832 void MessageWrapper::fillTransform(
const std::string &ref_parent_frame_id,
const std::string &ref_child_frame_id,
const geometry_msgs::Pose &ref_pose, geometry_msgs::TransformStamped &refTransformStamped)
835 refTransformStamped.header.frame_id = ref_parent_frame_id;
836 refTransformStamped.child_frame_id = ref_child_frame_id;
838 refTransformStamped.transform.translation.x = ref_pose.position.x;
839 refTransformStamped.transform.translation.y = ref_pose.position.y;
840 refTransformStamped.transform.translation.z = ref_pose.position.z;
841 refTransformStamped.transform.rotation.x = ref_pose.orientation.x;
842 refTransformStamped.transform.rotation.y = ref_pose.orientation.y;
843 refTransformStamped.transform.rotation.z = ref_pose.orientation.z;
844 refTransformStamped.transform.rotation.w = ref_pose.orientation.w;
847 const nav_msgs::Odometry
MessageWrapper::createRosOdoMessage(
const sbg_driver::SbgImuData &ref_sbg_imu_msg,
const sbg_driver::SbgEkfNav &ref_ekf_nav_msg,
const sbg_driver::SbgEkfQuat &ref_ekf_quat_msg,
const sbg_driver::SbgEkfEuler &ref_ekf_euler_msg)
849 tf2::Quaternion orientation(ref_ekf_quat_msg.quaternion.x, ref_ekf_quat_msg.quaternion.y, ref_ekf_quat_msg.quaternion.z, ref_ekf_quat_msg.quaternion.w);
851 return createRosOdoMessage(ref_sbg_imu_msg, ref_ekf_nav_msg, orientation, ref_ekf_euler_msg);
854 const nav_msgs::Odometry
MessageWrapper::createRosOdoMessage(
const sbg_driver::SbgImuData &ref_sbg_imu_msg,
const sbg_driver::SbgEkfNav &ref_ekf_nav_msg,
const sbg_driver::SbgEkfEuler &ref_ekf_euler_msg)
859 orientation.
setRPY(ref_ekf_euler_msg.angle.x, ref_ekf_euler_msg.angle.y, ref_ekf_euler_msg.angle.z);
861 return createRosOdoMessage(ref_sbg_imu_msg, ref_ekf_nav_msg, orientation, ref_ekf_euler_msg);
866 nav_msgs::Odometry odo_ros_msg;
867 std::string utm_zone;
868 geometry_msgs::TransformStamped transform;
873 tf2::convert(ref_orientation, odo_ros_msg.pose.pose.orientation);
878 utm_.
init(ref_ekf_nav_msg.latitude, ref_ekf_nav_msg.longitude);
884 ROS_INFO(
"Initialized from lat:%f long:%f UTM zone %d%c: easting:%fm (%dkm) northing:%fm (%dkm)"
893 geometry_msgs::Pose pose;
910 double longitudeRad =
sbgDegToRadD(ref_ekf_nav_msg.longitude);
911 double latitudeRad =
sbgDegToRadD(ref_ekf_nav_msg.latitude);
913 double convergence_angle = atan(tan(longitudeRad - central_meridian) * sin(latitudeRad));
916 double std_east = ref_ekf_nav_msg.position_accuracy.x;
917 double std_north = ref_ekf_nav_msg.position_accuracy.y;
918 double std_x = std_north * cos(convergence_angle) - std_east * sin(convergence_angle);
919 double std_y = std_north * sin(convergence_angle) + std_east * cos(convergence_angle);
920 double std_z = ref_ekf_nav_msg.position_accuracy.z;
921 odo_ros_msg.pose.covariance[0*6 + 0] = std_x * std_x;
922 odo_ros_msg.pose.covariance[1*6 + 1] = std_y * std_y;
923 odo_ros_msg.pose.covariance[2*6 + 2] = std_z * std_z;
924 odo_ros_msg.pose.covariance[3*6 + 3] = pow(ref_ekf_euler_msg.accuracy.x, 2);
925 odo_ros_msg.pose.covariance[4*6 + 4] = pow(ref_ekf_euler_msg.accuracy.y, 2);
926 odo_ros_msg.pose.covariance[5*6 + 5] = pow(ref_ekf_euler_msg.accuracy.z, 2);
930 odo_ros_msg.twist.twist.linear.x = ref_ekf_nav_msg.velocity.x;
931 odo_ros_msg.twist.twist.linear.y = ref_ekf_nav_msg.velocity.y;
932 odo_ros_msg.twist.twist.linear.z = ref_ekf_nav_msg.velocity.z;
933 odo_ros_msg.twist.twist.angular.x = ref_sbg_imu_msg.gyro.x;
934 odo_ros_msg.twist.twist.angular.y = ref_sbg_imu_msg.gyro.y;
935 odo_ros_msg.twist.twist.angular.z = ref_sbg_imu_msg.gyro.z;
936 odo_ros_msg.twist.covariance[0*6 + 0] = pow(ref_ekf_nav_msg.velocity_accuracy.x, 2);
937 odo_ros_msg.twist.covariance[1*6 + 1] = pow(ref_ekf_nav_msg.velocity_accuracy.y, 2);
938 odo_ros_msg.twist.covariance[2*6 + 2] = pow(ref_ekf_nav_msg.velocity_accuracy.z, 2);
939 odo_ros_msg.twist.covariance[3*6 + 3] = 0;
940 odo_ros_msg.twist.covariance[4*6 + 4] = 0;
941 odo_ros_msg.twist.covariance[5*6 + 5] = 0;
955 sensor_msgs::Temperature temperature_message;
957 temperature_message.header =
createRosHeader(ref_sbg_imu_msg.time_stamp);
958 temperature_message.temperature = ref_sbg_imu_msg.temp;
959 temperature_message.variance = 0.0;
961 return temperature_message;
966 sensor_msgs::MagneticField magnetic_message;
969 magnetic_message.magnetic_field = ref_sbg_mag_msg.mag;
971 return magnetic_message;
974 const geometry_msgs::TwistStamped
MessageWrapper::createRosTwistStampedMessage(
const sbg_driver::SbgEkfEuler& ref_sbg_ekf_euler_msg,
const sbg_driver::SbgEkfNav& ref_sbg_ekf_nav_msg,
const sbg_driver::SbgImuData& ref_sbg_imu_msg)
const
977 tdcm.
makeDcm(
sbg::SbgVector3f(ref_sbg_ekf_euler_msg.angle.x, ref_sbg_ekf_euler_msg.angle.y, ref_sbg_ekf_euler_msg.angle.z));
985 const geometry_msgs::TwistStamped
MessageWrapper::createRosTwistStampedMessage(
const sbg_driver::SbgEkfQuat& ref_sbg_ekf_quat_msg,
const sbg_driver::SbgEkfNav& ref_sbg_ekf_nav_msg,
const sbg_driver::SbgImuData& ref_sbg_imu_msg)
const
988 tdcm.
makeDcm(ref_sbg_ekf_quat_msg.quaternion.w, ref_sbg_ekf_quat_msg.quaternion.x, ref_sbg_ekf_quat_msg.quaternion.y, ref_sbg_ekf_quat_msg.quaternion.z);
997 geometry_msgs::TwistStamped twist_stamped_message;
999 twist_stamped_message.header =
createRosHeader(ref_sbg_imu_msg.time_stamp);
1000 twist_stamped_message.twist.angular = ref_sbg_imu_msg.delta_angle;
1002 twist_stamped_message.twist.linear.x = body_vel(0);
1003 twist_stamped_message.twist.linear.y = body_vel(1);
1004 twist_stamped_message.twist.linear.z = body_vel(2);
1006 return twist_stamped_message;
1011 geometry_msgs::PointStamped point_stamped_message;
1013 point_stamped_message.header =
createRosHeader(ref_sbg_ekf_msg.time_stamp);
1015 const auto ecef_coordinates =
helpers::convertLLAtoECEF(ref_sbg_ekf_msg.latitude, ref_sbg_ekf_msg.longitude, ref_sbg_ekf_msg.altitude);
1016 point_stamped_message.point.x = ecef_coordinates(0);
1017 point_stamped_message.point.y = ecef_coordinates(1);
1018 point_stamped_message.point.z = ecef_coordinates(2);
1020 return point_stamped_message;
1033 utc_reference_message.source =
"UTC time from device converted to Epoch";
1035 return utc_reference_message;
1040 sensor_msgs::NavSatFix nav_sat_fix_message;
1042 nav_sat_fix_message.header =
createRosHeader(ref_sbg_gps_msg.time_stamp);
1046 nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_NO_FIX;
1050 nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_SBAS_FIX;
1054 nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_FIX;
1057 if (ref_sbg_gps_msg.status.glo_l1_used || ref_sbg_gps_msg.status.glo_l2_used)
1059 nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GLONASS;
1063 nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GPS;
1066 nav_sat_fix_message.latitude = ref_sbg_gps_msg.latitude;
1067 nav_sat_fix_message.longitude = ref_sbg_gps_msg.longitude;
1068 nav_sat_fix_message.altitude = ref_sbg_gps_msg.altitude + ref_sbg_gps_msg.undulation;
1070 nav_sat_fix_message.position_covariance[0] = pow(ref_sbg_gps_msg.position_accuracy.x, 2);
1071 nav_sat_fix_message.position_covariance[4] = pow(ref_sbg_gps_msg.position_accuracy.y, 2);
1072 nav_sat_fix_message.position_covariance[8] = pow(ref_sbg_gps_msg.position_accuracy.z, 2);
1074 nav_sat_fix_message.position_covariance_type = nav_sat_fix_message.COVARIANCE_TYPE_DIAGONAL_KNOWN;
1076 return nav_sat_fix_message;
1081 sensor_msgs::FluidPressure fluid_pressure_message;
1083 fluid_pressure_message.header =
createRosHeader(ref_sbg_air_msg.time_stamp);
1084 fluid_pressure_message.fluid_pressure = ref_sbg_air_msg.pressure_abs;
1085 fluid_pressure_message.variance = 0.0;
1087 return fluid_pressure_message;
1092 nmea_msgs::Sentence nmea_gga_msg;
1093 uint32_t gps_tow_ms;
1095 uint32_t utc_minute;
1096 uint32_t utc_second;
1100 gps_tow_ms = ref_log_gps_pos.
timeOfWeek + (24ul * 3600ul * 1000ul);
1106 utc_hour = (gps_tow_ms / (3600 * 1000)) % 24;
1107 utc_minute = (gps_tow_ms / (60 * 1000)) % 60;
1108 utc_second = (gps_tow_ms / 1000) % 60;
1109 utc_ms = (gps_tow_ms % 1000);
1114 (utc_ms < 100 || utc_ms > 900) )
1118 float latitude_abs = std::fabs(latitude);
1119 int32_t lat_degs =
static_cast<int32_t
>(latitude_abs);
1120 float lat_mins = (latitude_abs -
static_cast<float>(lat_degs)) * 60.0f;
1124 float longitude_abs = std::fabs(longitude);
1125 int32_t lon_degs =
static_cast<int32_t
>(longitude_abs);
1126 float lon_mins = (longitude_abs -
static_cast<float>(lon_degs)) * 60.0f;
1137 constexpr uint32_t nmea_sentence_buffer_size = 128;
1138 char nmea_sentence_buff[nmea_sentence_buffer_size]{};
1139 auto len = snprintf(nmea_sentence_buff, nmea_sentence_buffer_size,
1140 "$GPGGA,%02d%02d%02d.%02d,%02d%02.4f,%c,%03d%02.4f,%c,%d,%d,%.1f,%.1f,M,%d,M,%.1f,%04d",
1147 (latitude < 0.0
f?
'S':
'N'),
1150 (longitude < 0.0
f?
'W':
'E'),
1161 uint8_t checksum = 0;
1162 for (int32_t i = 1; i < len; i++)
1164 checksum ^= nmea_sentence_buff[i];
1166 snprintf(&nmea_sentence_buff[len], nmea_sentence_buffer_size - len,
"*%02X\r\n", checksum);
1170 nmea_gga_msg.sentence = nmea_sentence_buff;
1173 return nmea_gga_msg;