25 #include "nav2_amcl/angleutils.hpp"
26 #include "nav2_amcl/motion_model/differential_motion_model.hpp"
27 #include "nav2_amcl/pf/pf_pdf.hpp"
34 double alpha1,
double alpha2,
double alpha3,
double alpha4,
52 set = pf->sets + pf->current_set;
56 double delta_rot1, delta_trans, delta_rot2;
57 double delta_rot1_hat, delta_trans_hat, delta_rot2_hat;
58 double delta_rot1_noise, delta_rot2_noise;
63 delta.v[1] * delta.v[1] +
64 delta.v[0] * delta.v[0]) < 0.01)
68 delta_rot1 = angleutils::angle_diff(
69 atan2(delta.v[1], delta.v[0]),
73 delta.v[0] * delta.v[0] +
74 delta.v[1] * delta.v[1]);
75 delta_rot2 = angleutils::angle_diff(delta.v[2], delta_rot1);
80 delta_rot1_noise = std::min(
81 fabs(angleutils::angle_diff(delta_rot1, 0.0)),
82 fabs(angleutils::angle_diff(delta_rot1, M_PI)));
83 delta_rot2_noise = std::min(
84 fabs(angleutils::angle_diff(delta_rot2, 0.0)),
85 fabs(angleutils::angle_diff(delta_rot2, M_PI)));
87 for (
int i = 0; i < set->sample_count; i++) {
91 delta_rot1_hat = angleutils::angle_diff(
95 alpha1_ * delta_rot1_noise * delta_rot1_noise +
96 alpha2_ * delta_trans * delta_trans)));
97 delta_trans_hat = delta_trans -
100 alpha3_ * delta_trans * delta_trans +
101 alpha4_ * delta_rot1_noise * delta_rot1_noise +
102 alpha4_ * delta_rot2_noise * delta_rot2_noise));
103 delta_rot2_hat = angleutils::angle_diff(
107 alpha1_ * delta_rot2_noise * delta_rot2_noise +
108 alpha2_ * delta_trans * delta_trans)));
111 sample->pose.v[0] += delta_trans_hat *
112 cos(sample->pose.v[2] + delta_rot1_hat);
113 sample->pose.v[1] += delta_trans_hat *
114 sin(sample->pose.v[2] + delta_rot1_hat);
115 sample->pose.v[2] += delta_rot1_hat + delta_rot2_hat;
121 #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.