Apollo 11.0
自动驾驶开放平台
apollo::perception::fusion::KalmanMotionFusion类 参考

#include <kalman_motion_fusion.h>

类 apollo::perception::fusion::KalmanMotionFusion 继承关系图:
apollo::perception::fusion::KalmanMotionFusion 的协作图:

Public 成员函数

 KalmanMotionFusion (TrackPtr track)
 
 ~KalmanMotionFusion ()=default
 
bool Init () override
 Init base data association config
 
void UpdateWithMeasurement (const SensorObjectConstPtr &measurement, double target_timestamp) override
 update track motion state with measurement
 
void UpdateWithoutMeasurement (const std::string &sensor_id, double measurement_timestamp, double target_timestamp) override
 update track motion state without measurement
 
std::string Name () const override
 The name of BaseMotionFusion
 
void GetStates (Eigen::Vector3d *anchor_point, Eigen::Vector3d *velocity)
 Get states
 
- Public 成员函数 继承自 apollo::perception::fusion::BaseMotionFusion
 BaseMotionFusion (TrackPtr track)
 
virtual ~BaseMotionFusion ()=default
 

额外继承的成员函数

- Protected 成员函数 继承自 apollo::perception::fusion::BaseMotionFusion
 DISALLOW_COPY_AND_ASSIGN (BaseMotionFusion)
 
- Protected 属性 继承自 apollo::perception::fusion::BaseMotionFusion
TrackPtr track_ref_
 

详细描述

在文件 kalman_motion_fusion.h 第 31 行定义.

构造及析构函数说明

◆ KalmanMotionFusion()

apollo::perception::fusion::KalmanMotionFusion::KalmanMotionFusion ( TrackPtr  track)
inlineexplicit

在文件 kalman_motion_fusion.h 第 33 行定义.

◆ ~KalmanMotionFusion()

apollo::perception::fusion::KalmanMotionFusion::~KalmanMotionFusion ( )
default

成员函数说明

◆ GetStates()

void apollo::perception::fusion::KalmanMotionFusion::GetStates ( Eigen::Vector3d *  anchor_point,
Eigen::Vector3d *  velocity 
)

Get states

参数
anchor_point
velocity

在文件 kalman_motion_fusion.cc 第 103 行定义.

104 {
105 *anchor_point = fused_anchor_point_;
106 *velocity = fused_velocity_;
107}

◆ Init()

bool apollo::perception::fusion::KalmanMotionFusion::Init ( )
overridevirtual

Init base data association config

返回
true
false

实现了 apollo::perception::fusion::BaseMotionFusion.

在文件 kalman_motion_fusion.cc 第 37 行定义.

37 {
38 if (track_ref_ == nullptr) {
39 return false;
40 }
41 if (track_ref_->GetLatestLidarObject() != nullptr) {
42 filter_init_ = InitFilter(track_ref_->GetLatestLidarObject());
43 } else if (track_ref_->GetLatestRadarObject() != nullptr) {
44 filter_init_ = InitFilter(track_ref_->GetLatestRadarObject());
45 }
46 return true;
47}

◆ Name()

std::string apollo::perception::fusion::KalmanMotionFusion::Name ( ) const
inlineoverridevirtual

The name of BaseMotionFusion

返回
std::string

实现了 apollo::perception::fusion::BaseMotionFusion.

在文件 kalman_motion_fusion.h 第 53 行定义.

53{ return "KalmamnMotionFusion"; }

◆ UpdateWithMeasurement()

void apollo::perception::fusion::KalmanMotionFusion::UpdateWithMeasurement ( const SensorObjectConstPtr &  measurement,
double  target_timestamp 
)
overridevirtual

update track motion state with measurement

参数
measurement
target_timestamp

实现了 apollo::perception::fusion::BaseMotionFusion.

在文件 kalman_motion_fusion.cc 第 134 行定义.

