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

interface of msf localization 更多...

#include <localization_integ_impl.h>

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

Public 成员函数

 LocalizationIntegImpl ()
 
 ~LocalizationIntegImpl ()
 
common::Status Init (const LocalizationIntegParam &params)
 
void PcdProcess (const LidarFrame &lidar_frame)
 
void RawImuProcessRfu (const ImuData &imu_data)
 
void RawObservationProcess (const drivers::gnss::EpochObservation &raw_obs_msg)
 
void RawEphemerisProcess (const drivers::gnss::GnssEphemeris &gnss_orbit_msg)
 
void GnssBestPoseProcess (const drivers::gnss::GnssBestPose &bestgnsspos_msg)
 
void GnssHeadingProcess (const drivers::gnss::Heading &gnssheading_msg)
 
const LocalizationResultGetLastestLidarLocalization () const
 
const LocalizationResultGetLastestIntegLocalization () const
 
const LocalizationResultGetLastestGnssLocalization () const
 

Protected 成员函数

void PcdProcessImpl (const LidarFrame &pcd_data)
 
void ImuProcessImpl (const ImuData &imu_data)
 
void RawObservationProcessImpl (const drivers::gnss::EpochObservation &raw_obs_msg)
 
void RawEphemerisProcessImpl (const drivers::gnss::GnssEphemeris &gnss_orbit_msg)
 
void GnssBestPoseProcessImpl (const drivers::gnss::GnssBestPose &bestgnsspos_msg)
 
void GnssHeadingProcessImpl (const drivers::gnss::Heading &gnssheading_msg)
 
void TransferGnssMeasureToLocalization (const MeasureData &measure, LocalizationEstimate *localization)
 

详细描述

interface of msf localization

在文件 localization_integ_impl.h51 行定义.

构造及析构函数说明

◆ LocalizationIntegImpl()

apollo::localization::msf::LocalizationIntegImpl::LocalizationIntegImpl ( )

在文件 localization_integ_impl.cc29 行定义.

30 : republish_process_(new MeasureRepublishProcess()),
31 integ_process_(new LocalizationIntegProcess()),
32 gnss_process_(new LocalizationGnssProcess()),
33 lidar_process_(new LocalizationLidarProcess()),
34 is_use_gnss_bestpose_(true),
35 imu_altitude_from_lidar_localization_(0.0),
36 imu_altitude_from_lidar_localization_available_(false),
37 enable_lidar_localization_(true),
38 gnss_antenna_extrinsic_(Eigen::Affine3d::Identity()) {}

◆ ~LocalizationIntegImpl()

apollo::localization::msf::LocalizationIntegImpl::~LocalizationIntegImpl ( )

在文件 localization_integ_impl.cc40 行定义.

40 {
41 delete republish_process_;
42 delete lidar_process_;
43 delete gnss_process_;
44 delete integ_process_;
45}

成员函数说明

◆ GetLastestGnssLocalization()

const LocalizationResult & apollo::localization::msf::LocalizationIntegImpl::GetLastestGnssLocalization ( ) const

在文件 localization_integ_impl.cc375 行定义.

376 {
377 return lastest_gnss_localization_;
378}

◆ GetLastestIntegLocalization()

const LocalizationResult & apollo::localization::msf::LocalizationIntegImpl::GetLastestIntegLocalization ( ) const

在文件 localization_integ_impl.cc370 行定义.

371 {
372 return lastest_integ_localization_;
373}

◆ GetLastestLidarLocalization()

const LocalizationResult & apollo::localization::msf::LocalizationIntegImpl::GetLastestLidarLocalization ( ) const

在文件 localization_integ_impl.cc365 行定义.

366 {
367 return lastest_lidar_localization_;
368}

◆ GnssBestPoseProcess()

void apollo::localization::msf::LocalizationIntegImpl::GnssBestPoseProcess ( const drivers::gnss::GnssBestPose bestgnsspos_msg)

在文件 localization_integ_impl.cc251 行定义.

