Apollo 11.0
自动驾驶开放平台
online_localization_expert.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 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 <iomanip>
18
19#include "cyber/common/log.h"
20#include "cyber/time/clock.h"
22
23namespace apollo {
24namespace localization {
25namespace msf {
26
28 msf_status_.set_local_lidar_consistency(MSF_LOCAL_LIDAR_CONSISTENCY_03);
29 msf_status_.set_gnss_consistency(MSF_GNSS_CONSISTENCY_03);
30 msf_status_.set_local_lidar_status(MSF_LOCAL_LIDAR_UNDEFINED_STATUS);
31 msf_status_.set_gnsspos_position_type(NONE);
32 msf_status_.set_msf_running_status(MSF_RUNNING_INIT);
33 msf_status_.set_local_lidar_quality(MSF_LOCAL_LIDAR_BAD);
34
35 imu_delay_time_threshold_1_ = param.imu_delay_time_threshold_1;
36 imu_delay_time_threshold_2_ = param.imu_delay_time_threshold_2;
37 imu_delay_time_threshold_3_ = param.imu_delay_time_threshold_3;
38
39 imu_missing_time_threshold_1_ = param.imu_missing_time_threshold_1;
40 imu_missing_time_threshold_2_ = param.imu_missing_time_threshold_2;
41 imu_missing_time_threshold_3_ = param.imu_missing_time_threshold_3;
42
43 bestgnsspose_loss_time_threshold_ = param.bestgnsspose_loss_time_threshold;
44 lidar_loss_time_threshold_ = param.lidar_loss_time_threshold;
45
46 localization_std_x_threshold_1_ = param.localization_std_x_threshold_1;
47 localization_std_y_threshold_1_ = param.localization_std_y_threshold_1;
48
49 localization_std_x_threshold_2_ = param.localization_std_x_threshold_2;
50 localization_std_y_threshold_2_ = param.localization_std_y_threshold_2;
51
52 return true;
53}
54
55void OnlineLocalizationExpert::AddImu(const ImuData &data) {
56 double cur_imu_time = data.measurement_time;
57 CheckImuDelayStatus(cur_imu_time);
58 CheckImuMissingStatus(cur_imu_time);
59 CheckGnssLidarMsfStatus(cur_imu_time);
60}
61
63 const LocalizationEstimate &data) {
64 SetLocalizationStatus(data);
65}
66
68 const LocalizationEstimate &data) {
69 msf_status_mutex_.lock();
70 msf_status_.set_local_lidar_status(data.msf_status().local_lidar_status());
71 msf_status_.set_local_lidar_quality(data.msf_status().local_lidar_quality());
72 msf_status_mutex_.unlock();
73 latest_lidar_timestamp_mutex_.lock();
74 latest_lidar_timestamp_ = data.measurement_time();
75 latest_lidar_timestamp_mutex_.unlock();
76}
77
79 const drivers::gnss::GnssBestPose &msg, const MeasureData &data) {
80 int gnss_solution_status = static_cast<int>(msg.sol_status());
81 int gnss_position_type = static_cast<int>(msg.sol_type());
82
83 int gnss_status = 0;
84 if (gnss_solution_status != 0) {
85 gnss_status = 93;
86 } else {
87 gnss_status = gnss_position_type;
88 }
89
90 msf_status_mutex_.lock();
91 msf_status_.set_gnsspos_position_type(
92 static_cast<apollo::localization::GnssPositionType>(gnss_status));
93 msf_status_mutex_.unlock();
94
95 latest_gnsspos_timestamp_mutex_.lock();
96 latest_gnsspos_timestamp_ = data.time;
97 latest_gnsspos_timestamp_mutex_.unlock();
98}
99
100void OnlineLocalizationExpert::CheckImuDelayStatus(const double &cur_imu_time) {
101 sensor_status_.set_imu_delay_status(apollo::localization::IMU_DELAY_NORMAL);
102 double cur_system_time = apollo::cyber::Clock::NowInSeconds();
103 double delta_system_time = cur_system_time - cur_imu_time;
104 if (delta_system_time > imu_delay_time_threshold_1_) {
105 ADEBUG << std::setprecision(16) << "the imu delays " << delta_system_time
106 << ", the current system time is " << cur_system_time
107 << ", the imu timestamp is " << cur_imu_time;
108 sensor_status_.set_imu_delay_status(apollo::localization::IMU_DELAY_3);
109 } else if (delta_system_time > imu_delay_time_threshold_2_) {
110 ADEBUG << std::setprecision(16) << "the imu delays " << delta_system_time
111 << ", the current system time is " << cur_system_time
112 << ", the imu timestamp is " << cur_imu_time;
113 sensor_status_.set_imu_delay_status(apollo::localization::IMU_DELAY_2);
114 } else if (delta_system_time > imu_delay_time_threshold_3_) {
115 ADEBUG << std::setprecision(16) << "the imu delays " << delta_system_time
116 << ", the current system time is " << cur_system_time
117 << ", the imu timestamp is " << cur_imu_time;
118 sensor_status_.set_imu_delay_status(apollo::localization::IMU_DELAY_1);
119 }
120}
121
122void OnlineLocalizationExpert::CheckImuMissingStatus(
123 const double &cur_imu_time) {
124 sensor_status_.set_imu_missing_status(
126 static double pre_imu_time = cur_imu_time;
127 double delta_time = cur_imu_time - pre_imu_time;
128 if (delta_time > imu_missing_time_threshold_1_) {
129 ADEBUG << std::setprecision(16) << "The imu message loss more than 100ms, "
130 << "the pre time and current time: " << pre_imu_time << " "
131 << cur_imu_time;
132 sensor_status_.set_imu_missing_status(ImuMsgMissingStatus::IMU_MISSING_3);
133 } else if (delta_time > imu_missing_time_threshold_2_) {
134 ADEBUG << std::setprecision(16) << "The imu message loss more than 50ms, "
135 << "the pre time and current time: " << pre_imu_time << " "
136 << cur_imu_time;
137 sensor_status_.set_imu_missing_status(ImuMsgMissingStatus::IMU_MISSING_2);
138 } else if (delta_time > imu_missing_time_threshold_3_) {
139 ADEBUG << std::setprecision(16) << "The imu message loss more than 10ms, "
140 << "the pre time and current time: " << pre_imu_time << " "
141 << cur_imu_time;
142 sensor_status_.set_imu_missing_status(ImuMsgMissingStatus::IMU_MISSING_1);
143 } else if (delta_time < 0.0) {
144 ADEBUG << std::setprecision(16) << "Received imu message's time "
145 << "is earlier than last imu message,"
146 << "the pre time and current time: " << pre_imu_time << " "
147 << cur_imu_time;
148 sensor_status_.set_imu_missing_status(
150 }
151 pre_imu_time = cur_imu_time;
152}
153
154void OnlineLocalizationExpert::CheckGnssLidarMsfStatus(
155 const double &cur_imu_time) {
156 std::lock_guard<std::mutex> lock(msf_status_mutex_);
157 latest_gnsspos_timestamp_mutex_.lock();
158 if (cur_imu_time - latest_gnsspos_timestamp_ >
159 bestgnsspose_loss_time_threshold_) {
160 AINFO << std::setprecision(15)
161 << "The bestgnsspose msg loses more than 2 seconds: "
162 << "imu time and latest gnss time: " << cur_imu_time << " "
163 << latest_gnsspos_timestamp_;
164 msf_status_.set_gnsspos_position_type(apollo::localization::MSG_LOSS);
165 }
166 latest_gnsspos_timestamp_mutex_.unlock();
167 latest_lidar_timestamp_mutex_.lock();
168 if (cur_imu_time - latest_lidar_timestamp_ > lidar_loss_time_threshold_) {
169 AINFO << std::setprecision(15)
170 << "The local lidar msg loses more than 2 seconds: "
171 << "imu time and latest local lidar time: " << cur_imu_time << " "
172 << latest_lidar_timestamp_;
173 msf_status_.set_local_lidar_status(
175 msf_status_.set_local_lidar_quality(LocalLidarQuality::MSF_LOCAL_LIDAR_BAD);
176 }
177 latest_lidar_timestamp_mutex_.unlock();
178}
179
180void OnlineLocalizationExpert::SetLocalizationStatus(
181 const LocalizationEstimate &data) {
182 apollo::common::Point3D position_std = data.uncertainty().position_std_dev();
183 std::lock_guard<std::mutex> lock(msf_status_mutex_);
184 if (position_std.x() < localization_std_x_threshold_1_ &&
185 position_std.y() < localization_std_y_threshold_1_) {
186 switch (msf_status_.gnsspos_position_type()) {
190 if (msf_status_.local_lidar_status() ==
192 msf_status_.set_msf_running_status(
195 integ_status_.state_message = "";
196 } else {
197 msf_status_.set_msf_running_status(
200 integ_status_.state_message =
201 "Warning: Lidar Localization Is Abnormal";
202 }
203 break;
210 if (msf_status_.local_lidar_status() ==
212 msf_status_.set_msf_running_status(
215 integ_status_.state_message =
216 "Warning: GNSS Localization Is Unstable";
217 } else {
218 msf_status_.set_msf_running_status(apollo::localization::MSF_SOL_X_X);
220 integ_status_.state_message =
221 "ERROR: Both GNSS and Lidar Localization Is Unstable";
222 }
223 break;
226 if (msf_status_.local_lidar_status() ==
228 msf_status_.set_msf_running_status(
231 integ_status_.state_message =
232 "Warning: GNSS Localization Is Abnormal";
233 } else {
234 msf_status_.set_msf_running_status(
237 integ_status_.state_message =
238 "ERROR: Both GNSS and Lidar Localization Is Abnormal";
239 }
240 break;
241 default:
242 if (msf_status_.local_lidar_status() ==
244 msf_status_.set_msf_running_status(
247 integ_status_.state_message =
248 "WARNNING: GNSS Localization Is Invalid";
249 } else {
250 msf_status_.set_msf_running_status(
253 integ_status_.state_message =
254 "ERROR: Both GNSS and Lidar Localization Is Invalid";
255 }
256 break;
257 }
258 } else if (position_std.x() < localization_std_x_threshold_2_ &&
259 position_std.y() < localization_std_y_threshold_2_) {
260 switch (msf_status_.gnsspos_position_type()) {
264 if (msf_status_.local_lidar_status() ==
266 msf_status_.set_msf_running_status(
269 integ_status_.state_message =
270 "CRITIAL_ERROR: Current Localization Is Unstable";
271 } else {
272 msf_status_.set_msf_running_status(
275 integ_status_.state_message =
276 "CRITIAL_ERROR: Current Localization Is Unstable, "
277 "Lidar Localization is Abnormal";
278 }
279 break;
286 if (msf_status_.local_lidar_status() ==
288 msf_status_.set_msf_running_status(
291 integ_status_.state_message =
292 "CRITIAL_ERROR: Current Localization Is Unstable, "
293 "GNSS Localization is Abnormal";
294 } else {
295 msf_status_.set_msf_running_status(
298 integ_status_.state_message =
299 "CRITIAL_ERROR: Current Localization Is Unstable, "
300 "Both GNSS And Lidar Localization Is Abnormal";
301 }
302 break;
305 if (msf_status_.local_lidar_status() ==
307 msf_status_.set_msf_running_status(
310 integ_status_.state_message =
311 "CRITIAL_ERROR: Current Localization Is Unstable, "
312 "GNSS Localization Is Abnormal";
313 } else {
314 msf_status_.set_msf_running_status(
317 integ_status_.state_message =
318 "CRITIAL_ERROR: Current Localization Is Unstable, "
319 "Both GNSS And Lidar Localization Is Abnormal";
320 }
321 break;
322 default:
323 if (msf_status_.local_lidar_status() ==
325 msf_status_.set_msf_running_status(
328 integ_status_.state_message =
329 "CRITIAL_ERROR: Current Localization Is Unstable, "
330 "GNSS Localization Is Abnormal";
331 } else {
332 msf_status_.set_msf_running_status(
335 integ_status_.state_message =
336 "CRITIAL_ERROR: Current Localization Is Unstable, "
337 "Both GNSS And Lidar Localization Is Abnormal";
338 }
339 break;
340 }
341
342 } else {
343 switch (msf_status_.gnsspos_position_type()) {
347 if (msf_status_.local_lidar_status() ==
349 msf_status_.set_msf_running_status(
352 integ_status_.state_message =
353 "FATAL_ERROR: Current Localization Is NOT Available";
354 } else {
355 msf_status_.set_msf_running_status(
358 integ_status_.state_message =
359 "FATAL_ERROR: Current Localization Is NOT Available, "
360 "Lidar Localization Is Abnormal";
361 }
362 break;
369 if (msf_status_.local_lidar_status() ==
371 msf_status_.set_msf_running_status(
374 integ_status_.state_message =
375 "FATAL_ERROR: Current Localization Is NOT Available, "
376 "GNSS Localization Is Unstable";
377 } else {
378 msf_status_.set_msf_running_status(
381 integ_status_.state_message =
382 "FATAL_ERROR: Current Localization Is NOT Available, "
383 "Both GNSS And Lidar Localization Is Unstable";
384 }
385 break;
388 if (msf_status_.local_lidar_status() ==
390 msf_status_.set_msf_running_status(
393 integ_status_.state_message =
394 "FATAL_ERROR: Current Localization Is NOT Available, "
395 "GNSS Localization Is Abnormal";
396 } else {
397 msf_status_.set_msf_running_status(
400 integ_status_.state_message =
401 "FATAL_ERROR: Current Localization Is NOT Available, "
402 "Both GNSS And Lidar Localization Is Abnormal";
403 }
404 break;
405 default:
406 if (msf_status_.local_lidar_status() ==
408 msf_status_.set_msf_running_status(
411 integ_status_.state_message =
412 "FATAL_ERROR: Current Localization Is NOT Available, "
413 "GNSS Localization Is Invalid";
414 } else {
415 msf_status_.set_msf_running_status(
418 integ_status_.state_message =
419 "FATAL_ERROR: Current Localization Is NOT Available, "
420 "Both GNSS And Lidar Localization Is Invalid";
421 }
422 break;
423 }
424 }
425}
426
428 MsfStatus *msf_status, MsfSensorMsgStatus *sensor_status,
429 LocalizationIntegStatus *integ_status) {
430 {
431 std::unique_lock<std::mutex> lock(msf_status_mutex_);
432 msf_status->set_local_lidar_consistency(
433 msf_status_.local_lidar_consistency());
434 msf_status->set_gnss_consistency(msf_status_.gnss_consistency());
435 msf_status->set_local_lidar_status(msf_status_.local_lidar_status());
436 msf_status->set_gnsspos_position_type(msf_status_.gnsspos_position_type());
437 msf_status->set_msf_running_status(msf_status_.msf_running_status());
438 msf_status->set_local_lidar_quality(msf_status_.local_lidar_quality());
439 }
440
441 sensor_status->set_imu_delay_status(sensor_status_.imu_delay_status());
442 sensor_status->set_imu_missing_status(sensor_status_.imu_missing_status());
443 sensor_status->set_imu_data_status(sensor_status_.imu_data_status());
444
445 *integ_status = integ_status_;
446}
447
449 std::unique_lock<std::mutex> lock(msf_status_mutex_);
450 msf_status->set_gnsspos_position_type(msf_status_.gnsspos_position_type());
451}
452
453} // namespace msf
454} // namespace localization
455} // namespace apollo
static double NowInSeconds()
gets the current time in second.
Definition clock.cc:56
void GetFusionStatus(MsfStatus *msf_status, MsfSensorMsgStatus *sensor_status, LocalizationIntegStatus *integstatus)
void AddFusionLocalization(const LocalizationEstimate &data)
void AddGnssBestPose(const drivers::gnss::GnssBestPose &msg, const MeasureData &data)
void AddLidarLocalization(const LocalizationEstimate &data)
#define ADEBUG
Definition log.h:41
#define AINFO
Definition log.h:42
class register implement
Definition arena_queue.h:37
optional LocalLidarQuality local_lidar_quality
optional LocalLidarConsistency local_lidar_consistency
optional GnssConsistency gnss_consistency
optional LocalLidarStatus local_lidar_status
optional MsfRunningStatus msf_running_status
optional GnssPositionType gnsspos_position_type