Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
motion_models.cpp
Go to the documentation of this file.
2
4
5MotionModel::MotionModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
6 : _process_noise_covariance_matrix(process_noise_covariance_matrix) {}
7
8NormalVelocityModel::NormalVelocityModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
9 : MotionModel(process_noise_covariance_matrix) {}
10
11ImuVelocityModel::ImuVelocityModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
12 : MotionModel(process_noise_covariance_matrix) {}
13
15 const unsigned int state_size) const {
16 return Eigen::MatrixXf::Identity(state_size, 6) * this->_process_noise_covariance_matrix *
17 Eigen::MatrixXf::Identity(6, state_size);
18}
19
20Eigen::MatrixXf MotionModel::create_process_noise_covariance_matrix(float process_noise) {
21 return Eigen::MatrixXf::Identity(6, 6) * process_noise;
22}
23
24/*------------------------Normal Velocity Model-----------------------*/
25
27 const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data,
28 const double time_interval) const {
29 Eigen::VectorXf next_state = expected_state;
30 if (std::abs(motion_prediction_data.rotational_velocity) < 0.02) { // Rectilinear movement
31
32 next_state(0) +=
33 motion_prediction_data.translational_velocity * cos(expected_state(2)) * time_interval;
34 next_state(1) +=
35 motion_prediction_data.translational_velocity * sin(expected_state(2)) * time_interval;
36 } else { // Curvilinear movement
37 double radius =
38 motion_prediction_data.translational_velocity / motion_prediction_data.rotational_velocity;
39 double delta_x = -radius * sin(expected_state(2)) +
40 radius * sin(expected_state(2) +
41 motion_prediction_data.rotational_velocity * time_interval);
42 double delta_y = radius * cos(expected_state(2)) -
43 radius * cos(expected_state(2) +
44 motion_prediction_data.rotational_velocity * time_interval);
45
46 next_state(0) += delta_x;
47 next_state(1) += delta_y;
48 }
49 next_state(3) = motion_prediction_data.translational_velocity * cos(next_state(2));
50 next_state(4) = motion_prediction_data.translational_velocity * sin(next_state(2));
51 next_state(5) = motion_prediction_data.rotational_velocity;
53 expected_state(2) + motion_prediction_data.rotational_velocity * time_interval);
54
55 return next_state;
56}
57
59 const Eigen::VectorXf &expected_state,
60 [[maybe_unused]] const MotionUpdate &motion_prediction_data,
61 [[maybe_unused]] const double time_interval) const {
62 Eigen::MatrixXf jacobian =
63 Eigen::MatrixXf::Identity(expected_state.size(), expected_state.size());
64
65 if (std::abs(motion_prediction_data.rotational_velocity) < 0.02) { // Rectilinear movement
66 jacobian(0, 2) =
67 -motion_prediction_data.translational_velocity * sin(expected_state(2)) * time_interval;
68 jacobian(1, 2) =
69 motion_prediction_data.translational_velocity * cos(expected_state(2)) * time_interval;
70 } else { // Curvilinear movement
71 float ratio =
72 motion_prediction_data.translational_velocity / motion_prediction_data.rotational_velocity;
73 float new_heading =
74 expected_state(2) + motion_prediction_data.rotational_velocity * time_interval;
75
76 jacobian(0, 2) = -ratio * (std::cos(expected_state(2)) - std::cos(new_heading));
77 jacobian(1, 2) = -ratio * (std::sin(expected_state(2)) - std::sin(new_heading));
78 }
79 jacobian(3, 2) = -motion_prediction_data.translational_velocity * sin(expected_state(2));
80 jacobian(4, 2) = motion_prediction_data.translational_velocity * cos(expected_state(2));
81 return jacobian;
82}
83
84/*----------------------IMU Velocity Model ------------------------*/
85
87 const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data,
88 const double time_interval) const { // working better than CTRA, but needs fix probably
89 Eigen::VectorXf next_state = expected_state;
90
91 next_state(0) += expected_state(3) * time_interval +
92 0.5 * motion_prediction_data.acceleration_x * pow(time_interval, 2);
93 next_state(1) += expected_state(4) * time_interval +
94 0.5 * motion_prediction_data.acceleration_y * pow(time_interval, 2);
95 next_state(5) = motion_prediction_data.rotational_velocity;
96 next_state(2) =
97 common_lib::maths::normalize_angle(expected_state(2) + next_state(5) * time_interval);
98 next_state(3) += motion_prediction_data.acceleration_x * time_interval;
99 next_state(4) += motion_prediction_data.acceleration_y * time_interval;
100
101 return next_state;
102}
103
105 const Eigen::VectorXf &expected_state,
106 [[maybe_unused]] const MotionUpdate &motion_prediction_data, const double time_interval) const {
107 Eigen::MatrixXf jacobian =
108 Eigen::MatrixXf::Identity(expected_state.size(), expected_state.size());
109
110 jacobian(0, 3) = time_interval;
111 jacobian(1, 4) = time_interval;
112
113 jacobian(2, 2) = time_interval;
114 jacobian(2, 5) = time_interval;
115 return jacobian;
116}
ImuVelocityModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
Construct a new Motion Model object.
Eigen::MatrixXf get_motion_to_state_matrix(const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data, const double time_interval) const override
Calculate state covariance matrix from velocity model using IMU data and linear functions Uses transl...
Eigen::VectorXf predict_expected_state(const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data, const double time_interval) const override
Calculate expected state vector from velocity model using IMU data and linear functions Uses translat...
Abstract Moiton Model class designed to be implemented by the different motion models.
MotionModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
Construct a new Motion Model object.
static Eigen::MatrixXf create_process_noise_covariance_matrix(float process_noise)
Eigen::MatrixXf _process_noise_covariance_matrix
R.
Eigen::MatrixXf get_process_noise_covariance_matrix(const unsigned int state_size) const
Get the process noise covariance matrix object.
NormalVelocityModel(const Eigen::MatrixXf &process_noise_covariance_matrix)
Construct a new Motion Model object.
Eigen::VectorXf predict_expected_state(const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data, const double time_interval) const override
Calculate expected state vector from velocity model using normal motion data Uses translation velocit...
Eigen::MatrixXf get_motion_to_state_matrix(const Eigen::VectorXf &expected_state, const MotionUpdate &motion_prediction_data, const double time_interval) const override
Calculate state covariance matrix from velocity model using normal motion data Uses translation veloc...
double normalize_angle(double angle)
Function to keep angle in [-Pi, Pi[ radians.
Struct for data retrieved by the IMU.
double rotational_velocity
Degrees per sec.
double translational_velocity
Meters per sec.
double acceleration_x
Meters per sec.
double acceleration_y
Meters per sec.