Convert a vehicle state in Cartesian frame to Frenet frame.
Decouple a 2d movement to two independent 1d movement w.r.t. reference line. The lateral movement is a function of longitudinal accumulated distance s to achieve better satisfaction of nonholonomic constraints.
33 {
34 const double dx = x - rx;
35 const double dy = y - ry;
36
37 const double cos_theta_r = std::cos(rtheta);
38 const double sin_theta_r = std::sin(rtheta);
39
40 const double cross_rd_nd = cos_theta_r * dy - sin_theta_r * dx;
41 ptr_d_condition->at(0) =
42 std::copysign(std::sqrt(dx * dx + dy * dy), cross_rd_nd);
43
44 const double delta_theta = theta - rtheta;
45 const double tan_delta_theta = std::tan(delta_theta);
46 const double cos_delta_theta = std::cos(delta_theta);
47
48 const double one_minus_kappa_r_d = 1 - rkappa * ptr_d_condition->at(0);
49 ptr_d_condition->at(1) = one_minus_kappa_r_d * tan_delta_theta;
50
51 const double kappa_r_d_prime =
52 rdkappa * ptr_d_condition->at(0) + rkappa * ptr_d_condition->at(1);
53
54 ptr_d_condition->at(2) =
55 -kappa_r_d_prime * tan_delta_theta +
56 one_minus_kappa_r_d / cos_delta_theta / cos_delta_theta *
57 (kappa * one_minus_kappa_r_d / cos_delta_theta - rkappa);
58
59 ptr_s_condition->at(0) = rs;
60
61 ptr_s_condition->at(1) = v * cos_delta_theta / one_minus_kappa_r_d;
62
63 const double delta_theta_prime =
64 one_minus_kappa_r_d / cos_delta_theta * kappa - rkappa;
65 ptr_s_condition->at(2) =
66 (a * cos_delta_theta -
67 ptr_s_condition->at(1) * ptr_s_condition->at(1) *
68 (ptr_d_condition->at(1) * delta_theta_prime - kappa_r_d_prime)) /
69 one_minus_kappa_r_d;
70}