6 : _process_noise_covariance_matrix(process_noise_covariance_matrix) {}
15 const unsigned int state_size)
const {
17 Eigen::MatrixXf::Identity(6, state_size);
21 return Eigen::MatrixXf::Identity(6, 6) * process_noise;
27 const Eigen::VectorXf &expected_state,
const MotionUpdate &motion_prediction_data,
28 const double time_interval)
const {
29 Eigen::VectorXf next_state = expected_state;
39 double delta_x = -radius * sin(expected_state(2)) +
40 radius * sin(expected_state(2) +
42 double delta_y = radius * cos(expected_state(2)) -
43 radius * cos(expected_state(2) +
46 next_state(0) += delta_x;
47 next_state(1) += delta_y;
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());
65 if (std::abs(motion_prediction_data.rotational_velocity) < 0.02) {
67 -motion_prediction_data.translational_velocity * sin(expected_state(2)) * time_interval;
69 motion_prediction_data.translational_velocity * cos(expected_state(2)) * time_interval;
72 motion_prediction_data.translational_velocity / motion_prediction_data.rotational_velocity;
74 expected_state(2) + motion_prediction_data.rotational_velocity * time_interval;
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));
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));
87 const Eigen::VectorXf &expected_state,
const MotionUpdate &motion_prediction_data,
88 const double time_interval)
const {
89 Eigen::VectorXf next_state = expected_state;
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);
98 next_state(3) += motion_prediction_data.
acceleration_x * time_interval;
99 next_state(4) += motion_prediction_data.
acceleration_y * time_interval;
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());
110 jacobian(0, 3) = time_interval;
111 jacobian(1, 4) = time_interval;
113 jacobian(2, 2) = time_interval;
114 jacobian(2, 5) = time_interval;
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.