19#include "yaml-cpp/yaml.h"
31namespace localization {
37 apollo::common::monitor::MonitorMessageItem::LOCALIZATION),
38 localization_state_(msf::LocalizationMeasureState::
OK),
40 raw_imu_msg_(nullptr) {}
45 return localization_integ_.
Init(localization_param_);
57 FLAGS_trans_gpstime_to_utctime;
58 localization_param_.
gnss_mode = FLAGS_gnss_mode;
65 localization_param_.
map_path = FLAGS_map_dir +
"/" + FLAGS_local_map_name;
74 localization_param_.
if_use_avx = FLAGS_if_use_avx;
80 localization_param_.
utm_zone_id = FLAGS_local_utm_zone_id;
82 if (FLAGS_if_utm_zone_id_from_folder) {
83 bool success = LoadZoneIdFromFolder(localization_param_.
map_path,
86 AWARN <<
"Can't load utm zone id from map folder, use default value.";
92 imu_vehicle_quat_.x() = FLAGS_imu_vehicle_qx;
93 imu_vehicle_quat_.y() = FLAGS_imu_vehicle_qy;
94 imu_vehicle_quat_.z() = FLAGS_imu_vehicle_qz;
95 imu_vehicle_quat_.w() = FLAGS_imu_vehicle_qw;
96 imu_vehicle_translation_[0] = 0.0;
97 imu_vehicle_translation_[1] = 0.0;
98 imu_vehicle_translation_[2] = 0.0;
100 if (FLAGS_if_vehicle_imu_from_file) {
106 AINFO <<
"Vehile imu file: " << FLAGS_vehicle_imu_file;
107 if (LoadImuVehicleExtrinsic(FLAGS_vehicle_imu_file, &qx, &qy, &qz, &qw,
108 &imu_vehicle_translation_)) {
109 imu_vehicle_quat_.x() = qx;
110 imu_vehicle_quat_.y() = qy;
111 imu_vehicle_quat_.z() = qz;
112 imu_vehicle_quat_.w() = qw;
114 AWARN <<
"Can't load imu vehicle quat from file, use default value.";
117 AINFO <<
"imu_vehicle_quat: " << imu_vehicle_quat_.x() <<
" "
118 << imu_vehicle_quat_.y() <<
" " << imu_vehicle_quat_.z() <<
" "
119 << imu_vehicle_quat_.w();
123 FLAGS_enable_lidar_localization;
125 if (!FLAGS_if_imuant_from_file) {
130 FLAGS_imu_to_ant_offset_ux;
132 FLAGS_imu_to_ant_offset_uy;
134 FLAGS_imu_to_ant_offset_uz;
136 double offset_x = 0.0;
137 double offset_y = 0.0;
138 double offset_z = 0.0;
139 double uncertainty_x = 0.0;
140 double uncertainty_y = 0.0;
141 double uncertainty_z = 0.0;
142 AINFO <<
"Ant imu lever arm file: " << FLAGS_ant_imu_leverarm_file;
143 ACHECK(LoadGnssAntennaExtrinsic(FLAGS_ant_imu_leverarm_file, &offset_x,
144 &offset_y, &offset_z, &uncertainty_x,
145 &uncertainty_y, &uncertainty_z));
164 FLAGS_imu_delay_time_threshold_1;
166 FLAGS_imu_delay_time_threshold_2;
168 FLAGS_imu_delay_time_threshold_3;
171 FLAGS_imu_missing_time_threshold_1;
173 FLAGS_imu_missing_time_threshold_2;
175 FLAGS_imu_missing_time_threshold_3;
178 FLAGS_bestgnsspose_loss_time_threshold;
180 FLAGS_lidar_loss_time_threshold;
183 FLAGS_localization_std_x_threshold_1;
185 FLAGS_localization_std_y_threshold_1;
188 FLAGS_localization_std_x_threshold_2;
190 FLAGS_localization_std_y_threshold_2;
194 localization_timer_->Start();
198 const std::shared_ptr<drivers::PointCloud> &message) {
200 if (pcd_msg_index_ % FLAGS_point_cloud_step != 0) {
211 publisher_->PublishLocalizationMsfLidar(result.localization());
216 const std::shared_ptr<drivers::gnss::Imu> &imu_msg) {
217 if (FLAGS_imu_coord_rfu) {
228 status_headerpb->set_timestamp_sec(
229 result.localization().header().timestamp_sec());
230 status.set_fusion_status(
231 static_cast<MeasureState>(result.integ_status().integ_state));
232 status.set_state_message(result.integ_status().state_message);
233 status.set_measurement_time(result.localization().measurement_time());
234 publisher_->PublishLocalizationStatus(status);
240 CompensateImuVehicleExtrinsic(&local_result);
242 publisher_->PublishPoseBroadcastTF(local_result);
243 publisher_->PublishPoseBroadcastTopic(local_result);
246 localization_state_ = result.state();
250 const std::shared_ptr<drivers::gnss::Imu> &imu_msg) {
252 std::unique_lock<std::mutex> lock(mutex_imu_msg_);
253 raw_imu_msg_ =
const_cast<std::shared_ptr<drivers::gnss::Imu> &
>(imu_msg);
258 const std::shared_ptr<drivers::gnss::GnssBestPose> &bestgnsspos_msg) {
261 FLAGS_gnss_only_init) {
271 publisher_->PublishLocalizationMsfGnss(result.localization());
276 const std::shared_ptr<drivers::gnss::EpochObservation> &raw_obs_msg) {
279 FLAGS_gnss_only_init) {
289 publisher_->PublishLocalizationMsfGnss(result.localization());
294 const std::shared_ptr<drivers::gnss::GnssEphemeris> &gnss_orbit_msg) {
297 FLAGS_gnss_only_init) {
305 const std::shared_ptr<drivers::gnss::Heading> &gnss_heading_msg) {
308 FLAGS_gnss_only_init) {
318 std::unique_lock<std::mutex> lock(mutex_imu_msg_);
323 const std::shared_ptr<LocalizationMsgPublisher> &publisher) {
324 publisher_ = publisher;
327void MSFLocalization::CompensateImuVehicleExtrinsic(
329 CHECK_NOTNULL(local_result);
333 const Eigen::Quaternion<double> quaternion(
334 orientation.
qw(), orientation.
qx(), orientation.
qy(), orientation.
qz());
335 Eigen::Quaternion<double> quat_vehicle_world = quaternion * imu_vehicle_quat_;
339 quat_vehicle_world.w(), quat_vehicle_world.x(), quat_vehicle_world.y(),
340 quat_vehicle_world.z()));
345 quat_vehicle_world.w(), quat_vehicle_world.x(), quat_vehicle_world.y(),
346 quat_vehicle_world.z());
347 eulerangles->set_x(euler_angle.pitch());
348 eulerangles->set_y(euler_angle.roll());
349 eulerangles->set_z(euler_angle.yaw());
353 Eigen::Vector3d compensated_position =
354 quat_vehicle_world.toRotationMatrix() * imu_vehicle_translation_;
355 position->set_x(position->
x() + compensated_position[0]);
356 position->set_y(position->
y() + compensated_position[1]);
357 position->set_z(position->
z() + compensated_position[2]);
360bool MSFLocalization::LoadGnssAntennaExtrinsic(
361 const std::string &file_path,
double *offset_x,
double *offset_y,
362 double *offset_z,
double *uncertainty_x,
double *uncertainty_y,
363 double *uncertainty_z) {
364 YAML::Node config = YAML::LoadFile(file_path);
365 if (config[
"leverarm"]) {
366 if (config[
"leverarm"][
"primary"][
"offset"]) {
367 *offset_x = config[
"leverarm"][
"primary"][
"offset"][
"x"].as<
double>();
368 *offset_y = config[
"leverarm"][
"primary"][
"offset"][
"y"].as<
double>();
369 *offset_z = config[
"leverarm"][
"primary"][
"offset"][
"z"].as<
double>();
371 if (config[
"leverarm"][
"primary"][
"uncertainty"]) {
373 config[
"leverarm"][
"primary"][
"uncertainty"][
"x"].as<
double>();
375 config[
"leverarm"][
"primary"][
"uncertainty"][
"y"].as<
double>();
377 config[
"leverarm"][
"primary"][
"uncertainty"][
"z"].as<
double>();
385bool MSFLocalization::LoadImuVehicleExtrinsic(
const std::string &file_path,
386 double *quat_qx,
double *quat_qy,
387 double *quat_qz,
double *quat_qw,
388 Eigen::Vector3d *translation) {
389 for (
size_t i = 0; i < 3; ++i) {
390 (*translation)[i] = 0.0;
395 YAML::Node config = YAML::LoadFile(file_path);
396 if (config[
"transform"]) {
397 if (config[
"transform"][
"rotation"]) {
398 *quat_qx = config[
"transform"][
"rotation"][
"x"].as<
double>();
399 *quat_qy = config[
"transform"][
"rotation"][
"y"].as<
double>();
400 *quat_qz = config[
"transform"][
"rotation"][
"z"].as<
double>();
401 *quat_qw = config[
"transform"][
"rotation"][
"w"].as<
double>();
405 if (config[
"transform"][
"translation"]) {
406 (*translation)[0] = config[
"transform"][
"translation"][
"x"].as<
double>();
407 (*translation)[1] = config[
"transform"][
"translation"][
"y"].as<
double>();
408 (*translation)[2] = config[
"transform"][
"translation"][
"z"].as<
double>();
415bool MSFLocalization::LoadZoneIdFromFolder(
const std::string &folder_path,
417 std::string map_zone_id_folder;
419 map_zone_id_folder = folder_path +
"/map/000/north";
421 map_zone_id_folder = folder_path +
"/map/000/south";
427 for (
auto itr = folder_list.begin(); itr != folder_list.end(); ++itr) {
428 *zone_id = std::stoi(*itr);
A general class to denote the return status of an API call.
Used to perform oneshot or periodic timing tasks
void SetPublisher(const std::shared_ptr< LocalizationMsgPublisher > &publisher)
void OnRawImu(const std::shared_ptr< drivers::gnss::Imu > &imu_msg)
void OnPointCloud(const std::shared_ptr< drivers::PointCloud > &message)
void OnGnssBestPose(const std::shared_ptr< drivers::gnss::GnssBestPose > &bestgnsspos_msg)
apollo::common::Status Init()
void OnRawImuCache(const std::shared_ptr< drivers::gnss::Imu > &imu_msg)
void OnLocalizationTimer()
void OnGnssHeading(const std::shared_ptr< drivers::gnss::Heading > &gnss_heading_msg)
void OnGnssRtkEph(const std::shared_ptr< drivers::gnss::GnssEphemeris > &gnss_orbit_msg)
void OnGnssRtkObs(const std::shared_ptr< drivers::gnss::EpochObservation > &raw_obs_msg)
const LocalizationResult & GetLastestLidarLocalization() const
void RawImuProcessFlu(const drivers::gnss::Imu &imu_msg)
void PcdProcess(const drivers::PointCloud &message)
const LocalizationResult & GetLastestIntegLocalization() const
common::Status Init(const LocalizationIntegParam ¶ms)
void GnssHeadingProcess(const drivers::gnss::Heading &gnss_heading_msg)
void RawObservationProcess(const drivers::gnss::EpochObservation &raw_obs_msg)
const LocalizationResult & GetLastestGnssLocalization() const
void RawEphemerisProcess(const drivers::gnss::GnssEphemeris &gnss_orbit_msg)
void RawImuProcessRfu(const drivers::gnss::Imu &imu_msg)
void GnssBestPoseProcess(const drivers::gnss::GnssBestPose &bestgnsspos_msg)
Defines the EulerAnglesZXY class.
The gflags used by localization module
Math-related util functions.
The class of MSFLocalization
EulerAnglesZXY< double > EulerAnglesZXYd
double QuaternionToHeading(const double qw, const double qx, const double qy, const double qz)
bool PathExists(const std::string &path)
Check if the path exists.
bool DirectoryExists(const std::string &directory_path)
Check if the directory specified by directory_path exists and is indeed a directory.
std::vector< std::string > ListSubPaths(const std::string &directory_path, const unsigned char d_type)
List sub-paths.
Contains a number of helper functions related to quaternions.
optional apollo::common::Quaternion orientation
std::string lidar_height_file
std::string ant_imu_leverarm_file
double bestgnsspose_loss_time_threshold
double imu_missing_time_threshold_1
std::string lidar_extrinsic_file
double sins_state_pos_std
double imu_delay_time_threshold_3
double imu_missing_time_threshold_2
bool is_sins_align_with_vel
double localization_std_x_threshold_2
double localization_std_y_threshold_1
double localization_std_y_threshold_2
double imu_missing_time_threshold_3
bool enable_lidar_localization
double imu_delay_time_threshold_1
double vel_threshold_get_yaw
bool is_ins_can_self_align
double imu_delay_time_threshold_2
double sins_state_span_time
double lidar_height_default
double lidar_loss_time_threshold
double map_coverage_theshold
double localization_std_x_threshold_1
bool is_using_raw_gnsspos
ImuToAntOffset imu_to_ant_offset
double imu_lidar_max_delay_time
bool is_trans_gpstime_to_utctime