@@ -54,7 +54,7 @@ BigVehicleTracker::BigVehicleTracker(
54
54
// Initialize parameters
55
55
// measurement noise covariance
56
56
float r_stddev_x = 1.5 ; // [m]
57
- float r_stddev_y = 0.5 ; // [m]
57
+ float r_stddev_y = 0.3 ; // [m]
58
58
float r_stddev_yaw = tier4_autoware_utils::deg2rad (20 ); // [rad]
59
59
float r_stddev_vel = 1.0 ; // [m/s]
60
60
ekf_params_.r_cov_x = std::pow (r_stddev_x, 2.0 );
@@ -76,13 +76,15 @@ BigVehicleTracker::BigVehicleTracker(
76
76
ekf_params_.q_stddev_acc_long = 9.8 * 0.3 ; // [m/(s*s)] uncertain longitudinal acceleration
77
77
ekf_params_.q_stddev_acc_lat = 9.8 * 0.1 ; // [m/(s*s)] uncertain lateral acceleration
78
78
ekf_params_.q_stddev_yaw_rate_min =
79
- tier4_autoware_utils::deg2rad (0.8 ); // [rad/s] uncertain yaw change rate
79
+ tier4_autoware_utils::deg2rad (1.5 ); // [rad/s] uncertain yaw change rate
80
80
ekf_params_.q_stddev_yaw_rate_max =
81
- tier4_autoware_utils::deg2rad (13.0 ); // [rad/s] uncertain yaw change rate
82
- ekf_params_.q_stddev_slip_rate_min =
83
- tier4_autoware_utils::deg2rad (0.2 ); // [rad/s] uncertain slip angle change rate
84
- ekf_params_.q_stddev_slip_rate_max =
85
- tier4_autoware_utils::deg2rad (5.0 ); // [rad/s] uncertain slip angle change rate
81
+ tier4_autoware_utils::deg2rad (15.0 ); // [rad/s] uncertain yaw change rate
82
+ float q_stddev_slip_rate_min =
83
+ tier4_autoware_utils::deg2rad (0.3 ); // [rad/s] uncertain slip angle change rate
84
+ float q_stddev_slip_rate_max =
85
+ tier4_autoware_utils::deg2rad (10.0 ); // [rad/s] uncertain slip angle change rate
86
+ ekf_params_.q_cov_slip_rate_min = std::pow (q_stddev_slip_rate_min, 2.0 );
87
+ ekf_params_.q_cov_slip_rate_max = std::pow (q_stddev_slip_rate_max, 2.0 );
86
88
ekf_params_.q_max_slip_angle = tier4_autoware_utils::deg2rad (30 ); // [rad] max slip angle
87
89
// limitations
88
90
max_vel_ = tier4_autoware_utils::kmph2mps (100 ); // [m/s]
@@ -253,9 +255,9 @@ bool BigVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
253
255
if (vel <= 0.01 ) {
254
256
q_stddev_yaw_rate = ekf_params_.q_stddev_yaw_rate_min ;
255
257
} else {
256
- // uncertain yaw rate limited by
257
- // centripetal acceleration w = a_lat/v
258
- // or slip angle w = v*sin(slip )/l_r
258
+ // uncertainty of the yaw rate is limited by
259
+ // centripetal acceleration a_lat : d(yaw)/dt = w = a_lat/v
260
+ // or maximum slip angle slip_max : w = v*sin(slip_max )/l_r
259
261
q_stddev_yaw_rate = std::min (
260
262
ekf_params_.q_stddev_acc_lat / vel,
261
263
vel * std::sin (ekf_params_.q_max_slip_angle ) / lr_); // [rad/s]
@@ -264,21 +266,23 @@ bool BigVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
264
266
}
265
267
float q_cov_slip_rate{0.0 };
266
268
if (vel <= 0.01 ) {
267
- q_cov_slip_rate = ekf_params_.q_stddev_slip_rate_min * ekf_params_. q_stddev_slip_rate_min ;
269
+ q_cov_slip_rate = ekf_params_.q_cov_slip_rate_min ;
268
270
} else {
269
- // sin(slip) = w*l_r/v
270
- // d(slip)/dt = - w*l_r/v^2 * d(v)/dt + l_r/v * d(w)/dt
271
- q_cov_slip_rate = std::pow (sin_slip * ekf_params_.q_stddev_acc_lat / vel, 2 ) +
272
- std::pow (q_stddev_yaw_rate * lr_ / vel, 2 );
273
- q_cov_slip_rate = std::min (
274
- q_cov_slip_rate, ekf_params_.q_stddev_slip_rate_max * ekf_params_.q_stddev_slip_rate_max );
275
- q_cov_slip_rate = std::max (
276
- q_cov_slip_rate, ekf_params_.q_stddev_slip_rate_min * ekf_params_.q_stddev_slip_rate_min );
271
+ // where sin(slip) = w * l_r / v
272
+ // uncertainty of the slip angle rate is modeled as
273
+ // d(slip)/dt ~ - w*l_r/v^2 * d(v)/dt + l_r/v * d(w)/dt
274
+ // = - sin(slip)/v * d(v)/dt + l_r/v * d(w)/dt
275
+ // d(w)/dt is modeled as proportional to w (more uncertain when slip is large)
276
+ // d(v)/dt and d(w)/t is considered that those are not correlated
277
+ q_cov_slip_rate =
278
+ std::pow (ekf_params_.q_stddev_acc_lat * sin_slip / vel, 2 ) + std::pow (sin_slip * 1.5 , 2 );
279
+ q_cov_slip_rate = std::min (q_cov_slip_rate, ekf_params_.q_cov_slip_rate_max );
280
+ q_cov_slip_rate = std::max (q_cov_slip_rate, ekf_params_.q_cov_slip_rate_min );
277
281
}
278
- const float q_cov_x = std::pow (0.5 * ekf_params_.q_stddev_acc_long * dt * dt, 2.0 );
279
- const float q_cov_y = std::pow (0.5 * ekf_params_.q_stddev_acc_lat * dt * dt, 2.0 );
280
- const float q_cov_yaw = std::pow (q_stddev_yaw_rate * dt, 2.0 );
281
- const float q_cov_vel = std::pow (ekf_params_.q_stddev_acc_long * dt, 2.0 );
282
+ const float q_cov_x = std::pow (0.5 * ekf_params_.q_stddev_acc_long * dt * dt, 2 );
283
+ const float q_cov_y = std::pow (0.5 * ekf_params_.q_stddev_acc_lat * dt * dt, 2 );
284
+ const float q_cov_yaw = std::pow (q_stddev_yaw_rate * dt, 2 );
285
+ const float q_cov_vel = std::pow (ekf_params_.q_stddev_acc_long * dt, 2 );
282
286
const float q_cov_slip = q_cov_slip_rate * dt * dt;
283
287
284
288
Eigen::MatrixXd Q = Eigen::MatrixXd::Zero (ekf_params_.dim_x , ekf_params_.dim_x );
0 commit comments