Roboclaw ROS Driver: Odometry Calculation Reversal

/odom
. On the same plot, I've also placed data reported by Phoebe's scanning LIDAR. Everything looked good when I commanded Phoebe to drive forward, but the geometry went askew as soon as Phoebe started turning. The LIDAR dots rotated one way, and the odometry reporting arrow rotated another. Something is wrong in the geometry calculation code.
For this particular problem I knew exactly where to start looking. When I assembled Phoebe, I knew I needed to configure motors in the way expected by the Roboclaw ROS driver. The README didn't explicitly say which motor went on which side, so I went into the source code and got conflicting answers. In the motor driving routine (cmd_vel_callback
) it performed calculation for right wheel motion and sent it to motor 1, and left wheel motion went to motor 2.
However, this doesn't match encoder calculation code. The method EncodeOdom::update_publish
expects its parameters to be (enc_left, enc_right
). In method Node::run
, it retrieves encoder values from motor 1 and saves it in variable enc1
, and enc2
for motor 2, then calls update_publish(enc1, enc2)
. Which would treat encoder value of motor 1 as enc_left instead of enc_right, the opposite of what we'd want.
So the fact data on /odom
is going the wrong way was not a surprise, but why didn't the LIDAR transform also suffer the same problem? This was traced down to an earlier change submitted as a fix for the reverse transform problem - that commit added a negative sign in front of the calculated angle when broadcasting odom -> base_link transform. But that only masked and didn't fix the underlying problem. The transform might look right, but /odom data is still all wrong, and variables like self.last_enc_right
is actually holding the left side value.
The correct fix would be to reverse the parameter order when calling EncodeOdom::update_publish
which correctly assigns encoder 1 count the right motor, and encoder 2 the left motor. And with the underlying problem fixed, we no longer need the negative sign so that can be deleted.
With this fix, Phoebe's laser plot and odometry plot in RViz appear to agree with each other and both correspond correctly to the direction Phoebe is turning. I've submitted this fix as a pull request on the Roboclaw ROS driver.