# Controlled wheel slips under external force

Hi, when applying external force to a wheeled robot (manually, inertia, other objects), controlled wheels don't rotate (slip). While they should, due to the friction between the wheels and the ground, when the external force applied overwhelms the forces that control the wheels together with the friction and damping forces of the wheels' joints.

I tried different methods of controlling the wheels: PID control, SetParam("vel") which both respect physics; different wheels' surface friction mu1 and mu2: from 0.1 to 1.0 to 1000000; different dynamics damping and friction for the wheels joints: from 0 to 100; different kp, kd, minDepth, maxVel, etc. Nothing helps.

The actual scenario I have troubles in bcz of this issue is 4-wheeled robot with two front differential wheels and two back caster wheels. It has its COG in the middle, which is quite behind the front axle. When it rotates in-place and then is commanded to stop (zero cmd_vel sent), the moment of rotational inertia keeps it rotating for some time, but front wheels starts slipping, which makes odometry based on front wheels wrong and, as the result, localization and navigation stuff produce wrong occupancy maps.

You can see this effect with any wheeled robot, say, Turtlebot3.

$export TURTLEBOT3_MODEL=burger$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch


Apply some force to it (e.g. linear 100N or rotational 10N) and observe that the front wheels are blocked and slips. Here are two videos visualizing the issue:

I'm on Melodic, Gazebo-9

edit retag close merge delete

Sort by » oldest newest most voted

If the controller is able to apply unlimited effort, it might be counteracting the torque on the wheels due to friction. You can try limiting the effort by specifying <limit><effort> in on the wheel joints.

more

Thanks. First of all, <limit><effort> is ignored for continuous joints. But even if I clamp the effort in the code, it still slips hardly. Even worse, it starts slipping also after you accelerate with cmd_vel and then send zero cmd_vel to stop. And only if I clamp to some ridiculously small values (like 0.1 N*m), it stops slipping. But with this small torque you can't really accelerate in a reasonable time.