Apollo 10.0
自动驾驶开放平台
apollo::localization::msf::LocalizationLidarProcess类 参考

process lidar msg for localization 更多...

#include <localization_lidar_process.h>

apollo::localization::msf::LocalizationLidarProcess 的协作图:

Public 类型

typedef Eigen::Affine3d TransformD
 
typedef Eigen::Vector3d Vector3D
 
typedef Eigen::Matrix3d Matrix3D
 

Public 成员函数

 LocalizationLidarProcess ()
 
 ~LocalizationLidarProcess ()
 
apollo::common::Status Init (const LocalizationIntegParam &params)
 
void PcdProcess (const LidarFrame &lidar_frame)
 
void GetResult (int *lidar_status, TransformD *location, Matrix3D *covariance) const
 
int GetResult (LocalizationEstimate *lidar_local_msg)
 
void IntegPvaProcess (const InsPva &sins_pva_msg)
 
void RawImuProcess (const ImuData &imu_msg)
 

详细描述

process lidar msg for localization

在文件 localization_lidar_process.h70 行定义.

成员类型定义说明

◆ Matrix3D

◆ TransformD

◆ Vector3D

构造及析构函数说明

◆ LocalizationLidarProcess()

apollo::localization::msf::LocalizationLidarProcess::LocalizationLidarProcess ( )

在文件 localization_lidar_process.cc33 行定义.

34 : locator_(new LocalizationLidar()),
35 pose_forecastor_(new PoseForcast()),
36 map_path_(""),
37 lidar_extrinsic_file_(""),
38 lidar_height_file_(""),
39 localization_mode_(2),
40 yaw_align_mode_(2),
41 lidar_filter_size_(17),
42 delta_yaw_limit_(0.25 * 3.14159 / 180.0),
43 init_delta_yaw_limit_(1.5 * 3.14159 / 180.0),
44 compensate_pitch_roll_limit_(0.035),
45 utm_zone_id_(50),
46 map_coverage_theshold_(0.8),
47 lidar_extrinsic_(TransformD::Identity()),
48 lidar_height_(),
49 is_get_first_lidar_msg_(false),
50 cur_predict_location_(TransformD::Identity()),
51 pre_predict_location_(TransformD::Identity()),
52 velocity_(Vector3D::Zero()),
53 pre_location_(TransformD::Identity()),
54 location_(TransformD::Identity()),
55 pre_location_time_(0.0),
56 location_covariance_(Matrix3D::Zero()),
57 lidar_status_(LidarState::NOT_VALID),
58 reinit_flag_(false),
59 imu_lidar_max_delay_time_(0.5),
60 is_unstable_reset_(true),
61 unstable_count_(0),
62 unstable_threshold_(0.3),
63 out_map_count_(0),
64 forecast_integ_state_(ForecastState::NOT_VALID),
65 forecast_timer_(-1) {}

◆ ~LocalizationLidarProcess()

apollo::localization::msf::LocalizationLidarProcess::~LocalizationLidarProcess ( )

在文件 localization_lidar_process.cc67 行定义.

67 {
68 delete locator_;
69 locator_ = nullptr;
70
71 delete pose_forecastor_;
72 pose_forecastor_ = nullptr;
73}

成员函数说明

◆ GetResult() [1/2]

void apollo::localization::msf::LocalizationLidarProcess::GetResult ( int *  lidar_status,
TransformD location,
Matrix3D covariance 
) const

在文件 localization_lidar_process.cc208 行定义.

210 {
211 CHECK_NOTNULL(lidar_status);
212 CHECK_NOTNULL(location);
213 CHECK_NOTNULL(covariance);
214
215 *lidar_status = static_cast<int>(lidar_status_);
216 *location = location_;
217 *covariance = location_covariance_;
218}

◆ GetResult() [2/2]

int apollo::localization::msf::LocalizationLidarProcess::GetResult ( LocalizationEstimate lidar_local_msg)

在文件 localization_lidar_process.cc220 行定义.