252 {
253 if (!is_use_gnss_bestpose_) {
254 return;
255 }
256
257 GnssBestPoseProcessImpl(bestgnsspos_msg);
258}
void GnssBestPoseProcessImpl(const drivers::gnss::GnssBestPose &bestgnsspos_msg)

◆ GnssBestPoseProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::GnssBestPoseProcessImpl ( const drivers::gnss::GnssBestPose bestgnsspos_msg)
protected

在文件 localization_integ_impl.cc285 行定义.

286 {
287 MeasureData measure;
288 if (republish_process_->NovatelBestgnssposProcess(bestgnsspos_msg,
289 &measure)) {
290 integ_process_->MeasureDataProcess(measure);
291
292 expert_.AddGnssBestPose(bestgnsspos_msg, measure);
293 LocalizationEstimate gnss_localization;
294 TransferGnssMeasureToLocalization(measure, &gnss_localization);
295 expert_.GetGnssStatus(gnss_localization.mutable_msf_status());
296
297 lastest_gnss_localization_ =
298 LocalizationResult(LocalizationMeasureState::OK, gnss_localization);
299 }
300}
void TransferGnssMeasureToLocalization(const MeasureData &measure, LocalizationEstimate *localization)
bool NovatelBestgnssposProcess(const GnssBestPose &bestgnsspos_msg, MeasureData *measure)
void AddGnssBestPose(const drivers::gnss::GnssBestPose &msg, const MeasureData &data)

◆ GnssHeadingProcess()

void apollo::localization::msf::LocalizationIntegImpl::GnssHeadingProcess ( const drivers::gnss::Heading gnssheading_msg)

在文件 localization_integ_impl.cc302 行定义.

303 {
304 GnssHeadingProcessImpl(gnssheading_msg);
305}
void GnssHeadingProcessImpl(const drivers::gnss::Heading &gnssheading_msg)

◆ GnssHeadingProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::GnssHeadingProcessImpl ( const drivers::gnss::Heading gnssheading_msg)
protected

在文件 localization_integ_impl.cc307 行定义.

308 {
309 MeasureData measure;
310 int heading_status = 0;
311 if (republish_process_->GnssHeadingProcess(gnssheading_msg, &measure,
312 &heading_status)) {
313 integ_process_->MeasureDataProcess(measure);
314 }
315}
bool GnssHeadingProcess(const drivers::gnss::Heading &heading_msg, MeasureData *measure, int *status)

◆ ImuProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::ImuProcessImpl ( const ImuData &  imu_data)
protected

在文件 localization_integ_impl.cc129 行定义.

