24 #include "nav2_amcl/angleutils.hpp"
25 #include "nav2_amcl/motion_model/omni_motion_model.hpp"
26 #include "nav2_amcl/pf/pf_pdf.hpp"
27 #include "nav2_amcl/pf/pf_vector.hpp"
34 double alpha1,
double alpha2,
double alpha3,
double alpha4,
52 set = pf->sets + pf->current_set;
55 double delta_trans, delta_rot, delta_bearing;
56 double delta_trans_hat, delta_rot_hat, delta_strafe_hat;
59 delta.v[0] * delta.v[0] +
60 delta.v[1] * delta.v[1]);
61 delta_rot = delta.v[2];
64 double trans_hat_stddev = sqrt(
65 alpha3_ * (delta_trans * delta_trans) +
66 alpha4_ * (delta_rot * delta_rot) );
67 double rot_hat_stddev = sqrt(
68 alpha1_ * (delta_rot * delta_rot) +
69 alpha2_ * (delta_trans * delta_trans) );
70 double strafe_hat_stddev = sqrt(
71 alpha4_ * (delta_rot * delta_rot) +
72 alpha5_ * (delta_trans * delta_trans) );
74 for (
int i = 0; i < set->sample_count; i++) {
77 delta_bearing = angleutils::angle_diff(
78 atan2(delta.v[1], delta.v[0]),
79 old_pose.v[2]) + sample->pose.v[2];
80 double cs_bearing = cos(delta_bearing);
81 double sn_bearing = sin(delta_bearing);
84 delta_trans_hat = delta_trans + pf_ran_gaussian(trans_hat_stddev);
85 delta_rot_hat = delta_rot + pf_ran_gaussian(rot_hat_stddev);
86 delta_strafe_hat = 0 + pf_ran_gaussian(strafe_hat_stddev);
88 sample->pose.v[0] += (delta_trans_hat * cs_bearing +
89 delta_strafe_hat * sn_bearing);
90 sample->pose.v[1] += (delta_trans_hat * sn_bearing -
91 delta_strafe_hat * cs_bearing);
92 sample->pose.v[2] += delta_rot_hat;
98 #include <pluginlib/class_list_macros.hpp>
An abstract motion model class.
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.