Fixing yaw keeps overshooting

asked 2019-11-20 05:35:49 -0500

SimonDahrs gravatar image


I'm building a 4-wheeled skid steering robot. Currently I'm implementing the functionality to drive towards a point (x, y) based on its odometry data. One node (drive control) sends twist messages containing linear x and angular z speed, which the other node (wheel control) receives. This node calculates the desired speed for the left and right wheels, and tries to obtain that speed using PD-controlled PWM signals. An odometry node takes care of the feedback of the front two wheels. This all seems to work fine. However, when the heading (yaw) of the robot needs to be corrected to eventually reach the desired point, it sends a twist message which an angular speed (PD controlled). The problem is that the yaw always overshoots. So the robot's yaw always passes the desired yaw which causes the robot's movement to oscillate. The following I tried:

  • Increase the yaw error margin
  • Decrease the angular velocity
  • Control the desired angular velocity with a PD-control mechanism
  • Increase all node work rates

These things did not fully solve this issue, and now I ran out of ideas. Does anyone have a grasp of what I can do to fix this problem? If you need some code, feel free to ask! Can't put all of it on here!

edit retag flag offensive close merge delete


If you have the possibility, you could look at using the diff_drive_controller from ros_control. It should also support skid steering setups.

This is not an answer, but reuse is always a good idea, so I wanted to make you aware of its existence.

gvdhoorn gravatar image gvdhoorn  ( 2019-11-20 06:20:46 -0500 )edit

This could be an issue with the PID values in your the parameters (.yaml) file. The problem you're having appears to be very similar to the one addressed in this video:

The I and D values are expected to be part of the configuration to address this problem.

fozzy-b gravatar image fozzy-b  ( 2020-01-10 11:20:01 -0500 )edit