Robotics StackExchange | Archived questions

Model slips over surface even though both has mu set to 1.0

I am running a simulation with a 4-wheeled robot on a surface given as a mesh. The ground model has following surface setting.

   <collision name="collision">
        <geometry>
          <mesh>
            <uri>model://garden/meshes/garden.dae</uri>
            <scale>0.17 0.17 0.17</scale> <!--0.17-->
          </mesh>
        </geometry>
        <surface>
            <friction>
                <ode>
                    <mu>1</mu>
                    <mu2>1</mu2>
                    <fdir1>0 0 0</fdir1>
                    <slip1>0</slip1>
                    <slip2>0</slip2>
                </ode>
            </friction>
        </surface>
      </collision>

The mu and mu2 are set to 1.0. If I put a primitive box on the slope somewhere on the ground model, the box does not slip.

The robot is implemented in URDF code and has following code in <gazebo> tags

<gazebo reference="right_drive_wheel_link">
    <mu1>1.0</mu1>
    <mu2>1.0</mu2>
</gazebo>

<gazebo reference="left_drive_wheel_link">
    <mu1>1.0</mu1>
    <mu2>1.0</mu2>
</gazebo>

And so I wou;d assume the robot will not slip over the ground. Yet is does slip. It slips even when perpendicular to a gradient of the slope (slips sideways from driving direction). How is this possible? What else needs to be set?


UPDATE

I found out the model slips much less when I decrease the simulation step. When I run the simulation with the step size of 0.001 the robot slips all the way to the bottom of the slope it is standing at in 22 minutes of simulation time. When I run the simulation with the step size of 0.0001 the robot moves less than 1/20 of the slope length during the same time.

Is there any way how to make the physics of sliding and friction work properly with larger step sizes? I can't wait two hours to simulate 20 minutes.

Asked by kumpakri on 2019-08-13 08:17:40 UTC

Comments

Answers

I assume you are having this problem because of your fdir1 is set to 0 0 0 and not in some direction. According to the Gazebo API, fdir1 is the "primary friction direction for dry friction coefficient (SurfaceParams::mu1) of the friction pyramid."

If you take a look at the ODE documentation,

fdir1 is a "first friction direction" vector that defines a direction along which frictional force is applied. It must be of unit length and perpendicular to the contact normal (so it is typically tangential to the contact surface). It should only be defined if the dContactFDir1 flag is set in surface.mode. The "second friction direction" is a vector computed to be perpendicular to both the contact normal and fdir1.

Asked by bhej on 2019-08-13 09:25:26 UTC

Comments