33 #include <boost/make_shared.hpp>
47 novatel_gps_msgs::RangePtr
51 if (bin_msg.data_.size() != (BINARY_OBSERVATION_SIZE * num_obs) + 4)
53 std::stringstream error;
54 error <<
"Unexpected range message size: " << bin_msg.data_.size();
57 novatel_gps_msgs::RangePtr ros_msg = boost::make_shared<novatel_gps_msgs::Range>();
59 ros_msg->novatel_msg_header = h_parser.
ParseBinary(bin_msg);
60 ros_msg->novatel_msg_header.message_name =
"RANGE";
62 ros_msg->numb_of_observ = num_obs;
63 ros_msg->info.reserve(num_obs);
64 for(
int i = 0; i < num_obs; i++)
66 size_t obs_offset = 4 + i * BINARY_OBSERVATION_SIZE;
68 novatel_gps_msgs::RangeInformation info;
70 info.prn_number =
ParseUInt16(&bin_msg.data_[obs_offset]);
71 info.glofreq =
ParseUInt16(&bin_msg.data_[obs_offset+2]);
72 info.psr =
ParseDouble(&bin_msg.data_[obs_offset+4]);
73 info.psr_std =
ParseFloat(&bin_msg.data_[obs_offset+12]);
74 info.adr =
ParseDouble(&bin_msg.data_[obs_offset+16]);
75 info.adr_std =
ParseFloat(&bin_msg.data_[obs_offset+24]);
76 info.dopp =
ParseFloat(&bin_msg.data_[obs_offset+28]);
77 info.noise_density_ratio =
ParseFloat(&bin_msg.data_[obs_offset+32]);
78 info.locktime =
ParseFloat(&bin_msg.data_[obs_offset+36]);
79 info.tracking_status =
ParseUInt32(&bin_msg.data_[obs_offset+40]);
81 ros_msg->info.push_back(info);
86 novatel_gps_msgs::RangePtr
89 novatel_gps_msgs::RangePtr
msg = boost::make_shared<novatel_gps_msgs::Range>();
94 std::stringstream error;
95 error <<
"Unable to parse number of observations in RANGE log.";
98 uint32_t numb_of_observ =
static_cast<uint32_t
>(
msg->numb_of_observ);
99 if (sentence.body.size() != 1 + numb_of_observ * ASCII_FIELDS)
101 std::stringstream error;
102 error <<
"Did not find expected number of observations in RANGE log.";
106 valid &=
ParseInt32(sentence.body[0],
msg->numb_of_observ, 10);
107 msg->info.resize(numb_of_observ);
108 for (
int i = 0, index = 0; index < numb_of_observ; i += 10, index++)
110 valid &=
ParseUInt16(sentence.body[i + 1],
msg->info[index].prn_number, 10);
111 valid &=
ParseUInt16(sentence.body[i + 2],
msg->info[index].glofreq, 10);
113 valid &=
ParseFloat(sentence.body[i + 4],
msg->info[index].psr_std);
115 valid &=
ParseFloat(sentence.body[i + 6],
msg->info[index].adr_std);
116 valid &=
ParseFloat(sentence.body[i + 7],
msg->info[index].dopp);
117 valid &=
ParseFloat(sentence.body[i + 8],
msg->info[index].noise_density_ratio);
118 valid &=
ParseFloat(sentence.body[i + 9],
msg->info[index].locktime);
119 std::string track =
"0x" + sentence.body[i + 10];
120 valid &=
ParseUInt32(track,
msg->info[index].tracking_status, 16);