129 {
130 // imu -> lidar
131 // imu -> integ -> republish -> lidar -> publish
132
133 // start_time = boost::posix_time::microsec_clock::local_time();
134 if (enable_lidar_localization_) {
135 lidar_process_->RawImuProcess(imu_data);
136 }
137 integ_process_->RawImuProcess(imu_data);
138
139 expert_.AddImu(imu_data);
140
141 // integ
142 IntegState state;
143 LocalizationEstimate integ_localization;
144 integ_process_->GetResult(&state, &integ_localization);
145 ImuData corrected_imu;
146 integ_process_->GetCorrectedImu(&corrected_imu);
147 InertialParameter earth_param;
148 integ_process_->GetEarthParameter(&earth_param);
149 // check msf running status and set msf_status in integ_localization
150
151 LocalizationIntegStatus integ_status;
152 expert_.AddFusionLocalization(integ_localization);
153 expert_.GetFusionStatus(integ_localization.mutable_msf_status(),
154 integ_localization.mutable_sensor_status(),
155 &integ_status);
156
157 apollo::localization::Pose* posepb_loc = integ_localization.mutable_pose();
158
159 if (imu_altitude_from_lidar_localization_available_) {
160 apollo::common::PointENU* position = posepb_loc->mutable_position();
161 position->set_z(imu_altitude_from_lidar_localization_);
162 }
163
164 // set linear acceleration
165 Eigen::Vector3d orig_acceleration(corrected_imu.fb[0], corrected_imu.fb[1],
166 corrected_imu.fb[2]);
167 const apollo::common::Quaternion& orientation =
168 integ_localization.pose().orientation();
169 Eigen::Quaternion<double> quaternion(orientation.qw(), orientation.qx(),
170 orientation.qy(), orientation.qz());
171 Eigen::Vector3d vec_acceleration =
172 static_cast<Eigen::Vector3d>(quaternion * orig_acceleration);
173
174 // Remove gravity.
175 vec_acceleration(2) -= earth_param.g;
176
177 apollo::common::Point3D* linear_acceleration =
178 posepb_loc->mutable_linear_acceleration();
179 linear_acceleration->set_x(vec_acceleration(0));
180 linear_acceleration->set_y(vec_acceleration(1));
181 linear_acceleration->set_z(vec_acceleration(2));
182
183 Eigen::Vector3d vec_acceleration_vrf =
184 quaternion.inverse() * vec_acceleration;
185
186 apollo::common::Point3D* linear_acceleration_vrf =
187 posepb_loc->mutable_linear_acceleration_vrf();
188 linear_acceleration_vrf->set_x(vec_acceleration_vrf(0));
189 linear_acceleration_vrf->set_y(vec_acceleration_vrf(1));
190 linear_acceleration_vrf->set_z(vec_acceleration_vrf(2));
191
192 // set angular velocity
193 Eigen::Vector3d orig_angular_velocity(
194 corrected_imu.wibb[0], corrected_imu.wibb[1], corrected_imu.wibb[2]);
195 Eigen::Vector3d vec_angular_velocity = static_cast<Eigen::Vector3d>(
196 quaternion.toRotationMatrix() * orig_angular_velocity);
197 apollo::common::Point3D* angular_velocity =
198 posepb_loc->mutable_angular_velocity();
199 angular_velocity->set_x(vec_angular_velocity(0));
200 angular_velocity->set_y(vec_angular_velocity(1));
201 angular_velocity->set_z(vec_angular_velocity(2));
202
203 apollo::common::Point3D* angular_velocity_vrf =
204 posepb_loc->mutable_angular_velocity_vrf();
205 angular_velocity_vrf->set_x(corrected_imu.wibb[0]);
206 angular_velocity_vrf->set_y(corrected_imu.wibb[1]);
207 angular_velocity_vrf->set_z(corrected_imu.wibb[2]);
208
209 lastest_integ_localization_ =
210 LocalizationResult(LocalizationMeasureState(static_cast<int>(state)),
211 integ_localization, integ_status);
212
213 InsPva integ_sins_pva;
214 double covariance[9][9];
215 integ_process_->GetResult(&state, &integ_sins_pva, covariance);
216
217 // update republish
218 republish_process_->IntegPvaProcess(integ_sins_pva);
219
220 if (state != IntegState::NOT_INIT) {
221 // pass result of integration localization to lidar process module
222 if (enable_lidar_localization_ && state != IntegState::NOT_STABLE) {
223 lidar_process_->IntegPvaProcess(integ_sins_pva);
224 }
225
226 if (!is_use_gnss_bestpose_) {
227 // pass localization result to gnss process module
228 gnss_process_->IntegSinsPvaProcess(integ_sins_pva, covariance);
229 }
230 }
231}
void IntegSinsPvaProcess(const InsPva &sins_pva, const double variance[9][9])
void GetResult(IntegState *state, LocalizationEstimate *localization)
void GetFusionStatus(MsfStatus *msf_status, MsfSensorMsgStatus *sensor_status, LocalizationIntegStatus *integstatus)
void AddFusionLocalization(const LocalizationEstimate &data)

◆ Init()

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

在文件 localization_integ_impl.cc47 行定义.

