22 #include "nav2_amcl/motion_model/differential_motion_model.hpp"
29 double alpha1,
double alpha2,
double alpha3,
double alpha4,
47 set = pf->sets + pf->current_set;
51 double delta_rot1, delta_trans, delta_rot2;
52 double delta_rot1_hat, delta_trans_hat, delta_rot2_hat;
53 double delta_rot1_noise, delta_rot2_noise;
58 delta.v[1] * delta.v[1] +
59 delta.v[0] * delta.v[0]) < 0.01)
63 delta_rot1 = angleutils::angle_diff(
64 atan2(delta.v[1], delta.v[0]),
68 delta.v[0] * delta.v[0] +
69 delta.v[1] * delta.v[1]);
70 delta_rot2 = angleutils::angle_diff(delta.v[2], delta_rot1);
75 delta_rot1_noise = std::min(
76 fabs(angleutils::angle_diff(delta_rot1, 0.0)),
77 fabs(angleutils::angle_diff(delta_rot1, M_PI)));
78 delta_rot2_noise = std::min(
79 fabs(angleutils::angle_diff(delta_rot2, 0.0)),
80 fabs(angleutils::angle_diff(delta_rot2, M_PI)));
82 for (
int i = 0; i < set->sample_count; i++) {
86 delta_rot1_hat = angleutils::angle_diff(
90 alpha1_ * delta_rot1_noise * delta_rot1_noise +
91 alpha2_ * delta_trans * delta_trans)));
92 delta_trans_hat = delta_trans -
95 alpha3_ * delta_trans * delta_trans +
96 alpha4_ * delta_rot1_noise * delta_rot1_noise +
97 alpha4_ * delta_rot2_noise * delta_rot2_noise));
98 delta_rot2_hat = angleutils::angle_diff(
102 alpha1_ * delta_rot2_noise * delta_rot2_noise +
103 alpha2_ * delta_trans * delta_trans)));
106 sample->pose.v[0] += delta_trans_hat *
107 cos(sample->pose.v[2] + delta_rot1_hat);
108 sample->pose.v[1] += delta_trans_hat *
109 sin(sample->pose.v[2] + delta_rot1_hat);
110 sample->pose.v[2] += delta_rot1_hat + delta_rot2_hat;
116 #include <pluginlib/class_list_macros.hpp>
virtual void initialize(double alpha1, double alpha2, double alpha3, double alpha4, double alpha5)
An factory to create motion models.
virtual void odometryUpdate(pf_t *pf, const pf_vector_t &pose, const pf_vector_t &delta)
Update on new odometry data.
An abstract motion model class.