31 #include <boost/make_shared.hpp>
50 const size_t EXPECTED_LEN_OEM6 = 13;
51 const size_t EXPECTED_LEN_OEM4 = 12;
53 if (sentence.body.size() != EXPECTED_LEN_OEM4 &&
54 sentence.body.size() != EXPECTED_LEN_OEM6)
56 std::stringstream error;
57 error <<
"Expected GPRMC lengths = "
58 << EXPECTED_LEN_OEM4 <<
" (for OEM4), "
59 << EXPECTED_LEN_OEM6 <<
" (for OEM6), "
60 <<
"actual length = " << sentence.body.size();
65 novatel_gps_msgs::GprmcPtr
msg = boost::make_shared<novatel_gps_msgs::Gprmc>();
66 msg->message_id = sentence.body[0];
68 if (sentence.body[1].empty() || sentence.body[1] ==
"0")
85 msg->position_status = sentence.body[2];
87 success &= (sentence.body[2].compare(
"A") == 0);
88 success &= !(sentence.body[3].empty() || sentence.body[5].empty());
92 double latitude = 0.0;
93 valid = valid &&
ParseDouble(sentence.body[3], latitude);
96 double longitude = 0.0;
97 valid = valid &&
ParseDouble(sentence.body[5], longitude);
100 msg->lat_dir = sentence.body[4];
101 msg->lon_dir = sentence.body[6];
104 msg->speed *= KNOTS_TO_MPS;
108 std::string date_str = sentence.body[9];
109 if (!date_str.empty())
111 msg->date = std::string(
"20") + date_str.substr(4, 2) +
112 std::string(
"-") + date_str.substr(2, 2) +
113 std::string(
"-") + date_str.substr(0, 2);
115 valid = valid &&
ParseFloat(sentence.body[10],
msg->mag_var);
116 msg->mag_var_direction = sentence.body[11];
117 if (sentence.body.size() == EXPECTED_LEN_OEM6) {
118 msg->mode_indicator = sentence.body[12];
123 was_last_gps_valid_ =
false;
127 was_last_gps_valid_ = success;
134 return was_last_gps_valid_;