31 #include <GeographicLib/UTMUPS.hpp> 32 #include <boost/tokenizer.hpp> 105 msg.pose.covariance[0] =
107 msg.pose.covariance[7] =
109 msg.pose.covariance[14] =
113 msg.pose.covariance[0] = -1.0;
114 msg.pose.covariance[7] = -1.0;
115 msg.pose.covariance[14] = -1.0;
133 msg.pose.pose.orientation.w = std::numeric_limits<double>::quiet_NaN();
134 msg.pose.pose.orientation.x = std::numeric_limits<double>::quiet_NaN();
135 msg.pose.pose.orientation.y = std::numeric_limits<double>::quiet_NaN();
136 msg.pose.pose.orientation.z = std::numeric_limits<double>::quiet_NaN();
145 msg.pose.covariance[21] = -1.0;
150 msg.pose.covariance[28] = -1.0;
155 msg.pose.covariance[35] = -1.0;
158 msg.pose.covariance[21] = -1.0;
159 msg.pose.covariance[28] = -1.0;
160 msg.pose.covariance[35] = -1.0;
193 uint16_t indicators_type_mask =
static_cast<uint16_t
>(255);
194 uint16_t indicators_value_mask =
static_cast<uint16_t
>(3840);
195 uint16_t qualityind_pos;
196 for (uint16_t i = static_cast<uint16_t>(0);
200 static_cast<uint16_t
>(0))
204 static_cast<uint16_t>(0))
206 gnss_status.level = DiagnosticStatusMsg::STALE;
208 8) == static_cast<uint16_t>(1) ||
210 8) ==
static_cast<uint16_t
>(2))
215 gnss_status.level = DiagnosticStatusMsg::OK;
228 for (uint16_t i = static_cast<uint16_t>(0);
231 if (i == qualityind_pos)
236 static_cast<uint16_t
>(1))
238 gnss_status.values[i].key =
"GNSS Signals, Main Antenna";
239 gnss_status.values[i].value = std::to_string(
242 static_cast<uint16_t>(2))
244 gnss_status.values[i].key =
"GNSS Signals, Aux1 Antenna";
245 gnss_status.values[i].value = std::to_string(
248 static_cast<uint16_t>(11))
250 gnss_status.values[i].key =
"RF Power, Main Antenna";
251 gnss_status.values[i].value = std::to_string(
254 static_cast<uint16_t>(12))
256 gnss_status.values[i].key =
"RF Power, Aux1 Antenna";
257 gnss_status.values[i].value = std::to_string(
260 static_cast<uint16_t>(21))
262 gnss_status.values[i].key =
"CPU Headroom";
263 gnss_status.values[i].value = std::to_string(
266 static_cast<uint16_t>(25))
268 gnss_status.values[i].key =
"OCXO Stability";
269 gnss_status.values[i].value = std::to_string(
272 static_cast<uint16_t>(30))
274 gnss_status.values[i].key =
"Base Station Measurements";
275 gnss_status.values[i].value = std::to_string(
280 static_cast<uint16_t>(31));
281 gnss_status.values[i].key =
"RTK Post-Processing";
282 gnss_status.values[i].value = std::to_string(
286 gnss_status.hardware_id = serialnumber;
287 gnss_status.name =
"gnss";
288 gnss_status.message =
289 "Quality Indicators (from 0 for low quality to 10 for high quality, 15 if unknown)";
290 msg.status.push_back(gnss_status);
306 bool valid_orientation =
true;
320 if ((tsImu - tsIns) > maxDt)
322 valid_orientation =
false;
339 valid_orientation =
false;
343 valid_orientation =
false;
360 valid_orientation =
false;
364 valid_orientation =
false;
369 msg.orientation_covariance[1] =
371 msg.orientation_covariance[2] =
373 msg.orientation_covariance[3] =
376 msg.orientation_covariance[5] =
378 msg.orientation_covariance[6] =
380 msg.orientation_covariance[7] =
386 valid_orientation =
false;
390 valid_orientation =
false;
393 if (!valid_orientation)
395 msg.orientation.w = std::numeric_limits<double>::quiet_NaN();
396 msg.orientation.x = std::numeric_limits<double>::quiet_NaN();
397 msg.orientation.y = std::numeric_limits<double>::quiet_NaN();
398 msg.orientation.z = std::numeric_limits<double>::quiet_NaN();
399 msg.orientation_covariance[0] = -1.0;
400 msg.orientation_covariance[4] = -1.0;
401 msg.orientation_covariance[8] = -1.0;
439 msg.twist.twist.linear.x = vel(0);
440 msg.twist.twist.linear.y = vel(1);
441 msg.twist.twist.linear.z = vel(2);
444 msg.twist.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
445 msg.twist.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
446 msg.twist.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
453 Eigen::Matrix3d Cov_vel_n = Eigen::Matrix3d::Zero();
465 Cov_vel_n(0, 0) = -1.0;
474 Cov_vel_n(1, 1) = -1.0;
479 Cov_vel_n(2, 2) = -1.0;
486 Cov_vel_n(0, 2) = Cov_vel_n(2, 0) =
489 Cov_vel_n(2, 1) = Cov_vel_n(1, 2) =
494 Cov_vel_n(0, 2) = Cov_vel_n(2, 0) =
497 Cov_vel_n(2, 1) = Cov_vel_n(1, 2) =
502 Cov_vel_n(0, 0) = -1.0;
503 Cov_vel_n(1, 1) = -1.0;
504 Cov_vel_n(2, 2) = -1.0;
507 msg.twist.covariance[0] = Cov_vel_n(0, 0);
508 msg.twist.covariance[1] = Cov_vel_n(0, 1);
509 msg.twist.covariance[2] = Cov_vel_n(0, 2);
510 msg.twist.covariance[6] = Cov_vel_n(1, 0);
511 msg.twist.covariance[7] = Cov_vel_n(1, 1);
512 msg.twist.covariance[8] = Cov_vel_n(1, 2);
513 msg.twist.covariance[12] = Cov_vel_n(2, 0);
514 msg.twist.covariance[13] = Cov_vel_n(2, 1);
515 msg.twist.covariance[14] = Cov_vel_n(2, 2);
518 msg.twist.covariance[0] = -1.0;
519 msg.twist.covariance[7] = -1.0;
520 msg.twist.covariance[14] = -1.0;
523 msg.twist.covariance[21] = -1.0;
524 msg.twist.covariance[28] = -1.0;
525 msg.twist.covariance[35] = -1.0;
554 msg.twist.twist.linear.x = vel(0);
555 msg.twist.twist.linear.y = vel(1);
556 msg.twist.twist.linear.z = vel(2);
559 msg.twist.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
560 msg.twist.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
561 msg.twist.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
566 Eigen::Matrix3d Cov_vel_n = Eigen::Matrix3d::Zero();
574 Cov_vel_n(0, 0) = -1.0;
581 Cov_vel_n(1, 1) = -1.0;
585 Cov_vel_n(2, 2) = -1.0;
598 msg.twist.covariance[0] = Cov_vel_n(0, 0);
599 msg.twist.covariance[1] = Cov_vel_n(0, 1);
600 msg.twist.covariance[2] = Cov_vel_n(0, 2);
601 msg.twist.covariance[6] = Cov_vel_n(1, 0);
602 msg.twist.covariance[7] = Cov_vel_n(1, 1);
603 msg.twist.covariance[8] = Cov_vel_n(1, 2);
604 msg.twist.covariance[12] = Cov_vel_n(2, 0);
605 msg.twist.covariance[13] = Cov_vel_n(2, 1);
606 msg.twist.covariance[14] = Cov_vel_n(2, 2);
609 msg.twist.covariance[0] = -1.0;
610 msg.twist.covariance[7] = -1.0;
611 msg.twist.covariance[14] = -1.0;
614 msg.twist.covariance[21] = -1.0;
615 msg.twist.covariance[28] = -1.0;
616 msg.twist.covariance[35] = -1.0;
619 msg.header.frame_id =
"navigation";
634 std::string zonestring;
635 bool northernHemisphere;
642 GeographicLib::UTMUPS::DecodeZone(*
fixedUtmZone_, zone, northernHemisphere);
643 GeographicLib::UTMUPS::Forward(
645 zone, northernHemisphere, easting, northing, gamma, k, zone);
650 GeographicLib::UTMUPS::Forward(
652 zone, northernHemisphere, easting, northing, gamma, k);
653 zonestring = GeographicLib::UTMUPS::EncodeZone(zone, northernHemisphere);
661 msg.pose.pose.position.x = easting;
662 msg.pose.pose.position.y = northing;
666 msg.pose.pose.position.x = northing;
667 msg.pose.pose.position.y = easting;
671 msg.header.frame_id =
"utm_" + zonestring;
680 msg.pose.covariance[0] =
682 msg.pose.covariance[7] =
684 msg.pose.covariance[14] =
688 msg.pose.covariance[0] = -1.0;
689 msg.pose.covariance[7] = -1.0;
690 msg.pose.covariance[14] = -1.0;
713 msg.pose.pose.orientation =
717 msg.pose.pose.orientation.w = std::numeric_limits<double>::quiet_NaN();
718 msg.pose.pose.orientation.x = std::numeric_limits<double>::quiet_NaN();
719 msg.pose.pose.orientation.y = std::numeric_limits<double>::quiet_NaN();
720 msg.pose.pose.orientation.z = std::numeric_limits<double>::quiet_NaN();
726 msg.pose.covariance[21] =
729 msg.pose.covariance[21] = -1.0;
731 msg.pose.covariance[28] =
734 msg.pose.covariance[28] = -1.0;
736 msg.pose.covariance[35] =
739 msg.pose.covariance[35] = -1.0;
742 msg.pose.covariance[21] = -1.0;
743 msg.pose.covariance[28] = -1.0;
744 msg.pose.covariance[35] = -1.0;
758 Eigen::Vector3d vel_enu;
762 vel_enu << ve, vn, vu;
766 vel_enu << vn, ve, -vu;
769 Eigen::Vector3d vel_body = R_n_b * vel_enu;
770 msg.twist.twist.linear.x = vel_body(0);
771 msg.twist.twist.linear.y = vel_body(1);
772 msg.twist.twist.linear.z = vel_body(2);
775 msg.twist.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
776 msg.twist.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
777 msg.twist.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
779 Eigen::Matrix3d Cov_vel_n = Eigen::Matrix3d::Zero();
791 Cov_vel_n(0, 0) = -1.0;
800 Cov_vel_n(1, 1) = -1.0;
804 Cov_vel_n(2, 2) = -1.0;
807 Cov_vel_n(0, 0) = -1.0;
808 Cov_vel_n(1, 1) = -1.0;
809 Cov_vel_n(2, 2) = -1.0;
847 msg.pose.covariance[33] *= -1.0;
848 msg.pose.covariance[23] *= -1.0;
849 msg.pose.covariance[22] *= -1.0;
850 msg.pose.covariance[27] *= -1.0;
875 Eigen::Matrix3d Cov_vel_body = R_n_b * Cov_vel_n * R_n_b.transpose();
877 msg.twist.covariance[0] = Cov_vel_body(0, 0);
878 msg.twist.covariance[1] = Cov_vel_body(0, 1);
879 msg.twist.covariance[2] = Cov_vel_body(0, 2);
880 msg.twist.covariance[6] = Cov_vel_body(1, 0);
881 msg.twist.covariance[7] = Cov_vel_body(1, 1);
882 msg.twist.covariance[8] = Cov_vel_body(1, 2);
883 msg.twist.covariance[12] = Cov_vel_body(2, 0);
884 msg.twist.covariance[13] = Cov_vel_body(2, 1);
885 msg.twist.covariance[14] = Cov_vel_body(2, 2);
888 msg.twist.covariance[0] = -1.0;
889 msg.twist.covariance[7] = -1.0;
890 msg.twist.covariance[14] = -1.0;
893 msg.twist.covariance[21] = -1.0;
894 msg.twist.covariance[28] = -1.0;
895 msg.twist.covariance[35] = -1.0;
917 msg.status.status = NavSatStatusMsg::STATUS_NO_FIX;
923 msg.status.status = NavSatStatusMsg::STATUS_FIX;
933 msg.status.status = NavSatStatusMsg::STATUS_GBAS_FIX;
938 msg.status.status = NavSatStatusMsg::STATUS_SBAS_FIX;
945 "PVTGeodetic's Mode field contains an invalid type of PVT solution.");
949 bool gps_in_pvt =
false;
950 bool glo_in_pvt =
false;
951 bool com_in_pvt =
false;
952 bool gal_in_pvt =
false;
954 for (
int bit = 0; bit != 31; ++bit)
957 if (bit <= 5 && in_use)
961 if (8 <= bit && bit <= 12 && in_use)
963 if (((13 <= bit && bit <= 14) || (28 <= bit && bit <= 30)) && in_use)
965 if ((bit == 17 || (19 <= bit && bit <= 22)) && in_use)
971 gps_in_pvt * 1 + glo_in_pvt * 2 + com_in_pvt * 4 + gal_in_pvt * 8;
972 msg.status.service = service;
985 msg.position_covariance_type = NavSatFixMsg::COVARIANCE_TYPE_KNOWN;
997 msg.status.status = NavSatStatusMsg::STATUS_NO_FIX;
1003 msg.status.status = NavSatStatusMsg::STATUS_FIX;
1013 msg.status.status = NavSatStatusMsg::STATUS_GBAS_FIX;
1018 msg.status.status = NavSatStatusMsg::STATUS_SBAS_FIX;
1025 "INSNavGeod's Mode field contains an invalid type of PVT solution.");
1029 bool gps_in_pvt =
false;
1030 bool glo_in_pvt =
false;
1031 bool com_in_pvt =
false;
1032 bool gal_in_pvt =
false;
1033 uint32_t mask_2 = 1;
1034 for (
int bit = 0; bit != 31; ++bit)
1037 if (bit <= 5 && in_use)
1041 if (8 <= bit && bit <= 12 && in_use)
1043 if (((13 <= bit && bit <= 14) || (28 <= bit && bit <= 30)) && in_use)
1045 if ((bit == 17 || (19 <= bit && bit <= 22)) && in_use)
1051 gps_in_pvt * 1 + glo_in_pvt * 2 + com_in_pvt * 4 + gal_in_pvt * 8;
1052 msg.status.service = service;
1059 msg.position_covariance[0] =
1061 msg.position_covariance[4] =
1063 msg.position_covariance[8] =
1075 msg.position_covariance_type = NavSatFixMsg::COVARIANCE_TYPE_DIAGONAL_KNOWN;
1107 std::vector<int32_t> cno_tracked;
1108 std::vector<int32_t> svid_in_sync;
1115 svid_in_sync.push_back(
1116 static_cast<int32_t>(measepoch_channel_type1.sv_id));
1119 if (((measepoch_channel_type1.type & type_mask) ==
1120 static_cast<uint8_t>(1)) ||
1121 ((measepoch_channel_type1.type & type_mask) ==
1122 static_cast<uint8_t>(2)))
1124 cno_tracked.push_back(
1125 static_cast<int32_t>(measepoch_channel_type1.cn0) / 4);
1128 cno_tracked.push_back(
1129 static_cast<int32_t>(measepoch_channel_type1.cn0) / 4 +
1130 static_cast<int32_t>(10));
1136 std::vector<int32_t> svid_in_sync_2;
1137 std::vector<int32_t> elevation_tracked;
1138 std::vector<int32_t> azimuth_tracked;
1139 std::vector<int32_t> svid_pvt;
1141 std::vector<int32_t> ordering;
1148 bool to_be_added =
false;
1149 for (int32_t j = 0; j < static_cast<int32_t>(svid_in_sync.size()); ++j)
1151 if (svid_in_sync[j] == static_cast<int32_t>(channel_sat_info.sv_id))
1153 ordering.push_back(j);
1160 svid_in_sync_2.push_back(
1161 static_cast<int32_t>(channel_sat_info.sv_id));
1162 elevation_tracked.push_back(
1163 static_cast<int32_t>(channel_sat_info.elev));
1164 static uint16_t azimuth_mask = 511;
1165 azimuth_tracked.push_back(static_cast<int32_t>(
1166 (channel_sat_info.az_rise_set & azimuth_mask)));
1168 svid_pvt.reserve(channel_sat_info.stateInfo.size());
1169 for (
const auto& channel_state_info : channel_sat_info.stateInfo)
1172 bool pvt_status =
false;
1173 uint16_t pvt_status_mask = std::pow(2, 15) + std::pow(2, 14);
1174 for (
int k = 15; k != -1; k -= 2)
1176 uint16_t pvt_status_value =
1177 (channel_state_info.pvt_status & pvt_status_mask) >> k - 1;
1178 if (pvt_status_value == 2)
1184 pvt_status_mask = pvt_status_mask - std::pow(2, k) -
1185 std::pow(2, k - 1) + std::pow(2, k - 2) +
1191 svid_pvt.push_back(static_cast<int32_t>(channel_sat_info.sv_id));
1196 msg.status.satellite_used_prn =
1199 msg.status.satellites_visible =
static_cast<uint16_t
>(svid_in_sync.size());
1200 msg.status.satellite_visible_prn = svid_in_sync_2;
1201 msg.status.satellite_visible_z = elevation_tracked;
1202 msg.status.satellite_visible_azimuth = azimuth_tracked;
1205 std::vector<int32_t> cno_tracked_reordered;
1208 for (int32_t k = 0; k < static_cast<int32_t>(ordering.size()); ++k)
1210 cno_tracked_reordered.push_back(cno_tracked[ordering[k]]);
1213 msg.status.satellite_visible_snr = cno_tracked_reordered;
1220 uint16_t status_mask = 15;
1226 msg.status.status = GPSStatusMsg::STATUS_NO_FIX;
1232 msg.status.status = GPSStatusMsg::STATUS_FIX;
1242 msg.status.status = GPSStatusMsg::STATUS_GBAS_FIX;
1249 if (reference_id == 131 || reference_id == 133 || reference_id == 135 ||
1250 reference_id == 135)
1252 msg.status.status = GPSStatusMsg::STATUS_WAAS_FIX;
1255 msg.status.status = GPSStatusMsg::STATUS_SBAS_FIX;
1263 "PVTGeodetic's Mode field contains an invalid type of PVT solution.");
1269 msg.status.motion_source = GPSStatusMsg::SOURCE_POINTS;
1272 msg.status.orientation_source = GPSStatusMsg::SOURCE_POINTS;
1273 msg.status.position_source = GPSStatusMsg::SOURCE_GPS;
1362 msg.position_covariance_type = NavSatFixMsg::COVARIANCE_TYPE_KNOWN;
1368 uint16_t status_mask = 15;
1369 uint16_t type_of_pvt =
1375 msg.status.status = GPSStatusMsg::STATUS_NO_FIX;
1381 msg.status.status = GPSStatusMsg::STATUS_FIX;
1391 msg.status.status = GPSStatusMsg::STATUS_GBAS_FIX;
1399 "INSNavGeod's Mode field contains an invalid type of PVT solution.");
1405 msg.status.motion_source = GPSStatusMsg::SOURCE_POINTS;
1408 msg.status.orientation_source = GPSStatusMsg::SOURCE_POINTS;
1409 msg.status.position_source = GPSStatusMsg::SOURCE_GPS;
1520 msg.position_covariance[0] =
1522 msg.position_covariance[4] =
1524 msg.position_covariance[8] =
1536 msg.position_covariance_type = NavSatFixMsg::COVARIANCE_TYPE_DIAGONAL_KNOWN;
1563 static uint64_t secToNSec = 1000000000;
1564 static uint64_t mSec2NSec = 1000000;
1565 static uint64_t nsOfGpsStart =
1569 static uint64_t nsecPerWeek = 7 * 24 * 60 * 60 * secToNSec;
1571 time_obj = nsOfGpsStart + tow * mSec2NSec + wnc * nsecPerWeek;
1621 std::size_t count_copy =
count_;
1629 if (count_copy == 0)
1633 data_[pos + 2] == 0x20 &&
data_[pos + 3] == 0x20 &&
1634 data_[pos + 4] == 0x4E) ||
1636 data_[pos + 2] == 0x20 &&
data_[pos + 3] == 0x20 &&
1637 data_[pos + 4] == 0x53) ||
1639 data_[pos + 2] == 0x20 &&
data_[pos + 3] == 0x20 &&
1640 data_[pos + 4] == 0x52));
1648 if (count_copy == 0)
1671 boost::char_separator<char> sep(
",");
1672 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
1674 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
1675 tokenizer tokens(block_in_string, sep);
1676 if (*tokens.begin() == id)
1781 std::stringstream ss;
1787 boost::char_separator<char> sep(
",");
1788 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
1790 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
1791 tokenizer tokens(block_in_string, sep);
1792 return *tokens.begin();
1794 return std::string();
1805 uint16_t block_length;
1809 return block_length;
1823 std::size_t jump_size;
1833 jump_size =
static_cast<uint32_t
>(1);
1845 jump_size =
static_cast<std::size_t
>(1);
1848 jump_size =
static_cast<std::size_t
>(1);
1863 template <
typename M>
1875 "Not publishing message with GNSS time because no leap seconds are available yet.");
1879 "No leap seconds were set and none were received from log yet.");
1898 "Not publishing tf with GNSS time because no leap seconds are available yet.");
1902 "No leap seconds were set and none were received from log yet.");
1931 "CRC Check returned False. Not a valid data block. Retrieving full SBF block.");
1942 std::vector<uint8_t> dvec(
data_,
1947 "septentrio_gnss_driver: parse error in PVTCartesian");
1958 publish<PVTCartesianMsg>(
"/pvtcartesian", msg);
1964 std::vector<uint8_t> dvec(
data_,
1969 "septentrio_gnss_driver: parse error in PVTGeodetic");
1990 std::vector<uint8_t> dvec(
data_,
1995 "septentrio_gnss_driver: parse error in BaseVectorCart");
2006 publish<BaseVectorCartMsg>(
"/basevectorcart", msg);
2012 std::vector<uint8_t> dvec(
data_,
2017 "septentrio_gnss_driver: parse error in BaseVectorGeod");
2028 publish<BaseVectorGeodMsg>(
"/basevectorgeod", msg);
2034 std::vector<uint8_t> dvec(
data_,
2039 "septentrio_gnss_driver: parse error in PosCovCartesian");
2050 publish<PosCovCartesianMsg>(
"/poscovcartesian", msg);
2055 std::vector<uint8_t> dvec(
data_,
2064 "septentrio_gnss_driver: parse error in PosCovGeodetic");
2084 std::vector<uint8_t> dvec(
data_,
2092 "septentrio_gnss_driver: parse error in AttEuler");
2111 std::vector<uint8_t> dvec(
data_,
2119 "septentrio_gnss_driver: parse error in AttCovEuler");
2140 std::vector<uint8_t> dvec(
data_,
2146 "septentrio_gnss_driver: parse error in INSNavCart");
2163 publish<INSNavCartMsg>(
"/insnavcart", msg);
2169 std::vector<uint8_t> dvec(
data_,
2179 "septentrio_gnss_driver: parse error in INSNavGeod");
2205 publish<TwistWithCovarianceStampedMsg>(
"/twist_ins", twist);
2213 std::vector<uint8_t> dvec(
data_,
2219 "septentrio_gnss_driver: parse error in IMUSetup");
2230 publish<IMUSetupMsg>(
"/imusetup", msg);
2237 std::vector<uint8_t> dvec(
data_,
2243 "septentrio_gnss_driver: parse error in VelSensorSetup");
2254 publish<VelSensorSetupMsg>(
"/velsensorsetup", msg);
2262 std::vector<uint8_t> dvec(
data_,
2268 "septentrio_gnss_driver: parse error in ExtEventINSNavCart");
2285 publish<INSNavCartMsg>(
"/exteventinsnavcart", msg);
2292 std::vector<uint8_t> dvec(
data_,
2298 "septentrio_gnss_driver: parse error in ExtEventINSNavGeod");
2315 publish<INSNavGeodMsg>(
"/exteventinsnavgeod", msg);
2321 std::vector<uint8_t> dvec(
data_,
2323 bool hasImuMeas =
false;
2328 "septentrio_gnss_driver: parse error in ExtSensorMeas");
2347 }
catch (std::runtime_error& e)
2354 publish<ImuMsg>(
"/imu", msg);
2365 msg.source =
"GPST";
2371 publish<TimeReferenceMsg>(
"/gpst", msg);
2376 boost::char_separator<char> sep(
"\r");
2377 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
2379 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
2380 tokenizer tokens(block_in_string, sep);
2383 std::string one_message = *tokens.begin();
2388 boost::char_separator<char> sep_2(
",*",
"", boost::keep_empty_tokens);
2389 tokenizer tokens_2(one_message, sep_2);
2390 std::vector<std::string> body;
2391 for (tokenizer::iterator tok_iter = tokens_2.begin();
2392 tok_iter != tokens_2.end(); ++tok_iter)
2394 body.push_back(*tok_iter);
2416 publish<GpggaMsg>(
"/gpgga", msg);
2423 boost::char_separator<char> sep(
"\r");
2424 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
2426 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
2427 tokenizer tokens(block_in_string, sep);
2430 std::string one_message = *tokens.begin();
2431 boost::char_separator<char> sep_2(
",*",
"", boost::keep_empty_tokens);
2432 tokenizer tokens_2(one_message, sep_2);
2433 std::vector<std::string> body;
2434 for (tokenizer::iterator tok_iter = tokens_2.begin();
2435 tok_iter != tokens_2.end(); ++tok_iter)
2437 body.push_back(*tok_iter);
2458 publish<GprmcMsg>(
"/gprmc", msg);
2463 boost::char_separator<char> sep(
"\r");
2464 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
2466 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
2467 tokenizer tokens(block_in_string, sep);
2470 std::string one_message = *tokens.begin();
2471 boost::char_separator<char> sep_2(
",*",
"", boost::keep_empty_tokens);
2472 tokenizer tokens_2(one_message, sep_2);
2473 std::vector<std::string> body;
2474 for (tokenizer::iterator tok_iter = tokens_2.begin();
2475 tok_iter != tokens_2.end(); ++tok_iter)
2477 body.push_back(*tok_iter);
2514 publish<GpgsaMsg>(
"/gpgsa", msg);
2521 boost::char_separator<char> sep(
"\r");
2522 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
2524 std::string block_in_string(reinterpret_cast<const char*>(
data_), nmea_size);
2525 tokenizer tokens(block_in_string, sep);
2528 std::string one_message = *tokens.begin();
2529 boost::char_separator<char> sep_2(
",*",
"", boost::keep_empty_tokens);
2530 tokenizer tokens_2(one_message, sep_2);
2531 std::vector<std::string> body;
2532 for (tokenizer::iterator tok_iter = tokens_2.begin();
2533 tok_iter != tokens_2.end(); ++tok_iter)
2535 body.push_back(*tok_iter);
2572 publish<GpgsvMsg>(
"/gpgsv", msg);
2584 }
catch (std::runtime_error& e)
2587 "NavSatFixMsg: " + std::string(e.what()));
2600 publish<NavSatFixMsg>(
"/navsatfix", msg);
2612 }
catch (std::runtime_error& e)
2615 "NavSatFixMsg: " + std::string(e.what()));
2633 publish<NavSatFixMsg>(
"/navsatfix", msg);
2646 }
catch (std::runtime_error& e)
2670 publish<GPSFixMsg>(
"/gpsfix", msg);
2682 }
catch (std::runtime_error& e)
2694 msg.status.header.frame_id = msg.header.frame_id;
2708 publish<GPSFixMsg>(
"/gpsfix", msg);
2720 }
catch (std::runtime_error& e)
2723 "PoseWithCovarianceStampedMsg: " + std::string(e.what()));
2738 publish<PoseWithCovarianceStampedMsg>(
"/pose", msg);
2750 }
catch (std::runtime_error& e)
2753 "PoseWithCovarianceStampedMsg: " + std::string(e.what()));
2771 publish<PoseWithCovarianceStampedMsg>(
"/pose", msg);
2777 std::vector<uint8_t> dvec(
data_,
2783 "septentrio_gnss_driver: parse error in ChannelStatus");
2791 std::vector<uint8_t> dvec(
data_,
2796 "septentrio_gnss_driver: parse error in MeasEpoch");
2809 std::vector<uint8_t> dvec(
data_,
2815 "septentrio_gnss_driver: parse error in DOP");
2823 std::vector<uint8_t> dvec(
data_,
2830 "septentrio_gnss_driver: parse error in VelCovGeodetic");
2847 publish<TwistWithCovarianceStampedMsg>(
"/twist", twist);
2857 }
catch (std::runtime_error& e)
2860 "DiagnosticArrayMsg: " + std::string(e.what()));
2886 publish<DiagnosticArrayMsg>(
"/diagnostics", msg);
2895 }
catch (std::runtime_error& e)
2909 publish<LocalizationUtmMsg>(
"/localization", msg);
2916 std::vector<uint8_t> dvec(
data_,
2923 "septentrio_gnss_driver: parse error in ReceiverStatus");
2931 std::vector<uint8_t> dvec(
data_,
2937 "septentrio_gnss_driver: parse error in QualityInd");
2945 std::vector<uint8_t> dvec(
data_,
2951 "septentrio_gnss_driver: parse error in ReceiverSetup");
2954 static int32_t ins_major = 1;
2955 static int32_t ins_minor = 3;
2956 static int32_t ins_patch = 2;
2957 static int32_t gnss_major = 4;
2958 static int32_t gnss_minor = 10;
2959 static int32_t gnss_patch = 0;
2961 boost::tokenizer<>::iterator it = tok.begin();
2962 std::vector<int32_t> major_minor_patch;
2963 major_minor_patch.reserve(3);
2964 for (boost::tokenizer<>::iterator it = tok.begin(); it != tok.end(); ++it)
2966 int32_t v = std::atoi(it->c_str());
2967 major_minor_patch.push_back(v);
2969 if (major_minor_patch.size() < 3)
2972 "septentrio_gnss_driver: parse error of firmware version.");
2978 if ((major_minor_patch[0] < ins_major) ||
2979 ((major_minor_patch[0] == ins_major) &&
2980 (major_minor_patch[1] < ins_minor)) ||
2981 ((major_minor_patch[0] == ins_major) &&
2982 (major_minor_patch[1] == ins_minor) &&
2983 (major_minor_patch[2] < ins_patch)))
2987 "INS receiver has firmware version: " +
2989 ", which does not support all features. Please update to at least " +
2990 std::to_string(ins_major) +
"." +
2991 std::to_string(ins_minor) +
"." +
2992 std::to_string(ins_patch) +
" or consult README.");
2996 if (major_minor_patch[0] < 3)
3000 "INS receiver seems to be used as GNSS. Some settings may trigger warnings or errors. Consider using 'ins_in_gnss_mode' as receiver type.");
3001 }
else if ((major_minor_patch[0] < gnss_major) ||
3002 ((major_minor_patch[0] == gnss_major) &&
3003 (major_minor_patch[1] < gnss_minor)) ||
3004 ((major_minor_patch[0] == gnss_major) &&
3005 (major_minor_patch[1] == gnss_minor) &&
3006 (major_minor_patch[2] < gnss_patch)))
3010 "GNSS receiver has firmware version: " +
3012 ", which may not support all features. Please update to at least " +
3013 std::to_string(gnss_major) +
"." +
3014 std::to_string(gnss_minor) +
"." +
3015 std::to_string(gnss_patch) +
" or consult README.");
3026 std::vector<uint8_t> dvec(
data_,
3031 "septentrio_gnss_driver: parse error in ReceiverTime");
3047 if ((unix_old != 0) && (
unix_time_ != unix_old))
3053 std::stringstream ss;
3054 ss <<
"Waiting for " << sleep_nsec / 1000000 <<
" milliseconds...";
3057 std::this_thread::sleep_for(std::chrono::nanoseconds(sleep_nsec));
3077 return allTrue(gpsfix_vec,
id);
3082 std::vector<bool> gpsfix_vec = {
3085 return allTrue(gpsfix_vec,
id);
3092 return allTrue(navsatfix_vec,
id);
3098 return allTrue(navsatfix_vec,
id);
3103 std::vector<bool> pose_vec = {
3119 return allTrue(diagnostics_vec,
id);
3130 vec.erase(vec.begin() + id);
3132 return (std::all_of(vec.begin(), vec.end(), [](
bool v) {
return v; }) ==
true);
void publish(const std::string &topic, const M &msg)
Publishing function.
nmea_msgs::Gpgsa GpgsaMsg
Timestamp recvTimestamp_
Timestamp of receiving buffer.
AttCovEulerMsg last_attcoveuler_
Since GPSFix etc. need AttCovEuler, incoming AttCovEuler blocks need to be stored.
bool gnss_gpsfix_complete(uint32_t id)
Wether all blocks from GNSS have arrived for GpsFix Message.
Struct to split an NMEA sentence into its ID and its body, the latter tokenized into a vector of stri...
uint32_t getTow(const uint8_t *buffer)
Get the time of week in ms of the SBF message.
std::string vehicle_frame_id
The frame ID of the vehicle frame.
bool isConnectionDescriptor()
bool read(std::string message_key, bool search=false)
Performs the CRC check (if SBF) and publishes ROS messages.
const uint8_t * data_
Pointer to the buffer of messages.
bool isResponse()
Determines whether data_ currently points to an NMEA message.
bool poscovgeodetic_has_arrived_gpsfix_
#define CARRIAGE_RETURN
0x0D is ASCII for "Carriage Return", i.e. "Enter"
const uint8_t * search()
Searches the buffer for the beginning of the next message (NMEA or SBF)
PosCovGeodeticMsg last_poscovgeodetic_
Since NavSatFix etc. need PosCovGeodetic, incoming PosCovGeodetic blocks need to be stored...
#define NMEA_SYNC_BYTE_1
0x24 is ASCII for $ - 1st byte in each message
bool ins_in_gnss_mode
Handle the case when an INS is used in GNSS mode.
Derived class for parsing GGA messages.
TwistWithCovarianceStampedMsg TwistCallback(bool fromIns=false)
"Callback" function when constructing TwistWithCovarianceStampedMsg messages
void publishTf(const LocalizationUtmMsg &loc)
Publishing function for tf.
bool insnavgeod_has_arrived_navsatfix_
bool allTrue(std::vector< bool > &vec, uint32_t id)
Wether all elements are true.
bool publish_attcoveuler
Whether or not to publish the AttCovEulerMsg message.
bool gnss_pose_complete(uint32_t id)
Wether all blocks from GNSS have arrived for Pose Message.
bool publish_tf
Whether or not to publish the tf of the localization.
bool read_from_sbf_log
Whether or not we are reading from an SBF file.
void wait(Timestamp time_obj)
Waits according to time when reading from file.
bool publish_poscovgeodetic
PVTGeodeticMsg last_pvtgeodetic_
Since NavSatFix etc. need PVTGeodetic, incoming PVTGeodetic blocks need to be stored.
bool crc_check_
Whether the CRC check as evaluated in the read() method was successful or not is stored here...
bool PVTCartesianParser(ROSaicNodeBase *node, It it, It itEnd, PVTCartesianMsg &msg)
Qi based parser for the SBF block "PVTCartesian".
bool IMUSetupParser(ROSaicNodeBase *node, It it, It itEnd, IMUSetupMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "IMUSetup".
NavSatFixMsg NavSatFixCallback()
"Callback" function when constructing NavSatFix messages
PoseWithCovarianceStampedMsg PoseWithCovarianceStampedCallback()
"Callback" function when constructing PoseWithCovarianceStamped messages
bool QualityIndParser(ROSaicNodeBase *node, It it, It itEnd, QualityInd &msg)
Qi based parser for the SBF block "QualityInd".
bool PVTGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, PVTGeodeticMsg &msg)
Qi based parser for the SBF block "PVTGeodetic".
bool ins_gpsfix_complete(uint32_t id)
Wether all blocks from INS have arrived for GpsFix Message.
septentrio_gnss_driver::VelSensorSetup VelSensorSetupMsg
septentrio_gnss_driver::INSNavCart INSNavCartMsg
bool INSNavCartParser(ROSaicNodeBase *node, It it, It itEnd, INSNavCartMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "INSNavCart".
std::vector< uint16_t > indicators
bool BaseVectorGeodParser(ROSaicNodeBase *node, It it, It itEnd, BaseVectorGeodMsg &msg)
bool ins_use_poi
INS solution reference point.
Derived class for parsing RMC messages.
ReceiverSetup last_receiversetup_
Since DiagnosticArray needs ReceiverSetup, incoming ReceiverSetup blocks need to be stored...
bool attcoveuler_has_arrived_pose_
Derived class for parsing GSA messages.
DOP last_dop_
Since GPSFix needs DOP, incoming DOP blocks need to be stored.
void log(LogLevel logLevel, const std::string &s)
Log function to provide abstraction of ROS loggers.
void next()
Goes to the start of the next message based on the calculated length of current message.
bool ReceiverStatusParser(ROSaicNodeBase *node, It it, It itEnd, ReceiverStatus &msg)
Struct for the SBF block "ReceiverStatus".
bool AttCovEulerParser(ROSaicNodeBase *node, It it, It itEnd, AttCovEulerMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "AttCovEuler".
#define NMEA_SYNC_BYTE_2_1
0x47 is ASCII for G - 2nd byte to indicate NMEA-type ASCII message
bool atteuler_has_arrived_pose_
septentrio_gnss_driver::IMUSetup IMUSetupMsg
bool receiverstatus_has_arrived_diagnostics_
bool isNMEA()
Determines whether data_ currently points to an NMEA message.
bool publish_twist
Whether or not to publish the TwistWithCovarianceStampedMsg message.
bool insnavgeod_has_arrived_localization_
const uint8_t * getPosBuffer()
Gets the current position in the read buffer.
bool BaseVectorCartParser(ROSaicNodeBase *node, It it, It itEnd, BaseVectorCartMsg &msg)
Eigen::Matrix3d rpyToRot(double roll, double pitch, double yaw)
nmea_msgs::Gpgsv GpgsvMsg
uint16_t getLength(const uint8_t *buffer)
Get the length of the SBF message.
nmea_msgs::Gprmc GprmcMsg
sensor_msgs::TimeReference TimeReferenceMsg
#define RESPONSE_SYNC_BYTE_3
ImuMsg ImuCallback()
"Callback" function when constructing ImuMsg messages
bool atteuler_has_arrived_gpsfix_
bool diagnostics_complete(uint32_t id)
Wether all blocks have arrived for Diagnostics Message.
INSNavGeodMsg last_insnavgeod_
Since NavSatFix, GPSFix, Imu and Pose. need INSNavGeod, incoming INSNavGeod blocks need to be stored...
uint16_t getWnc(const uint8_t *buffer)
Get the GPS week counter of the SBF message.
Defines a class that reads messages handed over from the circular buffer.
RxIDMap rx_id_map
All instances of the RxMessage class shall have access to the map without reinitializing it...
bool VelSensorSetupParser(ROSaicNodeBase *node, It it, It itEnd, VelSensorSetupMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "VelSensorSetup".
bool MeasEpochParser(ROSaicNodeBase *node, It it, It itEnd, MeasEpochMsg &msg)
Timestamp timestampSBF(const uint8_t *data, bool use_gnss_time)
Calculates the timestamp, in the Unix Epoch time format This is either done using the TOW as transmit...
nmea_msgs::Gpgga GpggaMsg
bool ChannelStatusParser(ROSaicNodeBase *node, It it, It itEnd, ChannelStatus &msg)
Qi based parser for the SBF block "ChannelStatus".
bool velcovgeodetic_has_arrived_gpsfix_
bool gnss_navsatfix_complete(uint32_t id)
Wether all blocks from GNSS have arrived for NavSatFix Message.
ChannelStatus last_channelstatus_
Since GPSFix needs ChannelStatus, incoming ChannelStatus blocks need to be stored.
bool isSBF()
Determines whether data_ currently points to an SBF block.
uint16_t parseUInt16(const uint8_t *buffer)
Converts a 2-byte-buffer into an unsigned 16-bit integer.
Settings * settings_
Settings struct.
uint32_t polling_period_pvt
Polling period for PVT-related SBF blocks.
bool publish_insnavgeod
Whether or not to publish the INSNavGeodMsg message.
bool AttEulerParser(ROSaicNodeBase *node, It it, It itEnd, AttEulerMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "AttEuler".
septentrio_gnss_driver::BaseVectorCart BaseVectorCartMsg
bool ins_pose_complete(uint32_t id)
Wether all blocks from INS have arrived for Pose Message.
bool ins_navsatfix_complete(uint32_t id)
Wether all blocks from INS have arrived for NavSatFix Message.
Timestamp timestampFromRos(const TimestampRos &tsr)
Convert ROS timestamp to nsec timestamp.
std::size_t count_
Number of unread bytes in the buffer.
bool PosCovGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, PosCovGeodeticMsg &msg)
Qi based parser for the SBF block "PosCovGeodetic".
septentrio_gnss_driver::ReceiverTime ReceiverTimeMsg
static const uint8_t SBF_SYNC_BYTE_1
0x24 is ASCII for $ - 1st byte in each message
bool INSNavGeodParser(ROSaicNodeBase *node, It it, It itEnd, INSNavGeodMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "INSNavGeod".
Class to declare error message format when parsing, derived from the public class "std::runtime_error...
bool publish_measepoch
Whether or not to publish the MeasEpoch message.
TypeOfPVTMap type_of_pvt_map
All instances of the RxMessage class shall have access to the map without reinitializing it...
void publishTf(const LocalizationUtmMsg &msg)
Publishing function.
bool ins_localization_complete(uint32_t id)
Wether all blocks have arrived for Localization Message.
ROSaicNodeBase * node_
Pointer to the node.
void publishMessage(const std::string &topic, const M &msg)
Publishing function.
bool publish_extsensormeas
Whether or not to publish the ExtSensorMeasMsg message.
std::size_t messageSize()
uint32_t count_gpsfix_
Number of times the GPSFixMsg message has been published.
bool ReceiverSetupParser(ROSaicNodeBase *node, It it, It itEnd, ReceiverSetup &msg)
Qi based parser for the SBF block "ReceiverSetup".
bool publish_localization
Whether or not to publish the LocalizationMsg message.
septentrio_gnss_driver::INSNavGeod INSNavGeodMsg
int32_t leap_seconds
The number of leap seconds that have been inserted into the UTC time.
#define CONNECTION_DESCRIPTOR_BYTE_1
std::string septentrio_receiver_type
Septentrio receiver type, either "gnss" or "ins".
TimestampRos timestampToRos(Timestamp ts)
Convert nsec timestamp to ROS timestamp.
bool ExtSensorMeasParser(ROSaicNodeBase *node, It it, It itEnd, ExtSensorMeasMsg &msg, bool use_ros_axis_orientation, bool &hasImuMeas)
Qi based parser for the SBF block "ExtSensorMeas".
bool qualityind_has_arrived_diagnostics_
bool poscovgeodetic_has_arrived_pose_
bool read_from_pcap
Whether or not we are reading from a PCAP file.
bool publish_velcovgeodetic
static const uint8_t SBF_SYNC_BYTE_2
0x40 is ASCII for @ - 2nd byte to indicate SBF block
diagnostic_msgs::DiagnosticStatus DiagnosticStatusMsg
bool PosCovCartesianParser(ROSaicNodeBase *node, It it, It itEnd, PosCovCartesianMsg &msg)
Qi based parser for the SBF block "PosCovCartesian".
bool lock_utm_zone
Wether the UTM zone of the localization is locked.
uint16_t getBlockLength()
Gets the length of the SBF block.
VelCovGeodeticMsg last_velcovgeodetic_
Since GPSFix needs VelCovGeodetic, incoming VelCovGeodetic blocks need to be stored.
bool publish_pvtgeodetic
Whether or not to publish the PVTGeodeticMsg message.
std::size_t message_size_
Helps to determine size of response message / NMEA message / SBF block.
std::string imu_frame_id
The frame ID used in the header of published ROS Imu message.
septentrio_gnss_driver::PosCovCartesian PosCovCartesianMsg
ReceiverStatus last_receiverstatus_
Since DiagnosticArray needs ReceiverStatus, incoming ReceiverStatus blocks need to be stored...
DiagnosticArrayMsg DiagnosticArrayCallback()
"Callback" function when constructing DiagnosticArrayMsg messages
bool pvtgeodetic_has_arrived_navsatfix_
bool publish_imu
Whether or not to publish the ImuMsg message.
bool dop_has_arrived_gpsfix_
For GPSFix: Whether the DOP block of the current epoch has arrived or not.
bool validValue(T s)
Check if value is not set to Do-Not-Use -2e10.
QuaternionMsg convertEulerToQuaternion(double yaw, double pitch, double roll)
Transforms Euler angles to a quaternion.
const uint8_t * getEndBuffer()
Gets the end position in the read buffer.
std::vector< ChannelSatInfo > satInfo
#define NMEA_SYNC_BYTE_2_2
0x50 is ASCII for P - 2nd byte to indicate proprietary ASCII message
diagnostic_msgs::DiagnosticArray DiagnosticArrayMsg
LocalizationUtmMsg LocalizationUtmCallback()
"Callback" function when constructing LocalizationUtmMsg messages
GprmcMsg parseASCII(const NMEASentence &sentence, const std::string &frame_id, bool use_gnss_time, Timestamp time_obj) noexcept(false) override
Parses one RMC message.
#define RESPONSE_SYNC_BYTE_1
0x24 is ASCII for $ - 1st byte in each response from the Rx
bool measepoch_has_arrived_gpsfix_
Timestamp getTime()
Gets current timestamp.
nav_msgs::Odometry LocalizationUtmMsg
MeasEpochMsg last_measepoch_
Since GPSFix needs MeasEpoch (for SNRs), incoming MeasEpoch blocks need to be stored.
std::string rx_serial_number
bool pvtgeodetic_has_arrived_pose_
bool publish_atteuler
Whether or not to publish the AttEulerMsg message.
bool pvtgeodetic_has_arrived_gpsfix_
GpggaMsg parseASCII(const NMEASentence &sentence, const std::string &frame_id, bool use_gnss_time, Timestamp time_obj) noexcept(false) override
Parses one GGA message.
std::shared_ptr< std::string > fixedUtmZone_
Fixed UTM zone.
GPSFixMsg GPSFixCallback()
"Callback" function when constructing GPSFix messages
AttEulerMsg last_atteuler_
Since GPSFix etc. need AttEuler, incoming AttEuler blocks need to be stored.
QualityInd last_qualityind_
Since DiagnosticArray needs QualityInd, incoming QualityInd blocks need to be stored.
int8_t current_leap_seconds_
Current leap seconds as received, do not use value is -128.
GpgsvMsg parseASCII(const NMEASentence &sentence, const std::string &frame_id, bool use_gnss_time, Timestamp time_obj) noexcept(false) override
Parses one GSV message.
bool insnavgeod_has_arrived_gpsfix_
bool found()
Has an NMEA message, SBF block or command reply been found in the buffer?
bool isValid(const uint8_t *block)
Validates whether the calculated CRC of the SBF block at hand matches the CRC field of the streamed S...
septentrio_gnss_driver::PVTCartesian PVTCartesianMsg
#define LINE_FEED
0x0A is ASCII for "Line Feed", i.e. "New Line"
bool attcoveuler_has_arrived_gpsfix_
bool insnavgeod_has_arrived_pose_
uint16_t getId(const uint8_t *buffer)
Get the ID of the SBF message.
Derived class for parsing GSV messages.
#define RESPONSE_SYNC_BYTE_2
0x52 is ASCII for R (for "Response") - 2nd byte in each response from the Rx
sensor_msgs::NavSatFix NavSatFixMsg
bool VelCovGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, VelCovGeodeticMsg &msg)
Qi based parser for the SBF block "VelCovGeodetic".
septentrio_gnss_driver::BaseVectorGeod BaseVectorGeodMsg
gps_common::GPSFix GPSFixMsg
bool channelstatus_has_arrived_gpsfix_
bool use_ros_axis_orientation
ROS axis orientation, body: front-left-up, geographic: ENU.
geometry_msgs::PoseWithCovarianceStamped PoseWithCovarianceStampedMsg
GpgsaMsg parseASCII(const NMEASentence &sentence, const std::string &frame_id, bool use_gnss_time, Timestamp time_obj) noexcept(false) override
Parses one GSA message.
bool DOPParser(ROSaicNodeBase *node, It it, It itEnd, DOP &msg)
Qi based parser for the SBF block "DOP".
bool poscovgeodetic_has_arrived_navsatfix_
std::string frame_id
The frame ID used in the header of every published ROS message.
ExtSensorMeasMsg last_extsensmeas_
Since Imu needs ExtSensorMeas, incoming ExtSensorMeas blocks need to be stored.
#define CONNECTION_DESCRIPTOR_BYTE_2
bool found_
Whether or not a message has been found.
geometry_msgs::TwistWithCovarianceStamped TwistWithCovarianceStampedMsg
bool isMessage(const uint16_t ID)
Determines whether data_ points to the SBF block with ID "ID", e.g. 5003.
bool ReceiverTimeParser(ROSaicNodeBase *node, It it, It itEnd, ReceiverTimeMsg &msg)
Struct for the SBF block "ReceiverTime".