Skip to content

Commit af6fac8

Browse files
committed
feat: slip angle process noise model revised
Signed-off-by: Taekjin LEE <taekjin.lee@tier4.jp>
1 parent c36e03d commit af6fac8

File tree

6 files changed

+83
-71
lines changed

6 files changed

+83
-71
lines changed

perception/multi_object_tracker/include/multi_object_tracker/tracker/model/bicycle_tracker.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class BicycleTracker : public Tracker
4040
float q_stddev_acc_lat;
4141
float q_stddev_yaw_rate_min;
4242
float q_stddev_yaw_rate_max;
43-
float q_stddev_slip_rate_min;
44-
float q_stddev_slip_rate_max;
43+
float q_cov_slip_rate_min;
44+
float q_cov_slip_rate_max;
4545
float q_max_slip_angle;
4646
float p0_cov_vel;
4747
float p0_cov_slip;

perception/multi_object_tracker/include/multi_object_tracker/tracker/model/big_vehicle_tracker.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class BigVehicleTracker : public Tracker
4040
float q_stddev_acc_lat;
4141
float q_stddev_yaw_rate_min;
4242
float q_stddev_yaw_rate_max;
43-
float q_stddev_slip_rate_min;
44-
float q_stddev_slip_rate_max;
43+
float q_cov_slip_rate_min;
44+
float q_cov_slip_rate_max;
4545
float q_max_slip_angle;
4646
float p0_cov_vel;
4747
float p0_cov_slip;

perception/multi_object_tracker/include/multi_object_tracker/tracker/model/normal_vehicle_tracker.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ class NormalVehicleTracker : public Tracker
4242
float q_stddev_acc_lat;
4343
float q_stddev_yaw_rate_min;
4444
float q_stddev_yaw_rate_max;
45-
float q_stddev_slip_rate_min;
46-
float q_stddev_slip_rate_max;
45+
float q_cov_slip_rate_min;
46+
float q_cov_slip_rate_max;
4747
float q_max_slip_angle;
4848
float p0_cov_vel;
4949
float p0_cov_slip;

perception/multi_object_tracker/src/tracker/model/bicycle_tracker.cpp

