Apollo 11.0
自动驾驶开放平台
broadgnss_base_parser.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17// An parser for decoding binary messages from a NovAtel receiver. The following
18// messages must be
19// logged in order for this parser to work properly.
20//
22
23#include <cmath>
24#include <iostream>
25#include <limits>
26#include <memory>
27#include <vector>
28
29namespace apollo {
30namespace drivers {
31namespace gnss {
32
34 : auto_fill_gps_msg_(config.auto_fill_gps_msg()) {}
35
37 return GetMessages(0, messages);
38}
39
40void BroadGnssBaseParser::GetMessages(const uint8_t& channel,
41 MessageInfoVec* messages) {
42 if (data_ == nullptr) {
43 return;
44 }
45 if (!PrepareMessage(channel)) {
46 return;
47 }
48
50 FillGnssBestpos();
51 messages->push_back(MessageInfo{MessageType::BEST_GNSS_POS,
52 reinterpret_cast<MessagePtr>(&bestpos_)});
53 return;
54 }
55
57 FillHeading();
58 messages->push_back(MessageInfo{MessageType::HEADING,
59 reinterpret_cast<MessagePtr>(&heading_)});
60 return;
61 }
62
63 if (auto_fill_gps_msg_ && broadgnss_message_.best_latitude < 0 &&
64 bestpos_ratecontrol_.check()) {
65 FillGnssBestpos();
66 messages->push_back(MessageInfo{MessageType::BEST_GNSS_POS,
67 reinterpret_cast<MessagePtr>(&bestpos_)});
68 }
69
70 if (auto_fill_gps_msg_ && broadgnss_message_.gps_heading < -0.1) {
71 FillHeading();
72 messages->push_back(MessageInfo{MessageType::HEADING,
73 reinterpret_cast<MessagePtr>(&heading_)});
74 }
75
76 FillImu();
77 FillIns();
78 FillInsStat();
79 messages->push_back(
80 MessageInfo{MessageType::IMU, reinterpret_cast<MessagePtr>(&imu_)});
81 messages->push_back(
82 MessageInfo{MessageType::INS, reinterpret_cast<MessagePtr>(&ins_)});
83 messages->push_back(MessageInfo{MessageType::INS_STAT,
84 reinterpret_cast<MessagePtr>(&ins_stat_)});
85}
86
87void BroadGnssBaseParser::PrepareMessageStatus(const uint8_t& solution_status,
88 const uint8_t& solution_type) {
89 switch (solution_status) {
90 case 0:
92 break;
93 case 1:
94 case 2:
95 case 3:
97 break;
98 case 4:
100 break;
101 default:
103 }
104 switch (solution_type) {
105 case 0:
107 break;
108 case 1:
109 case 2:
110 case 3:
111 case 6:
113 break;
114 case 4:
116 break;
117 case 5:
119 break;
120 default:
122 }
123}
124
125void BroadGnssBaseParser::FillGnssBestpos() {
126 bestpos_.set_measurement_time(broadgnss_message_.gps_timestamp_sec);
127 bestpos_.set_sol_status(broadgnss_message_.solution_status);
128 bestpos_.set_sol_type(broadgnss_message_.solution_type);
130 // 使用BESTPOS结果
131 bestpos_.set_latitude(broadgnss_message_.best_latitude);
132 bestpos_.set_longitude(broadgnss_message_.best_longitude);
133 bestpos_.set_height_msl(broadgnss_message_.best_altitude);
134 bestpos_.set_undulation(broadgnss_message_.undulation);
135 bestpos_.set_differential_age(broadgnss_message_.differential_age);
136 bestpos_.set_solution_age(broadgnss_message_.solution_age);
137 } else {
138 // 使用融合结果
139 bestpos_.set_latitude(broadgnss_message_.latitude);
140 bestpos_.set_longitude(broadgnss_message_.longitude);
141 bestpos_.set_height_msl(broadgnss_message_.altitude);
142 }
143
144 bestpos_.set_latitude_std_dev(broadgnss_message_.lat_std);
145 bestpos_.set_longitude_std_dev(broadgnss_message_.lon_std);
146 bestpos_.set_height_std_dev(broadgnss_message_.alti_std);
147 bestpos_.set_num_sats_tracked(broadgnss_message_.satellites_num);
148 bestpos_.set_num_sats_in_solution(broadgnss_message_.satellites_num);
149 bestpos_.set_num_sats_l1(broadgnss_message_.satellites_num);
150 bestpos_.set_num_sats_multi(broadgnss_message_.satellites_num);
151}
152
153void BroadGnssBaseParser::FillIns() {
154 ins_.mutable_euler_angles()->set_x(broadgnss_message_.roll * DEG_TO_RAD);
155 ins_.mutable_euler_angles()->set_y(-broadgnss_message_.pitch * DEG_TO_RAD);
156 ins_.mutable_euler_angles()->set_z(
158 ins_.mutable_position()->set_lon(broadgnss_message_.longitude);
159 ins_.mutable_position()->set_lat(broadgnss_message_.latitude);
160 ins_.mutable_position()->set_height(broadgnss_message_.altitude);
161 ins_.mutable_linear_velocity()->set_x(broadgnss_message_.ve);
162 ins_.mutable_linear_velocity()->set_y(broadgnss_message_.vn);
163 ins_.mutable_linear_velocity()->set_z(broadgnss_message_.vu);
165 broadgnss_message_.acc_z, ins_.mutable_linear_acceleration());
167 broadgnss_message_.gyro_z, ins_.mutable_angular_velocity());
168 ins_.set_measurement_time(broadgnss_message_.gps_timestamp_sec);
169 ins_.mutable_header()->set_timestamp_sec(cyber::Time::Now().ToSecond());
170
176 ins_.set_type(Ins::GOOD);
177 break;
179 ins_.set_type(Ins::CONVERGING);
180 break;
181 default:
182 ins_.set_type(Ins::INVALID);
183 break;
184 }
185}
186
187void BroadGnssBaseParser::FillInsStat() {
188 ins_stat_.set_ins_status(broadgnss_message_.solution_status);
189 ins_stat_.set_pos_type(broadgnss_message_.solution_type);
190}
191
192void BroadGnssBaseParser::FillImu() {
194 broadgnss_message_.acc_z, imu_.mutable_linear_acceleration());
196 broadgnss_message_.gyro_z, imu_.mutable_angular_velocity());
197 imu_.set_measurement_time(broadgnss_message_.gps_timestamp_sec);
198}
199
200void BroadGnssBaseParser::FillHeading() {
201 heading_.set_solution_status(broadgnss_message_.solution_status);
202 heading_.set_position_type(broadgnss_message_.solution_type);
203 heading_.set_measurement_time(broadgnss_message_.gps_timestamp_sec);
204 if (broadgnss_message_.gps_heading > -0.1) {
205 heading_.set_heading(broadgnss_message_.gps_heading);
206 heading_.set_pitch(broadgnss_message_.gps_pitch);
207 } else {
208 heading_.set_heading(broadgnss_message_.heading);
209 heading_.set_pitch(broadgnss_message_.pitch);
210 }
211 heading_.set_heading_std_dev(broadgnss_message_.yaw_std);
212 heading_.set_pitch_std_dev(broadgnss_message_.pitch_std);
213 // heading_.set_station_id("0");
214 heading_.set_satellite_number_multi(broadgnss_message_.satellites_num);
215 heading_.set_satellite_soulution_number(broadgnss_message_.satellites_num);
216}
217
218} // namespace gnss
219} // namespace drivers
220} // namespace apollo
static Time Now()
get the current time.
Definition time.cc:57
virtual void GetMessages(const uint8_t &channel, MessageInfoVec *messages)
virtual bool PrepareMessage(const uint8_t &channel)=0
void PrepareMessageStatus(const uint8_t &solution_status, const uint8_t &solution_type)
const uint8_t * data_
Definition parser.h:145
::google::protobuf::Message * MessagePtr
Definition parser.h:34
constexpr double DEG_TO_RAD
constexpr char BESTPOSA_MESSAGE_ID[]
void rfu_to_flu(double r, double f, double u, ::apollo::common::Point3D *flu)
constexpr double azimuth_deg_to_yaw_rad(double azimuth)
constexpr char HEADINGA_MESSAGE_ID[]
std::vector< MessageInfo > MessageInfoVec
Definition parser.h:57
class register implement
Definition arena_queue.h:37