Apollo 11.0
自动驾驶开放平台
localization_integ_impl.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
18
19#include "cyber/common/log.h"
22
23namespace apollo {
24namespace localization {
25namespace msf {
26
27using common::Status;
28
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()) {}
39
41 delete republish_process_;
42 delete lidar_process_;
43 delete gnss_process_;
44 delete integ_process_;
45}
46
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) =
79 gnss_antenna_extrinsic_.translation()(1) =
81 gnss_antenna_extrinsic_.translation()(2) =
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}
95
97 PcdProcessImpl(lidar_frame);
98}
99
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}
124
125void LocalizationIntegImpl::RawImuProcessRfu(const ImuData& imu_data) {
126 ImuProcessImpl(imu_data);
127}
128
129void LocalizationIntegImpl::ImuProcessImpl(const ImuData& imu_data) {
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}
232
234 const drivers::gnss::EpochObservation& raw_obs_msg) {
235 if (is_use_gnss_bestpose_) {
236 return;
237 }
238
239 RawObservationProcessImpl(raw_obs_msg);
240}
241
243 const drivers::gnss::GnssEphemeris& gnss_orbit_msg) {
244 if (is_use_gnss_bestpose_) {
245 return;
246 }
247
248 RawEphemerisProcessImpl(gnss_orbit_msg);
249}
250
252 const drivers::gnss::GnssBestPose& bestgnsspos_msg) {
253 if (!is_use_gnss_bestpose_) {
254 return;
255 }
256
257 GnssBestPoseProcessImpl(bestgnsspos_msg);
258}
259
261 const drivers::gnss::EpochObservation& raw_obs_msg) {
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}
279
281 const drivers::gnss::GnssEphemeris& gnss_orbit_msg) {
282 gnss_process_->RawEphemerisProcess(gnss_orbit_msg);
283}
284
286 const drivers::gnss::GnssBestPose& bestgnsspos_msg) {
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_ =
299 }
300}
301
303 const drivers::gnss::Heading& gnssheading_msg) {
304 GnssHeadingProcessImpl(gnssheading_msg);
305}
306
308 const drivers::gnss::Heading& gnssheading_msg) {
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}
316
318 const MeasureData& measure, LocalizationEstimate* localization) {
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}
364
366 const {
367 return lastest_lidar_localization_;
368}
369
371 const {
372 return lastest_integ_localization_;
373}
374
376 const {
377 return lastest_gnss_localization_;
378}
379
380} // namespace msf
381} // namespace localization
382} // namespace apollo
A general class to denote the return status of an API call.
Definition status.h:43
static Status OK()
generate a success status.
Definition status.h:60
static bool LatlonToUtmXY(double lon, double lat, UTMCoor *utm_xy)
void RawObservationProcess(const drivers::gnss::EpochObservation &raw_obs)
void RawEphemerisProcess(const drivers::gnss::GnssEphemeris &gnss_orbit)
apollo::common::Status Init(const LocalizationIntegParam &param)
LocalizationMeasureState GetResult(MeasureData *gnss_measure)
void IntegSinsPvaProcess(const InsPva &sins_pva, const double variance[9][9])
void RawEphemerisProcessImpl(const drivers::gnss::GnssEphemeris &gnss_orbit_msg)
void RawObservationProcess(const drivers::gnss::EpochObservation &raw_obs_msg)
void GnssBestPoseProcessImpl(const drivers::gnss::GnssBestPose &bestgnsspos_msg)
void TransferGnssMeasureToLocalization(const MeasureData &measure, LocalizationEstimate *localization)
void GnssHeadingProcess(const drivers::gnss::Heading &gnssheading_msg)
void GnssBestPoseProcess(const drivers::gnss::GnssBestPose &bestgnsspos_msg)
void RawEphemerisProcess(const drivers::gnss::GnssEphemeris &gnss_orbit_msg)
void RawObservationProcessImpl(const drivers::gnss::EpochObservation &raw_obs_msg)
void GnssHeadingProcessImpl(const drivers::gnss::Heading &gnssheading_msg)
const LocalizationResult & GetLastestIntegLocalization() const
common::Status Init(const LocalizationIntegParam &params)
const LocalizationResult & GetLastestGnssLocalization() const
const LocalizationResult & GetLastestLidarLocalization() const
apollo::common::Status Init(const LocalizationIntegParam &params)
void GetResult(IntegState *state, LocalizationEstimate *localization)
apollo::common::Status Init(const LocalizationIntegParam &params)
void GetResult(int *lidar_status, TransformD *location, Matrix3D *covariance) const
bool LidarLocalProcess(const LocalizationEstimate &lidar_local_msg, MeasureData *measure)
bool NovatelBestgnssposProcess(const GnssBestPose &bestgnsspos_msg, MeasureData *measure)
void GnssLocalProcess(const MeasureData &gnss_local_msg, MeasureData *measure)
bool GnssHeadingProcess(const drivers::gnss::Heading &heading_msg, MeasureData *measure, int *status)
common::Status Init(const LocalizationIntegParam &params)
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)
The class of LocalizationIntegImpl
#define AINFO
Definition log.h:42
class register implement
Definition arena_queue.h:37
optional apollo::localization::Pose pose
optional apollo::common::Quaternion orientation
Definition pose.proto:31
optional apollo::common::PointENU position
Definition pose.proto:26
the UTM coordinate struct including x and y.