@@ -52,9 +52,9 @@ NormalVehicleTracker::NormalVehicleTracker(
52
52
object_ = object;
53
53
54
54
// Initialize parameters
55
- // measurement noise covariance
56
- float r_stddev_x = 1.0 ; // in object coordinate [m]
57
- float r_stddev_y = 0.3 ; // in object coordinate [m]
55
+ // measurement noise covariance: detector uncertainty + ego vehicle motion uncertainty
56
+ float r_stddev_x = 0.5 ; // in vehicle coordinate [m]
57
+ float r_stddev_y = 0.4 ; // in vehicle coordinate [m]
58
58
float r_stddev_yaw = tier4_autoware_utils::deg2rad (20 ); // in map coordinate [rad]
59
59
float r_stddev_vel = 1.0 ; // in object coordinate [m/s]
60
60
ekf_params_.r_cov_x = std::pow (r_stddev_x, 2.0 );
@@ -73,8 +73,8 @@ NormalVehicleTracker::NormalVehicleTracker(
73
73
ekf_params_.p0_cov_vel = std::pow (p0_stddev_vel, 2.0 );
74
74
ekf_params_.p0_cov_slip = std::pow (p0_stddev_slip, 2.0 );
75
75
// process noise covariance
76
- ekf_params_.q_stddev_acc_long = 9.8 * 0.3 ; // [m/(s*s)] uncertain longitudinal acceleration
77
- ekf_params_.q_stddev_acc_lat = 9.8 * 0.1 ; // [m/(s*s)] uncertain lateral acceleration
76
+ ekf_params_.q_stddev_acc_long = 9.8 * 0.35 ; // [m/(s*s)] uncertain longitudinal acceleration
77
+ ekf_params_.q_stddev_acc_lat = 9.8 * 0.15 ; // [m/(s*s)] uncertain lateral acceleration
78
78
ekf_params_.q_stddev_yaw_rate_min =
79
79
tier4_autoware_utils::deg2rad (1.5 ); // [rad/s] uncertain yaw change rate
80
80
ekf_params_.q_stddev_yaw_rate_max =
@@ -219,23 +219,24 @@ bool NormalVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
219
219
ekf.getX (X_t);
220
220
const double cos_yaw = std::cos (X_t (IDX::YAW) + X_t (IDX::SLIP));
221
221
const double sin_yaw = std::sin (X_t (IDX::YAW) + X_t (IDX::SLIP));
222
+ const double vel = X_t (IDX::VEL);
222
223
const double cos_slip = std::cos (X_t (IDX::SLIP));
223
224
const double sin_slip = std::sin (X_t (IDX::SLIP));
224
- const double vel = X_t (IDX::VEL);
225
+
226
+ double w = vel * sin_slip / lr_;
225
227
const double sin_2yaw = std::sin (2 .0f * X_t (IDX::YAW));
226
- const double w = vel * sin_slip / lr_;
227
228
const double w_dtdt = w * dt * dt;
228
229
const double vv_dtdt__lr = vel * vel * dt * dt / lr_;
229
230
230
231
// Predict state vector X t+1
231
232
Eigen::MatrixXd X_next_t (ekf_params_.dim_x , 1 ); // predicted state
232
233
X_next_t (IDX::X) =
233
- X_t (IDX::X) + vel * cos_yaw * dt - 0.5 * vel * sin_slip * w_dtdt; // dx = v * cos(yaw)
234
+ X_t (IDX::X) + vel * cos_yaw * dt - 0.5 * vel * sin_slip * w_dtdt; // dx = v * cos(yaw) * dt
234
235
X_next_t (IDX::Y) =
235
- X_t (IDX::Y) + vel * sin_yaw * dt + 0.5 * vel * cos_slip * w_dtdt; // dy = v * sin(yaw)
236
- X_next_t (IDX::YAW) = X_t (IDX::YAW) + vel / lr_ * sin_slip * dt; // dyaw = omega
236
+ X_t (IDX::Y) + vel * sin_yaw * dt + 0.5 * vel * cos_slip * w_dtdt; // dy = v * sin(yaw) * dt
237
+ X_next_t (IDX::YAW) = X_t (IDX::YAW) + w * dt; // d(yaw) = w * dt
237
238
X_next_t (IDX::VEL) = X_t (IDX::VEL);
238
- X_next_t (IDX::SLIP) = X_t (IDX::SLIP);
239
+ X_next_t (IDX::SLIP) = X_t (IDX::SLIP); // slip_angle = asin(lr * w / v)
239
240
240
241
// State transition matrix A
241
242
Eigen::MatrixXd A = Eigen::MatrixXd::Identity (ekf_params_.dim_x , ekf_params_.dim_x );
@@ -320,8 +321,8 @@ bool NormalVehicleTracker::measureWithPose(
320
321
r_cov_x = ekf_params_.r_cov_x ;
321
322
r_cov_y = ekf_params_.r_cov_y ;
322
323
} else if (utils::isLargeVehicleLabel (label)) {
323
- constexpr float r_stddev_x = 8 .0 ; // [m]
324
- constexpr float r_stddev_y = 0.8 ; // [m]
324
+ constexpr float r_stddev_x = 2 .0 ; // [m]
325
+ constexpr float r_stddev_y = 2.0 ; // [m]
325
326
r_cov_x = std::pow (r_stddev_x, 2.0 );
326
327
r_cov_y = std::pow (r_stddev_y, 2.0 );
327
328
} else {
0 commit comments