220 {
221 if (lidar_local_msg == nullptr) {
222 return static_cast<int>(LidarState::NOT_VALID);
223 }
224
225 lidar_local_msg->set_measurement_time(pre_location_time_);
226
227 apollo::common::Header* headerpb = lidar_local_msg->mutable_header();
228 headerpb->set_timestamp_sec(pre_location_time_);
229
230 apollo::localization::Pose* posepb = lidar_local_msg->mutable_pose();
231 apollo::common::PointENU* position = posepb->mutable_position();
232 position->set_x(location_.translation()(0));
233 position->set_y(location_.translation()(1));
234 position->set_z(location_.translation()(2));
235
236 apollo::common::Quaternion* quaternion = posepb->mutable_orientation();
237 Eigen::Quaterniond quat(location_.linear());
238 quaternion->set_qx(quat.x());
239 quaternion->set_qy(quat.y());
240 quaternion->set_qz(quat.z());
241 quaternion->set_qw(quat.w());
242
244 lidar_local_msg->mutable_uncertainty();
245
246 apollo::common::Point3D* position_std_dev =
247 uncertainty->mutable_position_std_dev();
248 position_std_dev->set_x(location_covariance_(0, 0));
249 position_std_dev->set_y(location_covariance_(1, 1));
250 position_std_dev->set_z(0.0);
251
252 static constexpr double yaw_covariance = 0.15 * 0.15 * DEG_TO_RAD2;
253 apollo::common::Point3D* orientation_std_dev =
254 uncertainty->mutable_orientation_std_dev();
255 orientation_std_dev->set_x(0.0);
256 orientation_std_dev->set_y(0.0);
257 orientation_std_dev->set_z(yaw_covariance);
258
259 MsfStatus* msf_status = lidar_local_msg->mutable_msf_status();
260 msf_status->set_local_lidar_status(local_lidar_status_);
261 msf_status->set_local_lidar_quality(local_lidar_quality_);
262
263 return static_cast<int>(lidar_status_);
264}

◆ Init()

Status apollo::localization::msf::LocalizationLidarProcess::Init ( const LocalizationIntegParam params)

在文件 localization_lidar_process.cc75 行定义.

75 {
76 // initial_success_ = false;
77 map_path_ = params.map_path;
78 lidar_extrinsic_file_ = params.lidar_extrinsic_file;
79 lidar_height_file_ = params.lidar_height_file;
80 localization_mode_ = params.localization_mode;
81 yaw_align_mode_ = params.lidar_yaw_align_mode;
82 utm_zone_id_ = params.utm_zone_id;
83 map_coverage_theshold_ = params.map_coverage_theshold;
84 imu_lidar_max_delay_time_ = params.imu_lidar_max_delay_time;
85
86 lidar_filter_size_ = params.lidar_filter_size;
87
88 is_unstable_reset_ = params.is_lidar_unstable_reset;
89 unstable_threshold_ = params.unstable_reset_threshold;
90 if_use_avx_ = params.if_use_avx;
91
92 lidar_status_ = LidarState::NOT_VALID;
93
94 // reload_map_flag_ = false;
95 reinit_flag_ = false;
96
97 // buffer
98 out_map_count_ = 0;
99
100 is_get_first_lidar_msg_ = false;
101 cur_predict_location_ = TransformD::Identity();
102 pre_predict_location_ = TransformD::Identity();
103 pre_location_ = TransformD::Identity();
104 velocity_ = Vector3D::Zero();
105 location_ = TransformD::Identity();
106 location_covariance_ = Matrix3D::Zero();
108 local_lidar_quality_ = LocalLidarQuality::MSF_LOCAL_LIDAR_BAD;
109
110 bool success = LoadLidarExtrinsic(lidar_extrinsic_file_, &lidar_extrinsic_);
111 if (!success) {
112 AERROR << "LocalizationLidar: Fail to access the lidar"
113 " extrinsic file: "
114 << lidar_extrinsic_file_;
116 "Fail to access the lidar extrinsic file");
117 }
118
119 success = LoadLidarHeight(lidar_height_file_, &lidar_height_);
120 if (!success) {
121 AWARN << "LocalizationLidar: Fail to load the lidar"
122 " height file: "
123 << lidar_height_file_ << " Will use default value!";
124 lidar_height_.height = params.lidar_height_default;
125 }
126
127 if (!locator_->Init(map_path_, lidar_filter_size_, lidar_filter_size_,
128 utm_zone_id_)) {
131 "Fail to load localization map!");
132 }
133
134 locator_->SetVelodyneExtrinsic(lidar_extrinsic_);
135 locator_->SetLocalizationMode(localization_mode_);
136 locator_->SetImageAlignMode(yaw_align_mode_);
137 locator_->SetValidThreshold(static_cast<float>(map_coverage_theshold_));
138 locator_->SetVehicleHeight(lidar_height_.height);
139 locator_->SetDeltaPitchRollLimit(compensate_pitch_roll_limit_);
140
141 const double deg_to_rad = 0.017453292519943;
142 const double max_gyro_input = 200 * deg_to_rad; // 200 degree
143 const double max_acc_input = 5.0; // 5.0 m/s^2
144 pose_forecastor_->SetMaxListNum(400);
145 pose_forecastor_->SetMaxAccelInput(max_acc_input);
146 pose_forecastor_->SetMaxGyroInput(max_gyro_input);
147 pose_forecastor_->SetZoneId(utm_zone_id_);
148
149 return Status::OK();
150}
static Status OK()
generate a success status.
Definition status.h:60
bool Init(const std::string &map_path, const unsigned int search_range_x, const unsigned int search_range_y, const int zone_id, const unsigned int resolution_id=0)
void SetVelodyneExtrinsic(const Eigen::Affine3d &pose)
#define AERROR
Definition log.h:44
#define AWARN
Definition log.h:43

