message_wrapper.cpp
Go to the documentation of this file.
1 // File header
2 #include "message_wrapper.h"
3 
4 // Project headers
5 #include <sbg_vector3.h>
6 
8 
12 //---------------------------------------------------------------------//
13 //- Constructor -//
14 //---------------------------------------------------------------------//
15 
16 MessageWrapper::MessageWrapper(void):
17 m_first_valid_utc_(false)
18 {
19 
20 }
21 
22 //---------------------------------------------------------------------//
23 //- Internal methods -//
24 //---------------------------------------------------------------------//
25 
26 const std_msgs::Header MessageWrapper::createRosHeader(uint32_t device_timestamp) const
27 {
28  std_msgs::Header header;
29 
30  if (!m_first_valid_utc_)
31  {
32  header.stamp = m_ros_processing_time_;
33  header.frame_id = "System";
34  }
35  else
36  {
37  header.stamp = computeCorrectedRosTime(device_timestamp);
38 
39  std::string frame_header;
40  frame_header = "UTC";
41 
42  if (m_last_sbg_utc_.clock_status.clock_utc_status == SBG_ECOM_UTC_INVALID)
43  {
44  frame_header += " INTERNAL";
45  }
46  else
47  {
48  if (m_last_sbg_utc_.clock_status.clock_utc_status == SBG_ECOM_UTC_NO_LEAP_SEC)
49  {
50  frame_header += " NO LEAP";
51  }
52 
53  if (m_last_sbg_utc_.clock_status.clock_utc_sync)
54  {
55  if (m_last_sbg_utc_.clock_status.clock_status == SBG_ECOM_CLOCK_STEERING)
56  {
57  frame_header += " | SYNCHRONIZING";
58  }
59  else if (m_last_sbg_utc_.clock_status.clock_status == SBG_ECOM_CLOCK_VALID)
60  {
61  frame_header += " | SYNC";
62  }
63  }
64  else
65  {
66  frame_header += " | NOT SYNC";
67  }
68  }
69 
70  header.frame_id = frame_header;
71  }
72 
73  return header;
74 }
75 
76 const ros::Time MessageWrapper::computeCorrectedRosTime(uint32_t device_timestamp) const
77 {
78  //
79  // Convert the UTC time to epoch from the last received message.
80  // Add the SBG timestamp difference (timestamp is in microsecond).
81  //
82  ros::Time utc_to_epoch;
83  uint32_t device_timestamp_diff;
84  uint64_t nanoseconds;
85 
86  utc_to_epoch = convertUtcTimeToEpoch(m_last_sbg_utc_);
87  device_timestamp_diff = device_timestamp - m_last_sbg_utc_.time_stamp;
88 
89  nanoseconds = utc_to_epoch.toNSec() + static_cast<uint64_t>(device_timestamp_diff) * 1000;
90 
91  utc_to_epoch.fromNSec(nanoseconds);
92 
93  return utc_to_epoch;
94 }
95 
96 const sbg_driver::SbgEkfStatus MessageWrapper::createEkfStatusMessage(uint32_t ekf_status) const
97 {
98  sbg_driver::SbgEkfStatus ekf_status_message;
99 
100  ekf_status_message.solution_mode = sbgEComLogEkfGetSolutionMode(ekf_status);
101  ekf_status_message.attitude_valid = (ekf_status & SBG_ECOM_SOL_ATTITUDE_VALID) != 0;
102  ekf_status_message.heading_valid = (ekf_status & SBG_ECOM_SOL_HEADING_VALID) != 0;
103  ekf_status_message.velocity_valid = (ekf_status & SBG_ECOM_SOL_VELOCITY_VALID) != 0;
104  ekf_status_message.position_valid = (ekf_status & SBG_ECOM_SOL_POSITION_VALID) != 0;
105 
106  ekf_status_message.vert_ref_used = (ekf_status & SBG_ECOM_SOL_VERT_REF_USED) != 0;
107  ekf_status_message.mag_ref_used = (ekf_status & SBG_ECOM_SOL_MAG_REF_USED) != 0;
108  ekf_status_message.gps1_vel_used = (ekf_status & SBG_ECOM_SOL_GPS1_VEL_USED) != 0;
109  ekf_status_message.gps1_pos_used = (ekf_status & SBG_ECOM_SOL_GPS1_POS_USED) != 0;
110  ekf_status_message.gps1_course_used = (ekf_status & SBG_ECOM_SOL_GPS1_HDT_USED) != 0;
111  ekf_status_message.gps1_hdt_used = (ekf_status & SBG_ECOM_SOL_GPS1_HDT_USED) != 0;
112  ekf_status_message.gps2_vel_used = (ekf_status & SBG_ECOM_SOL_GPS2_VEL_USED) != 0;
113  ekf_status_message.gps2_pos_used = (ekf_status & SBG_ECOM_SOL_GPS2_POS_USED) != 0;
114  ekf_status_message.gps2_course_used = (ekf_status & SBG_ECOM_SOL_GPS2_POS_USED) != 0;
115  ekf_status_message.gps2_hdt_used = (ekf_status & SBG_ECOM_SOL_GPS2_HDT_USED) != 0;
116  ekf_status_message.odo_used = (ekf_status & SBG_ECOM_SOL_ODO_USED) != 0;
117 
118  return ekf_status_message;
119 }
120 
121 const sbg_driver::SbgGpsPosStatus MessageWrapper::createGpsPosStatusMessage(const SbgLogGpsPos& ref_log_gps_pos) const
122 {
123  sbg_driver::SbgGpsPosStatus gps_pos_status_message;
124 
125  gps_pos_status_message.status = sbgEComLogGpsPosGetStatus(ref_log_gps_pos.status);
126  gps_pos_status_message.type = sbgEComLogGpsPosGetType(ref_log_gps_pos.status);
127  gps_pos_status_message.gps_l1_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L1_USED) != 0;
128  gps_pos_status_message.gps_l2_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L2_USED) != 0;
129  gps_pos_status_message.gps_l5_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GPS_L5_USED) != 0;
130  gps_pos_status_message.glo_l1_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GLO_L1_USED) != 0;
131  gps_pos_status_message.glo_l2_used = (ref_log_gps_pos.status & SBG_ECOM_GPS_POS_GLO_L2_USED) != 0;
132 
133  return gps_pos_status_message;
134 }
135 
136 const sbg_driver::SbgGpsVelStatus MessageWrapper::createGpsVelStatusMessage(const SbgLogGpsVel& ref_log_gps_vel) const
137 {
138  sbg_driver::SbgGpsVelStatus gps_vel_status_message;
139 
140  gps_vel_status_message.vel_status = sbgEComLogGpsVelGetStatus(ref_log_gps_vel.status);
141  gps_vel_status_message.vel_type = sbgEComLogGpsVelGetType(ref_log_gps_vel.status);
142 
143  return gps_vel_status_message;
144 }
145 
146 const sbg_driver::SbgImuStatus MessageWrapper::createImuStatusMessage(uint16_t sbg_imu_status) const
147 {
148  sbg_driver::SbgImuStatus imu_status_message;
149 
150  imu_status_message.imu_com = (sbg_imu_status & SBG_ECOM_IMU_COM_OK) != 0;
151  imu_status_message.imu_status = (sbg_imu_status & SBG_ECOM_IMU_STATUS_BIT) != 0 ;
152  imu_status_message.imu_accel_x = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_X_BIT) != 0;
153  imu_status_message.imu_accel_y = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_Y_BIT) != 0;
154  imu_status_message.imu_accel_z = (sbg_imu_status & SBG_ECOM_IMU_ACCEL_Z_BIT) != 0;
155  imu_status_message.imu_gyro_x = (sbg_imu_status & SBG_ECOM_IMU_GYRO_X_BIT) != 0;
156  imu_status_message.imu_gyro_y = (sbg_imu_status & SBG_ECOM_IMU_GYRO_Y_BIT) != 0;
157  imu_status_message.imu_gyro_z = (sbg_imu_status & SBG_ECOM_IMU_GYRO_Z_BIT) != 0;
158  imu_status_message.imu_accels_in_range = (sbg_imu_status & SBG_ECOM_IMU_ACCELS_IN_RANGE) != 0;
159  imu_status_message.imu_gyros_in_range = (sbg_imu_status & SBG_ECOM_IMU_GYROS_IN_RANGE) != 0;
160 
161  return imu_status_message;
162 }
163 
164 const sbg_driver::SbgMagStatus MessageWrapper::createMagStatusMessage(const SbgLogMag& ref_log_mag) const
165 {
166  sbg_driver::SbgMagStatus mag_status_message;
167 
168  mag_status_message.mag_x = (ref_log_mag.status & SBG_ECOM_MAG_MAG_X_BIT) != 0;
169  mag_status_message.mag_y = (ref_log_mag.status & SBG_ECOM_MAG_MAG_Y_BIT) != 0;
170  mag_status_message.mag_z = (ref_log_mag.status & SBG_ECOM_MAG_MAG_Z_BIT) != 0;
171  mag_status_message.accel_x = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_X_BIT) != 0;
172  mag_status_message.accel_y = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_Y_BIT) != 0;
173  mag_status_message.accel_z = (ref_log_mag.status & SBG_ECOM_MAG_ACCEL_Z_BIT) != 0;
174  mag_status_message.mags_in_range = (ref_log_mag.status & SBG_ECOM_MAG_MAGS_IN_RANGE) != 0;
175  mag_status_message.accels_in_range = (ref_log_mag.status & SBG_ECOM_MAG_ACCELS_IN_RANGE) != 0;
176  mag_status_message.calibration = (ref_log_mag.status & SBG_ECOM_MAG_CALIBRATION_OK) != 0;
177 
178  return mag_status_message;
179 }
180 
181 const sbg_driver::SbgShipMotionStatus MessageWrapper::createShipMotionStatusMessage(const SbgLogShipMotionData& ref_log_ship_motion) const
182 {
183  sbg_driver::SbgShipMotionStatus ship_motion_status_message;
184 
185  ship_motion_status_message.heave_valid = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_VALID) != 0;
186  ship_motion_status_message.heave_vel_aided = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_VEL_AIDED) != 0;
187  ship_motion_status_message.period_available = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_PERIOD_INCLUDED) != 0;
188  ship_motion_status_message.period_valid = (ref_log_ship_motion.status & SBG_ECOM_HEAVE_PERIOD_VALID) != 0;
189 
190  return ship_motion_status_message;
191 }
192 
193 const sbg_driver::SbgStatusAiding MessageWrapper::createStatusAidingMessage(const SbgLogStatusData& ref_log_status) const
194 {
195  sbg_driver::SbgStatusAiding status_aiding_message;
196 
197  status_aiding_message.gps1_pos_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_POS_RECV) != 0;
198  status_aiding_message.gps1_vel_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_VEL_RECV) != 0;
199  status_aiding_message.gps1_hdt_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_HDT_RECV) != 0;
200  status_aiding_message.gps1_utc_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_GPS1_UTC_RECV) != 0;
201 
202  status_aiding_message.mag_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_MAG_RECV) != 0;
203  status_aiding_message.odo_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_ODO_RECV) != 0;
204  status_aiding_message.dvl_recv = (ref_log_status.aidingStatus & SBG_ECOM_AIDING_DVL_RECV) != 0;
205 
206  return status_aiding_message;
207 }
208 
209 const sbg_driver::SbgStatusCom MessageWrapper::createStatusComMessage(const SbgLogStatusData& ref_log_status) const
210 {
211  sbg_driver::SbgStatusCom status_com_message;
212 
213  status_com_message.port_a = (ref_log_status.comStatus & SBG_ECOM_PORTA_VALID) != 0;
214  status_com_message.port_b = (ref_log_status.comStatus & SBG_ECOM_PORTB_VALID) != 0;
215  status_com_message.port_c = (ref_log_status.comStatus & SBG_ECOM_PORTC_VALID) != 0;
216  status_com_message.port_d = (ref_log_status.comStatus & SBG_ECOM_PORTD_VALID) != 0;
217  status_com_message.port_e = (ref_log_status.comStatus & SBG_ECOM_PORTE_VALID) != 0;
218 
219  status_com_message.port_a_rx = (ref_log_status.comStatus & SBG_ECOM_PORTA_RX_OK) != 0;
220  status_com_message.port_a_tx = (ref_log_status.comStatus & SBG_ECOM_PORTA_TX_OK) != 0;
221  status_com_message.port_b_rx = (ref_log_status.comStatus & SBG_ECOM_PORTB_RX_OK) != 0;
222  status_com_message.port_b_tx = (ref_log_status.comStatus & SBG_ECOM_PORTB_TX_OK) != 0;
223  status_com_message.port_c_rx = (ref_log_status.comStatus & SBG_ECOM_PORTC_RX_OK) != 0;
224  status_com_message.port_c_tx = (ref_log_status.comStatus & SBG_ECOM_PORTC_TX_OK) != 0;
225  status_com_message.port_d_rx = (ref_log_status.comStatus & SBG_ECOM_PORTD_RX_OK) != 0;
226  status_com_message.port_d_tx = (ref_log_status.comStatus & SBG_ECOM_PORTD_TX_OK) != 0;
227  status_com_message.port_e_rx = (ref_log_status.comStatus & SBG_ECOM_PORTE_RX_OK) != 0;
228  status_com_message.port_e_tx = (ref_log_status.comStatus & SBG_ECOM_PORTE_TX_OK) != 0;
229 
230  status_com_message.can_rx = (ref_log_status.comStatus & SBG_ECOM_CAN_RX_OK) != 0;
231  status_com_message.can_tx = (ref_log_status.comStatus & SBG_ECOM_CAN_TX_OK) != 0;
232  status_com_message.can_status = (ref_log_status.comStatus & SBG_ECOM_CAN_VALID) != 0;
233 
234  return status_com_message;
235 }
236 
237 const sbg_driver::SbgStatusGeneral MessageWrapper::createStatusGeneralMessage(const SbgLogStatusData& ref_log_status) const
238 {
239  sbg_driver::SbgStatusGeneral status_general_message;
240 
241  status_general_message.main_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_MAIN_POWER_OK) != 0;
242  status_general_message.imu_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_IMU_POWER_OK) != 0;
243  status_general_message.gps_power = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_GPS_POWER_OK) != 0;
244  status_general_message.settings = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_SETTINGS_OK) != 0;
245  status_general_message.temperature = (ref_log_status.generalStatus & SBG_ECOM_GENERAL_TEMPERATURE_OK) != 0;
246 
247  return status_general_message;
248 }
249 
250 const sbg_driver::SbgUtcTimeStatus MessageWrapper::createUtcStatusMessage(const SbgLogUtcData& ref_log_utc) const
251 {
252  sbg_driver::SbgUtcTimeStatus utc_status_message;
253 
254  utc_status_message.clock_stable = (ref_log_utc.status & SBG_ECOM_CLOCK_STABLE_INPUT) != 0;
255  utc_status_message.clock_utc_sync = (ref_log_utc.status & SBG_ECOM_CLOCK_UTC_SYNC) != 0;
256 
257  utc_status_message.clock_status = static_cast<uint8_t>(sbgEComLogUtcGetClockStatus(ref_log_utc.status));
258  utc_status_message.clock_utc_status = static_cast<uint8_t>(sbgEComLogUtcGetClockUtcStatus(ref_log_utc.status));
259 
260  return utc_status_message;
261 }
262 
263 uint32_t MessageWrapper::getNumberOfDaysInYear(uint16_t year) const
264 {
265  if (isLeapYear(year))
266  {
267  return 366;
268  }
269  else
270  {
271  return 365;
272  }
273 }
274 
275 uint32_t MessageWrapper::getNumberOfDaysInMonth(uint16_t year, uint8_t month_index) const
276 {
277  if ((month_index == 4) || (month_index == 6) || (month_index == 9) || (month_index == 11))
278  {
279  return 30;
280  }
281  else if ((month_index == 2))
282  {
283  if (isLeapYear(year))
284  {
285  return 29;
286  }
287  else
288  {
289  return 28;
290  }
291  }
292  else
293  {
294  return 31;
295  }
296 }
297 
298 bool MessageWrapper::isLeapYear(uint16_t year) const
299 {
300  return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
301 }
302 
303 const ros::Time MessageWrapper::convertUtcTimeToEpoch(const sbg_driver::SbgUtcTime& ref_sbg_utc_msg) const
304 {
305  ros::Time utc_to_epoch;
306  uint32_t days;
307  uint64_t nanoseconds;
308 
309  //
310  // Convert the UTC time to Epoch(Unix) time, which is the elasped seconds since 1 Jan 1970.
311  //
312  days = 0;
313  nanoseconds = 0;
314 
315  for (uint16_t yearIndex = 1970; yearIndex < ref_sbg_utc_msg.year; yearIndex++)
316  {
317  days += getNumberOfDaysInYear(yearIndex);
318  }
319 
320  for (uint8_t monthIndex = 1; monthIndex < ref_sbg_utc_msg.month; monthIndex++)
321  {
322  days += getNumberOfDaysInMonth(ref_sbg_utc_msg.year, monthIndex);
323  }
324 
325  days += ref_sbg_utc_msg.day - 1;
326 
327  nanoseconds = days * 24;
328  nanoseconds = (nanoseconds + ref_sbg_utc_msg.hour) * 60;
329  nanoseconds = (nanoseconds + ref_sbg_utc_msg.min) * 60;
330  nanoseconds = nanoseconds + ref_sbg_utc_msg.sec;
331  nanoseconds = nanoseconds * 1000000000 + ref_sbg_utc_msg.nanosec;
332 
333  utc_to_epoch.fromNSec(nanoseconds);
334 
335  return utc_to_epoch;
336 }
337 
338 const sbg_driver::SbgAirDataStatus MessageWrapper::createAirDataStatusMessage(const SbgLogAirData& ref_sbg_air_data) const
339 {
340  sbg_driver::SbgAirDataStatus air_data_status_message;
341 
342  air_data_status_message.is_delay_time = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_TIME_IS_DELAY) != 0;
343  air_data_status_message.pressure_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_PRESSURE_ABS_VALID) != 0;
344  air_data_status_message.altitude_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_ALTITUDE_VALID) != 0;
345  air_data_status_message.pressure_diff_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_PRESSURE_DIFF_VALID) != 0;
346  air_data_status_message.air_speed_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_AIRPSEED_VALID) != 0;
347  air_data_status_message.air_temperature_valid = (ref_sbg_air_data.status & SBG_ECOM_AIR_DATA_TEMPERATURE_VALID) != 0;
348 
349  return air_data_status_message;
350 }
351 
352 //---------------------------------------------------------------------//
353 //- Parameters -//
354 //---------------------------------------------------------------------//
355 
357 {
358  m_ros_processing_time_ = ref_ros_time;
359 }
360 
361 //---------------------------------------------------------------------//
362 //- Operations -//
363 //---------------------------------------------------------------------//
364 
365 const sbg_driver::SbgEkfEuler MessageWrapper::createSbgEkfEulerMessage(const SbgLogEkfEulerData& ref_log_ekf_euler) const
366 {
367  sbg_driver::SbgEkfEuler ekf_euler_message;
368 
369  ekf_euler_message.header = createRosHeader(ref_log_ekf_euler.timeStamp);
370  ekf_euler_message.time_stamp = ref_log_ekf_euler.timeStamp;
371  ekf_euler_message.status = createEkfStatusMessage(ref_log_ekf_euler.status);
372  ekf_euler_message.angle = createGeometryVector3<float>(ref_log_ekf_euler.euler, 3);
373  ekf_euler_message.accuracy = createGeometryVector3<float>(ref_log_ekf_euler.eulerStdDev, 3);
374 
375  return ekf_euler_message;
376 }
377 
378 const sbg_driver::SbgEkfNav MessageWrapper::createSbgEkfNavMessage(const SbgLogEkfNavData& ref_log_ekf_nav) const
379 {
380  sbg_driver::SbgEkfNav ekf_nav_message;
381 
382  ekf_nav_message.header = createRosHeader(ref_log_ekf_nav.timeStamp);
383  ekf_nav_message.time_stamp = ekf_nav_message.time_stamp;
384  ekf_nav_message.status = createEkfStatusMessage(ref_log_ekf_nav.status);
385  ekf_nav_message.undulation = ref_log_ekf_nav.undulation;
386 
387  ekf_nav_message.velocity = createGeometryVector3<float>(ref_log_ekf_nav.velocity, 3);
388  ekf_nav_message.velocity_accuracy = createGeometryVector3<float>(ref_log_ekf_nav.velocityStdDev, 3);
389  ekf_nav_message.position = createGeometryVector3<double>(ref_log_ekf_nav.position, 3);
390 
391  return ekf_nav_message;
392 }
393 
394 const sbg_driver::SbgEkfQuat MessageWrapper::createSbgEkfQuatMessage(const SbgLogEkfQuatData& ref_log_ekf_quat) const
395 {
396  sbg_driver::SbgEkfQuat ekf_quat_message;
397 
398  ekf_quat_message.header = createRosHeader(ref_log_ekf_quat.timeStamp);
399  ekf_quat_message.time_stamp = ref_log_ekf_quat.timeStamp;
400  ekf_quat_message.status = createEkfStatusMessage(ref_log_ekf_quat.status);
401  ekf_quat_message.accuracy = createGeometryVector3<float>(ref_log_ekf_quat.eulerStdDev, 3);
402  ekf_quat_message.quaternion.w = ref_log_ekf_quat.quaternion[0];
403  ekf_quat_message.quaternion.x = ref_log_ekf_quat.quaternion[1];
404  ekf_quat_message.quaternion.y = ref_log_ekf_quat.quaternion[2];
405  ekf_quat_message.quaternion.z = ref_log_ekf_quat.quaternion[3];
406 
407  return ekf_quat_message;
408 }
409 
410 const sbg_driver::SbgEvent MessageWrapper::createSbgEventMessage(const SbgLogEvent& ref_log_event) const
411 {
412  sbg_driver::SbgEvent event_message;
413 
414  event_message.header = createRosHeader(ref_log_event.timeStamp);
415  event_message.time_stamp = ref_log_event.timeStamp;
416 
417  event_message.overflow = (ref_log_event.status & SBG_ECOM_EVENT_OVERFLOW) != 0;
418  event_message.offset_0_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_0_VALID) != 0;
419  event_message.offset_1_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_1_VALID) != 0;
420  event_message.offset_2_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_2_VALID) != 0;
421  event_message.offset_3_valid = (ref_log_event.status & SBG_ECOM_EVENT_OFFSET_3_VALID) != 0;
422 
423  event_message.time_offset_0 = ref_log_event.timeOffset0;
424  event_message.time_offset_1 = ref_log_event.timeOffset1;
425  event_message.time_offset_2 = ref_log_event.timeOffset2;
426  event_message.time_offset_3 = ref_log_event.timeOffset3;
427 
428  return event_message;
429 }
430 
431 const sbg_driver::SbgGpsHdt MessageWrapper::createSbgGpsHdtMessage(const SbgLogGpsHdt& ref_log_gps_hdt) const
432 {
433  sbg_driver::SbgGpsHdt gps_hdt_message;
434 
435  gps_hdt_message.header = createRosHeader(ref_log_gps_hdt.timeStamp);
436  gps_hdt_message.time_stamp = ref_log_gps_hdt.timeStamp;
437 
438  gps_hdt_message.status = ref_log_gps_hdt.status;
439  gps_hdt_message.tow = ref_log_gps_hdt.timeOfWeek;
440  gps_hdt_message.true_heading = ref_log_gps_hdt.heading;
441  gps_hdt_message.true_heading_acc = ref_log_gps_hdt.headingAccuracy;
442  gps_hdt_message.pitch = ref_log_gps_hdt.pitch;
443  gps_hdt_message.pitch_acc = ref_log_gps_hdt.pitchAccuracy;
444 
445  return gps_hdt_message;
446 }
447 
448 const sbg_driver::SbgGpsPos MessageWrapper::createSbgGpsPosMessage(const SbgLogGpsPos& ref_log_gps_pos) const
449 {
450  sbg_driver::SbgGpsPos gps_pos_message;
451 
452  gps_pos_message.header = createRosHeader(ref_log_gps_pos.timeStamp);
453  gps_pos_message.time_stamp = ref_log_gps_pos.timeStamp;
454 
455  gps_pos_message.status = createGpsPosStatusMessage(ref_log_gps_pos);
456  gps_pos_message.gps_tow = ref_log_gps_pos.timeOfWeek;
457  gps_pos_message.position.x = ref_log_gps_pos.latitude;
458  gps_pos_message.position.y = ref_log_gps_pos.longitude;
459  gps_pos_message.position.z = ref_log_gps_pos.altitude;
460  gps_pos_message.undulation = ref_log_gps_pos.undulation;
461  gps_pos_message.position_accuracy.x = ref_log_gps_pos.latitudeAccuracy;
462  gps_pos_message.position_accuracy.y = ref_log_gps_pos.longitudeAccuracy;
463  gps_pos_message.position_accuracy.z = ref_log_gps_pos.altitudeAccuracy;
464  gps_pos_message.num_sv_used = ref_log_gps_pos.numSvUsed;
465  gps_pos_message.base_station_id = ref_log_gps_pos.baseStationId;
466  gps_pos_message.diff_age = ref_log_gps_pos.differentialAge;
467 
468  return gps_pos_message;
469 }
470 
471 const sbg_driver::SbgGpsRaw MessageWrapper::createSbgGpsRawMessage(const SbgLogGpsRaw& ref_log_gps_raw) const
472 {
473  sbg_driver::SbgGpsRaw gps_raw_message;
474 
475  gps_raw_message.data.assign(ref_log_gps_raw.rawBuffer, ref_log_gps_raw.rawBuffer + ref_log_gps_raw.bufferSize);
476 
477  return gps_raw_message;
478 }
479 
480 const sbg_driver::SbgGpsVel MessageWrapper::createSbgGpsVelMessage(const SbgLogGpsVel& ref_log_gps_vel) const
481 {
482  sbg_driver::SbgGpsVel gps_vel_message;
483 
484  gps_vel_message.header = createRosHeader(ref_log_gps_vel.timeStamp);
485  gps_vel_message.time_stamp = ref_log_gps_vel.timeStamp;
486  gps_vel_message.status = createGpsVelStatusMessage(ref_log_gps_vel);
487  gps_vel_message.gps_tow = ref_log_gps_vel.timeOfWeek;
488  gps_vel_message.course = ref_log_gps_vel.course;
489  gps_vel_message.course_acc = ref_log_gps_vel.courseAcc;
490  gps_vel_message.vel = createGeometryVector3<float>(ref_log_gps_vel.velocity, 3);
491  gps_vel_message.vel_acc = createGeometryVector3<float>(ref_log_gps_vel.velocityAcc, 3);
492 
493  return gps_vel_message;
494 }
495 
496 const sbg_driver::SbgImuData MessageWrapper::createSbgImuDataMessage(const SbgLogImuData& ref_log_imu_data) const
497 {
498  sbg_driver::SbgImuData imu_data_message;
499 
500  imu_data_message.header = createRosHeader(ref_log_imu_data.timeStamp);
501  imu_data_message.time_stamp = ref_log_imu_data.timeStamp;
502  imu_data_message.imu_status = createImuStatusMessage(ref_log_imu_data.status);
503  imu_data_message.temp = ref_log_imu_data.temperature;
504  imu_data_message.accel = createGeometryVector3<float>(ref_log_imu_data.accelerometers, 3);
505  imu_data_message.gyro = createGeometryVector3<float>(ref_log_imu_data.gyroscopes, 3);
506  imu_data_message.delta_vel = createGeometryVector3<float>(ref_log_imu_data.deltaVelocity, 3);
507  imu_data_message.delta_angle = createGeometryVector3<float>(ref_log_imu_data.deltaAngle, 3);
508 
509  return imu_data_message;
510 }
511 
512 const sbg_driver::SbgMag MessageWrapper::createSbgMagMessage(const SbgLogMag& ref_log_mag) const
513 {
514  sbg_driver::SbgMag mag_message;
515 
516  mag_message.header = createRosHeader(ref_log_mag.timeStamp);
517  mag_message.time_stamp = ref_log_mag.timeStamp;
518  mag_message.status = createMagStatusMessage(ref_log_mag);
519  mag_message.mag = createGeometryVector3<float>(ref_log_mag.magnetometers, 3);
520  mag_message.accel = createGeometryVector3<float>(ref_log_mag.accelerometers, 3);
521 
522  return mag_message;
523 }
524 
525 const sbg_driver::SbgMagCalib MessageWrapper::createSbgMagCalibMessage(const SbgLogMagCalib& ref_log_mag_calib) const
526 {
527  sbg_driver::SbgMagCalib mag_calib_message;
528 
529  // TODO. SbgMagCalib is not implemented.
530  mag_calib_message.header = createRosHeader(ref_log_mag_calib.timeStamp);
531 
532  return mag_calib_message;
533 }
534 
535 const sbg_driver::SbgOdoVel MessageWrapper::createSbgOdoVelMessage(const SbgLogOdometerData& ref_log_odo) const
536 {
537  sbg_driver::SbgOdoVel odo_vel_message;
538 
539  odo_vel_message.header = createRosHeader(ref_log_odo.timeStamp);
540  odo_vel_message.time_stamp = ref_log_odo.timeStamp;
541 
542  odo_vel_message.status = ref_log_odo.status;
543  odo_vel_message.vel = ref_log_odo.velocity;
544 
545  return odo_vel_message;
546 }
547 
548 const sbg_driver::SbgShipMotion MessageWrapper::createSbgShipMotionMessage(const SbgLogShipMotionData& ref_log_ship_motion) const
549 {
550  sbg_driver::SbgShipMotion ship_motion_message;
551 
552  ship_motion_message.header = createRosHeader(ref_log_ship_motion.timeStamp);
553  ship_motion_message.time_stamp = ref_log_ship_motion.timeStamp;
554  ship_motion_message.status = createShipMotionStatusMessage(ref_log_ship_motion);
555  ship_motion_message.ship_motion = createGeometryVector3<float>(ref_log_ship_motion.shipMotion, 3);
556  ship_motion_message.acceleration = createGeometryVector3<float>(ref_log_ship_motion.shipAccel, 3);
557  ship_motion_message.velocity = createGeometryVector3<float>(ref_log_ship_motion.shipVel, 3);
558 
559  return ship_motion_message;
560 }
561 
562 const sbg_driver::SbgStatus MessageWrapper::createSbgStatusMessage(const SbgLogStatusData& ref_log_status) const
563 {
564  sbg_driver::SbgStatus status_message;
565 
566  status_message.header = createRosHeader(ref_log_status.timeStamp);
567  status_message.time_stamp = ref_log_status.timeStamp;
568 
569  status_message.status_general = createStatusGeneralMessage(ref_log_status);
570  status_message.status_com = createStatusComMessage(ref_log_status);
571  status_message.status_aiding = createStatusAidingMessage(ref_log_status);
572 
573  return status_message;
574 }
575 
576 const sbg_driver::SbgUtcTime MessageWrapper::createSbgUtcTimeMessage(const SbgLogUtcData& ref_log_utc)
577 {
578  sbg_driver::SbgUtcTime utc_time_message;
579 
580  utc_time_message.header = createRosHeader(ref_log_utc.timeStamp);
581  utc_time_message.time_stamp = ref_log_utc.timeStamp;
582 
583  utc_time_message.clock_status = createUtcStatusMessage(ref_log_utc);
584  utc_time_message.year = ref_log_utc.year;
585  utc_time_message.month = ref_log_utc.month;
586  utc_time_message.day = ref_log_utc.day;
587  utc_time_message.hour = ref_log_utc.hour;
588  utc_time_message.min = ref_log_utc.minute;
589  utc_time_message.sec = ref_log_utc.second;
590  utc_time_message.nanosec = ref_log_utc.nanoSecond;
591  utc_time_message.gps_tow = ref_log_utc.gpsTimeOfWeek;
592 
593  if (!m_first_valid_utc_)
594  {
595  if (utc_time_message.clock_status.clock_stable && utc_time_message.clock_status.clock_utc_sync)
596  {
597  if (utc_time_message.clock_status.clock_status == SBG_ECOM_CLOCK_VALID)
598  {
599  m_first_valid_utc_ = true;
600  ROS_INFO("A full valid UTC log has been detected, timestamp will be synchronized with the UTC data.");
601  }
602  }
603  }
604 
605  //
606  // Store the last UTC message.
607  //
608  m_last_sbg_utc_ = utc_time_message;
609 
610  return utc_time_message;
611 }
612 
613 const sbg_driver::SbgAirData MessageWrapper::createSbgAirDataMessage(const SbgLogAirData& ref_air_data_log) const
614 {
615  sbg_driver::SbgAirData air_data_message;
616 
617  air_data_message.header = createRosHeader(ref_air_data_log.timeStamp);
618  air_data_message.time_stamp = ref_air_data_log.timeStamp;
619  air_data_message.status = createAirDataStatusMessage(ref_air_data_log);
620  air_data_message.pressure_abs = ref_air_data_log.pressureAbs;
621  air_data_message.altitude = ref_air_data_log.altitude;
622  air_data_message.pressure_diff = ref_air_data_log.pressureDiff;
623  air_data_message.true_air_speed = ref_air_data_log.trueAirspeed;
624  air_data_message.air_temperature = ref_air_data_log.airTemperature;
625 
626  return air_data_message;
627 }
628 
629 const sbg_driver::SbgImuShort MessageWrapper::createSbgImuShortMessage(const SbgLogImuShort& ref_short_imu_log) const
630 {
631  sbg_driver::SbgImuShort imu_short_message;
632 
633  imu_short_message.header = createRosHeader(ref_short_imu_log.timeStamp);
634  imu_short_message.time_stamp = ref_short_imu_log.timeStamp;
635  imu_short_message.imu_status = createImuStatusMessage(ref_short_imu_log.status);
636  imu_short_message.temperature = ref_short_imu_log.temperature;
637  imu_short_message.delta_velocity = createGeometryVector3<int32_t>(ref_short_imu_log.deltaVelocity, 3);
638  imu_short_message.delta_angle = createGeometryVector3<int32_t>(ref_short_imu_log.deltaAngle, 3);
639 
640  return imu_short_message;
641 }
642 
643 const sensor_msgs::Imu MessageWrapper::createRosImuMessage(const sbg_driver::SbgImuData& ref_sbg_imu_msg, const sbg_driver::SbgEkfQuat& ref_sbg_quat_msg) const
644 {
645  sensor_msgs::Imu imu_ros_message;
646 
647  imu_ros_message.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
648 
649  imu_ros_message.orientation = ref_sbg_quat_msg.quaternion;
650  imu_ros_message.angular_velocity = ref_sbg_imu_msg.gyro;
651  imu_ros_message.angular_velocity_covariance[0] = -1;
652  imu_ros_message.linear_acceleration = ref_sbg_imu_msg.accel;
653  imu_ros_message.linear_acceleration_covariance[0] = -1;
654 
655  return imu_ros_message;
656 }
657 
658 const sensor_msgs::Temperature MessageWrapper::createRosTemperatureMessage(const sbg_driver::SbgImuData& ref_sbg_imu_msg) const
659 {
660  sensor_msgs::Temperature temperature_message;
661 
662  temperature_message.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
663  temperature_message.temperature = ref_sbg_imu_msg.temp;
664  temperature_message.variance = 0;
665 
666  return temperature_message;
667 }
668 
669 const sensor_msgs::MagneticField MessageWrapper::createRosMagneticMessage(const sbg_driver::SbgMag& ref_sbg_mag_msg) const
670 {
671  sensor_msgs::MagneticField magnetic_message;
672 
673  magnetic_message.header = createRosHeader(ref_sbg_mag_msg.time_stamp);
674  magnetic_message.magnetic_field = ref_sbg_mag_msg.mag;
675 
676  return magnetic_message;
677 }
678 
679 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
680 {
681  sbg::SbgMatrix3f tdcm;
682  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));
683  tdcm.transpose();
684 
685  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);
686 
687  return createRosTwistStampedMessage(res, ref_sbg_imu_msg);
688 }
689 
690 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
691 {
692 
693  sbg::SbgMatrix3f tdcm;
694  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);
695  tdcm.transpose();
696 
697  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);
698  return createRosTwistStampedMessage(res, ref_sbg_imu_msg);
699 }
700 
701 const geometry_msgs::TwistStamped MessageWrapper::createRosTwistStampedMessage(const sbg::SbgVector3f& body_vel, const sbg_driver::SbgImuData& ref_sbg_imu_msg) const
702 {
703  geometry_msgs::TwistStamped twist_stamped_message;
704 
705  twist_stamped_message.header = createRosHeader(ref_sbg_imu_msg.time_stamp);
706  twist_stamped_message.twist.angular = ref_sbg_imu_msg.gyro;
707 
708  twist_stamped_message.twist.linear.x = body_vel(0);
709  twist_stamped_message.twist.linear.y = body_vel(1);
710  twist_stamped_message.twist.linear.z = body_vel(2);
711 
712  return twist_stamped_message;
713 }
714 
715 const geometry_msgs::PointStamped MessageWrapper::createRosPointStampedMessage(const sbg_driver::SbgEkfNav& ref_sbg_ekf_msg) const
716 {
717  geometry_msgs::PointStamped point_stamped_message;
718 
719  point_stamped_message.header = createRosHeader(ref_sbg_ekf_msg.time_stamp);
720 
721  //
722  // Conversion from Geodetic coordinates to ECEF is based on World Geodetic System 1984 (WGS84).
723  // Radius are expressed in meters, and latitute/longitude in radian.
724  //
725  double equatorial_radius;
726  double polar_radius;
727  double prime_vertical_radius;
728  double eccentricity;
729  double latitude;
730  double longitude;
731 
732  equatorial_radius = 6378137.0;
733  polar_radius = 6356752.314245;
734  eccentricity = 1 - pow(polar_radius, 2) / pow(equatorial_radius, 2);
735  latitude = sbgDegToRadD(ref_sbg_ekf_msg.position.x);
736  longitude = sbgDegToRadD(ref_sbg_ekf_msg.position.x);
737 
738  prime_vertical_radius = equatorial_radius / sqrt(1.0 - pow(eccentricity, 2) * pow(sin(latitude), 2));
739 
740  point_stamped_message.point.x = (prime_vertical_radius + ref_sbg_ekf_msg.position.z) * cos(latitude) * cos(longitude);
741  point_stamped_message.point.y = (prime_vertical_radius + ref_sbg_ekf_msg.position.z) * cos(latitude) * sin(longitude);
742  point_stamped_message.point.z = ((pow(polar_radius, 2) / pow(equatorial_radius, 2)) * prime_vertical_radius + ref_sbg_ekf_msg.position.z) * sin(latitude);
743 
744  return point_stamped_message;
745 }
746 
747 const sensor_msgs::TimeReference MessageWrapper::createRosUtcTimeReferenceMessage(const sbg_driver::SbgUtcTime& ref_sbg_utc_msg) const
748 {
749  sensor_msgs::TimeReference utc_reference_message;
750 
751  //
752  // This message is defined to have comparison between the System time and the Utc reference.
753  // Header of the ROS message will always be the System time, and the source is the computed time from Utc data.
754  //
755  utc_reference_message.header.stamp = m_ros_processing_time_;
756  utc_reference_message.time_ref = computeCorrectedRosTime(ref_sbg_utc_msg.time_stamp);
757  utc_reference_message.source = "UTC time from device converted to Epoch";
758 
759  return utc_reference_message;
760 }
761 
762 const sensor_msgs::NavSatFix MessageWrapper::createRosNavSatFixMessage(const sbg_driver::SbgGpsPos& ref_sbg_gps_msg) const
763 {
764  sensor_msgs::NavSatFix nav_sat_fix_message;
765 
766  nav_sat_fix_message.header = createRosHeader(ref_sbg_gps_msg.time_stamp);
767 
768  if (ref_sbg_gps_msg.status.type == SBG_ECOM_POS_NO_SOLUTION)
769  {
770  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_NO_FIX;
771  }
772  else if (ref_sbg_gps_msg.status.type == SBG_ECOM_POS_SBAS)
773  {
774  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_SBAS_FIX;
775  }
776  else
777  {
778  nav_sat_fix_message.status.status = nav_sat_fix_message.status.STATUS_FIX;
779  }
780 
781  if (ref_sbg_gps_msg.status.glo_l1_used || ref_sbg_gps_msg.status.glo_l2_used)
782  {
783  nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GLONASS;
784  }
785  else
786  {
787  nav_sat_fix_message.status.service = nav_sat_fix_message.status.SERVICE_GPS;
788  }
789 
790  nav_sat_fix_message.latitude = ref_sbg_gps_msg.position.x;
791  nav_sat_fix_message.longitude = ref_sbg_gps_msg.position.y;
792  nav_sat_fix_message.altitude = ref_sbg_gps_msg.position.z;
793 
794  nav_sat_fix_message.position_covariance[0] = pow(ref_sbg_gps_msg.position_accuracy.x, 2);
795  nav_sat_fix_message.position_covariance[4] = pow(ref_sbg_gps_msg.position_accuracy.y, 2);
796  nav_sat_fix_message.position_covariance[8] = pow(ref_sbg_gps_msg.position_accuracy.z, 2);
797 
798  nav_sat_fix_message.position_covariance_type = nav_sat_fix_message.COVARIANCE_TYPE_DIAGONAL_KNOWN;
799 
800  return nav_sat_fix_message;
801 }
802 
803 const sensor_msgs::FluidPressure MessageWrapper::createRosFluidPressureMessage(const sbg_driver::SbgAirData& ref_sbg_air_msg) const
804 {
805  sensor_msgs::FluidPressure fluid_pressure_message;
806 
807  fluid_pressure_message.header = createRosHeader(ref_sbg_air_msg.time_stamp);
808  fluid_pressure_message.fluid_pressure = ref_sbg_air_msg.pressure_abs;
809  fluid_pressure_message.variance = 0;
810 
811  return fluid_pressure_message;
812 }
#define SBG_ECOM_PORTD_RX_OK
#define SBG_ECOM_AIDING_GPS1_VEL_RECV
#define SBG_ECOM_PORTD_TX_OK
#define SBG_ECOM_GPS_POS_GLO_L1_USED
#define SBG_ECOM_CLOCK_STABLE_INPUT
#define SBG_ECOM_GENERAL_MAIN_POWER_OK
SBG_INLINE SbgEComGpsVelType sbgEComLogGpsVelGetType(uint32_t status)
const sensor_msgs::NavSatFix createRosNavSatFixMessage(const sbg_driver::SbgGpsPos &ref_sbg_gps_msg) const
#define SBG_ECOM_AIDING_MAG_RECV
const sbg_driver::SbgEkfEuler createSbgEkfEulerMessage(const SbgLogEkfEulerData &ref_log_ekf_euler) const
#define SBG_ECOM_SOL_GPS1_POS_USED
const sensor_msgs::Temperature createRosTemperatureMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg) const
#define SBG_ECOM_GPS_POS_GPS_L5_USED
#define SBG_ECOM_IMU_GYRO_Y_BIT
#define SBG_ECOM_EVENT_OFFSET_2_VALID
#define SBG_ECOM_AIR_DATA_PRESSURE_DIFF_VALID
#define SBG_ECOM_SOL_MAG_REF_USED
#define SBG_ECOM_PORTA_VALID
Time & fromNSec(uint64_t t)
#define SBG_ECOM_IMU_GYRO_Z_BIT
sbg_driver::SbgUtcTime m_last_sbg_utc_
#define SBG_ECOM_MAG_CALIBRATION_OK
#define SBG_ECOM_MAG_MAG_Z_BIT
#define SBG_ECOM_EVENT_OVERFLOW
#define SBG_ECOM_EVENT_OFFSET_1_VALID
#define SBG_ECOM_SOL_VERT_REF_USED
#define SBG_ECOM_SOL_HEADING_VALID
#define SBG_ECOM_SOL_GPS2_VEL_USED
SBG_INLINE SbgEComGpsPosStatus sbgEComLogGpsPosGetStatus(uint32_t status)
uint32_t getNumberOfDaysInMonth(uint16_t year, uint8_t month_index) const
#define SBG_ECOM_SOL_GPS2_POS_USED
#define SBG_ECOM_AIDING_DVL_RECV
const sensor_msgs::MagneticField createRosMagneticMessage(const sbg_driver::SbgMag &ref_sbg_mag_msg) const
const sbg_driver::SbgShipMotion createSbgShipMotionMessage(const SbgLogShipMotionData &ref_log_ship_motion) const
const ros::Time convertUtcTimeToEpoch(const sbg_driver::SbgUtcTime &ref_sbg_utc_msg) const
const ros::Time computeCorrectedRosTime(uint32_t device_timestamp) const
int32_t deltaVelocity[3]
const sbg_driver::SbgAirDataStatus createAirDataStatusMessage(const SbgLogAirData &ref_sbg_air_data) const
const sensor_msgs::Imu createRosImuMessage(const sbg_driver::SbgImuData &ref_sbg_imu_msg, const sbg_driver::SbgEkfQuat &ref_sbg_quat_msg) const
#define SBG_ECOM_AIR_DATA_AIRPSEED_VALID
#define SBG_ECOM_MAG_ACCEL_Y_BIT
#define SBG_ECOM_PORTB_TX_OK
#define SBG_ECOM_PORTE_TX_OK
const sbg_driver::SbgGpsVelStatus createGpsVelStatusMessage(const SbgLogGpsVel &ref_log_gps_vel) const
#define SBG_ECOM_PORTB_VALID
std_msgs::Header * header(M &m)
const sbg_driver::SbgShipMotionStatus createShipMotionStatusMessage(const SbgLogShipMotionData &ref_log_ship_motion) const
#define SBG_ECOM_SOL_POSITION_VALID
#define SBG_ECOM_PORTC_VALID
#define SBG_ECOM_PORTD_VALID
uint8_t rawBuffer[SBG_ECOM_GPS_RAW_MAX_BUFFER_SIZE]
#define SBG_ECOM_HEAVE_PERIOD_INCLUDED
const sbg_driver::SbgMagCalib createSbgMagCalibMessage(const SbgLogMagCalib &ref_log_mag_calib) const
Handle creation of messages.
#define SBG_ECOM_SOL_ODO_USED
#define SBG_ECOM_GENERAL_IMU_POWER_OK
SBG_INLINE SbgEComGpsPosType sbgEComLogGpsPosGetType(uint32_t status)
#define SBG_ECOM_MAG_MAG_Y_BIT
#define SBG_ECOM_IMU_ACCEL_X_BIT
const sbg_driver::SbgGpsRaw createSbgGpsRawMessage(const SbgLogGpsRaw &ref_log_gps_raw) const
SBG_INLINE SbgEComClockStatus sbgEComLogUtcGetClockStatus(uint16_t status)
#define SBG_ECOM_AIR_DATA_ALTITUDE_VALID
SBG_INLINE SbgEComSolutionMode sbgEComLogEkfGetSolutionMode(uint32_t status)
#define SBG_ECOM_GPS_POS_GPS_L2_USED
#define SBG_ECOM_AIDING_ODO_RECV
void transpose(void)
Definition: sbg_matrix3.h:176
const sbg_driver::SbgMagStatus createMagStatusMessage(const SbgLogMag &ref_log_mag) const
#define SBG_ECOM_MAG_MAG_X_BIT
const sbg_driver::SbgImuShort createSbgImuShortMessage(const SbgLogImuShort &ref_short_imu_log) const
#define SBG_ECOM_IMU_ACCELS_IN_RANGE
const sbg_driver::SbgOdoVel createSbgOdoVelMessage(const SbgLogOdometerData &ref_log_odo) const
float accelerometers[3]
const sbg_driver::SbgUtcTime createSbgUtcTimeMessage(const SbgLogUtcData &ref_log_utc)
const std_msgs::Header createRosHeader(uint32_t device_timestamp) const
#define SBG_ECOM_CAN_VALID
const sbg_driver::SbgEkfQuat createSbgEkfQuatMessage(const SbgLogEkfQuatData &ref_log_ekf_quat) const
#define SBG_ECOM_MAG_ACCEL_X_BIT
#define SBG_ECOM_PORTC_TX_OK
#define SBG_ECOM_GPS_POS_GLO_L2_USED
const sbg_driver::SbgStatus createSbgStatusMessage(const SbgLogStatusData &ref_log_status) const
const sbg_driver::SbgStatusGeneral createStatusGeneralMessage(const SbgLogStatusData &ref_log_status) const
#define SBG_ECOM_PORTB_RX_OK
bool isLeapYear(uint16_t year) const
#define SBG_ECOM_CLOCK_UTC_SYNC
#define SBG_ECOM_MAG_MAGS_IN_RANGE
#define ROS_INFO(...)
const sbg_driver::SbgGpsHdt createSbgGpsHdtMessage(const SbgLogGpsHdt &ref_log_gps_hdt) const
SBG_INLINE SbgEComClockUtcStatus sbgEComLogUtcGetClockUtcStatus(uint16_t status)
#define SBG_ECOM_CAN_RX_OK
SbgVector3< float > SbgVector3f
Definition: sbg_vector3.h:178
SBG_INLINE double sbgDegToRadD(double angle)
Definition: sbgDefines.h:361
float magnetometers[3]
#define SBG_ECOM_PORTE_VALID
const geometry_msgs::TwistStamped createRosTwistStampedMessage(const sbg::SbgVector3f &body_vel, const sbg_driver::SbgImuData &ref_sbg_imu_msg) const
const sbg_driver::SbgGpsPos createSbgGpsPosMessage(const SbgLogGpsPos &ref_log_gps_pos) const
uint64_t toNSec() const
#define SBG_ECOM_SOL_GPS1_VEL_USED
#define SBG_ECOM_GPS_POS_GPS_L1_USED
const sbg_driver::SbgAirData createSbgAirDataMessage(const SbgLogAirData &ref_air_data_log) const
#define SBG_ECOM_SOL_VELOCITY_VALID
#define SBG_ECOM_AIR_DATA_PRESSURE_ABS_VALID
SBG_INLINE SbgEComGpsVelStatus sbgEComLogGpsVelGetStatus(uint32_t status)
#define SBG_ECOM_MAG_ACCEL_Z_BIT
#define SBG_ECOM_GENERAL_SETTINGS_OK
#define SBG_ECOM_SOL_GPS2_HDT_USED
#define SBG_ECOM_CAN_TX_OK
const sbg_driver::SbgImuData createSbgImuDataMessage(const SbgLogImuData &ref_log_imu_data) const
#define SBG_ECOM_HEAVE_PERIOD_VALID
const sbg_driver::SbgEvent createSbgEventMessage(const SbgLogEvent &ref_log_event) const
#define SBG_ECOM_AIDING_GPS1_UTC_RECV
#define SBG_ECOM_EVENT_OFFSET_0_VALID
#define SBG_ECOM_AIR_DATA_TIME_IS_DELAY
void setRosProcessingTime(const ros::Time &ref_ros_time)
#define SBG_ECOM_MAG_ACCELS_IN_RANGE
#define SBG_ECOM_AIDING_GPS1_POS_RECV
const sensor_msgs::FluidPressure createRosFluidPressureMessage(const sbg_driver::SbgAirData &ref_sbg_air_msg) const
#define SBG_ECOM_GENERAL_TEMPERATURE_OK
#define SBG_ECOM_PORTE_RX_OK
#define SBG_ECOM_HEAVE_VALID
const geometry_msgs::PointStamped createRosPointStampedMessage(const sbg_driver::SbgEkfNav &ref_sbg_ekf_msg) const
const sbg_driver::SbgUtcTimeStatus createUtcStatusMessage(const SbgLogUtcData &ref_log_utc) const
const sbg_driver::SbgGpsVel createSbgGpsVelMessage(const SbgLogGpsVel &ref_log_gps_vel) const
#define SBG_ECOM_SOL_GPS1_HDT_USED
void makeDcm(const SbgVector3f &euler)
Definition: sbg_matrix3.h:199
#define SBG_ECOM_AIDING_GPS1_HDT_RECV
#define SBG_ECOM_IMU_ACCEL_Z_BIT
#define SBG_ECOM_AIR_DATA_TEMPERATURE_VALID
uint32_t getNumberOfDaysInYear(uint16_t year) const
const sbg_driver::SbgStatusAiding createStatusAidingMessage(const SbgLogStatusData &ref_log_status) const
uint32_t timeStamp
#define SBG_ECOM_GENERAL_GPS_POWER_OK
#define SBG_ECOM_PORTA_RX_OK
#define SBG_ECOM_IMU_GYROS_IN_RANGE
#define SBG_ECOM_PORTC_RX_OK
const sbg_driver::SbgMag createSbgMagMessage(const SbgLogMag &ref_log_mag) const
const sbg_driver::SbgStatusCom createStatusComMessage(const SbgLogStatusData &ref_log_status) const
#define SBG_ECOM_PORTA_TX_OK
const sensor_msgs::TimeReference createRosUtcTimeReferenceMessage(const sbg_driver::SbgUtcTime &ref_sbg_utc_msg) const
Handle a three components vector.
const sbg_driver::SbgEkfNav createSbgEkfNavMessage(const SbgLogEkfNavData &ref_log_ekf_nav) const
const sbg_driver::SbgEkfStatus createEkfStatusMessage(uint32_t ekf_status) const
ros::Time m_ros_processing_time_
#define SBG_ECOM_SOL_ATTITUDE_VALID
#define SBG_ECOM_EVENT_OFFSET_3_VALID
#define SBG_ECOM_IMU_GYRO_X_BIT
const sbg_driver::SbgImuStatus createImuStatusMessage(uint16_t sbg_imu_status) const
#define SBG_ECOM_IMU_COM_OK
#define SBG_ECOM_IMU_ACCEL_Y_BIT
const sbg_driver::SbgGpsPosStatus createGpsPosStatusMessage(const SbgLogGpsPos &ref_log_gps_pos) const
#define SBG_ECOM_IMU_STATUS_BIT
#define SBG_ECOM_HEAVE_VEL_AIDED


sbg_driver
Author(s): SBG Systems
autogenerated on Thu Oct 22 2020 03:47:22