47 {
48 enable_lidar_localization_ = params.enable_lidar_localization;
49 if (params.enable_lidar_localization) {
50 auto state = lidar_process_->Init(params);
51 if (!state.ok()) {
52 return state;
53 }
54 }
55
56 auto state = republish_process_->Init(params);
57 if (!state.ok()) {
58 return state;
59 }
60
61 state = integ_process_->Init(params);
62 if (!state.ok()) {
63 return state;
64 }
65
66 if (params.gnss_mode == static_cast<int>(GnssMode::SELF)) {
67 state = gnss_process_->Init(params);
68 is_use_gnss_bestpose_ = false;
69 if (!state.ok()) {
70 return state;
71 }
72 } else {
73 is_use_gnss_bestpose_ = true;
74 }
75
76 if (params.is_using_raw_gnsspos) {
77 gnss_antenna_extrinsic_.translation()(0) =
78 params.imu_to_ant_offset.offset_x;
79 gnss_antenna_extrinsic_.translation()(1) =
80 params.imu_to_ant_offset.offset_y;
81 gnss_antenna_extrinsic_.translation()(2) =
82 params.imu_to_ant_offset.offset_z;
83 } else {
84 gnss_antenna_extrinsic_ = Eigen::Affine3d::Identity();
85 }
86 AINFO << "gnss and imu lever arm: "
87 << gnss_antenna_extrinsic_.translation()(0) << " "
88 << gnss_antenna_extrinsic_.translation()(1) << " "
89 << gnss_antenna_extrinsic_.translation()(2);
90
91 expert_.Init(params);
92
93 return Status::OK();
94}
static Status OK()
generate a success status.
Definition status.h:60
apollo::common::Status Init(const LocalizationIntegParam &param)
apollo::common::Status Init(const LocalizationIntegParam &params)
apollo::common::Status Init(const LocalizationIntegParam &params)
common::Status Init(const LocalizationIntegParam &params)
#define AINFO
Definition log.h:42

◆ PcdProcess()

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

在文件 localization_integ_impl.cc96 行定义.

96 {
97 PcdProcessImpl(lidar_frame);
98}

◆ PcdProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::PcdProcessImpl ( const LidarFrame pcd_data)
protected

在文件 localization_integ_impl.cc100 行定义.

100 {
101 // lidar -> republish -> integ
102 lidar_process_->PcdProcess(pcd_data);
103
104 int state = 0;
105 LocalizationEstimate lidar_localization;
106
107 state = lidar_process_->GetResult(&lidar_localization);
108
109 expert_.AddLidarLocalization(lidar_localization);
110
111 MeasureData lidar_measure;
112 if (state == 2) { // only state OK republish lidar msg
113 republish_process_->LidarLocalProcess(lidar_localization, &lidar_measure);
114 integ_process_->MeasureDataProcess(lidar_measure);
115
116 imu_altitude_from_lidar_localization_ =
117 lidar_localization.pose().position().z();
118 imu_altitude_from_lidar_localization_available_ = true;
119 }
120
121 lastest_lidar_localization_ =
122 LocalizationResult(LocalizationMeasureState(state), lidar_localization);
123}
void GetResult(int *lidar_status, TransformD *location, Matrix3D *covariance) const
bool LidarLocalProcess(const LocalizationEstimate &lidar_local_msg, MeasureData *measure)
void AddLidarLocalization(const LocalizationEstimate &data)

◆ RawEphemerisProcess()

void apollo::localization::msf::LocalizationIntegImpl::RawEphemerisProcess ( const drivers::gnss::GnssEphemeris gnss_orbit_msg)

在文件 localization_integ_impl.cc242 行定义.

243 {
244 if (is_use_gnss_bestpose_) {
245 return;
246 }
247
248 RawEphemerisProcessImpl(gnss_orbit_msg);
249}
void RawEphemerisProcessImpl(const drivers::gnss::GnssEphemeris &gnss_orbit_msg)

◆ RawEphemerisProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::RawEphemerisProcessImpl ( const drivers::gnss::GnssEphemeris gnss_orbit_msg)
protected

在文件 localization_integ_impl.cc280 行定义.

281 {
282 gnss_process_->RawEphemerisProcess(gnss_orbit_msg);
283}
void RawEphemerisProcess(const drivers::gnss::GnssEphemeris &gnss_orbit)

◆ RawImuProcessRfu()