135 {
136 fused_anchor_point_ =
137 measurement->GetBaseObject()->anchor_point.cast<double>();
138 fused_velocity_ = measurement->GetBaseObject()->velocity.cast<double>();
139 fused_acceleration_ =
140 measurement->GetBaseObject()->acceleration.cast<double>();
141 center_uncertainty_ = measurement->GetBaseObject()->center_uncertainty;
142 velo_uncertainty_ = measurement->GetBaseObject()->velocity_uncertainty;
143 acc_uncertainty_ = measurement->GetBaseObject()->acceleration_uncertainty;
144
145 double time_diff = measurement->GetTimestamp() -
146 track_ref_->GetFusedObject()->GetTimestamp();
147 bool is_lidar = IsLidar(measurement);
148 bool is_radar = IsRadar(measurement);
149 bool is_camera = IsCamera(measurement);
150 SensorObjectConstPtr lidar_ptr = track_ref_->GetLatestLidarObject();
151 SensorObjectConstPtr radar_ptr = track_ref_->GetLatestRadarObject();
152 SensorObjectConstPtr camera_ptr = track_ref_->GetLatestCameraObject();
153 // Motion fusion
154 if (is_lidar || is_radar || is_camera) {
155 if (filter_init_) {
156 MotionFusionWithMeasurement(measurement, time_diff);
157 } else {
158 filter_init_ = InitFilter(measurement);
159 }
160 if (!filter_init_) {
161 // No kalman result, no matter which sensortype
162 // of measurement, use measurement's
163 // anchor point and velocity
164 return;
165 }
166 }
167 // shape & location fusion
168 if (is_lidar || is_radar) {
169 if (is_lidar || (is_radar && lidar_ptr == nullptr)) {
170 // 1) measurement is lidar: use lidar's anchor point
171 // , use fused velocity
172 // 2) measurement is radar, and has no history lidar:
173 // use radar's anchor point, use fused velocity
174 fused_velocity_(0) = kalman_filter_.GetStates()(2);
175 fused_velocity_(1) = kalman_filter_.GetStates()(3);
176 }
177 if (is_radar && lidar_ptr != nullptr) {
178 // measurement is radar, has history lidar:
179 // use fused achor point, use fused velocity
180 fused_anchor_point_(0) = kalman_filter_.GetStates()(0);
181 fused_anchor_point_(1) = kalman_filter_.GetStates()(1);
182 fused_velocity_(0) = kalman_filter_.GetStates()(2);
183 fused_velocity_(1) = kalman_filter_.GetStates()(3);
184 }
185 } else if (is_camera) {
186 if (filter_init_) {
187 if (lidar_ptr != nullptr) {
188 // measurement is camera, has history lidar
189 // use fused position, use fused velocity
190 fused_anchor_point_(0) = kalman_filter_.GetStates()(0);
191 fused_anchor_point_(1) = kalman_filter_.GetStates()(1);
192 fused_velocity_(0) = kalman_filter_.GetStates()(2);
193 fused_velocity_(1) = kalman_filter_.GetStates()(3);
194 } else if (radar_ptr != nullptr) {
195 // measurement is camera, has no history lidar, but
196 // has history radar, use history radar's position
197 // use fused velocity
198 fused_anchor_point_ =
199 radar_ptr->GetBaseObject()->anchor_point.cast<double>();
200 fused_velocity_(0) = kalman_filter_.GetStates()(2);
201 fused_velocity_(1) = kalman_filter_.GetStates()(3);
202 } else {
203 // measurement is camera, has no history lidar
204 // or radar, use measurement's anchor point and
205 // velocity, do nothing(at the beginning of this
206 // function, fused velocity/anchor point has been
207 // set to as same as measurement)
208 }
209 }
210 }
211 fused_acceleration_(0) = kalman_filter_.GetStates()(4);
212 fused_acceleration_(1) = kalman_filter_.GetStates()(5);
213 // Originally, we would reset filter_init_ to false, when there is no
214 // valid lidar & radar measurement. now, as the quality of estimation
215 // of camera improved, this step is not needed.
216 UpdateMotionState();
217}
std::shared_ptr< const SensorObject > SensorObjectConstPtr
bool IsCamera(const SensorObjectConstPtr &obj)
bool IsLidar(const SensorObjectConstPtr &obj)
bool IsRadar(const SensorObjectConstPtr &obj)

◆ UpdateWithoutMeasurement()

void apollo::perception::fusion::KalmanMotionFusion::UpdateWithoutMeasurement ( const std::string &  sensor_id,
double  measurement_timestamp,
double  target_timestamp 
)
overridevirtual

update track motion state without measurement

参数
sensor_id
measurement_timestamp
target_timestamp

实现了 apollo::perception::fusion::BaseMotionFusion.

在文件 kalman_motion_fusion.cc 第 109 行定义.

111 {
112 SensorObjectConstPtr lidar_ptr = track_ref_->GetLatestLidarObject();
113 SensorObjectConstPtr radar_ptr = track_ref_->GetLatestRadarObject();
114 SensorObjectConstPtr camera_ptr = track_ref_->GetLatestCameraObject();
115 bool is_alive =
116 (lidar_ptr != nullptr || radar_ptr != nullptr || camera_ptr != nullptr);
117 if (filter_init_ && is_alive) {
118 double time_diff =
119 measurement_timestamp - track_ref_->GetFusedObject()->GetTimestamp();
120 MotionFusionWithoutMeasurement(time_diff);
121 fused_anchor_point_(0) = kalman_filter_.GetStates()(0);
122 fused_anchor_point_(1) = kalman_filter_.GetStates()(1);
123 fused_velocity_(0) = kalman_filter_.GetStates()(2);
124 fused_velocity_(1) = kalman_filter_.GetStates()(3);
125 fused_acceleration_(0) = kalman_filter_.GetStates()(4);
126 fused_acceleration_(1) = kalman_filter_.GetStates()(5);
127 }
128 // Originally, we would reset filter_init_ to false, when there is no
129 // valid lidar & radar measurement. now, as the quality of estimation
130 // of camera improved, this step is not needed.
131 UpdateMotionState();
132}

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