Inconsistent odom_alpha1 and odom_alpha4 parameters between AMCL's diff and omni models?

asked 2016-07-11 11:14:02 -0500

spmaniato gravatar image

updated 2016-07-14 11:22:49 -0500

I've been working on AMCL's source code lately and noticed the following inconsistency. I was gonna open a GitHub ticket, but thought I'd get a second opinion here first.

Update: I ended up opening the issue: navigation/issues/499


Here goes:

The amcl wiki page says (abbreviated):

  • ~odom_alpha1 Expected noise in odometry's rotation estimate from the rotational component
  • ~odom_alpha2 Expected noise in odometry's rotation estimate from translational component
  • ~odom_alpha3 Expected noise in odometry's translation estimate from the translational component
  • ~odom_alpha4 Expected noise in odometry's translation estimate from the rotational component

In the source code (amcl_odom.cpp), we see the following for the diff and omni models:

For diff:

delta_rot1_hat = angle_diff(delta_rot1,
          pf_ran_gaussian(this->alpha1*delta_rot1_noise*delta_rot1_noise +
                          this->alpha2*delta_trans*delta_trans));
delta_trans_hat = delta_trans - 
          pf_ran_gaussian(this->alpha3*delta_trans*delta_trans +
                          this->alpha4*delta_rot1_noise*delta_rot1_noise +
                          this->alpha4*delta_rot2_noise*delta_rot2_noise);
delta_rot2_hat = angle_diff(delta_rot2,
          pf_ran_gaussian(this->alpha1*delta_rot2_noise*delta_rot2_noise +
                          this->alpha2*delta_trans*delta_trans));

This is consistent with the wiki page's explanation.

However, for omni:

double trans_hat_stddev = (alpha3 * (delta_trans*delta_trans) +
                           alpha1 * (delta_rot*delta_rot));
double rot_hat_stddev = (alpha4 * (delta_rot*delta_rot) +
                         alpha2 * (delta_trans*delta_trans));
double strafe_hat_stddev = (alpha1 * (delta_rot*delta_rot) +
                            alpha5 * (delta_trans*delta_trans));

This seems to imply that:

  • alpha1 is translation noise from rotation, not rotation from rotation
  • alpha4 is rotation noise from rotation, not translation from rotation

In other words, alpha1 and alpha4 look flipped in the omni model (compared to diff and the wiki page). The other two common params, alpha2 and alpha3, are OK. The inconsistency also appears in the corrected versions of the two odom models btw.

What do people think? Seems inconsistent to me.

edit retag flag offensive close merge delete