void apollo::localization::msf::LocalizationIntegImpl::RawImuProcessRfu ( const ImuData &  imu_data)

在文件 localization_integ_impl.cc125 行定义.

125 {
126 ImuProcessImpl(imu_data);
127}

◆ RawObservationProcess()

void apollo::localization::msf::LocalizationIntegImpl::RawObservationProcess ( const drivers::gnss::EpochObservation raw_obs_msg)

在文件 localization_integ_impl.cc233 行定义.

234 {
235 if (is_use_gnss_bestpose_) {
236 return;
237 }
238
239 RawObservationProcessImpl(raw_obs_msg);
240}
void RawObservationProcessImpl(const drivers::gnss::EpochObservation &raw_obs_msg)

◆ RawObservationProcessImpl()

void apollo::localization::msf::LocalizationIntegImpl::RawObservationProcessImpl ( const drivers::gnss::EpochObservation raw_obs_msg)
protected

在文件 localization_integ_impl.cc260 行定义.

261 {
262 gnss_process_->RawObservationProcess(raw_obs_msg);
263
264 MeasureData gnss_measure;
265 LocalizationMeasureState state = gnss_process_->GetResult(&gnss_measure);
266
267 MeasureData measure;
268 if (state == LocalizationMeasureState::OK ||
270 republish_process_->GnssLocalProcess(gnss_measure, &measure);
271 integ_process_->MeasureDataProcess(measure);
272 }
273
274 LocalizationEstimate gnss_localization;
275 TransferGnssMeasureToLocalization(measure, &gnss_localization);
276
277 lastest_gnss_localization_ = LocalizationResult(state, gnss_localization);
278}
void RawObservationProcess(const drivers::gnss::EpochObservation &raw_obs)
LocalizationMeasureState GetResult(MeasureData *gnss_measure)
void GnssLocalProcess(const MeasureData &gnss_local_msg, MeasureData *measure)

◆ TransferGnssMeasureToLocalization()

void apollo::localization::msf::LocalizationIntegImpl::TransferGnssMeasureToLocalization ( const MeasureData &  measure,
LocalizationEstimate localization 
)
protected

在文件 localization_integ_impl.cc317 行定义.

318 {
319 CHECK_NOTNULL(localization);
320
321 apollo::common::Header* headerpb = localization->mutable_header();
322 apollo::localization::Pose* posepb = localization->mutable_pose();
323
324 double timestamp = measure.time;
325 localization->set_measurement_time(timestamp);
326 headerpb->set_timestamp_sec(timestamp);
327
328 UTMCoor utm_xy;
329 FrameTransform::LatlonToUtmXY(measure.gnss_pos.longitude,
330 measure.gnss_pos.latitude, &utm_xy);
331
332 apollo::common::PointENU* position = posepb->mutable_position();
333 position->set_x(utm_xy.x);
334 position->set_y(utm_xy.y);
335 position->set_z(measure.gnss_pos.height);
336
337 apollo::common::Quaternion* quaternion = posepb->mutable_orientation();
338 quaternion->set_qx(0.0);
339 quaternion->set_qy(0.0);
340 quaternion->set_qz(0.0);
341 quaternion->set_qw(1.0);
342
344 localization->mutable_uncertainty();
345
346 apollo::common::Point3D* position_std_dev =
347 uncertainty->mutable_position_std_dev();
348 position_std_dev->set_x(-1.0);
349 position_std_dev->set_y(-1.0);
350 position_std_dev->set_z(-1.0);
351
352 if (measure.is_have_variance) {
353 position_std_dev->set_x(measure.variance[0][0]);
354 position_std_dev->set_y(measure.variance[1][1]);
355 position_std_dev->set_z(measure.variance[2][2]);
356 }
357
358 apollo::common::Point3D* orientation_std_dev =
359 uncertainty->mutable_orientation_std_dev();
360 orientation_std_dev->set_x(-1.0);
361 orientation_std_dev->set_y(-1.0);
362 orientation_std_dev->set_z(-1.0);
363}
static bool LatlonToUtmXY(double lon, double lat, UTMCoor *utm_xy)

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