message_wrapper.cpp
Go to the documentation of this file.
1 // File header
2 #include "message_wrapper.h"
3 
4 // ROS headers
9 
10 // Project headers
11 #include <sbg_vector3.h>
12 #include <sbg_ros_helpers.h>
13 
15 
19 //---------------------------------------------------------------------//
20 //- Constructor -//
21 //---------------------------------------------------------------------//
22 
23 MessageWrapper::MessageWrapper():
24 first_valid_utc_(false)
25 {
26 }
27 
28 //---------------------------------------------------------------------//
29 //- Internal methods -//
30 //---------------------------------------------------------------------//
31 
32 const std_msgs::Header MessageWrapper::createRosHeader(uint32_t device_timestamp) const
33 {
34  std_msgs::Header header;
35 
36  header.frame_id = frame_id_;
37 
39  {
40  header.stamp = convertInsTimeToUnix(device_timestamp);
41  }
42  else
43  {
44  header.stamp = ros::Time::now();
45  }
46 
47  return header;
48 }
49 
50 const ros::Time MessageWrapper::convertInsTimeToUnix(uint32_t device_timestamp) const
51 {
52  //
53  // Convert the UTC time to epoch from the last received message.
54  // Add the SBG timestamp difference (timestamp is in microsecond).
55  //
56  ros::Time utc_to_epoch;
57  uint32_t device_timestamp_diff;
58  uint64_t nanoseconds;
59 
60  utc_to_epoch = convertUtcTimeToUnix(last_sbg_utc_);
61  device_timestamp_diff = device_timestamp - last_sbg_utc_.time_stamp;
62 
63  nanoseconds = utc_to_epoch.toNSec() + static_cast<uint64_t>(device_timestamp_diff) * 1000;
64 
65  utc_to_epoch.fromNSec(nanoseconds);
66 
67  return utc_to_epoch;
68 }
69 
70 const ros::Time MessageWrapper::convertUtcTimeToUnix(const sbg_driver::SbgUtcTime& ref_sbg_utc_msg) const
71 {
72  ros::Time utc_to_epoch;
73  uint32_t days;
74  uint64_t nanoseconds;
75 
76  //
77  // Convert the UTC time to Epoch(Unix) time, which is the elapsed seconds since 1 Jan 1970.
78  //
79  days = 0;
80  nanoseconds = 0;
81 
82  for (uint16_t yearIndex = 1970; yearIndex < ref_sbg_utc_msg.year; yearIndex++)
83  {
84  days += sbg::helpers::getNumberOfDaysInYear(yearIndex);
85  }
86 
87  for (uint8_t monthIndex = 1; monthIndex < ref_sbg_utc_msg.month; monthIndex++)
88  {
89  days += sbg::helpers::getNumberOfDaysInMonth(ref_sbg_utc_msg.year, monthIndex);
90  }
91 
92  days += ref_sbg_utc_msg.day - 1;
93 
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;
99 
100  utc_to_epoch.fromNSec(nanoseconds);
101 
102  return utc_to_epoch;
103 }
104 
105 const sbg_driver::SbgEkfStatus MessageWrapper::createEkfStatusMessage(uint32_t ekf_status) const
106 {
107  sbg_driver::SbgEkfStatus ekf_status_message;
108 
109  ekf_status_message.solution_mode = sbgEComLogEkfGetSolutionMode(ekf_status);
110  ekf_status_message.attitude_valid = (ekf_status & SBG_ECOM_SOL_ATTITUDE_VALID) != 0;
111  ekf_status_message.heading_valid = (ekf_status & SBG_ECOM_SOL_HEADING_VALID) != 0;
112  ekf_status_message.velocity_valid = (ekf_status & SBG_ECOM_SOL_VELOCITY_VALID) != 0;
113  ekf_status_message.position_valid = (ekf_status & SBG_ECOM_SOL_POSITION_VALID) != 0;
114 
115  ekf_status_message.vert_ref_used = (ekf_status & SBG_ECOM_SOL_VERT_REF_USED) != 0;
116  ekf_status_message.mag_ref_used = (ekf_status & SBG_ECOM_SOL_MAG_REF_USED) != 0;
117 
118  ekf_status_message.gps1_vel_used = (ekf_status & SBG_ECOM_SOL_GPS1_VEL_USED) != 0;
119  ekf_status_message.gps1_pos_used = (ekf_status & SBG_ECOM_SOL_GPS1_POS_USED) != 0;
120  ekf_status_message.gps1_course_used = (ekf_status & SBG_ECOM_SOL_GPS1_HDT_USED) != 0;
121  ekf_status_message.gps1_hdt_used = (ekf_status & SBG_ECOM_SOL_GPS1_HDT_USED) != 0;
122 
123  ekf_status_message.gps2_vel_used = (ekf_status & SBG_ECOM_SOL_GPS2_VEL_USED) != 0;
124  ekf_status_message.gps2_pos_used = (ekf_status & SBG_ECOM_SOL_GPS2_POS_USED) != 0;
125  ekf_status_message.gps2_course_used = (ekf_status & SBG_ECOM_SOL_GPS2_POS_USED) != 0;
126  ekf_status_message.gps2_hdt_used = (ekf_status & SBG_ECOM_SOL_GPS2_HDT_USED) != 0;
127 
128  ekf_status_message.odo_used = (ekf_status & SBG_ECOM_SOL_ODO_USED) != 0;
129 
130  return ekf_status_message;
131 }
132 
133 const sbg_driver::SbgGpsPosStatus MessageWrapper::createGpsPosStatusMessage(const SbgLogGpsPos& ref_log_gps_pos) const
134 {
135  sbg_driver::SbgGpsPosStatus gps_pos_status_message;
136 
137  gps_pos_status_message.status = sbgEComLogGpsPosGetStatus(ref_log_gps_pos.status);
138  gps_pos_status_message.type = sbgEComLogGpsPosGetType(ref_log_gps_pos.status);
139 
140  gps_pos_status_message.gps_l1_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L1_USED) != 0;
141  gps_pos_status_message.gps_l2_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L2_USED) != 0;
142  gps_pos_status_message.gps_l5_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L5_USED) != 0;
143 
144  gps_pos_status_message.glo_l1_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GLO_L1_USED) != 0;
145  gps_pos_status_message.glo_l2_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GLO_L2_USED) != 0;
146 
147  return gps_pos_status_message;
148 }
149 
150 const sbg_driver::SbgGpsVelStatus MessageWrapper::createGpsVelStatusMessage(const SbgLogGpsVel& ref_log_gps_vel) const
151 {
152  sbg_driver::SbgGpsVelStatus gps_vel_status_message;
153 
154  gps_vel_status_message.vel_status = sbgEComLogGpsVelGetStatus(ref_log_gps_vel.status);
155  gps_vel_status_message.vel_type = sbgEComLogGpsVelGetType(ref_log_gps_vel.status);
156 
157  return gps_vel_status_message;
158 }
159 
160 const sbg_driver::SbgImuStatus MessageWrapper::createImuStatusMessage(uint16_t sbg_imu_status) const
161 {
162  sbg_driver::SbgImuStatus imu_status_message;
163 
164  imu_status_message.imu_com = (sbg_imu_status & SBG_ECOM_IMU_COM_OK) != 0;
165  imu_status_message.imu_status = (sbg_imu_status & SBG_ECOM_IMU_STATUS_BIT) != 0 ;
166  imu_status_message.imu_accels_in_range = (sbg_imu_status & SBG_ECOM_IMU_ACCELS_IN_RANGE) != 0;
167  imu_status_message.imu_gyros_in_range = (sbg_imu_status & SBG_ECOM_IMU_GYROS_IN_RANGE) != 0;
168 
169  imu_status_message.imu_accel_x = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_X_BIT) != 0;
170  imu_status_message.imu_accel_y = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_Y_BIT) != 0;
171  imu_status_message.imu_accel_z = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_Z_BIT) != 0;
172 
173  imu_status_message.imu_gyro_x = (sbg_imu_status & SBG_ECOM_IMU_GYRO_X_BIT) != 0;
174  imu_status_message.imu_gyro_y = (sbg_imu_status & SBG_ECOM_IMU_GYRO_Y_BIT) != 0;
175  imu_status_message.imu_gyro_z = (sbg_imu_status & SBG_ECOM_IMU_GYRO_Z_BIT) != 0;
176 
177  return imu_status_message;
178 }
179 
180 const sbg_driver::SbgMagStatus MessageWrapper::createMagStatusMessage(const SbgLogMag& ref_log_mag) const
181 {
182  sbg_driver::SbgMagStatus mag_status_message;
183 
184  mag_status_message.mag_x = (ref_log_mag.status & SBG_ECOM_MAG_MAG_X_BIT) != 0;
185  mag_status_message.mag_y = (ref_log_mag.status & SBG_ECOM_MAG_MAG_Y_BIT) != 0;
186  mag_status_message.mag_z = (ref_log_mag.status & SBG_ECOM_MAG_MAG_Z_BIT) != 0;
187 
188  mag_status_message.accel_x = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_X_BIT) != 0;
189  mag_status_message.accel_y = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_Y_BIT) != 0;
190  mag_status_message.accel_z = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_Z_BIT) != 0;
191 
192  mag_status_message.mags_in_range = (ref_log_mag.status & SBG_ECOM_MAG_MAGS_IN_RANGE) != 0;
193  mag_status_message.accels_in_range = (ref_log_mag.status & SBG_ECOM_MAG_ACCELS_IN_RANGE) != 0;
194  mag_status_message.calibration = (ref_log_mag.status & SBG_ECOM_MAG_CALIBRATION_OK) != 0;
195 
196  return mag_status_message;
197 }
198 
199 const sbg_driver::SbgShipMotionStatus MessageWrapper::createShipMotionStatusMessage(const SbgLogShipMotionData& ref_log_ship_motion) const
200 {
201  sbg_driver::SbgShipMotionStatus ship_motion_status_message;
202 
203  ship_motion_status_message.heave_valid = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_VALID) != 0;
204  ship_motion_status_message.heave_vel_aided = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_VEL_AIDED) != 0;
205  ship_motion_status_message.period_available = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_PERIOD_INCLUDED) != 0;
206  ship_motion_status_message.period_valid = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_PERIOD_VALID) != 0;
207 
208  return ship_motion_status_message;
209 }
210 
211 const sbg_driver::SbgStatusAiding MessageWrapper::createStatusAidingMessage(const SbgLogStatusData& ref_log_status) const
212 {
213  sbg_driver::SbgStatusAiding status_aiding_message;
214 
215  status_aiding_message.gps1_pos_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_POS_RECV) != 0;
216  status_aiding_message.gps1_vel_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_VEL_RECV) != 0;
217  status_aiding_message.gps1_hdt_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_HDT_RECV) != 0;
218  status_aiding_message.gps1_utc_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_UTC_RECV) != 0;
219 
220  status_aiding_message.mag_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_MAG_RECV) != 0;
221  status_aiding_message.odo_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_ODO_RECV) != 0;
222  status_aiding_message.dvl_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_DVL_RECV) != 0;
223 
224  return status_aiding_message;
225 }
226 
227 const sbg_driver::SbgStatusCom MessageWrapper::createStatusComMessage(const SbgLogStatusData& ref_log_status) const
228 {
229  sbg_driver::SbgStatusCom status_com_message;
230 
231  status_com_message.port_a = (ref_log_status.comStatus & SBG_ECOM_PORTA_VALID) != 0;
232  status_com_message.port_b = (ref_log_status.comStatus & SBG_ECOM_PORTB_VALID) != 0;
233  status_com_message.port_c = (ref_log_status.comStatus & SBG_ECOM_PORTC_VALID) != 0;
234  status_com_message.port_d = (ref_log_status.comStatus & SBG_ECOM_PORTD_VALID) != 0;
235  status_com_message.port_e = (ref_log_status.comStatus & SBG_ECOM_PORTE_VALID) != 0;
236 
237  status_com_message.port_a_rx = (ref_log_status.comStatus & SBG_ECOM_PORTA_RX_OK) != 0;
238  status_com_message.port_a_tx = (ref_log_status.comStatus & SBG_ECOM_PORTA_TX_OK) != 0;
239  status_com_message.port_b_rx = (ref_log_status.comStatus & SBG_ECOM_PORTB_RX_OK) != 0;
240  status_com_message.port_b_tx = (ref_log_status.comStatus & SBG_ECOM_PORTB_TX_OK) != 0;
241  status_com_message.port_c_rx = (ref_log_status.comStatus & SBG_ECOM_PORTC_RX_OK) != 0;
242  status_com_message.port_c_tx = (ref_log_status.comStatus & SBG_ECOM_PORTC_TX_OK) != 0;
243  status_com_message.port_d_rx = (ref_log_status.comStatus & SBG_ECOM_PORTD_RX_OK) != 0;
244  status_com_message.port_d_tx = (ref_log_status.comStatus & SBG_ECOM_PORTD_TX_OK) != 0;
245  status_com_message.port_e_rx = (ref_log_status.comStatus & SBG_ECOM_PORTE_RX_OK) != 0;
246  status_com_message.port_e_tx = (ref_log_status.comStatus & SBG_ECOM_PORTE_TX_OK) != 0;
247 
248  status_com_message.can_rx = (ref_log_status.comStatus & SBG_ECOM_CAN_RX_OK) != 0;
249  status_com_message.can_tx = (ref_log_status.comStatus & SBG_ECOM_CAN_TX_OK) != 0;
250  status_com_message.can_status = (ref_log_status.comStatus & SBG_ECOM_CAN_VALID) != 0;
251 
252  return status_com_message;
253 }
254 
255 const sbg_driver::SbgStatusGeneral MessageWrapper::createStatusGeneralMessage(const SbgLogStatusData& ref_log_status) const
256 {
257  sbg_driver::SbgStatusGeneral status_general_message;
258 
259  status_general_message.main_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_MAIN_POWER_OK) != 0;
260  status_general_message.imu_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_IMU_POWER_OK) != 0;
261  status_general_message.gps_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_GPS_POWER_OK) != 0;
262  status_general_message.settings = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_SETTINGS_OK) != 0;
263  status_general_message.temperature = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_TEMPERATURE_OK) != 0;
264 
265  return status_general_message;
266 }
267 
268 const sbg_driver::SbgUtcTimeStatus MessageWrapper::createUtcStatusMessage(const SbgLogUtcData& ref_log_utc) const
269 {
270  sbg_driver::SbgUtcTimeStatus utc_status_message;
271 
272  utc_status_message.clock_stable = (ref_log_utc.status & SBG_ECOM_CLOCK_STABLE_INPUT) != 0;
273  utc_status_message.clock_utc_sync = (ref_log_utc.status & SBG_ECOM_CLOCK_UTC_SYNC) != 0;
274 
275  utc_status_message.clock_status = static_cast<uint8_t>(sbgEComLogUtcGetClockStatus(ref_log_utc.status));
276  utc_status_message.clock_utc_status = static_cast<uint8_t>(sbgEComLogUtcGetClockUtcStatus(ref_log_utc.status));
277 
278  return utc_status_message;
279 }
280 
281 const sbg_driver::SbgAirDataStatus MessageWrapper::createAirDataStatusMessage(const SbgLogAirData& ref_sbg_air_data) const
282 {
283  sbg_driver::SbgAirDataStatus air_data_status_message;
284 
285  air_data_status_message.is_delay_time = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_TIME_IS_DELAY) != 0;
286  air_data_status_message.pressure_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_PRESSURE_ABS_VALID) != 0;
287  air_data_status_message.altitude_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_ALTITUDE_VALID) != 0;
288  air_data_status_message.pressure_diff_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_PRESSURE_DIFF_VALID) != 0;
289  air_data_status_message.air_speed_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_AIRPSEED_VALID) != 0;
290  air_data_status_message.air_temperature_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_TEMPERATURE_VALID) != 0;
291 
292  return air_data_status_message;
293 }
294 
295 //---------------------------------------------------------------------//
296 //- Parameters -//
297 //---------------------------------------------------------------------//
298 
300 {
301  time_reference_ = time_reference;
302 }
303 
304 void MessageWrapper::setFrameId(const std::string &frame_id)
305 {
306  frame_id_ = frame_id;
307 }
308 
310 {
311  use_enu_ = enu;
312 }
313 
314 void MessageWrapper::setOdomEnable(bool odom_enable)
315 {
316  odom_enable_ = odom_enable;
317 }
318 
319 void MessageWrapper::setOdomPublishTf(bool publish_tf)
320 {
321  odom_publish_tf_ = publish_tf;
322 }
323 
324 void MessageWrapper::setOdomFrameId(const std::string &ref_frame_id)
325 {
326  odom_frame_id_ = ref_frame_id;
327 }
328 
329 void MessageWrapper::setOdomBaseFrameId(const std::string &ref_frame_id)
330 {
331  odom_base_frame_id_ = ref_frame_id;
332 }
333 
334 void MessageWrapper::setOdomInitFrameId(const std::string &ref_frame_id)
335 {
336  odom_init_frame_id_ = ref_frame_id;
337 }
338 
339 //---------------------------------------------------------------------//
340 //- Operations -//
341 //---------------------------------------------------------------------//
342 
343 const sbg_driver::SbgEkfEuler MessageWrapper::createSbgEkfEulerMessage(const SbgLogEkfEulerData& ref_log_ekf_euler) const
344 {
345  sbg_driver::SbgEkfEuler ekf_euler_message;
346 
347  ekf_euler_message.header = createRosHeader(ref_log_ekf_euler.timeStamp);
348  ekf_euler_message.time_stamp = ref_log_ekf_euler.timeStamp;
349  ekf_euler_message.status = createEkfStatusMessage(ref_log_ekf_euler.status);
350 
351  if (use_enu_)
352  {
353  ekf_euler_message.angle.x = ref_log_ekf_euler.euler[0];
354  ekf_euler_message.angle.y = -ref_log_ekf_euler.euler[1];
355  ekf_euler_message.angle.z = -sbg::helpers::wrapAnglePi(-(SBG_PI_F / 2.0f) + ref_log_ekf_euler.euler[2]);
356  }
357  else
358  {
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];
362  }
363 
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];
367 
368  return ekf_euler_message;
369 }
370 
371 const sbg_driver::SbgEkfNav MessageWrapper::createSbgEkfNavMessage(const SbgLogEkfNavData& ref_log_ekf_nav) const
372 {
373  sbg_driver::SbgEkfNav ekf_nav_message;
374 
375  ekf_nav_message.header = createRosHeader(ref_log_ekf_nav.timeStamp);
376  ekf_nav_message.time_stamp = ref_log_ekf_nav.timeStamp;
377  ekf_nav_message.status = createEkfStatusMessage(ref_log_ekf_nav.status);
378  ekf_nav_message.undulation = ref_log_ekf_nav.undulation;
379 
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];
383 
384  if (use_enu_)
385  {
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];
389 
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];
393 
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];
397  }
398  else
399  {
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];
403 
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];
407 
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];
411  }
412 
413  return ekf_nav_message;
414 }
415 
416 const sbg_driver::SbgEkfQuat MessageWrapper::createSbgEkfQuatMessage(const SbgLogEkfQuatData& ref_log_ekf_quat) const
417 {
418  sbg_driver::SbgEkfQuat ekf_quat_message;
419 
420  ekf_quat_message.header = createRosHeader(ref_log_ekf_quat.timeStamp);
421  ekf_quat_message.time_stamp = ref_log_ekf_quat.timeStamp;
422  ekf_quat_message.status = createEkfStatusMessage(ref_log_ekf_quat.status);
423 
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];
427 
428  if (use_enu_)
429  {
430  static const tf2::Quaternion q_enu_to_nwu{0, 0, M_SQRT2 / 2, M_SQRT2 / 2};
431  tf2::Quaternion q_nwu{ref_log_ekf_quat.quaternion[1],
432  -ref_log_ekf_quat.quaternion[2],
433  -ref_log_ekf_quat.quaternion[3],
434  ref_log_ekf_quat.quaternion[0]};
435 
436  ekf_quat_message.quaternion = tf2::toMsg(q_enu_to_nwu * q_nwu);
437  }
438  else
439  {
440  tf2::Quaternion q_ned{ref_log_ekf_quat.quaternion[1],
441  ref_log_ekf_quat.quaternion[2],
442  ref_log_ekf_quat.quaternion[3],
443  ref_log_ekf_quat.quaternion[0]};
444 
445  ekf_quat_message.quaternion = tf2::toMsg(q_ned);
446  }
447 
448  return ekf_quat_message;
449 }
450 
451 const sbg_driver::SbgEvent MessageWrapper::createSbgEventMessage(const SbgLogEvent& ref_log_event) const
452 {
453  sbg_driver::SbgEvent event_message;
454 
455  event_message.header = createRosHeader(ref_log_event.timeStamp);
456  event_message.time_stamp = ref_log_event.timeStamp;
457 
458  event_message.overflow = (ref_log_event.status & SBG_ECOM_EVENT_OVERFLOW) != 0;
459  event_message.offset_0_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_0_VALID) != 0;
460  event_message.offset_1_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_1_VALID) != 0;
461  event_message.offset_2_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_2_VALID) != 0;
462  event_message.offset_3_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_3_VALID) != 0;
463 
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;
468 
469  return event_message;
470 }
471 
472 const sbg_driver::SbgGpsHdt MessageWrapper::createSbgGpsHdtMessage(const SbgLogGpsHdt& ref_log_gps_hdt) const
473 {
474  sbg_driver::SbgGpsHdt gps_hdt_message;
475 
476  gps_hdt_message.header = createRosHeader(ref_log_gps_hdt.timeStamp);
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;
480  gps_hdt_message.true_heading_acc = ref_log_gps_hdt.headingAccuracy;
481  gps_hdt_message.pitch_acc = ref_log_gps_hdt.pitchAccuracy;
482  gps_hdt_message.baseline = ref_log_gps_hdt.baseline;
483 
484  if (use_enu_)
485  {
486  gps_hdt_message.true_heading = sbg::helpers::wrapAngle360(90.0f - ref_log_gps_hdt.heading);
487  gps_hdt_message.pitch = -ref_log_gps_hdt.pitch;
488  }
489  else
490  {
491  gps_hdt_message.true_heading = ref_log_gps_hdt.heading;
492  gps_hdt_message.pitch = ref_log_gps_hdt.pitch;
493  }
494 
495  return gps_hdt_message;
496 }
497 
498 const sbg_driver::SbgGpsPos MessageWrapper::createSbgGpsPosMessage(const SbgLogGpsPos& ref_log_gps_pos) const
499 {
500  sbg_driver::SbgGpsPos gps_pos_message;
501 
502  gps_pos_message.header = createRosHeader(ref_log_gps_pos.timeStamp);
503  gps_pos_message.time_stamp = ref_log_gps_pos.timeStamp;
504 
505  gps_pos_message.status = createGpsPosStatusMessage(ref_log_gps_pos);
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;
510  gps_pos_message.diff_age = ref_log_gps_pos.differentialAge;
511 
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;
515 
516  if (use_enu_)
517  {
518  gps_pos_message.position_accuracy.x = ref_log_gps_pos.longitudeAccuracy;
519  gps_pos_message.position_accuracy.y = ref_log_gps_pos.latitudeAccuracy;
520  gps_pos_message.position_accuracy.z = ref_log_gps_pos.altitudeAccuracy;
521  }
522  else
523  {
524  gps_pos_message.position_accuracy.x = ref_log_gps_pos.latitudeAccuracy;
525  gps_pos_message.position_accuracy.y = ref_log_gps_pos.longitudeAccuracy;
526  gps_pos_message.position_accuracy.z = ref_log_gps_pos.altitudeAccuracy;
527  }
528 
529  return gps_pos_message;
530 }
531 
532 const sbg_driver::SbgGpsRaw MessageWrapper::createSbgGpsRawMessage(const SbgLogGpsRaw& ref_log_gps_raw) const
533 {
534  sbg_driver::SbgGpsRaw gps_raw_message;
535 
536  gps_raw_message.data.assign(ref_log_gps_raw.rawBuffer, ref_log_gps_raw.rawBuffer + ref_log_gps_raw.bufferSize);
537 
538  return gps_raw_message;
539 }
540 
541 const sbg_driver::SbgGpsVel MessageWrapper::createSbgGpsVelMessage(const SbgLogGpsVel& ref_log_gps_vel) const
542 {
543  sbg_driver::SbgGpsVel gps_vel_message;
544 
545  gps_vel_message.header = createRosHeader(ref_log_gps_vel.timeStamp);
546  gps_vel_message.time_stamp = ref_log_gps_vel.timeStamp;
547  gps_vel_message.status = createGpsVelStatusMessage(ref_log_gps_vel);
548  gps_vel_message.gps_tow = ref_log_gps_vel.timeOfWeek;
549  gps_vel_message.course_acc = ref_log_gps_vel.courseAcc;
550 
551  if (use_enu_)
552  {
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];
556 
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];
560 
561  gps_vel_message.course = sbg::helpers::wrapAngle360(90.0f - ref_log_gps_vel.course);
562  }
563  else
564  {
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];
568 
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];
572 
573  gps_vel_message.course = ref_log_gps_vel.course;
574  }
575 
576  return gps_vel_message;
577 }
578 
579 const sbg_driver::SbgImuData MessageWrapper::createSbgImuDataMessage(const SbgLogImuData& ref_log_imu_data) const
580 {
581  sbg_driver::SbgImuData imu_data_message;
582 
583  imu_data_message.header = createRosHeader(ref_log_imu_data.timeStamp);
584  imu_data_message.time_stamp = ref_log_imu_data.timeStamp;
585  imu_data_message.imu_status = createImuStatusMessage(ref_log_imu_data.status);
586  imu_data_message.temp = ref_log_imu_data.temperature;
587 
588  if (use_enu_)
589  {
590  imu_data_message.accel.x = ref_log_imu_data.accelerometers[0];
591  imu_data_message.accel.y = -ref_log_imu_data.accelerometers[1];
592  imu_data_message.accel.z = -ref_log_imu_data.accelerometers[2];
593 
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];
597 
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];
601 
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];
605  }
606  else
607  {
608  imu_data_message.accel.x = ref_log_imu_data.accelerometers[0];
609  imu_data_message.accel.y = ref_log_imu_data.accelerometers[1];
610  imu_data_message.accel.z = ref_log_imu_data.accelerometers[2];
611 
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];
615 
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];
619 
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];
623  }
624 
625  return imu_data_message;
626 }
627 
628 const sbg_driver::SbgMag MessageWrapper::createSbgMagMessage(const SbgLogMag& ref_log_mag) const
629 {
630  sbg_driver::SbgMag mag_message;
631 
632  mag_message.header = createRosHeader(ref_log_mag.timeStamp);
633  mag_message.time_stamp = ref_log_mag.timeStamp;
634  mag_message.status = createMagStatusMessage(ref_log_mag);
635 
636  if (use_enu_)
637  {
638  mag_message.mag.x = ref_log_mag.magnetometers[0];
639  mag_message.mag.y = -ref_log_mag.magnetometers[1];
640  mag_message.mag.z = -ref_log_mag.magnetometers[2];
641 
642  mag_message.accel.x = ref_log_mag.accelerometers[0];
643  mag_message.accel.y = -ref_log_mag.accelerometers[1];
644  mag_message.accel.z = -ref_log_mag.accelerometers[2];
645  }
646  else
647  {
648  mag_message.mag.x = ref_log_mag.magnetometers[0];
649  mag_message.mag.y = ref_log_mag.magnetometers[1];
650  mag_message.mag.z = ref_log_mag.magnetometers[2];
651 
652  mag_message.accel.x = ref_log_mag.accelerometers[0];
653  mag_message.accel.y = ref_log_mag.accelerometers[1];
654  mag_message.accel.z = ref_log_mag.accelerometers[2];
655  }
656 
657  return mag_message;
658 }
659 
660 const sbg_driver::SbgMagCalib MessageWrapper::createSbgMagCalibMessage(const SbgLogMagCalib& ref_log_mag_calib) const
661 {
662  sbg_driver::SbgMagCalib mag_calib_message;
663 
664  // TODO. SbgMagCalib is not implemented.
665  mag_calib_message.header = createRosHeader(ref_log_mag_calib.timeStamp);
666 
667  return mag_calib_message;
668 }
669 
670 const sbg_driver::SbgOdoVel MessageWrapper::createSbgOdoVelMessage(const SbgLogOdometerData& ref_log_odo) const
671 {
672  sbg_driver::SbgOdoVel odo_vel_message;
673 
674  odo_vel_message.header = createRosHeader(ref_log_odo.timeStamp);
675  odo_vel_message.time_stamp = ref_log_odo.timeStamp;
676 
677  odo_vel_message.status = ref_log_odo.status;
678  odo_vel_message.vel = ref_log_odo.velocity;
679 
680  return odo_vel_message;
681 }
682 
683 const sbg_driver::SbgShipMotion MessageWrapper::createSbgShipMotionMessage(const SbgLogShipMotionData& ref_log_ship_motion) const
684 {
685  sbg_driver::SbgShipMotion ship_motion_message;
686 
687  ship_motion_message.header = createRosHeader(ref_log_ship_motion.timeStamp);
688  ship_motion_message.time_stamp = ref_log_ship_motion.timeStamp;
689  ship_motion_message.status = createShipMotionStatusMessage(ref_log_ship_motion);
690 
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];
694 
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];
698 
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];
702 
703  return ship_motion_message;
704 }
705 
706 const sbg_driver::SbgStatus MessageWrapper::createSbgStatusMessage(const SbgLogStatusData& ref_log_status) const
707 {
708  sbg_driver::SbgStatus status_message;
709 
710  status_message.header = createRosHeader(ref_log_status.timeStamp);
711  status_message.time_stamp = ref_log_status.timeStamp;
712 
713  status_message.status_general = createStatusGeneralMessage(ref_log_status);
714  status_message.status_com = createStatusComMessage(ref_log_status);
715  status_message.status_aiding = createStatusAidingMessage(ref_log_status);
716 
717  return status_message;
718 }
719 
720 const sbg_driver::SbgUtcTime MessageWrapper::createSbgUtcTimeMessage(const SbgLogUtcData& ref_log_utc)
721 {
722  sbg_driver::SbgUtcTime utc_time_message;
723 
724  utc_time_message.header = createRosHeader(ref_log_utc.timeStamp);
725  utc_time_message.time_stamp = ref_log_utc.timeStamp;
726 
727  utc_time_message.clock_status = createUtcStatusMessage(ref_log_utc);
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;
735  utc_time_message.gps_tow = ref_log_utc.gpsTimeOfWeek;
736 
737  if (!first_valid_utc_)
738  {
739  if (utc_time_message.clock_status.clock_stable && utc_time_message.clock_status.clock_utc_sync)
740  {
741  if (utc_time_message.clock_status.clock_status == SBG_ECOM_CLOCK_VALID)
742  {
743  first_valid_utc_ = true;
744  ROS_INFO("A full valid UTC log has been detected, timestamp will be synchronized with the UTC data.");
745  }
746  }
747  }
748 
749  //
750  // Store the last UTC message.
751  //
752  last_sbg_utc_ = utc_time_message;
753 
754  return utc_time_message;
755 }
756 
757 const sbg_driver::SbgAirData MessageWrapper::createSbgAirDataMessage(const SbgLogAirData& ref_air_data_log) const
758 {
759  sbg_driver::SbgAirData air_data_message;
760 
761  air_data_message.header = createRosHeader(ref_air_data_log.timeStamp);
762  air_data_message.time_stamp = ref_air_data_log.timeStamp;
763  air_data_message.status = createAirDataStatusMessage(ref_air_data_log);
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;
769 
770  return air_data_message;
771 }
772 
773 const sbg_driver::SbgImuShort MessageWrapper::createSbgImuShortMessage(const SbgLogImuShort& ref_short_imu_log) const
774 {
775  sbg_driver::SbgImuShort imu_short_message;
776 
777  imu_short_message.header = createRosHeader(ref_short_imu_log.timeStamp);
778  imu_short_message.time_stamp = ref_short_imu_log.timeStamp;
779  imu_short_message.imu_status = createImuStatusMessage(ref_short_imu_log.status);
780  imu_short_message.temperature = ref_short_imu_log.temperature;
781 
782  if (use_enu_)
783  {
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];
787 
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];
791  }
792  else
793  {
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];
797 
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];
801  }
802 
803  return imu_short_message;
804 }
805 
806 const sensor_msgs::Imu MessageWrapper::createRosImuMessage(const sbg_driver::SbgImuData& ref_sbg_imu_msg, const sbg_driver::SbgEkfQuat& ref_sbg_quat_msg) const
807 {
808  sensor_msgs::Imu imu_ros_message;
809 
810  imu_ros_message.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
811 
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;
815 
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);
819 
820  //
821  // Angular velocity and linear acceleration covariances are not provided.
822  //
823  for (size_t i = 0; i < 9; i++)
824  {
825  imu_ros_message.angular_velocity_covariance[i] = 0.0;
826  imu_ros_message.linear_acceleration_covariance[i] = 0.0;
827  }
828 
829  return imu_ros_message;
830 }
831 
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)
833 {
834  refTransformStamped.header.stamp = ros::Time::now();
835  refTransformStamped.header.frame_id = ref_parent_frame_id;
836  refTransformStamped.child_frame_id = ref_child_frame_id;
837 
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;
845 }
846 
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)
848 {
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);
850 
851  return createRosOdoMessage(ref_sbg_imu_msg, ref_ekf_nav_msg, orientation, ref_ekf_euler_msg);
852 }
853 
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)
855 {
856  tf2::Quaternion orientation;
857 
858  // Compute orientation quaternion from euler angles (already converted from NED to ENU if needed).
859  orientation.setRPY(ref_ekf_euler_msg.angle.x, ref_ekf_euler_msg.angle.y, ref_ekf_euler_msg.angle.z);
860 
861  return createRosOdoMessage(ref_sbg_imu_msg, ref_ekf_nav_msg, orientation, ref_ekf_euler_msg);
862 }
863 
864 const nav_msgs::Odometry MessageWrapper::createRosOdoMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg, const sbg_driver::SbgEkfNav &ref_ekf_nav_msg, const tf2::Quaternion &ref_orientation, const sbg_driver::SbgEkfEuler &ref_ekf_euler_msg)
865 {
866  nav_msgs::Odometry odo_ros_msg;
867  std::string utm_zone;
868  geometry_msgs::TransformStamped transform;
869 
870  // The pose message provides the position and orientation of the robot relative to the frame specified in header.frame_id
871  odo_ros_msg.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
872  odo_ros_msg.header.frame_id = odom_frame_id_;
873  tf2::convert(ref_orientation, odo_ros_msg.pose.pose.orientation);
874 
875  // Convert latitude and longitude to UTM coordinates.
876  if (!utm_.isInit())
877  {
878  utm_.init(ref_ekf_nav_msg.latitude, ref_ekf_nav_msg.longitude);
879  const auto first_valid_easting_northing = utm_.computeEastingNorthing(ref_ekf_nav_msg.latitude, ref_ekf_nav_msg.longitude);
880  first_valid_easting_ = first_valid_easting_northing[0];
881  first_valid_northing_ = first_valid_easting_northing[1];
882  first_valid_altitude_ = ref_ekf_nav_msg.altitude;
883 
884  ROS_INFO("Initialized from lat:%f long:%f UTM zone %d%c: easting:%fm (%dkm) northing:%fm (%dkm)"
885  , ref_ekf_nav_msg.latitude, ref_ekf_nav_msg.longitude, utm_.getZoneNumber(), utm_.getLetterDesignator()
888  );
889 
890  if (odom_publish_tf_)
891  {
892  // Publish UTM initial transformation.
893  geometry_msgs::Pose pose;
894  pose.position.x = first_valid_easting_;
895  pose.position.y = first_valid_northing_;
896  pose.position.z = first_valid_altitude_;
897 
899  tf_broadcaster_.sendTransform(transform);
901  }
902  }
903 
904  const auto easting_northing = utm_.computeEastingNorthing(ref_ekf_nav_msg.latitude, ref_ekf_nav_msg.longitude);
905  odo_ros_msg.pose.pose.position.x = easting_northing[0] - first_valid_easting_;
906  odo_ros_msg.pose.pose.position.y = easting_northing[1] - first_valid_northing_;
907  odo_ros_msg.pose.pose.position.z = ref_ekf_nav_msg.altitude - first_valid_altitude_;
908 
909  // Compute convergence angle.
910  double longitudeRad = sbgDegToRadD(ref_ekf_nav_msg.longitude);
911  double latitudeRad = sbgDegToRadD(ref_ekf_nav_msg.latitude);
912  double central_meridian = sbgDegToRadD(utm_.getMeridian());
913  double convergence_angle = atan(tan(longitudeRad - central_meridian) * sin(latitudeRad));
914 
915  // Convert position standard deviations to UTM frame.
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);
927 
928  // The twist message gives the linear and angular velocity relative to the frame defined in child_frame_id
929  odo_ros_msg.child_frame_id = frame_id_;
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;
942 
943  if (odom_publish_tf_)
944  {
945  // Publish odom transformation.
946  fillTransform(odo_ros_msg.header.frame_id, odom_base_frame_id_, odo_ros_msg.pose.pose, transform);
947  tf_broadcaster_.sendTransform(transform);
948  }
949 
950  return odo_ros_msg;
951 }
952 
953 const sensor_msgs::Temperature MessageWrapper::createRosTemperatureMessage(const sbg_driver::SbgImuData& ref_sbg_imu_msg) const
954 {
955  sensor_msgs::Temperature temperature_message;
956 
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;
960 
961  return temperature_message;
962 }
963 
964 const sensor_msgs::MagneticField MessageWrapper::createRosMagneticMessage(const sbg_driver::SbgMag& ref_sbg_mag_msg) const
965 {
966  sensor_msgs::MagneticField magnetic_message;
967 
968  magnetic_message.header = createRosHeader(ref_sbg_mag_msg.time_stamp);
969  magnetic_message.magnetic_field = ref_sbg_mag_msg.mag;
970 
971  return magnetic_message;
972 }
973 
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
975 {
976  sbg::SbgMatrix3f tdcm;
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));
978  tdcm.transpose();
979 
980  const sbg::SbgVector3f res = tdcm * sbg::SbgVector3f(ref_sbg_ekf_nav_msg.velocity.x, ref_sbg_ekf_nav_msg.velocity.y, ref_sbg_ekf_nav_msg.velocity.z);
981 
982  return createRosTwistStampedMessage(res, ref_sbg_imu_msg);
983 }
984 
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
986 {
987  sbg::SbgMatrix3f tdcm;
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);
989  tdcm.transpose();
990 
991  const sbg::SbgVector3f res = tdcm * sbg::SbgVector3f(ref_sbg_ekf_nav_msg.velocity.x, ref_sbg_ekf_nav_msg.velocity.y, ref_sbg_ekf_nav_msg.velocity.z);
992  return createRosTwistStampedMessage(res, ref_sbg_imu_msg);
993 }
994 
995 const geometry_msgs::TwistStamped MessageWrapper::createRosTwistStampedMessage(const sbg::SbgVector3f& body_vel, const sbg_driver::SbgImuData& ref_sbg_imu_msg) const
996 {
997  geometry_msgs::TwistStamped twist_stamped_message;
998 
999  twist_stamped_message.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
1000  twist_stamped_message.twist.angular = ref_sbg_imu_msg.delta_angle;
1001 
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);
1005 
1006  return twist_stamped_message;
1007 }
1008 
1009 const geometry_msgs::PointStamped MessageWrapper::createRosPointStampedMessage(const sbg_driver::SbgEkfNav& ref_sbg_ekf_msg) const
1010 {
1011  geometry_msgs::PointStamped point_stamped_message;
1012 
1013  point_stamped_message.header = createRosHeader(ref_sbg_ekf_msg.time_stamp);
1014 
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);
1019 
1020  return point_stamped_message;
1021 }
1022 
1023 const sensor_msgs::TimeReference MessageWrapper::createRosUtcTimeReferenceMessage(const sbg_driver::SbgUtcTime& ref_sbg_utc_msg) const
1024 {
1025  sensor_msgs::TimeReference utc_reference_message;
1026 
1027  //
1028  // This message is defined to have comparison between the System time and the Utc reference.
1029  // Header of the ROS message will always be the System time, and the source is the computed time from Utc data.
1030  //
1031  utc_reference_message.header.stamp = ros::Time::now();
1032  utc_reference_message.time_ref = convertInsTimeToUnix(ref_sbg_utc_msg.time_stamp);
1033  utc_reference_message.source = "UTC time from device converted to Epoch";
1034 
1035  return utc_reference_message;
1036 }
1037 
1038 const sensor_msgs::NavSatFix MessageWrapper::createRosNavSatFixMessage(const sbg_driver::SbgGpsPos& ref_sbg_gps_msg) const
1039 {
1040  sensor_msgs::NavSatFix nav_sat_fix_message;
1041 
1042  nav_sat_fix_message.header = createRosHeader(ref_sbg_gps_msg.time_stamp);
1043 
1044  if (ref_sbg_gps_msg.status.type == SBG_ECOM_POS_NO_SOLUTION)
1045  {
1046  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_NO_FIX;
1047  }
1048  else if (ref_sbg_gps_msg.status.type == SBG_ECOM_POS_SBAS)
1049  {
1050  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_SBAS_FIX;
1051  }
1052  else
1053  {
1054  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_FIX;
1055  }
1056 
1057  if (ref_sbg_gps_msg.status.glo_l1_used || ref_sbg_gps_msg.status.glo_l2_used)
1058  {
1059  nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GLONASS;
1060  }
1061  else
1062  {
1063  nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GPS;
1064  }
1065 
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;
1069 
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);
1073 
1074  nav_sat_fix_message.position_covariance_type = nav_sat_fix_message.COVARIANCE_TYPE_DIAGONAL_KNOWN;
1075 
1076  return nav_sat_fix_message;
1077 }
1078 
1079 const sensor_msgs::FluidPressure MessageWrapper::createRosFluidPressureMessage(const sbg_driver::SbgAirData& ref_sbg_air_msg) const
1080 {
1081  sensor_msgs::FluidPressure fluid_pressure_message;
1082 
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;
1086 
1087  return fluid_pressure_message;
1088 }
1089 
1090 const nmea_msgs::Sentence MessageWrapper::createNmeaGGAMessageForNtrip(const SbgLogGpsPos &ref_log_gps_pos) const
1091 {
1092  nmea_msgs::Sentence nmea_gga_msg;
1093  uint32_t gps_tow_ms;
1094  uint32_t utc_hour;
1095  uint32_t utc_minute;
1096  uint32_t utc_second;
1097  uint32_t utc_ms;
1098 
1099  // Offset GPS Time of Week by a full day to easily handle zero roll over while applying the leap second
1100  gps_tow_ms = ref_log_gps_pos.timeOfWeek + (24ul * 3600ul * 1000ul);
1101 
1102  // Apply the GPS to UTC leap second offset
1103  gps_tow_ms = gps_tow_ms - (sbg::helpers::getUtcOffset(first_valid_utc_, last_sbg_utc_.gps_tow, last_sbg_utc_.sec) * 1000ul);
1104 
1105  // Extract UTC hours/mins/seconds values
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);
1110 
1111  // Only output a GGA message at 1 Hz (plain second) and for valid positions
1112  if ( (sbgEComLogGpsPosGetStatus(ref_log_gps_pos.status) == SBG_ECOM_POS_SOL_COMPUTED) &&
1114  (utc_ms < 100 || utc_ms > 900) )
1115  {
1116  // Latitude conversion
1117  float latitude = sbg::helpers::clamp(static_cast<float>(ref_log_gps_pos.latitude), -90.0f, 90.0f);
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;
1121 
1122  // Longitude conversion
1123  float longitude = sbg::helpers::clamp(static_cast<float>(ref_log_gps_pos.longitude), -180.0f, 180.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;
1127 
1128  // Compute and clamp each parameter
1129  float h_dop = sbg::helpers::clamp(std::hypot(ref_log_gps_pos.latitudeAccuracy, ref_log_gps_pos.longitudeAccuracy), 0.0f, 9.9f);
1130  float diff_age = sbg::helpers::clamp(ref_log_gps_pos.differentialAge / 100.0f, 0.0f, 9.9f);
1131  uint8_t sv_used = sbg::helpers::clamp(ref_log_gps_pos.numSvUsed, static_cast<uint8_t>(0), static_cast<uint8_t>(99));
1132  float altitude = sbg::helpers::clamp(static_cast<float>(ref_log_gps_pos.altitude), -99999.9f, 99999.9f);
1133  int32_t undulation = sbg::helpers::clamp(static_cast<int32_t>(ref_log_gps_pos.undulation), -99999, 99999);
1134  uint16_t base_station_id = sbg::helpers::clamp(ref_log_gps_pos.baseStationId, static_cast<uint16_t>(0), static_cast<uint16_t>(9999));
1135 
1136  // Write the NMEA sentence - 80 chars max
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",
1141  utc_hour,
1142  utc_minute,
1143  utc_second,
1144  utc_ms/10,
1145  lat_degs,
1146  lat_mins,
1147  (latitude < 0.0f?'S':'N'),
1148  lon_degs,
1149  lon_mins,
1150  (longitude < 0.0f?'W':'E'),
1151  static_cast<int32_t>(sbg::helpers::convertSbgGpsTypeToNmeaGpsType(sbgEComLogGpsPosGetType(ref_log_gps_pos.status))),
1152  sv_used,
1153  h_dop,
1154  altitude,
1155  undulation,
1156  diff_age,
1157  base_station_id
1158  );
1159 
1160  // Compute and append the NMEA checksum
1161  uint8_t checksum = 0;
1162  for (int32_t i = 1; i < len; i++)
1163  {
1164  checksum ^= nmea_sentence_buff[i];
1165  }
1166  snprintf(&nmea_sentence_buff[len], nmea_sentence_buffer_size - len, "*%02X\r\n", checksum);
1167 
1168  // Fill the NMEA ROS message
1169  nmea_gga_msg.header = createRosHeader(ref_log_gps_pos.timeStamp);
1170  nmea_gga_msg.sentence = nmea_sentence_buff;
1171  }
1172 
1173  return nmea_gga_msg;
1174 }
sbg::MessageWrapper::createRosHeader
const std_msgs::Header createRosHeader(uint32_t device_timestamp) const
Definition: message_wrapper.cpp:32
_SbgLogUtcData::minute
int8_t minute
Definition: sbgEComBinaryLogUtc.h:120
_SbgLogGpsPos::longitudeAccuracy
float longitudeAccuracy
Definition: sbgEComBinaryLogGps.h:292
sbg::MessageWrapper::first_valid_utc_
bool first_valid_utc_
Definition: message_wrapper.h:91
_SbgLogMagCalib
Definition: sbgEComBinaryLogMag.h:64
sbgEComLogGpsVelGetType
SBG_INLINE SbgEComGpsVelType sbgEComLogGpsVelGetType(uint32_t status)
Definition: sbgEComBinaryLogGps.h:173
SBG_ECOM_SOL_GPS1_POS_USED
#define SBG_ECOM_SOL_GPS1_POS_USED
Definition: sbgEComBinaryLogEkf.h:46
SBG_ECOM_CAN_VALID
#define SBG_ECOM_CAN_VALID
Definition: sbgEComBinaryLogStatus.h:73
_SbgLogShipMotionData::shipAccel
float shipAccel[3]
Definition: sbgEComBinaryLogShipMotion.h:54
SBG_ECOM_EVENT_OVERFLOW
#define SBG_ECOM_EVENT_OVERFLOW
This file is used to parse received event markers binary logs.
Definition: sbgEComBinaryLogEvent.h:33
tf2::convert
void convert(const A &a, B &b)
SBG_ECOM_MAG_CALIBRATION_OK
#define SBG_ECOM_MAG_CALIBRATION_OK
Definition: sbgEComBinaryLogMag.h:44
tf2_ros::StaticTransformBroadcaster::sendTransform
void sendTransform(const geometry_msgs::TransformStamped &transform)
SBG_ECOM_MAG_MAGS_IN_RANGE
#define SBG_ECOM_MAG_MAGS_IN_RANGE
Definition: sbgEComBinaryLogMag.h:41
sbg::SbgVector3< float >
SBG_ECOM_PORTE_RX_OK
#define SBG_ECOM_PORTE_RX_OK
Definition: sbgEComBinaryLogStatus.h:64
_SbgLogUtcData::nanoSecond
int32_t nanoSecond
Definition: sbgEComBinaryLogUtc.h:122
_SbgLogUtcData::hour
int8_t hour
Definition: sbgEComBinaryLogUtc.h:119
_SbgLogGpsVel::course
float course
Definition: sbgEComBinaryLogGps.h:275
sbg::Utm::computeEastingNorthing
std::array< double, 2 > computeEastingNorthing(double latitude, double longitude) const
Definition: sbg_utm.cpp:65
SBG_ECOM_SOL_GPS2_VEL_USED
#define SBG_ECOM_SOL_GPS2_VEL_USED
Definition: sbgEComBinaryLogEkf.h:48
SBG_ECOM_IMU_ACCEL_Z_BIT
#define SBG_ECOM_IMU_ACCEL_Z_BIT
Definition: sbgEComBinaryLogImu.h:38
_SbgLogOdometerData::velocity
float velocity
Definition: sbgEComBinaryLogOdometer.h:47
_SbgLogImuShort::deltaVelocity
int32_t deltaVelocity[3]
Definition: sbgEComBinaryLogImu.h:73
sbg::helpers::convertSbgGpsTypeToNmeaGpsType
NmeaGGAQuality convertSbgGpsTypeToNmeaGpsType(SbgEComGpsPosType sbg_gps_type)
Definition: sbg_ros_helpers.cpp:105
SBG_ECOM_AIDING_GPS1_HDT_RECV
#define SBG_ECOM_AIDING_GPS1_HDT_RECV
Definition: sbgEComBinaryLogStatus.h:93
sbg::MessageWrapper::createAirDataStatusMessage
const sbg_driver::SbgAirDataStatus createAirDataStatusMessage(const SbgLogAirData &ref_sbg_air_data) const
Definition: message_wrapper.cpp:281
SBG_ECOM_SOL_HEADING_VALID
#define SBG_ECOM_SOL_HEADING_VALID
Definition: sbgEComBinaryLogEkf.h:40
sbg::MessageWrapper::createEkfStatusMessage
const sbg_driver::SbgEkfStatus createEkfStatusMessage(uint32_t ekf_status) const
Definition: message_wrapper.cpp:105
SBG_ECOM_SOL_ATTITUDE_VALID
#define SBG_ECOM_SOL_ATTITUDE_VALID
Definition: sbgEComBinaryLogEkf.h:39
_SbgLogImuData::gyroscopes
float gyroscopes[3]
Definition: sbgEComBinaryLogImu.h:59
_SbgLogEvent::timeOffset0
uint16_t timeOffset0
Definition: sbgEComBinaryLogEvent.h:50
_SbgLogStatusData
Definition: sbgEComBinaryLogStatus.h:116
SBG_ECOM_MAG_MAG_X_BIT
#define SBG_ECOM_MAG_MAG_X_BIT
This file is used to parse received magnetometer binary logs.
Definition: sbgEComBinaryLogMag.h:33
_SbgLogEkfQuatData::status
uint32_t status
Definition: sbgEComBinaryLogEkf.h:127
_SbgLogEvent::timeOffset1
uint16_t timeOffset1
Definition: sbgEComBinaryLogEvent.h:51
_SbgLogEkfNavData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogEkf.h:135
_SbgLogMag::accelerometers
float accelerometers[3]
Definition: sbgEComBinaryLogMag.h:58
_SbgLogEkfEulerData::status
uint32_t status
Definition: sbgEComBinaryLogEkf.h:116
_SbgLogAirData::altitude
float altitude
Definition: sbgEComBinaryLogAirData.h:55
_SbgLogGpsHdt::headingAccuracy
float headingAccuracy
Definition: sbgEComBinaryLogGps.h:308
SBG_ECOM_AIR_DATA_PRESSURE_DIFF_VALID
#define SBG_ECOM_AIR_DATA_PRESSURE_DIFF_VALID
Definition: sbgEComBinaryLogAirData.h:39
SBG_ECOM_IMU_GYRO_Y_BIT
#define SBG_ECOM_IMU_GYRO_Y_BIT
Definition: sbgEComBinaryLogImu.h:41
_SbgLogGpsRaw::rawBuffer
uint8_t rawBuffer[SBG_ECOM_GPS_RAW_MAX_BUFFER_SIZE]
Definition: sbgEComBinaryLogGps.h:319
SBG_ECOM_GENERAL_SETTINGS_OK
#define SBG_ECOM_GENERAL_SETTINGS_OK
Definition: sbgEComBinaryLogStatus.h:32
sbg::MessageWrapper::setOdomEnable
void setOdomEnable(bool odom_enable)
Definition: message_wrapper.cpp:314
_SbgLogAirData::trueAirspeed
float trueAirspeed
Definition: sbgEComBinaryLogAirData.h:57
SBG_ECOM_GENERAL_TEMPERATURE_OK
#define SBG_ECOM_GENERAL_TEMPERATURE_OK
Definition: sbgEComBinaryLogStatus.h:33
_SbgLogMag::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogMag.h:55
_SbgLogShipMotionData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogShipMotion.h:50
_SbgLogEkfQuatData::quaternion
float quaternion[4]
Definition: sbgEComBinaryLogEkf.h:125
_SbgLogGpsVel::velocity
float velocity[3]
Definition: sbgEComBinaryLogGps.h:273
_SbgLogGpsHdt::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogGps.h:304
SBG_ECOM_EVENT_OFFSET_2_VALID
#define SBG_ECOM_EVENT_OFFSET_2_VALID
Definition: sbgEComBinaryLogEvent.h:36
sbgDegToRadD
SBG_INLINE double sbgDegToRadD(double angle)
Definition: sbgDefines.h:361
_SbgLogAirData
Definition: sbgEComBinaryLogAirData.h:50
SBG_ECOM_GPS_POS_GPS_L5_USED
#define SBG_ECOM_GPS_POS_GPS_L5_USED
Definition: sbgEComBinaryLogGps.h:55
_SbgLogGpsHdt::status
uint16_t status
Definition: sbgEComBinaryLogGps.h:305
_SbgLogEkfNavData::velocityStdDev
float velocityStdDev[3]
Definition: sbgEComBinaryLogEkf.h:137
SBG_ECOM_SOL_GPS2_POS_USED
#define SBG_ECOM_SOL_GPS2_POS_USED
Definition: sbgEComBinaryLogEkf.h:49
tf2::Quaternion::setRPY
void setRPY(const tf2Scalar &roll, const tf2Scalar &pitch, const tf2Scalar &yaw)
_SbgLogUtcData
Definition: sbgEComBinaryLogUtc.h:112
sbg_ros_helpers.h
Helpers for various tasks.
sbg::MessageWrapper::createStatusAidingMessage
const sbg_driver::SbgStatusAiding createStatusAidingMessage(const SbgLogStatusData &ref_log_status) const
Definition: message_wrapper.cpp:211
sbg::MessageWrapper::createGpsPosStatusMessage
const sbg_driver::SbgGpsPosStatus createGpsPosStatusMessage(const SbgLogGpsPos &ref_log_gps_pos) const
Definition: message_wrapper.cpp:133
SBG_ECOM_PORTB_TX_OK
#define SBG_ECOM_PORTB_TX_OK
Definition: sbgEComBinaryLogStatus.h:59
sbg::MessageWrapper::createSbgEkfNavMessage
const sbg_driver::SbgEkfNav createSbgEkfNavMessage(const SbgLogEkfNavData &ref_log_ekf_nav) const
Definition: message_wrapper.cpp:371
SBG_ECOM_SOL_GPS1_VEL_USED
#define SBG_ECOM_SOL_GPS1_VEL_USED
Definition: sbgEComBinaryLogEkf.h:45
_SbgLogEvent::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogEvent.h:48
_SbgLogGpsHdt
Definition: sbgEComBinaryLogGps.h:302
sbgEComLogGpsVelGetStatus
SBG_INLINE SbgEComGpsVelStatus sbgEComLogGpsVelGetStatus(uint32_t status)
Definition: sbgEComBinaryLogGps.h:163
_SbgLogGpsVel::timeOfWeek
uint32_t timeOfWeek
Definition: sbgEComBinaryLogGps.h:272
sbg::MessageWrapper::time_reference_
TimeReference time_reference_
Definition: message_wrapper.h:94
sbg::MessageWrapper::odom_enable_
bool odom_enable_
Definition: message_wrapper.h:96
_SbgLogGpsVel::status
uint32_t status
Definition: sbgEComBinaryLogGps.h:271
sbg::MessageWrapper::fillTransform
void fillTransform(const std::string &ref_parent_frame_id, const std::string &ref_child_frame_id, const geometry_msgs::Pose &ref_pose, geometry_msgs::TransformStamped &ref_transform_stamped)
Definition: message_wrapper.cpp:832
_SbgLogImuShort::status
uint16_t status
Definition: sbgEComBinaryLogImu.h:72
_SbgLogEkfNavData::undulation
float undulation
Definition: sbgEComBinaryLogEkf.h:140
sbg::MessageWrapper::setOdomFrameId
void setOdomFrameId(const std::string &ref_frame_id)
Definition: message_wrapper.cpp:324
_SbgLogMag::status
uint16_t status
Definition: sbgEComBinaryLogMag.h:56
sbg::MessageWrapper::createSbgGpsHdtMessage
const sbg_driver::SbgGpsHdt createSbgGpsHdtMessage(const SbgLogGpsHdt &ref_log_gps_hdt) const
Definition: message_wrapper.cpp:472
sbg::MessageWrapper::createImuStatusMessage
const sbg_driver::SbgImuStatus createImuStatusMessage(uint16_t sbg_imu_status) const
Definition: message_wrapper.cpp:160
_SbgLogEvent
Definition: sbgEComBinaryLogEvent.h:46
_SbgLogShipMotionData::status
uint16_t status
Definition: sbgEComBinaryLogShipMotion.h:51
SBG_ECOM_SOL_VELOCITY_VALID
#define SBG_ECOM_SOL_VELOCITY_VALID
Definition: sbgEComBinaryLogEkf.h:41
SBG_ECOM_EVENT_OFFSET_3_VALID
#define SBG_ECOM_EVENT_OFFSET_3_VALID
Definition: sbgEComBinaryLogEvent.h:37
_SbgLogUtcData::year
uint16_t year
Definition: sbgEComBinaryLogUtc.h:116
sbg::MessageWrapper::createSbgUtcTimeMessage
const sbg_driver::SbgUtcTime createSbgUtcTimeMessage(const SbgLogUtcData &ref_log_utc)
Definition: message_wrapper.cpp:720
sbg::MessageWrapper::createSbgStatusMessage
const sbg_driver::SbgStatus createSbgStatusMessage(const SbgLogStatusData &ref_log_status) const
Definition: message_wrapper.cpp:706
sbg::Utm::init
void init(double latitude, double longitude)
Definition: sbg_utm.cpp:46
_SbgLogShipMotionData::shipVel
float shipVel[3]
Definition: sbgEComBinaryLogShipMotion.h:55
_SbgLogStatusData::aidingStatus
uint32_t aidingStatus
Definition: sbgEComBinaryLogStatus.h:122
sbg::MessageWrapper::odom_publish_tf_
bool odom_publish_tf_
Definition: message_wrapper.h:97
SBG_ECOM_HEAVE_VALID
#define SBG_ECOM_HEAVE_VALID
This file is used to parse received ship motion binary logs.
Definition: sbgEComBinaryLogShipMotion.h:30
sbg::MessageWrapper::setTimeReference
void setTimeReference(TimeReference time_reference)
Definition: message_wrapper.cpp:299
_SbgLogEvent::timeOffset3
uint16_t timeOffset3
Definition: sbgEComBinaryLogEvent.h:53
SBG_ECOM_SOL_VERT_REF_USED
#define SBG_ECOM_SOL_VERT_REF_USED
Definition: sbgEComBinaryLogEkf.h:43
_SbgLogImuData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogImu.h:56
_SbgLogGpsPos::undulation
float undulation
Definition: sbgEComBinaryLogGps.h:290
SBG_ECOM_PORTD_TX_OK
#define SBG_ECOM_PORTD_TX_OK
Definition: sbgEComBinaryLogStatus.h:63
_SbgLogImuData::status
uint16_t status
Definition: sbgEComBinaryLogImu.h:57
sbg::MessageWrapper::createRosTwistStampedMessage
const geometry_msgs::TwistStamped createRosTwistStampedMessage(const sbg::SbgVector3f &body_vel, const sbg_driver::SbgImuData &ref_sbg_imu_msg) const
Definition: message_wrapper.cpp:995
SBG_ECOM_CAN_RX_OK
#define SBG_ECOM_CAN_RX_OK
Definition: sbgEComBinaryLogStatus.h:74
_SbgLogImuData::temperature
float temperature
Definition: sbgEComBinaryLogImu.h:60
sbg::MessageWrapper::createRosNavSatFixMessage
const sensor_msgs::NavSatFix createRosNavSatFixMessage(const sbg_driver::SbgGpsPos &ref_sbg_gps_msg) const
Definition: message_wrapper.cpp:1038
transform_broadcaster.h
f
f
_SbgLogEvent::timeOffset2
uint16_t timeOffset2
Definition: sbgEComBinaryLogEvent.h:52
SBG_ECOM_POS_SBAS
@ SBG_ECOM_POS_SBAS
Definition: sbgEComBinaryLogGps.h:130
SBG_ECOM_AIR_DATA_PRESSURE_ABS_VALID
#define SBG_ECOM_AIR_DATA_PRESSURE_ABS_VALID
Definition: sbgEComBinaryLogAirData.h:37
sbg::MessageWrapper::createStatusGeneralMessage
const sbg_driver::SbgStatusGeneral createStatusGeneralMessage(const SbgLogStatusData &ref_log_status) const
Definition: message_wrapper.cpp:255
_SbgLogGpsPos::baseStationId
uint16_t baseStationId
Definition: sbgEComBinaryLogGps.h:295
sbg::SbgMatrix3
Definition: sbg_matrix3.h:52
SBG_ECOM_GPS_POS_GPS_L2_USED
#define SBG_ECOM_GPS_POS_GPS_L2_USED
Definition: sbgEComBinaryLogGps.h:54
SBG_ECOM_SOL_POSITION_VALID
#define SBG_ECOM_SOL_POSITION_VALID
Definition: sbgEComBinaryLogEkf.h:42
sbgEComLogUtcGetClockUtcStatus
SBG_INLINE SbgEComClockUtcStatus sbgEComLogUtcGetClockUtcStatus(uint16_t status)
Definition: sbgEComBinaryLogUtc.h:84
message_wrapper.h
Handle creation of messages.
sbg::MessageWrapper::static_tf_broadcaster_
tf2_ros::StaticTransformBroadcaster static_tf_broadcaster_
Definition: message_wrapper.h:103
SBG_PI_F
#define SBG_PI_F
Definition: sbgDefines.h:293
SBG_ECOM_IMU_GYRO_Z_BIT
#define SBG_ECOM_IMU_GYRO_Z_BIT
Definition: sbgEComBinaryLogImu.h:42
_SbgLogEkfQuatData::eulerStdDev
float eulerStdDev[3]
Definition: sbgEComBinaryLogEkf.h:126
sbg::MessageWrapper::first_valid_northing_
double first_valid_northing_
Definition: message_wrapper.h:107
SBG_ECOM_HEAVE_PERIOD_INCLUDED
#define SBG_ECOM_HEAVE_PERIOD_INCLUDED
Definition: sbgEComBinaryLogShipMotion.h:33
SBG_ECOM_GPS_POS_GPS_L1_USED
#define SBG_ECOM_GPS_POS_GPS_L1_USED
Definition: sbgEComBinaryLogGps.h:53
_SbgLogUtcData::day
int8_t day
Definition: sbgEComBinaryLogUtc.h:118
_SbgLogGpsPos::differentialAge
uint16_t differentialAge
Definition: sbgEComBinaryLogGps.h:296
sbg::MessageWrapper::createSbgEventMessage
const sbg_driver::SbgEvent createSbgEventMessage(const SbgLogEvent &ref_log_event) const
Definition: message_wrapper.cpp:451
_SbgLogOdometerData::status
uint16_t status
Definition: sbgEComBinaryLogOdometer.h:46
_SbgLogUtcData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogUtc.h:114
sbg::MessageWrapper::first_valid_easting_
double first_valid_easting_
Definition: message_wrapper.h:106
sbg::MessageWrapper::createSbgAirDataMessage
const sbg_driver::SbgAirData createSbgAirDataMessage(const SbgLogAirData &ref_air_data_log) const
Definition: message_wrapper.cpp:757
_SbgLogGpsPos::altitudeAccuracy
float altitudeAccuracy
Definition: sbgEComBinaryLogGps.h:293
_SbgLogStatusData::comStatus
uint32_t comStatus
Definition: sbgEComBinaryLogStatus.h:121
_SbgLogUtcData::second
int8_t second
Definition: sbgEComBinaryLogUtc.h:121
sbg::helpers::getNumberOfDaysInMonth
uint32_t getNumberOfDaysInMonth(uint16_t year, uint8_t month_index)
Definition: sbg_ros_helpers.cpp:54
_SbgLogAirData::pressureAbs
float pressureAbs
Definition: sbgEComBinaryLogAirData.h:54
SBG_ECOM_MAG_ACCEL_X_BIT
#define SBG_ECOM_MAG_ACCEL_X_BIT
Definition: sbgEComBinaryLogMag.h:37
tf2_ros::TransformBroadcaster::sendTransform
void sendTransform(const geometry_msgs::TransformStamped &transform)
sbg::MessageWrapper::convertInsTimeToUnix
const ros::Time convertInsTimeToUnix(uint32_t device_timestamp) const
Definition: message_wrapper.cpp:50
_SbgLogEkfQuatData
Definition: sbgEComBinaryLogEkf.h:122
_SbgLogOdometerData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogOdometer.h:45
_SbgLogEkfNavData::status
uint32_t status
Definition: sbgEComBinaryLogEkf.h:142
sbg::Utm::getMeridian
double getMeridian() const
Definition: sbg_utm.cpp:32
sbg::TimeReference
TimeReference
Definition: config_store.h:51
SBG_ECOM_CLOCK_UTC_SYNC
#define SBG_ECOM_CLOCK_UTC_SYNC
Definition: sbgEComBinaryLogUtc.h:42
SBG_ECOM_GENERAL_MAIN_POWER_OK
#define SBG_ECOM_GENERAL_MAIN_POWER_OK
This file is used to parse received device status binary logs.
Definition: sbgEComBinaryLogStatus.h:29
sbg::MessageWrapper::setUseEnu
void setUseEnu(bool enu)
Definition: message_wrapper.cpp:309
_SbgLogGpsHdt::timeOfWeek
uint32_t timeOfWeek
Definition: sbgEComBinaryLogGps.h:306
_SbgLogMag::magnetometers
float magnetometers[3]
Definition: sbgEComBinaryLogMag.h:57
sbg::MessageWrapper::createSbgGpsPosMessage
const sbg_driver::SbgGpsPos createSbgGpsPosMessage(const SbgLogGpsPos &ref_log_gps_pos) const
Definition: message_wrapper.cpp:498
SBG_ECOM_AIDING_GPS1_UTC_RECV
#define SBG_ECOM_AIDING_GPS1_UTC_RECV
Definition: sbgEComBinaryLogStatus.h:94
sbg::helpers::getUtcOffset
int32_t getUtcOffset(bool first_valid_utc, uint32_t gps_tow, uint8_t sec)
Definition: sbg_ros_helpers.cpp:82
sbg::helpers::convertLLAtoECEF
sbg::SbgVector3d convertLLAtoECEF(double latitude, double longitude, double altitude)
Definition: sbg_ros_helpers.cpp:144
SBG_ECOM_IMU_ACCELS_IN_RANGE
#define SBG_ECOM_IMU_ACCELS_IN_RANGE
Definition: sbgEComBinaryLogImu.h:44
sbg::helpers::wrapAngle360
float wrapAngle360(float angle_deg)
Definition: sbg_ros_helpers.cpp:25
SBG_ECOM_POS_NO_SOLUTION
@ SBG_ECOM_POS_NO_SOLUTION
Definition: sbgEComBinaryLogGps.h:126
sbg::MessageWrapper::setFrameId
void setFrameId(const std::string &frame_id)
Definition: message_wrapper.cpp:304
Quaternion.h
_SbgLogEkfEulerData
Definition: sbgEComBinaryLogEkf.h:111
sbg::SbgMatrix3::transpose
void transpose()
Definition: sbg_matrix3.h:172
SBG_ECOM_AIDING_ODO_RECV
#define SBG_ECOM_AIDING_ODO_RECV
Definition: sbgEComBinaryLogStatus.h:100
sbg::Utm::getZoneNumber
int getZoneNumber() const
Definition: sbg_utm.cpp:27
sbg::MessageWrapper::setOdomBaseFrameId
void setOdomBaseFrameId(const std::string &ref_frame_id)
Definition: message_wrapper.cpp:329
_SbgLogEkfEulerData::euler
float euler[3]
Definition: sbgEComBinaryLogEkf.h:114
SBG_ECOM_EVENT_OFFSET_1_VALID
#define SBG_ECOM_EVENT_OFFSET_1_VALID
Definition: sbgEComBinaryLogEvent.h:35
_SbgLogShipMotionData::shipMotion
float shipMotion[3]
Definition: sbgEComBinaryLogShipMotion.h:53
_SbgLogUtcData::status
uint16_t status
Definition: sbgEComBinaryLogUtc.h:115
_SbgLogEkfEulerData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogEkf.h:113
SBG_ECOM_AIR_DATA_TEMPERATURE_VALID
#define SBG_ECOM_AIR_DATA_TEMPERATURE_VALID
Definition: sbgEComBinaryLogAirData.h:41
sbg::MessageWrapper::first_valid_altitude_
double first_valid_altitude_
Definition: message_wrapper.h:108
sbg::MessageWrapper::createRosOdoMessage
const nav_msgs::Odometry createRosOdoMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg, const sbg_driver::SbgEkfNav &ref_sbg_ekf_nav_msg, const sbg_driver::SbgEkfQuat &ref_sbg_ekf_quat_msg, const sbg_driver::SbgEkfEuler &ref_sbg_ekf_euler_msg)
Definition: message_wrapper.cpp:847
_SbgLogGpsPos::longitude
double longitude
Definition: sbgEComBinaryLogGps.h:288
sbg::MessageWrapper::odom_base_frame_id_
std::string odom_base_frame_id_
Definition: message_wrapper.h:99
SBG_ECOM_PORTC_VALID
#define SBG_ECOM_PORTC_VALID
Definition: sbgEComBinaryLogStatus.h:52
SBG_ECOM_PORTE_VALID
#define SBG_ECOM_PORTE_VALID
Definition: sbgEComBinaryLogStatus.h:54
_SbgLogImuData
Definition: sbgEComBinaryLogImu.h:54
SBG_ECOM_HEAVE_VEL_AIDED
#define SBG_ECOM_HEAVE_VEL_AIDED
Definition: sbgEComBinaryLogShipMotion.h:31
_SbgLogImuShort::deltaAngle
int32_t deltaAngle[3]
Definition: sbgEComBinaryLogImu.h:74
sbg::MessageWrapper::convertUtcTimeToUnix
const ros::Time convertUtcTimeToUnix(const sbg_driver::SbgUtcTime &ref_sbg_utc_msg) const
Definition: message_wrapper.cpp:70
sbg::Utm::isInit
bool isInit() const
Definition: sbg_utm.cpp:22
sbg::helpers::getNumberOfDaysInYear
uint32_t getNumberOfDaysInYear(uint16_t year)
Definition: sbg_ros_helpers.cpp:42
sbgEComLogGpsPosGetType
SBG_INLINE SbgEComGpsPosType sbgEComLogGpsPosGetType(uint32_t status)
Definition: sbgEComBinaryLogGps.h:212
_SbgLogGpsPos
Definition: sbgEComBinaryLogGps.h:282
_SbgLogGpsPos::latitudeAccuracy
float latitudeAccuracy
Definition: sbgEComBinaryLogGps.h:291
SBG_ECOM_PORTA_TX_OK
#define SBG_ECOM_PORTA_TX_OK
Definition: sbgEComBinaryLogStatus.h:57
_SbgLogEkfNavData::positionStdDev
float positionStdDev[3]
Definition: sbgEComBinaryLogEkf.h:141
SBG_ECOM_AIR_DATA_ALTITUDE_VALID
#define SBG_ECOM_AIR_DATA_ALTITUDE_VALID
Definition: sbgEComBinaryLogAirData.h:38
SBG_ECOM_AIDING_GPS1_POS_RECV
#define SBG_ECOM_AIDING_GPS1_POS_RECV
Definition: sbgEComBinaryLogStatus.h:91
_SbgLogOdometerData
Definition: sbgEComBinaryLogOdometer.h:43
SBG_ECOM_PORTB_VALID
#define SBG_ECOM_PORTB_VALID
Definition: sbgEComBinaryLogStatus.h:51
sbg::MessageWrapper::createSbgMagCalibMessage
const sbg_driver::SbgMagCalib createSbgMagCalibMessage(const SbgLogMagCalib &ref_log_mag_calib) const
Definition: message_wrapper.cpp:660
_SbgLogGpsHdt::heading
float heading
Definition: sbgEComBinaryLogGps.h:307
SBG_ECOM_IMU_ACCEL_X_BIT
#define SBG_ECOM_IMU_ACCEL_X_BIT
Definition: sbgEComBinaryLogImu.h:36
SBG_ECOM_AIDING_DVL_RECV
#define SBG_ECOM_AIDING_DVL_RECV
Definition: sbgEComBinaryLogStatus.h:101
SBG_ECOM_GPS_POS_GLO_L2_USED
#define SBG_ECOM_GPS_POS_GLO_L2_USED
Definition: sbgEComBinaryLogGps.h:57
_SbgLogGpsVel
Definition: sbgEComBinaryLogGps.h:268
sbg::MessageWrapper::use_enu_
bool use_enu_
Definition: message_wrapper.h:93
sbg::MessageWrapper::createSbgImuDataMessage
const sbg_driver::SbgImuData createSbgImuDataMessage(const SbgLogImuData &ref_log_imu_data) const
Definition: message_wrapper.cpp:579
_SbgLogAirData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogAirData.h:52
_SbgLogMagCalib::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogMag.h:66
_SbgLogEkfQuatData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogEkf.h:124
_SbgLogEkfNavData
Definition: sbgEComBinaryLogEkf.h:133
SBG_ECOM_PORTA_VALID
#define SBG_ECOM_PORTA_VALID
Definition: sbgEComBinaryLogStatus.h:50
_SbgLogGpsPos::latitude
double latitude
Definition: sbgEComBinaryLogGps.h:287
SBG_ECOM_HEAVE_PERIOD_VALID
#define SBG_ECOM_HEAVE_PERIOD_VALID
Definition: sbgEComBinaryLogShipMotion.h:34
sbg::MessageWrapper::createSbgGpsVelMessage
const sbg_driver::SbgGpsVel createSbgGpsVelMessage(const SbgLogGpsVel &ref_log_gps_vel) const
Definition: message_wrapper.cpp:541
SBG_ECOM_AIDING_GPS1_VEL_RECV
#define SBG_ECOM_AIDING_GPS1_VEL_RECV
Definition: sbgEComBinaryLogStatus.h:92
_SbgLogEkfEulerData::eulerStdDev
float eulerStdDev[3]
Definition: sbgEComBinaryLogEkf.h:115
_SbgLogShipMotionData
Definition: sbgEComBinaryLogShipMotion.h:48
SBG_ECOM_CAN_TX_OK
#define SBG_ECOM_CAN_TX_OK
Definition: sbgEComBinaryLogStatus.h:75
SBG_ECOM_GENERAL_GPS_POWER_OK
#define SBG_ECOM_GENERAL_GPS_POWER_OK
Definition: sbgEComBinaryLogStatus.h:31
SBG_ECOM_IMU_COM_OK
#define SBG_ECOM_IMU_COM_OK
This file is used to parse received IMU binary logs.
Definition: sbgEComBinaryLogImu.h:33
sbg::MessageWrapper::createRosImuMessage
const sensor_msgs::Imu createRosImuMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg, const sbg_driver::SbgEkfQuat &ref_sbg_quat_msg) const
Definition: message_wrapper.cpp:806
TimeBase< Time, Duration >::fromNSec
Time & fromNSec(uint64_t t)
ros::Time
_SbgLogUtcData::month
int8_t month
Definition: sbgEComBinaryLogUtc.h:117
sbg::helpers::clamp
const T & clamp(const T &value, const T &min, const T &max)
Definition: sbg_ros_helpers.h:137
sbg::MessageWrapper::createRosMagneticMessage
const sensor_msgs::MagneticField createRosMagneticMessage(const sbg_driver::SbgMag &ref_sbg_mag_msg) const
Definition: message_wrapper.cpp:964
sbg::MessageWrapper::createRosTemperatureMessage
const sensor_msgs::Temperature createRosTemperatureMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg) const
Definition: message_wrapper.cpp:953
SBG_ECOM_SOL_GPS2_HDT_USED
#define SBG_ECOM_SOL_GPS2_HDT_USED
Definition: sbgEComBinaryLogEkf.h:50
sbg::MessageWrapper::setOdomInitFrameId
void setOdomInitFrameId(const std::string &ref_frame_id)
Definition: message_wrapper.cpp:334
sbg::MessageWrapper::frame_id_
std::string frame_id_
Definition: message_wrapper.h:92
sbg::SbgVector3f
SbgVector3< float > SbgVector3f
Definition: sbg_vector3.h:182
SBG_ECOM_PORTB_RX_OK
#define SBG_ECOM_PORTB_RX_OK
Definition: sbgEComBinaryLogStatus.h:58
SBG_ECOM_SOL_ODO_USED
#define SBG_ECOM_SOL_ODO_USED
Definition: sbgEComBinaryLogEkf.h:51
SBG_ECOM_IMU_GYROS_IN_RANGE
#define SBG_ECOM_IMU_GYROS_IN_RANGE
Definition: sbgEComBinaryLogImu.h:45
_SbgLogGpsPos::status
uint32_t status
Definition: sbgEComBinaryLogGps.h:285
sbg::MessageWrapper::createSbgMagMessage
const sbg_driver::SbgMag createSbgMagMessage(const SbgLogMag &ref_log_mag) const
Definition: message_wrapper.cpp:628
SBG_ECOM_EVENT_OFFSET_0_VALID
#define SBG_ECOM_EVENT_OFFSET_0_VALID
Definition: sbgEComBinaryLogEvent.h:34
sbg::MessageWrapper::tf_broadcaster_
tf2_ros::TransformBroadcaster tf_broadcaster_
Definition: message_wrapper.h:102
_SbgLogMag
Definition: sbgEComBinaryLogMag.h:53
SBG_ECOM_POS_SOL_COMPUTED
@ SBG_ECOM_POS_SOL_COMPUTED
Definition: sbgEComBinaryLogGps.h:115
SBG_ECOM_CLOCK_VALID
@ SBG_ECOM_CLOCK_VALID
Definition: sbgEComBinaryLogUtc.h:52
_SbgLogImuData::deltaVelocity
float deltaVelocity[3]
Definition: sbgEComBinaryLogImu.h:61
_SbgLogImuShort::temperature
int16_t temperature
Definition: sbgEComBinaryLogImu.h:75
sbg::MessageWrapper::utm_
Utm utm_
Definition: message_wrapper.h:105
SBG_ECOM_PORTD_VALID
#define SBG_ECOM_PORTD_VALID
Definition: sbgEComBinaryLogStatus.h:53
SBG_ECOM_PORTE_TX_OK
#define SBG_ECOM_PORTE_TX_OK
Definition: sbgEComBinaryLogStatus.h:65
sbg::MessageWrapper::createSbgOdoVelMessage
const sbg_driver::SbgOdoVel createSbgOdoVelMessage(const SbgLogOdometerData &ref_log_odo) const
Definition: message_wrapper.cpp:670
SBG_ECOM_PORTA_RX_OK
#define SBG_ECOM_PORTA_RX_OK
Definition: sbgEComBinaryLogStatus.h:56
TimeBase< Time, Duration >::toNSec
uint64_t toNSec() const
sbg::MessageWrapper::createSbgShipMotionMessage
const sbg_driver::SbgShipMotion createSbgShipMotionMessage(const SbgLogShipMotionData &ref_log_ship_motion) const
Definition: message_wrapper.cpp:683
SBG_ECOM_GPS_POS_GLO_L1_USED
#define SBG_ECOM_GPS_POS_GLO_L1_USED
Definition: sbgEComBinaryLogGps.h:56
static_transform_broadcaster.h
SBG_ECOM_MAG_MAG_Z_BIT
#define SBG_ECOM_MAG_MAG_Z_BIT
Definition: sbgEComBinaryLogMag.h:35
sbg::MessageWrapper::odom_init_frame_id_
std::string odom_init_frame_id_
Definition: message_wrapper.h:100
tf2::Quaternion
_SbgLogGpsVel::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogGps.h:270
sbg::TimeReference::INS_UNIX
@ INS_UNIX
_SbgLogImuShort
Definition: sbgEComBinaryLogImu.h:69
SBG_ECOM_AIR_DATA_AIRPSEED_VALID
#define SBG_ECOM_AIR_DATA_AIRPSEED_VALID
Definition: sbgEComBinaryLogAirData.h:40
tf2_geometry_msgs.h
SBG_ECOM_MAG_MAG_Y_BIT
#define SBG_ECOM_MAG_MAG_Y_BIT
Definition: sbgEComBinaryLogMag.h:34
tf2::toMsg
B toMsg(const A &a)
SBG_ECOM_SOL_GPS1_HDT_USED
#define SBG_ECOM_SOL_GPS1_HDT_USED
Definition: sbgEComBinaryLogEkf.h:47
SBG_ECOM_CLOCK_STABLE_INPUT
#define SBG_ECOM_CLOCK_STABLE_INPUT
Definition: sbgEComBinaryLogUtc.h:41
_SbgLogAirData::pressureDiff
float pressureDiff
Definition: sbgEComBinaryLogAirData.h:56
_SbgLogStatusData::generalStatus
uint16_t generalStatus
Definition: sbgEComBinaryLogStatus.h:119
_SbgLogImuData::accelerometers
float accelerometers[3]
Definition: sbgEComBinaryLogImu.h:58
SBG_ECOM_GENERAL_IMU_POWER_OK
#define SBG_ECOM_GENERAL_IMU_POWER_OK
Definition: sbgEComBinaryLogStatus.h:30
SBG_ECOM_AIDING_MAG_RECV
#define SBG_ECOM_AIDING_MAG_RECV
Definition: sbgEComBinaryLogStatus.h:99
SBG_ECOM_MAG_ACCEL_Y_BIT
#define SBG_ECOM_MAG_ACCEL_Y_BIT
Definition: sbgEComBinaryLogMag.h:38
SBG_ECOM_IMU_STATUS_BIT
#define SBG_ECOM_IMU_STATUS_BIT
Definition: sbgEComBinaryLogImu.h:34
SBG_ECOM_IMU_ACCEL_Y_BIT
#define SBG_ECOM_IMU_ACCEL_Y_BIT
Definition: sbgEComBinaryLogImu.h:37
_SbgLogGpsPos::timeOfWeek
uint32_t timeOfWeek
Definition: sbgEComBinaryLogGps.h:286
sbg::MessageWrapper::createSbgGpsRawMessage
const sbg_driver::SbgGpsRaw createSbgGpsRawMessage(const SbgLogGpsRaw &ref_log_gps_raw) const
Definition: message_wrapper.cpp:532
sbg::MessageWrapper::createSbgEkfQuatMessage
const sbg_driver::SbgEkfQuat createSbgEkfQuatMessage(const SbgLogEkfQuatData &ref_log_ekf_quat) const
Definition: message_wrapper.cpp:416
sbg::SbgMatrix3::makeDcm
void makeDcm(const SbgVector3f &euler)
Definition: sbg_matrix3.h:195
_SbgLogEkfNavData::position
double position[3]
Definition: sbgEComBinaryLogEkf.h:138
sbg::helpers::wrapAnglePi
float wrapAnglePi(float angle_rad)
Definition: sbg_ros_helpers.cpp:10
sbgEComLogUtcGetClockStatus
SBG_INLINE SbgEComClockStatus sbgEComLogUtcGetClockStatus(uint16_t status)
Definition: sbgEComBinaryLogUtc.h:74
sbg::MessageWrapper::createNmeaGGAMessageForNtrip
const nmea_msgs::Sentence createNmeaGGAMessageForNtrip(const SbgLogGpsPos &ref_log_gps_pos) const
Definition: message_wrapper.cpp:1090
_SbgLogImuShort::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogImu.h:71
sbg::MessageWrapper::createSbgEkfEulerMessage
const sbg_driver::SbgEkfEuler createSbgEkfEulerMessage(const SbgLogEkfEulerData &ref_log_ekf_euler) const
Definition: message_wrapper.cpp:343
sbg::MessageWrapper::setOdomPublishTf
void setOdomPublishTf(bool publish_tf)
Definition: message_wrapper.cpp:319
sbg_vector3.h
Handle a X,Y,Z vector.
_SbgLogGpsPos::altitude
double altitude
Definition: sbgEComBinaryLogGps.h:289
header
const std::string header
ROS_INFO
#define ROS_INFO(...)
_SbgLogAirData::airTemperature
float airTemperature
Definition: sbgEComBinaryLogAirData.h:58
_SbgLogStatusData::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogStatus.h:118
sbg::MessageWrapper::createUtcStatusMessage
const sbg_driver::SbgUtcTimeStatus createUtcStatusMessage(const SbgLogUtcData &ref_log_utc) const
Definition: message_wrapper.cpp:268
SBG_ECOM_PORTD_RX_OK
#define SBG_ECOM_PORTD_RX_OK
Definition: sbgEComBinaryLogStatus.h:62
sbgEComLogGpsPosGetStatus
SBG_INLINE SbgEComGpsPosStatus sbgEComLogGpsPosGetStatus(uint32_t status)
Definition: sbgEComBinaryLogGps.h:202
sbg::MessageWrapper::createRosFluidPressureMessage
const sensor_msgs::FluidPressure createRosFluidPressureMessage(const sbg_driver::SbgAirData &ref_sbg_air_msg) const
Definition: message_wrapper.cpp:1079
SBG_ECOM_PORTC_RX_OK
#define SBG_ECOM_PORTC_RX_OK
Definition: sbgEComBinaryLogStatus.h:60
sbg::Utm::getLetterDesignator
char getLetterDesignator() const
Definition: sbg_utm.cpp:37
SBG_ECOM_IMU_GYRO_X_BIT
#define SBG_ECOM_IMU_GYRO_X_BIT
Definition: sbgEComBinaryLogImu.h:40
_SbgLogAirData::status
uint16_t status
Definition: sbgEComBinaryLogAirData.h:53
SBG_ECOM_MAG_ACCEL_Z_BIT
#define SBG_ECOM_MAG_ACCEL_Z_BIT
Definition: sbgEComBinaryLogMag.h:39
_SbgLogGpsPos::timeStamp
uint32_t timeStamp
Definition: sbgEComBinaryLogGps.h:284
sbg::MessageWrapper::createMagStatusMessage
const sbg_driver::SbgMagStatus createMagStatusMessage(const SbgLogMag &ref_log_mag) const
Definition: message_wrapper.cpp:180
_SbgLogEvent::status
uint16_t status
Definition: sbgEComBinaryLogEvent.h:49
sbg::MessageWrapper::createSbgImuShortMessage
const sbg_driver::SbgImuShort createSbgImuShortMessage(const SbgLogImuShort &ref_short_imu_log) const
Definition: message_wrapper.cpp:773
sbg::MessageWrapper::odom_frame_id_
std::string odom_frame_id_
Definition: message_wrapper.h:98
_SbgLogGpsHdt::pitch
float pitch
Definition: sbgEComBinaryLogGps.h:309
_SbgLogUtcData::gpsTimeOfWeek
uint32_t gpsTimeOfWeek
Definition: sbgEComBinaryLogUtc.h:123
sbg::MessageWrapper::createShipMotionStatusMessage
const sbg_driver::SbgShipMotionStatus createShipMotionStatusMessage(const SbgLogShipMotionData &ref_log_ship_motion) const
Definition: message_wrapper.cpp:199
SBG_ECOM_AIR_DATA_TIME_IS_DELAY
#define SBG_ECOM_AIR_DATA_TIME_IS_DELAY
Definition: sbgEComBinaryLogAirData.h:36
sbg::MessageWrapper::createGpsVelStatusMessage
const sbg_driver::SbgGpsVelStatus createGpsVelStatusMessage(const SbgLogGpsVel &ref_log_gps_vel) const
Definition: message_wrapper.cpp:150
sbg::MessageWrapper::last_sbg_utc_
sbg_driver::SbgUtcTime last_sbg_utc_
Definition: message_wrapper.h:90
SBG_ECOM_PORTC_TX_OK
#define SBG_ECOM_PORTC_TX_OK
Definition: sbgEComBinaryLogStatus.h:61
sbgEComLogEkfGetSolutionMode
SBG_INLINE SbgEComSolutionMode sbgEComLogEkfGetSolutionMode(uint32_t status)
Definition: sbgEComBinaryLogEkf.h:84
SBG_ECOM_SOL_MAG_REF_USED
#define SBG_ECOM_SOL_MAG_REF_USED
Definition: sbgEComBinaryLogEkf.h:44
_SbgLogGpsRaw::bufferSize
size_t bufferSize
Definition: sbgEComBinaryLogGps.h:320
sbg::MessageWrapper
Definition: message_wrapper.h:87
_SbgLogGpsHdt::baseline
float baseline
Definition: sbgEComBinaryLogGps.h:311
_SbgLogGpsVel::velocityAcc
float velocityAcc[3]
Definition: sbgEComBinaryLogGps.h:274
_SbgLogEkfNavData::velocity
float velocity[3]
Definition: sbgEComBinaryLogEkf.h:136
_SbgLogGpsHdt::pitchAccuracy
float pitchAccuracy
Definition: sbgEComBinaryLogGps.h:310
_SbgLogGpsVel::courseAcc
float courseAcc
Definition: sbgEComBinaryLogGps.h:276
sbg::MessageWrapper::createRosPointStampedMessage
const geometry_msgs::PointStamped createRosPointStampedMessage(const sbg_driver::SbgEkfNav &ref_sbg_ekf_msg) const
Definition: message_wrapper.cpp:1009
_SbgLogImuData::deltaAngle
float deltaAngle[3]
Definition: sbgEComBinaryLogImu.h:62
_SbgLogGpsPos::numSvUsed
uint8_t numSvUsed
Definition: sbgEComBinaryLogGps.h:294
ros::Time::now
static Time now()
_SbgLogGpsRaw
Definition: sbgEComBinaryLogGps.h:317
SBG_ECOM_MAG_ACCELS_IN_RANGE
#define SBG_ECOM_MAG_ACCELS_IN_RANGE
Definition: sbgEComBinaryLogMag.h:42
sbg::MessageWrapper::createStatusComMessage
const sbg_driver::SbgStatusCom createStatusComMessage(const SbgLogStatusData &ref_log_status) const
Definition: message_wrapper.cpp:227
sbg::MessageWrapper::createRosUtcTimeReferenceMessage
const sensor_msgs::TimeReference createRosUtcTimeReferenceMessage(const sbg_driver::SbgUtcTime &ref_sbg_utc_msg) const
Definition: message_wrapper.cpp:1023


sbg_driver
Author(s): SBG Systems
autogenerated on Fri Oct 11 2024 02:13:40