+25-21
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,17 @@ BicycleTracker::BicycleTracker(
7373
ekf_params_.p0_cov_slip = std::pow(p0_stddev_slip, 2.0);
7474
// process noise covariance
7575
ekf_params_.q_stddev_acc_long = 9.8 * 0.3; // [m/(s*s)] uncertain longitudinal acceleration
76-
ekf_params_.q_stddev_acc_lat = 9.8 * 0.15; // [m/(s*s)] uncertain lateral acceleration
76+
ekf_params_.q_stddev_acc_lat = 9.8 * 0.1; // [m/(s*s)] uncertain lateral acceleration
7777
ekf_params_.q_stddev_yaw_rate_min =
7878
tier4_autoware_utils::deg2rad(5.0); // [rad/s] uncertain yaw change rate
7979
ekf_params_.q_stddev_yaw_rate_max =
8080
tier4_autoware_utils::deg2rad(15.0); // [rad/s] uncertain yaw change rate
81-
ekf_params_.q_stddev_slip_rate_min =
82-
tier4_autoware_utils::deg2rad(1.0); // [rad/s] uncertain slip angle change rate
83-
ekf_params_.q_stddev_slip_rate_max =
84-
tier4_autoware_utils::deg2rad(7.0); // [rad/s] uncertain slip angle change rate
81+
float q_stddev_slip_rate_min =
82+
tier4_autoware_utils::deg2rad(1); // [rad/s] uncertain slip angle change rate
83+
float q_stddev_slip_rate_max =
84+
tier4_autoware_utils::deg2rad(10.0); // [rad/s] uncertain slip angle change rate
85+
ekf_params_.q_cov_slip_rate_min = std::pow(q_stddev_slip_rate_min, 2.0);
86+
ekf_params_.q_cov_slip_rate_max = std::pow(q_stddev_slip_rate_max, 2.0);
8587
ekf_params_.q_max_slip_angle = tier4_autoware_utils::deg2rad(30); // [rad] max slip angle
8688
// limitations
8789
max_vel_ = tier4_autoware_utils::kmph2mps(100); // [m/s]
@@ -238,9 +240,9 @@ bool BicycleTracker::predict(const double dt, KalmanFilter & ekf) const
238240
if (vel <= 0.01) {
239241
q_stddev_yaw_rate = ekf_params_.q_stddev_yaw_rate_min;
240242
} else {
241-
// uncertain yaw rate limited by
242-
// centripetal acceleration w = a_lat/v
243-
// or slip angle w = v*sin(slip)/l_r
243+
// uncertainty of the yaw rate is limited by
244+
// centripetal acceleration a_lat : d(yaw)/dt = w = a_lat/v
245+
// or maximum slip angle slip_max : w = v*sin(slip_max)/l_r
244246
q_stddev_yaw_rate = std::min(
245247
ekf_params_.q_stddev_acc_lat / vel,
246248
vel * std::sin(ekf_params_.q_max_slip_angle) / lr_); // [rad/s]
@@ -249,21 +251,23 @@ bool BicycleTracker::predict(const double dt, KalmanFilter & ekf) const
249251
}
250252
float q_cov_slip_rate{0.0};
251253
if (vel <= 0.01) {
252-
q_cov_slip_rate = ekf_params_.q_stddev_slip_rate_min * ekf_params_.q_stddev_slip_rate_min;
254+
q_cov_slip_rate = ekf_params_.q_cov_slip_rate_min;
253255
} else {
254-
// sin(slip) = w*l_r/v
255-
// d(slip)/dt = - w*l_r/v^2 * d(v)/dt + l_r/v * d(w)/dt
256-
q_cov_slip_rate = std::pow(sin_slip * ekf_params_.q_stddev_acc_lat / vel, 2) +
257-
std::pow(q_stddev_yaw_rate * lr_ / vel, 2);
258-
q_cov_slip_rate = std::min(
259-
q_cov_slip_rate, ekf_params_.q_stddev_slip_rate_max * ekf_params_.q_stddev_slip_rate_max);
260-
q_cov_slip_rate = std::max(
261-
q_cov_slip_rate, ekf_params_.q_stddev_slip_rate_min * ekf_params_.q_stddev_slip_rate_min);
256+
// where sin(slip) = w * l_r / v
257+
// uncertainty of the slip angle rate is modeled as
258+
// d(slip)/dt ~ - w*l_r/v^2 * d(v)/dt + l_r/v * d(w)/dt
259+
// = - sin(slip)/v * d(v)/dt + l_r/v * d(w)/dt
260+
// d(w)/dt is modeled as proportional to w (more uncertain when slip is large)
261+
// d(v)/dt and d(w)/t is considered that those are not correlated
262+
q_cov_slip_rate =
263+
std::pow(ekf_params_.q_stddev_acc_lat * sin_slip / vel, 2) + std::pow(sin_slip * 1.5, 2);
264+
q_cov_slip_rate = std::min(q_cov_slip_rate, ekf_params_.q_cov_slip_rate_max);
265+
q_cov_slip_rate = std::max(q_cov_slip_rate, ekf_params_.q_cov_slip_rate_min);
262266
}
263-
const float q_cov_x = std::pow(0.5 * ekf_params_.q_stddev_acc_long * dt * dt, 2.0);
264-
const float q_cov_y = std::pow(0.5 * ekf_params_.q_stddev_acc_lat * dt * dt, 2.0);
265-
const float q_cov_yaw = std::pow(q_stddev_yaw_rate * dt, 2.0);
266-
const float q_cov_vel = std::pow(ekf_params_.q_stddev_acc_long * dt, 2.0);
267+
const float q_cov_x = std::pow(0.5 * ekf_params_.q_stddev_acc_long * dt * dt, 2);
268+
const float q_cov_y = std::pow(0.5 * ekf_params_.q_stddev_acc_lat * dt * dt, 2);
269+
const float q_cov_yaw = std::pow(q_stddev_yaw_rate * dt, 2);
270+
const float q_cov_vel = std::pow(ekf_params_.q_stddev_acc_long * dt, 2);
267271
const float q_cov_slip = q_cov_slip_rate * dt * dt;
268272

269273
Eigen::MatrixXd Q = Eigen::MatrixXd::Zero(ekf_params_.dim_x, ekf_params_.dim_x);

perception/multi_object_tracker/src/tracker/model/big_vehicle_tracker.cpp

+27-23
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ BigVehicleTracker::BigVehicleTracker(
5454
// Initialize parameters
5555
// measurement noise covariance
5656
float r_stddev_x = 1.5; // [m]
57-
float r_stddev_y = 0.5; // [m]
57+
float r_stddev_y = 0.3; // [m]
5858
float r_stddev_yaw = tier4_autoware_utils::deg2rad(20); // [rad]
5959
float r_stddev_vel = 1.0; // [m/s]
6060
ekf_params_.r_cov_x = std::pow(r_stddev_x, 2.0);
@@ -76,13 +76,15 @@ BigVehicleTracker::BigVehicleTracker(
7676
ekf_params_.q_stddev_acc_long = 9.8 * 0.3; // [m/(s*s)] uncertain longitudinal acceleration
7777
ekf_params_.q_stddev_acc_lat = 9.8 * 0.1; // [m/(s*s)] uncertain lateral acceleration
7878
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
8080
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);
8688
ekf_params_.q_max_slip_angle = tier4_autoware_utils::deg2rad(30); // [rad] max slip angle
8789
// limitations
8890
max_vel_ = tier4_autoware_utils::kmph2mps(100); // [m/s]
@@ -253,9 +255,9 @@ bool BigVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
253255
if (vel <= 0.01) {
254256
q_stddev_yaw_rate = ekf_params_.q_stddev_yaw_rate_min;
255257
} 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
259261
q_stddev_yaw_rate = std::min(
260262
ekf_params_.q_stddev_acc_lat / vel,
261263
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
264266
}
265267
float q_cov_slip_rate{0.0};
266268
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;
268270
} 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);
277281
}
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);
282286
const float q_cov_slip = q_cov_slip_rate * dt * dt;
283287

