@@ -22,7 +22,9 @@ KinematicsAdtModel::KinematicsAdtModel(
22
22
const double front_wheelbase, const double rear_wheelbase, const double steer_lim,
23
23
const double steer_tau)
24
24
: VehicleModelInterface(
25
- /* dim_x */ 3 , /* dim_u */ 1 , /* dim_y */ 2 , front_wheelbase + rear_wheelbase)
25
+ /* dim_x */ 3 , /* dim_u */ 1 , /* dim_y */ 2 , front_wheelbase + rear_wheelbase),
26
+ m_wheelbase_diff (front_wheelbase - rear_wheelbase),
27
+ m_wheelbase_squared_diff(rear_wheelbase * rear_wheelbase - front_wheelbase * front_wheelbase)
26
28
{
27
29
m_front_wheelbase = front_wheelbase;
28
30
m_rear_wheelbase = rear_wheelbase;
@@ -37,27 +39,34 @@ void KinematicsAdtModel::calculateDiscreteMatrix(
37
39
auto sign = [](double x) { return (x > 0.0 ) - (x < 0.0 ); };
38
40
39
41
/* Linearize delta around delta_r (reference delta) */
40
- double delta_r = atan (m_wheelbase * m_curvature);
42
+ const double curvature_squared = m_curvature * m_curvature;
43
+ double delta_r = std::atan (
44
+ (1.0 - std::sqrt (m_wheelbase_squared_diff * curvature_squared + 1.0 )) /
45
+ (m_wheelbase_diff * m_curvature));
41
46
if (std::abs (delta_r) >= m_steer_lim) {
42
47
delta_r = m_steer_lim * static_cast <double >(sign (delta_r));
43
48
}
44
- double cos_delta_r_squared_inv = 1 / ( cos (delta_r) * cos (delta_r));
49
+
45
50
double velocity = m_velocity;
46
51
if (std::abs (m_velocity) < 1e-04 ) {
47
52
velocity = 1e-04 * (m_velocity >= 0 ? 1 : -1 );
48
53
}
49
54
50
- a_d << 0.0 , velocity, 0.0 , 0.0 , 0.0 , velocity / m_wheelbase * cos_delta_r_squared_inv, 0.0 , 0.0 ,
51
- -1.0 / m_steer_tau;
55
+ const double front_wheelbase_c_rear_wheelbase_inv =
56
+ 1.0 / (m_front_wheelbase + m_rear_wheelbase * cos (delta_r));
57
+
58
+ const double turning_velocity = velocity * sin (delta_r) * front_wheelbase_c_rear_wheelbase_inv;
59
+ const double pd_turning_velocity =
60
+ velocity * (m_front_wheelbase * cos (delta_r) + m_rear_wheelbase) *
61
+ front_wheelbase_c_rear_wheelbase_inv * front_wheelbase_c_rear_wheelbase_inv;
62
+
63
+ a_d << 0.0 , velocity, 0.0 , 0.0 , 0.0 , pd_turning_velocity, 0.0 , 0.0 , -1.0 / m_steer_tau;
52
64
53
65
b_d << 0.0 , 0.0 , 1.0 / m_steer_tau;
54
66
55
67
c_d << 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ;
56
68
57
- w_d << 0.0 ,
58
- -velocity * m_curvature +
59
- velocity / m_wheelbase * (tan (delta_r) - delta_r * cos_delta_r_squared_inv),
60
- 0.0 ;
69
+ w_d << 0.0 , -velocity * m_curvature + turning_velocity - pd_turning_velocity * delta_r, 0.0 ;
61
70
62
71
// bilinear discretization for ZOH system
63
72
// no discretization is needed for Cd
@@ -108,7 +117,8 @@ MPCTrajectory KinematicsAdtModel::calculatePredictedTrajectoryInWorldCoordinate(
108
117
Eigen::VectorXd dstate = Eigen::VectorXd::Zero (4 );
109
118
dstate (0 ) = velocity * std::cos (yaw);
110
119
dstate (1 ) = velocity * std::sin (yaw);
111
- dstate (2 ) = velocity * std::tan (steer) / m_wheelbase;
120
+ dstate (2 ) =
121
+ velocity * std::sin (steer) / (m_front_wheelbase + m_rear_wheelbase * std::cos (steer));
112
122
dstate (3 ) = -(steer - desired_steer) / m_steer_tau;
113
123
114
124
// Note: don't do "return state_w + dstate * dt", which does not work due to the lazy evaluation
0 commit comments