24namespace localization {
31 msf_status_.set_gnsspos_position_type(
NONE);
56 double cur_imu_time = data.measurement_time;
57 CheckImuDelayStatus(cur_imu_time);
58 CheckImuMissingStatus(cur_imu_time);
59 CheckGnssLidarMsfStatus(cur_imu_time);
64 SetLocalizationStatus(data);
69 msf_status_mutex_.lock();
72 msf_status_mutex_.unlock();
73 latest_lidar_timestamp_mutex_.lock();
75 latest_lidar_timestamp_mutex_.unlock();
80 int gnss_solution_status =
static_cast<int>(msg.
sol_status());
81 int gnss_position_type =
static_cast<int>(msg.
sol_type());
84 if (gnss_solution_status != 0) {
87 gnss_status = gnss_position_type;
90 msf_status_mutex_.lock();
91 msf_status_.set_gnsspos_position_type(
93 msf_status_mutex_.unlock();
95 latest_gnsspos_timestamp_mutex_.lock();
96 latest_gnsspos_timestamp_ = data.time;
97 latest_gnsspos_timestamp_mutex_.unlock();
100void OnlineLocalizationExpert::CheckImuDelayStatus(
const double &cur_imu_time) {
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;
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;
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;
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 <<
" "
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 <<
" "
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 <<
" "
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 <<
" "
148 sensor_status_.set_imu_missing_status(
151 pre_imu_time = cur_imu_time;
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_;
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(
177 latest_lidar_timestamp_mutex_.unlock();
180void OnlineLocalizationExpert::SetLocalizationStatus(
181 const LocalizationEstimate &data) {
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_) {
192 msf_status_.set_msf_running_status(
197 msf_status_.set_msf_running_status(
201 "Warning: Lidar Localization Is Abnormal";
212 msf_status_.set_msf_running_status(
216 "Warning: GNSS Localization Is Unstable";
221 "ERROR: Both GNSS and Lidar Localization Is Unstable";
228 msf_status_.set_msf_running_status(
232 "Warning: GNSS Localization Is Abnormal";
234 msf_status_.set_msf_running_status(
238 "ERROR: Both GNSS and Lidar Localization Is Abnormal";
244 msf_status_.set_msf_running_status(
248 "WARNNING: GNSS Localization Is Invalid";
250 msf_status_.set_msf_running_status(
254 "ERROR: Both GNSS and Lidar Localization Is Invalid";
258 }
else if (position_std.
x() < localization_std_x_threshold_2_ &&
259 position_std.
y() < localization_std_y_threshold_2_) {
266 msf_status_.set_msf_running_status(
270 "CRITIAL_ERROR: Current Localization Is Unstable";
272 msf_status_.set_msf_running_status(
276 "CRITIAL_ERROR: Current Localization Is Unstable, "
277 "Lidar Localization is Abnormal";
288 msf_status_.set_msf_running_status(
292 "CRITIAL_ERROR: Current Localization Is Unstable, "
293 "GNSS Localization is Abnormal";
295 msf_status_.set_msf_running_status(
299 "CRITIAL_ERROR: Current Localization Is Unstable, "
300 "Both GNSS And Lidar Localization Is Abnormal";
307 msf_status_.set_msf_running_status(
311 "CRITIAL_ERROR: Current Localization Is Unstable, "
312 "GNSS Localization Is Abnormal";
314 msf_status_.set_msf_running_status(
318 "CRITIAL_ERROR: Current Localization Is Unstable, "
319 "Both GNSS And Lidar Localization Is Abnormal";
325 msf_status_.set_msf_running_status(
329 "CRITIAL_ERROR: Current Localization Is Unstable, "
330 "GNSS Localization Is Abnormal";
332 msf_status_.set_msf_running_status(
336 "CRITIAL_ERROR: Current Localization Is Unstable, "
337 "Both GNSS And Lidar Localization Is Abnormal";
349 msf_status_.set_msf_running_status(
353 "FATAL_ERROR: Current Localization Is NOT Available";
355 msf_status_.set_msf_running_status(
359 "FATAL_ERROR: Current Localization Is NOT Available, "
360 "Lidar Localization Is Abnormal";
371 msf_status_.set_msf_running_status(
375 "FATAL_ERROR: Current Localization Is NOT Available, "
376 "GNSS Localization Is Unstable";
378 msf_status_.set_msf_running_status(
382 "FATAL_ERROR: Current Localization Is NOT Available, "
383 "Both GNSS And Lidar Localization Is Unstable";
390 msf_status_.set_msf_running_status(
394 "FATAL_ERROR: Current Localization Is NOT Available, "
395 "GNSS Localization Is Abnormal";
397 msf_status_.set_msf_running_status(
401 "FATAL_ERROR: Current Localization Is NOT Available, "
402 "Both GNSS And Lidar Localization Is Abnormal";
408 msf_status_.set_msf_running_status(
412 "FATAL_ERROR: Current Localization Is NOT Available, "
413 "GNSS Localization Is Invalid";
415 msf_status_.set_msf_running_status(
419 "FATAL_ERROR: Current Localization Is NOT Available, "
420 "Both GNSS And Lidar Localization Is Invalid";
431 std::unique_lock<std::mutex> lock(msf_status_mutex_);
432 msf_status->set_local_lidar_consistency(
445 *integ_status = integ_status_;
449 std::unique_lock<std::mutex> lock(msf_status_mutex_);
static double NowInSeconds()
gets the current time in second.
void GetFusionStatus(MsfStatus *msf_status, MsfSensorMsgStatus *sensor_status, LocalizationIntegStatus *integstatus)
void AddFusionLocalization(const LocalizationEstimate &data)
void AddImu(const ImuData &data)
void AddGnssBestPose(const drivers::gnss::GnssBestPose &msg, const MeasureData &data)
bool Init(const LocalizationIntegParam ¶m)
void AddLidarLocalization(const LocalizationEstimate &data)
void GetGnssStatus(MsfStatus *msf_status)
@ MSF_LOCAL_LIDAR_CONSISTENCY_03
@ MSF_LOCAL_LIDAR_UNDEFINED_STATUS
@ MSF_LOCAL_LIDAR_NO_OUTPUT
@ MSF_GNSS_CONSISTENCY_03
optional SolutionType sol_type
optional SolutionStatus sol_status
optional double measurement_time
optional MsfStatus msf_status
optional ImuMsgDelayStatus imu_delay_status
optional ImuMsgDataStatus imu_data_status
optional ImuMsgMissingStatus imu_missing_status
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
double bestgnsspose_loss_time_threshold
double imu_missing_time_threshold_1
double imu_delay_time_threshold_3
double imu_missing_time_threshold_2
double localization_std_x_threshold_2
double localization_std_y_threshold_1
double localization_std_y_threshold_2
double imu_missing_time_threshold_3
double imu_delay_time_threshold_1
double imu_delay_time_threshold_2
double lidar_loss_time_threshold
double localization_std_x_threshold_1
std::string state_message
LocalizationIntegState integ_state