◆ IntegPvaProcess()

void apollo::localization::msf::LocalizationLidarProcess::IntegPvaProcess ( const InsPva &  sins_pva_msg)

在文件 localization_lidar_process.cc266 行定义.

266 {
267 pose_forecastor_->PushInspvaData(sins_pva_msg);
268}

◆ PcdProcess()

void apollo::localization::msf::LocalizationLidarProcess::PcdProcess ( const LidarFrame lidar_frame)

在文件 localization_lidar_process.cc164 行定义.

164 {
165 if (!CheckState()) {
166 AERROR << "PcdProcess: Receive an invalid lidar msg!";
167 return;
168 }
169
170 // pcd process cost time
171 Timer timer;
172 timer.Start();
173
174 static unsigned int pcd_index = 0;
175
176 if (!GetPredictPose(lidar_frame.measurement_time, &cur_predict_location_,
177 &forecast_integ_state_)) {
178 AINFO << "PcdProcess: Discard a lidar msg because can't get predict pose. "
179 << "More info see log in function GetPredictPose.";
180 return;
181 }
182
183 if (forecast_integ_state_ != ForecastState::INCREMENT) {
184 forecast_timer_ = -1;
185 }
186 ++forecast_timer_;
187
188 locator_->SetDeltaYawLimit(ComputeDeltaYawLimit(
189 forecast_timer_, 10, delta_yaw_limit_, init_delta_yaw_limit_));
190
191 if (!is_get_first_lidar_msg_) {
192 pre_predict_location_ = cur_predict_location_;
193 pre_location_ = cur_predict_location_;
194 velocity_ = Vector3D::Zero();
195 is_get_first_lidar_msg_ = true;
196 }
197
198 velocity_ = cur_predict_location_.translation() - pre_location_.translation();
199
200 int ret = locator_->Update(pcd_index++, cur_predict_location_, velocity_,
201 lidar_frame, if_use_avx_);
202
203 UpdateState(ret, lidar_frame.measurement_time);
204
205 timer.End("Lidar process");
206}
int Update(const unsigned int frame_idx, const Eigen::Affine3d &pose, const Eigen::Vector3d velocity, const LidarFrame &lidar_frame, bool use_avx=false)
#define AINFO
Definition log.h:42

◆ RawImuProcess()

void apollo::localization::msf::LocalizationLidarProcess::RawImuProcess ( const ImuData &  imu_msg)

在文件 localization_lidar_process.cc270 行定义.

270 {
271 pose_forecastor_->PushImuData(imu_msg);
272}

该类的文档由以下文件生成: