22 #include "nav2_amcl/motion_model/omni_motion_model.hpp"
29 double alpha1,
double alpha2,
double alpha3,
double alpha4,
47 set = pf->sets + pf->current_set;
50 double delta_trans, delta_rot, delta_bearing;
51 double delta_trans_hat, delta_rot_hat, delta_strafe_hat;
54 delta.v[0] * delta.v[0] +
55 delta.v[1] * delta.v[1]);
56 delta_rot = delta.v[2];
59 double trans_hat_stddev = sqrt(
60 alpha3_ * (delta_trans * delta_trans) +
61 alpha4_ * (delta_rot * delta_rot) );
62 double rot_hat_stddev = sqrt(
63 alpha1_ * (delta_rot * delta_rot) +
64 alpha2_ * (delta_trans * delta_trans) );
65 double strafe_hat_stddev = sqrt(
66 alpha4_ * (delta_rot * delta_rot) +
67 alpha5_ * (delta_trans * delta_trans) );
69 for (
int i = 0; i < set->sample_count; i++) {
72 delta_bearing = angleutils::angle_diff(
73 atan2(delta.v[1], delta.v[0]),
74 old_pose.v[2]) + sample->pose.v[2];
75 double cs_bearing = cos(delta_bearing);
76 double sn_bearing = sin(delta_bearing);
79 delta_trans_hat = delta_trans + pf_ran_gaussian(trans_hat_stddev);
80 delta_rot_hat = delta_rot + pf_ran_gaussian(rot_hat_stddev);
81 delta_strafe_hat = 0 + pf_ran_gaussian(strafe_hat_stddev);
83 sample->pose.v[0] += (delta_trans_hat * cs_bearing +
84 delta_strafe_hat * sn_bearing);
85 sample->pose.v[1] += (delta_trans_hat * sn_bearing -
86 delta_strafe_hat * cs_bearing);
87 sample->pose.v[2] += delta_rot_hat;
93 #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.