284288
Eigen::MatrixXd Q = Eigen::MatrixXd::Zero(ekf_params_.dim_x, ekf_params_.dim_x);

perception/multi_object_tracker/src/tracker/model/normal_vehicle_tracker.cpp

+25-21
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ NormalVehicleTracker::NormalVehicleTracker(
7676
ekf_params_.q_stddev_acc_long = 9.8 * 0.3; // [m/(s*s)] uncertain longitudinal acceleration
7777
ekf_params_.q_stddev_acc_lat = 9.8 * 0.1; // [m/(s*s)] uncertain lateral acceleration
7878
ekf_params_.q_stddev_yaw_rate_min =
79-
tier4_autoware_utils::deg2rad(1.2); // [rad/s] uncertain yaw change rate
79+
tier4_autoware_utils::deg2rad(1.5); // [rad/s] uncertain yaw change rate
8080
ekf_params_.q_stddev_yaw_rate_max =
8181
tier4_autoware_utils::deg2rad(15.0); // [rad/s] uncertain yaw change rate
82-
ekf_params_.q_stddev_slip_rate_min =
82+
float q_stddev_slip_rate_min =
8383
tier4_autoware_utils::deg2rad(0.3); // [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
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);
8688
ekf_params_.q_max_slip_angle = tier4_autoware_utils::deg2rad(30); // [rad] max slip angle
8789
// limitations
8890
max_vel_ = tier4_autoware_utils::kmph2mps(100); // [m/s]
@@ -253,32 +255,34 @@ bool NormalVehicleTracker::predict(const double dt, KalmanFilter & ekf) const
253255
if (vel <= 0.01) {
254256
q_stddev_yaw_rate = ekf_params_.q_stddev_yaw_rate_min;
255257
} 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
259261
q_stddev_yaw_rate = std::min(
260262
ekf_params_.q_stddev_acc_lat / vel,
261263
vel * std::sin(ekf_params_.q_max_slip_angle) / lr_); // [rad/s]
262264
q_stddev_yaw_rate = std::min(q_stddev_yaw_rate, ekf_params_.q_stddev_yaw_rate_max);
263265
q_stddev_yaw_rate = std::max(q_stddev_yaw_rate, ekf_params_.q_stddev_yaw_rate_min);
264266
}
265-
float q_cov_slip_rate{0.0};
267+
float q_cov_slip_rate{0.0f};
266268
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;
268270
} 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);
277281
}
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);
282286
const float q_cov_slip = q_cov_slip_rate * dt * dt;
283287

284288
Eigen::MatrixXd Q = Eigen::MatrixXd::Zero(ekf_params_.dim_x, ekf_params_.dim_x);

0 commit comments

Comments
 (0)