@@ -64,9 +64,9 @@ BigVehicleTracker::BigVehicleTracker(
64
64
// initial covariance
65
65
float p0_stddev_x = 1.5 ; // [m]
66
66
float p0_stddev_y = 0.5 ; // [m]
67
- float p0_stddev_yaw = tier4_autoware_utils::deg2rad (30 ); // [rad]
68
- float p0_stddev_vel = tier4_autoware_utils::kmph2mps (1000 ); // [m/s]
69
- float p0_stddev_slip = tier4_autoware_utils::deg2rad (10 ); // [rad/s]
67
+ float p0_stddev_yaw = tier4_autoware_utils::deg2rad (25 ); // in map coordinate [rad]
68
+ float p0_stddev_vel = tier4_autoware_utils::kmph2mps (1000 ); // in object coordinate [m/s]
69
+ float p0_stddev_slip = tier4_autoware_utils::deg2rad (5 ); // in object coordinate [rad/s]
70
70
ekf_params_.p0_cov_x = std::pow (p0_stddev_x, 2.0 );
71
71
ekf_params_.p0_cov_y = std::pow (p0_stddev_y, 2.0 );
72
72
ekf_params_.p0_cov_yaw = std::pow (p0_stddev_yaw, 2.0 );
@@ -80,9 +80,9 @@ BigVehicleTracker::BigVehicleTracker(
80
80
ekf_params_.q_stddev_yaw_rate_max =
81
81
tier4_autoware_utils::deg2rad (13.0 ); // [rad/s] uncertain yaw change rate
82
82
ekf_params_.q_stddev_slip_rate_min =
83
- tier4_autoware_utils::deg2rad (0.6 ); // [rad/s] uncertain slip angle change rate
83
+ tier4_autoware_utils::deg2rad (0.2 ); // [rad/s] uncertain slip angle change rate
84
84
ekf_params_.q_stddev_slip_rate_max =
85
- tier4_autoware_utils::deg2rad (10 .0 ); // [rad/s] uncertain slip angle change rate
85
+ tier4_autoware_utils::deg2rad (5 .0 ); // [rad/s] uncertain slip angle change rate
86
86
ekf_params_.q_max_slip_angle = tier4_autoware_utils::deg2rad (30 ); // [rad] max slip angle
87
87
// limitations
88
88
max_vel_ = tier4_autoware_utils::kmph2mps (100 ); // [m/s]
@@ -262,19 +262,24 @@ bool BigVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
262
262
q_stddev_yaw_rate = std::min (q_stddev_yaw_rate, ekf_params_.q_stddev_yaw_rate_max );
263
263
q_stddev_yaw_rate = std::max (q_stddev_yaw_rate, ekf_params_.q_stddev_yaw_rate_min );
264
264
}
265
- float q_stddev_slip_rate {0.0 };
265
+ float q_cov_slip_rate {0.0 };
266
266
if (vel <= 0.01 ) {
267
- q_stddev_slip_rate = ekf_params_.q_stddev_slip_rate_min ;
267
+ q_cov_slip_rate = ekf_params_. q_stddev_slip_rate_min * ekf_params_.q_stddev_slip_rate_min ;
268
268
} else {
269
- q_stddev_slip_rate = std::abs (sin_slip * ekf_params_.q_stddev_acc_lat / vel);
270
- q_stddev_slip_rate = std::min (q_stddev_slip_rate, ekf_params_.q_stddev_slip_rate_max );
271
- q_stddev_slip_rate = std::max (q_stddev_slip_rate, ekf_params_.q_stddev_slip_rate_min );
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 );
272
277
}
273
278
const float q_cov_x = std::pow (0.5 * ekf_params_.q_stddev_acc_long * dt * dt, 2.0 );
274
279
const float q_cov_y = std::pow (0.5 * ekf_params_.q_stddev_acc_lat * dt * dt, 2.0 );
275
280
const float q_cov_yaw = std::pow (q_stddev_yaw_rate * dt, 2.0 );
276
281
const float q_cov_vel = std::pow (ekf_params_.q_stddev_acc_long * dt, 2.0 );
277
- const float q_cov_slip = std::pow (q_stddev_slip_rate * dt, 2.0 ) ;
282
+ const float q_cov_slip = q_cov_slip_rate * dt * dt ;
278
283
279
284
Eigen::MatrixXd Q = Eigen::MatrixXd::Zero (ekf_params_.dim_x , ekf_params_.dim_x );
280
285
// Rotate the covariance matrix according to the vehicle yaw
@@ -544,20 +549,40 @@ bool BigVehicleTracker::getTrackedObject(
544
549
twist_with_cov.twist .linear .x = X_t (IDX::VEL) * std::cos (X_t (IDX::SLIP));
545
550
twist_with_cov.twist .linear .y = X_t (IDX::VEL) * std::sin (X_t (IDX::SLIP));
546
551
twist_with_cov.twist .angular .z =
547
- X_t (IDX::VEL) / lr_ * std::sin (X_t (IDX::SLIP)); // yaw_rate = vel_k / l_r * sin(slip_k)
548
- // twist covariance
549
- constexpr double vy_cov = 0.1 * 0.1 ; // TODO(yukkysaito) Currently tentative
552
+ X_t (IDX::VEL) * std::sin (X_t (IDX::SLIP)) / lr_; // yaw_rate = vel_k * sin(slip_k) / l_r
553
+ /* twist covariance
554
+ * convert covariance from velocity, slip angle to vx, vy, and yaw angle
555
+ *
556
+ * vx = vel * cos(slip)
557
+ * vy = vel * sin(slip)
558
+ * wz = vel * sin(slip) / l_r = vy / l_r
559
+ *
560
+ */
550
561
constexpr double vz_cov = 0.1 * 0.1 ; // TODO(yukkysaito) Currently tentative
551
562
constexpr double wx_cov = 0.1 * 0.1 ; // TODO(yukkysaito) Currently tentative
552
563
constexpr double wy_cov = 0.1 * 0.1 ; // TODO(yukkysaito) Currently tentative
553
- twist_with_cov.covariance [utils::MSG_COV_IDX::X_X] = P (IDX::VEL, IDX::VEL);
554
- twist_with_cov.covariance [utils::MSG_COV_IDX::Y_Y] = vy_cov;
564
+
565
+ Eigen::MatrixXd cov_jacob (3 , 2 );
566
+ cov_jacob << std::cos (X_t (IDX::SLIP)), -X_t (IDX::VEL) * std::sin (X_t (IDX::SLIP)),
567
+ std::sin (X_t (IDX::SLIP)), X_t (IDX::VEL) * std::cos (X_t (IDX::SLIP)),
568
+ std::sin (X_t (IDX::SLIP)) / lr_, X_t (IDX::VEL) * std::cos (X_t (IDX::SLIP)) / lr_;
569
+ Eigen::MatrixXd cov_twist (2 , 2 );
570
+ cov_twist << P (IDX::VEL, IDX::VEL), P (IDX::VEL, IDX::SLIP), P (IDX::SLIP, IDX::VEL),
571
+ P (IDX::SLIP, IDX::SLIP);
572
+ Eigen::MatrixXd twist_cov_mat = cov_jacob * cov_twist * cov_jacob.transpose ();
573
+
574
+ twist_with_cov.covariance [utils::MSG_COV_IDX::X_X] = twist_cov_mat (0 , 0 );
575
+ twist_with_cov.covariance [utils::MSG_COV_IDX::X_Y] = twist_cov_mat (0 , 1 );
576
+ twist_with_cov.covariance [utils::MSG_COV_IDX::X_YAW] = twist_cov_mat (0 , 2 );
577
+ twist_with_cov.covariance [utils::MSG_COV_IDX::Y_X] = twist_cov_mat (1 , 0 );
578
+ twist_with_cov.covariance [utils::MSG_COV_IDX::Y_Y] = twist_cov_mat (1 , 1 );
579
+ twist_with_cov.covariance [utils::MSG_COV_IDX::Y_YAW] = twist_cov_mat (1 , 2 );
580
+ twist_with_cov.covariance [utils::MSG_COV_IDX::YAW_X] = twist_cov_mat (2 , 0 );
581
+ twist_with_cov.covariance [utils::MSG_COV_IDX::YAW_Y] = twist_cov_mat (2 , 1 );
582
+ twist_with_cov.covariance [utils::MSG_COV_IDX::YAW_YAW] = twist_cov_mat (2 , 2 );
555
583
twist_with_cov.covariance [utils::MSG_COV_IDX::Z_Z] = vz_cov;
556
- twist_with_cov.covariance [utils::MSG_COV_IDX::X_YAW] = P (IDX::VEL, IDX::SLIP);
557
- twist_with_cov.covariance [utils::MSG_COV_IDX::YAW_X] = P (IDX::SLIP, IDX::VEL);
558
584
twist_with_cov.covariance [utils::MSG_COV_IDX::ROLL_ROLL] = wx_cov;
559
585
twist_with_cov.covariance [utils::MSG_COV_IDX::PITCH_PITCH] = wy_cov;
560
- twist_with_cov.covariance [utils::MSG_COV_IDX::YAW_YAW] = P (IDX::SLIP, IDX::SLIP);
561
586
562
587
// set shape
563
588
object.shape .dimensions .x = bounding_box_.length ;
0 commit comments