Apollo 11.0
自动驾驶开放平台
decode_0B.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 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#include <cmath>
18#include <iostream>
19
22
23typedef struct { /* time struct */
24 time_t time; /* time (s) expressed by standard time_t */
25 double sec; /* fraction of second under 1 s */
26} gtime_t;
27
28gtime_t epoch2time_sdk(const double* ep) {
29 const int doy[] = {1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
30 gtime_t time = {0};
31 int days, sec, year = static_cast<int>(ep[0]), mon = static_cast<int>(ep[1]),
32 day = static_cast<int>(ep[2]);
33
34 if (year < 1970 || 2099 < year || mon < 1 || 12 < mon) return time;
35
36 /* leap year if year%4==0 in 1901-2099 */
37 days = (year - 1970) * 365 + (year - 1969) / 4 + doy[mon - 1] + day - 2 +
38 (year % 4 == 0 && mon >= 3 ? 1 : 0);
39 sec = static_cast<int>(floor(ep[5]));
40 time.time = static_cast<time_t>(days) * 86400 +
41 static_cast<int>(ep[3]) * 3600 + static_cast<int>(ep[4]) * 60 +
42 sec;
43 time.sec = ep[5] - sec;
44 return time;
45}
46
47gtime_t gpst2time_sdk(int week, double sec) {
48 static const double gpst0[] = {1980, 1, 6, 0, 0, 0};
49 gtime_t t = epoch2time_sdk(gpst0);
50
51 if (sec < -1E9 || 1E9 < sec) sec = 0.0;
52 t.time += 86400 * 7 * week + static_cast<int>(sec);
53 t.sec = sec - static_cast<int>(sec);
54 return t;
55}
56
58 filename2 = "BDDB10.csv";
59 content2 =
60 "Lon_deg,LonStd,Lat_deg,LatStd,Alt_m,AltStd,fix,RtkAge_s,Trk_deg,Vspd_"
61 "mps,LatencyVel_s,BaseLineLenth_m,Heading_dg,HeadingStd,Pitch_deg,"
62 "PitchStd,UtcYear,UtcMon,UtcDay,UtcHour,UtcMin,UtcSec,ItowPos,ItowVel,"
63 "ItowHeading,RecMsgOutput,SvNumMst";
64
65 filename0b = "BDDB0B.csv";
66 content0b =
67 "roll,pitch,yaw,GyroX,GyroY,GyroZ,x_acc,y_acc,z_acc,latitude,longitude,"
68 "altitude,north_vel,east_vel,ground_vel,ins_status,modestatus,system_ms";
69
70 // createFileAndWrite(filename2, content2);
71 // createFileAndWrite(filename0b, content0b);
72
75}
76
78
79void Decode_0B::subData(const uint8_t* sub_address, int& index) {
80 std::string type = "";
81 char str[16] = {0};
82 std::snprintf(str, sizeof(str), "%02X%02X%02X", sub_address[0],
83 sub_address[1], sub_address[2]);
84 type += str;
85 if (type == m_typeImu) {
86 parse0B(sub_address, index);
87 } else if (type == m_typeGnss) {
88 parseGnss(sub_address, index);
89 } else {
90 index += 3;
91 printf("protocol type error:%s!\n", type.c_str());
92 }
93}
94
95void Decode_0B::parse0B(const uint8_t* data, int& pos) {
96 static const double deg_coefficient = 360.0 / 32768;
97 static const double angular_coefficient = 300.0 / 32768;
98 static const double acc_coefficient = 12.0 / 32768 * 9.7883105;
99 static const double velocity_coefficient = 100.0 / 32768;
100 static const double deg_to_rad = M_PI / 180.0;
101
102 int sub_index = 3;
103 uint8_t check_sum = 0;
104 int dataLength = getLength(m_typeImu);
105 /* check xor */
106 for (int i = 0; i < dataLength - 1; ++i) {
107 check_sum ^= data[i];
108 }
109
110 if (check_sum == data[dataLength - 1]) {
111 /* roll pitch yaw */
112 float roll = (toValue<int16_t>(data, sub_index)) * deg_coefficient;
113 float pitch = (toValue<int16_t>(data, sub_index)) * deg_coefficient;
114 float x = (toValue<int16_t>(data, sub_index)) * deg_coefficient;
115 if (x < 0) {
116 x = 360.0 + x;
117 }
118 float yaw = x;
119
120 /* gx gy gz , ax ay az */
121 double imu_msg_y_angular_velocity =
122 (toValue<int16_t>(data, sub_index)) * angular_coefficient;
123 double imu_msg_x_angular_velocity =
124 (toValue<int16_t>(data, sub_index)) * angular_coefficient;
125 double imu_msg_z_angular_velocity =
126 -(toValue<int16_t>(data, sub_index)) * angular_coefficient;
127 double imu_msg_y_acc =
128 (toValue<int16_t>(data, sub_index)) * acc_coefficient;
129 double imu_msg_x_acc =
130 (toValue<int16_t>(data, sub_index)) * acc_coefficient;
131 double imu_msg_z_acc =
132 -(toValue<int16_t>(data, sub_index)) * acc_coefficient;
133
134 double imu_msg_latitude = (toValue<int32_t>(data, sub_index)) * 0.0000001;
135 double imu_msg_longitude = (toValue<int32_t>(data, sub_index)) * 0.0000001;
136 double imu_msg_altitude = (toValue<int32_t>(data, sub_index)) * 0.001;
137
138 float imu_msg_north_velocity =
139 (toValue<int16_t>(data, sub_index)) * velocity_coefficient;
140 float imu_msg_east_velocity =
141 (toValue<int16_t>(data, sub_index)) * velocity_coefficient;
142 float imu_msg_ground_velocity =
143 (toValue<int16_t>(data, sub_index)) * velocity_coefficient;
144 uint8_t imu_msg_ins_status = toValue<uint8_t>(data, sub_index);
145 sub_index = 44;
146 uint8_t modestatus = toValue<uint8_t>(data, sub_index);
147 sub_index = 46;
148 int16_t data1 = toValue<uint16_t>(data, sub_index);
149 int16_t data2 = toValue<uint16_t>(data, sub_index);
150 int16_t data3 = toValue<uint16_t>(data, sub_index);
151
152 sub_index = 52;
153 uint32_t timiddle = toValue<uint32_t>(data, sub_index);
154 double t_ms = timiddle * 2.5 * 0.0001;
155 uint8_t loop_type = toValue<uint8_t>(data, sub_index);
156 sub_index = 58;
157 uint32_t t_week = (toValue<uint32_t>(data, sub_index));
158
159 gtime_t ts_time = gpst2time_sdk(t_week, t_ms - 18);
160
161 int64_t system_ms = (static_cast<double>(ts_time.time) * 1000.0) +
162 (static_cast<double>(ts_time.sec) * 1000.0);
163
164 pos += m_lengthImu;
165
166 // 俯仰角
167 insdata.Pitch_deg = pitch;
168 // 横滚角
169 insdata.Roll_deg = roll;
170 // 航向角
171 insdata.Yaw_deg = yaw;
172
173 insdata.GyroX = imu_msg_x_angular_velocity * deg_to_rad; /*gx*/
174 insdata.GyroY = imu_msg_y_angular_velocity * deg_to_rad;
175 insdata.GyroZ = imu_msg_z_angular_velocity * deg_to_rad;
176 insdata.AccX_g = imu_msg_x_acc; /* 零偏修正后加速度计 */
177 insdata.AccY_g = imu_msg_y_acc;
178 insdata.AccZ_g = imu_msg_z_acc;
179
180 // 这个是惯导融合后的输出
181 insdata.Lon_deg = imu_msg_longitude;
182 insdata.Lat_deg = imu_msg_latitude;
183 insdata.Alt_m = imu_msg_altitude;
184
186 imu_msg_north_velocity; /*融合后 NED north velocity (m/s) */
188 imu_msg_east_velocity; /*融合后 NED east velocity (m/s) */
190 imu_msg_ground_velocity; /*融合后 NED down velocity (m/s) */
191 insdata.InsStatus = imu_msg_ins_status;
192 insdata.LoopType = loop_type;
193 insdata.data1 = data1;
194 insdata.data2 = data2;
195 insdata.data3 = data3;
196 insdata.ModeStatus = modestatus;
197 insdata.SysTime_ms = system_ms;
198
199 // Do not write csv.
200 // std::vector<std::string> data_w;
201 // data_w.push_back(std::to_string(pitch));
202 // data_w.push_back(std::to_string(roll));
203 // data_w.push_back(std::to_string(yaw));
204 // data_w.push_back(std::to_string(imu_msg_x_angular_velocity));
205 // data_w.push_back(std::to_string(imu_msg_y_angular_velocity));
206 // data_w.push_back(std::to_string(imu_msg_z_angular_velocity));
207 // data_w.push_back(std::to_string(imu_msg_x_acc));
208 // data_w.push_back(std::to_string(imu_msg_y_acc));
209 // data_w.push_back(std::to_string(imu_msg_z_acc));
210 // data_w.push_back(std::to_string(imu_msg_longitude));
211 // data_w.push_back(std::to_string(imu_msg_latitude));
212 // data_w.push_back(std::to_string(imu_msg_altitude));
213 // data_w.push_back(std::to_string(imu_msg_north_velocity));
214 // data_w.push_back(std::to_string(imu_msg_east_velocity));
215 // data_w.push_back(std::to_string(imu_msg_ground_velocity));
216 // data_w.push_back(std::to_string(imu_msg_ins_status));
217 // data_w.push_back(std::to_string(modestatus));
218 // data_w.push_back(std::to_string(system_ms));
219
220 // if (AppendCsv(filename0b, data_w)) {
221 // // std::cout << "数据成功写入到文件 " << filename << "\n";
222 // } else {
223 // std::cerr << "写入文件时出现错误\n";
224 // }
225
226 update_ins = 1;
227 } else {
228 pos += 3;
229 }
230}
231
232void Decode_0B::parseGnss(const uint8_t* data, int& pos) {
233 int sub_index = 3;
234 uint8_t check_sum = 0;
235 int dataLength = getLength(m_typeGnss);
236 /* check xor */
237 for (int i = 0; i < dataLength - 1; ++i) {
238 check_sum ^= data[i];
239 }
240
241 if (check_sum == data[dataLength - 1]) {
242 double m_gnssMsg_longitude =
243 (toValue<int32_t>(data, sub_index)) * 0.0000001;
244 double m_gnssMsg_lon_sigma = (toValue<int16_t>(data, sub_index)) * 0.001;
245 double m_gnssMsg_latitude = (toValue<int32_t>(data, sub_index)) * 0.0000001;
246 double m_gnssMsg_lat_sigma = (toValue<int16_t>(data, sub_index)) * 0.001;
247 double m_gnssMsg_altitude = (toValue<int32_t>(data, sub_index)) * 0.001;
248 double m_gnssMsg_alt_sigma = (toValue<int16_t>(data, sub_index)) * 0.001;
249
250 double m_gnssMsg_gps_fix = toValue<uint16_t>(data, sub_index);
251 float m_gnssMsg_rtk_age = toValue<uint16_t>(data, sub_index);
252 uint8_t m_gnssMsg_flags_pos = data[sub_index++];
253 uint8_t m_gnssMsg_flags_vel = data[sub_index++];
254 uint8_t m_gnssMsg_flags_attitude = data[sub_index++];
255 uint8_t m_gnssMsg_flags_time = data[sub_index++];
256
257 double m_gnssMsg_hor_vel = (toValue<int16_t>(data, sub_index)) * 0.01;
258 double m_gnssMsg_track_angle = (toValue<int16_t>(data, sub_index)) * 0.01;
259 double m_gnssMsg_ver_vel = (toValue<int16_t>(data, sub_index)) * 0.01;
260 double m_gnssMsg_latency_vel = (toValue<int16_t>(data, sub_index)) * 0.001;
261 double m_gnssMsg_base_length = (toValue<int16_t>(data, sub_index)) * 0.001;
262
263 double m_gnssMsg_yaw = (toValue<int16_t>(data, sub_index)) * 0.01;
264 double m_gnssMsg_yaw_sigma = (toValue<int16_t>(data, sub_index)) * 0.001;
265 double m_gnssMsg_pitch = (toValue<int16_t>(data, sub_index)) * 0.001;
266 double m_gnssMsg_pitch_sigma = (toValue<int16_t>(data, sub_index)) * 0.001;
267
268 uint16_t utc_year_m = toValue<uint16_t>(data, sub_index);
269 uint16_t utc_year = (utc_year_m & 0x3f) + 2000;
270 // week_year = (((utc_year_m >> 6)&0x3ff) +2000);
271 uint8_t utc_mon = data[sub_index++];
272 uint8_t utc_day = data[sub_index++];
273 uint8_t utc_hour = data[sub_index++];
274 uint8_t utc_min = data[sub_index++];
275 float utc_sec = toValue<uint16_t>(data, sub_index) * 0.001;
276
277 double m_gnssMsg_ts_pos = toValue<uint32_t>(data, sub_index);
278 double m_gnssMsg_ts_vel = toValue<uint32_t>(data, sub_index);
279 double m_gnssMsg_ts_heading = toValue<uint32_t>(data, sub_index);
280 double m_gnssMsg_state = data[sub_index++];
281 double m_gnssMsg_num_master = data[sub_index++];
282 sub_index++;
283
284 double m_gnssMsg_gdop = (toValue<int16_t>(data, sub_index)) * 0.01;
285 double m_gnssMsg_pdop = (toValue<int16_t>(data, sub_index)) * 0.01;
286 double m_gnssMsg_hdop = (toValue<int16_t>(data, sub_index)) * 0.01;
287 double m_gnssMsg_htdop = (toValue<int16_t>(data, sub_index)) * 0.01;
288 double m_gnssMsg_tdop = (toValue<int16_t>(data, sub_index)) * 0.01;
289 double m_gnssMsg_num_reserve = data[sub_index++];
290
291 pos += m_lengthGnss;
292
293 insdata.flag_pos = m_gnssMsg_flags_pos;
294 // 这是融合rtk的输出
295 insdata.Lon_gnss_deg = m_gnssMsg_longitude;
296 insdata.Lat_gnss_deg = m_gnssMsg_latitude;
297 insdata.Alt_gnss_m = m_gnssMsg_altitude;
298 insdata.differential_age = m_gnssMsg_rtk_age;
299
300 // Do not write csv.
301 // std::vector<std::string> data_w;
302 // data_w.push_back(std::to_string(m_gnssMsg_longitude));
303 // data_w.push_back(std::to_string(m_gnssMsg_lon_sigma));
304 // data_w.push_back(std::to_string(m_gnssMsg_latitude));
305 // data_w.push_back(std::to_string(m_gnssMsg_lat_sigma));
306 // data_w.push_back(std::to_string(m_gnssMsg_altitude));
307 // data_w.push_back(std::to_string(m_gnssMsg_alt_sigma));
308 // data_w.push_back(std::to_string(m_gnssMsg_gps_fix));
309 // data_w.push_back(std::to_string(m_gnssMsg_rtk_age));
310 // // data_w.push_back(std::to_string(m_gnssMsg_msg_type));
311 // // data_w.push_back(std::to_string(m_gnssMsg_flags_pos));
312 // // data_w.push_back(std::to_string(m_gnssMsg_flags_vel));
313 // // data_w.push_back(std::to_string(m_gnssMsg_flags_attitude));
314 // // data_w.push_back(std::to_string(m_gnssMsg_flags_time));
315 // // data_w.push_back(std::to_string(m_gnssMsg_hor_vel));
316 // data_w.push_back(std::to_string(m_gnssMsg_track_angle));
317 // data_w.push_back(std::to_string(m_gnssMsg_ver_vel));
318 // data_w.push_back(std::to_string(m_gnssMsg_latency_vel));
319 // data_w.push_back(std::to_string(m_gnssMsg_base_length));
320 // data_w.push_back(std::to_string(m_gnssMsg_yaw));
321 // data_w.push_back(std::to_string(m_gnssMsg_yaw_sigma));
322 // data_w.push_back(std::to_string(m_gnssMsg_pitch));
323 // data_w.push_back(std::to_string(m_gnssMsg_pitch_sigma));
324 // data_w.push_back(std::to_string(utc_year));
325 // data_w.push_back(std::to_string(utc_mon));
326 // data_w.push_back(std::to_string(utc_day));
327 // data_w.push_back(std::to_string(utc_hour));
328 // data_w.push_back(std::to_string(utc_min));
329 // data_w.push_back(std::to_string(utc_sec));
330 // data_w.push_back(std::to_string(m_gnssMsg_ts_pos));
331 // data_w.push_back(std::to_string(m_gnssMsg_ts_vel));
332 // data_w.push_back(std::to_string(m_gnssMsg_ts_heading));
333 // data_w.push_back(std::to_string(m_gnssMsg_state));
334 // data_w.push_back(std::to_string(m_gnssMsg_num_master));
335 // data_w.push_back(std::to_string(m_gnssMsg_gdop));
336 // data_w.push_back(std::to_string(m_gnssMsg_pdop));
337 // data_w.push_back(std::to_string(m_gnssMsg_hdop));
338 // // data_w.push_back(std::to_string(m_gnssMsg_vdop));
339 // data_w.push_back(std::to_string(m_gnssMsg_tdop));
340 // data_w.push_back(std::to_string(m_gnssMsg_num_reserve));
341
342 // if (AppendCsv(filename2, data_w)) {
343 // // std::cout << "数据成功写入到文件 " << filename << "\n";
344 // } else {
345 // std::cerr << "写入文件时出现错误\n";
346 // }
347
348 } else {
349 pos += 3;
350 }
351}
std::string m_typeGnss
void parseGnss(const uint8_t *data, int &pos)
Definition decode_0B.cc:232
virtual ~Decode_0B()
Definition decode_0B.cc:77
std::string m_typeImu
void parse0B(const uint8_t *data, int &pos)
Definition decode_0B.cc:95
void subData(const uint8_t *sub_address, int &index)
Definition decode_0B.cc:79
bool registProtocol(const std::string &protocolFlag, int length, ProtocolAsensing *sub)
int getLength(const std::string &flag)
gtime_t epoch2time_sdk(const double *ep)
Definition decode_0B.cc:28
gtime_t gpst2time_sdk(int week, double sec)
Definition decode_0B.cc:47
uint8_t InsStatus
double Lon_gnss_deg
double Lat_gnss_deg
float differential_age
uint8_t flag_pos
uint8_t LoopType
uint8_t ModeStatus
int64_t SysTime_ms
double sec
Definition decode_0B.cc:25
time_t time
Definition decode_0B.cc:24