Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

inertia origin set in urdf handled wrong by gazebo?

Hi there,

I am currently developing an urdf model of our robot for simulation in gazebo. I always had problems setting the mass origin correctly. My model has a base_footprint link as root link, which has and so I didn't care about it's inertia origin, the child link is the base_link which is the main body of the robot, where I set the mass and origin values. I found out that gazebo (or the urdf converter?) is handling the model in a very strange way. The origin value of base_link is ignored and the origin for all (fixed) parts is the origin specified in base_footprint.

So now my question is how this is supposed to be? Is this wanted behaviour or a bug in gazebo? Or am I missing something? It took me weeks to figure out what exactly is the problem, and I couldn't find any information about this problem.

here are some lines from my urdf file:

  <link name="base_link">
    <visual>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
    </collision>
    <inertial>
      <origin xyz="1337 42 1984" rpy="0 0 0" /> <!-- whatever I put here is ignored -->
      <mass value="70.0"/>
      <inertia ixx="1.0" ixy="0" ixz="0" iyy="1.0" iyz="0" izz="1.0"/>
    </inertial>
  </link>
  <link name="base_footprint">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 -0.15 0.2"/> <!-- this is the mass origin for every part -->
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.0"/>
      <origin xyz="-0.15 0 0.2"/>
      <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
    </inertial>
  </link>
  <joint name="base_footprint" type="fixed">
    <origin rpy="0 0 1.57075" xyz="0 0 0"/>
    <parent link="base_footprint"/>
    <child link="base_link"/>
  </joint>

inertia origin set in urdf handled wrong by gazebo?

Hi there,

I am currently developing an urdf model of our robot for simulation in gazebo. I always had problems setting the mass origin correctly. My model has a base_footprint link as root link, which has and so I didn't care about it's inertia origin, the child link is the base_link which is the main body of the robot, where I set the mass and origin values. I found out that gazebo (or the urdf converter?) is handling the model in a very strange way. The origin value of base_link is ignored and the origin for all (fixed) parts is the origin specified in base_footprint.

So now my question is how this is supposed to be? Is this wanted behaviour or a bug in gazebo? Or am I missing something? It took me weeks to figure out what exactly is the problem, and I couldn't find any information about this problem.

here are some lines from my urdf file:

  <link name="base_link">
    <visual>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
    </collision>
    <inertial>
      <origin xyz="1337 42 1984" rpy="0 0 0" /> <!-- whatever I put here is ignored -->
      <mass value="70.0"/>
      <inertia ixx="1.0" ixy="0" ixz="0" iyy="1.0" iyz="0" izz="1.0"/>
    </inertial>
  </link>
  <link name="base_footprint">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 -0.15 0.2"/> <!-- this is the mass origin for every part -->
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.0"/>
      <origin xyz="-0.15 0 0.2"/>
      <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
    </inertial>
  </link>
  <joint name="base_footprint" type="fixed">
    <origin rpy="0 0 1.57075" xyz="0 0 0"/>
    <parent link="base_footprint"/>
    <child link="base_link"/>
  </joint>

edit: Another question. Where should I specify the inertia values and how are they evaluated? e.g. what happens if I give an inertia matrix for both base_footprint and base_link at different origins?

inertia origin set in urdf handled wrong by gazebo?

Hi there,

I am currently developing an urdf model of our robot for simulation in gazebo. I always had problems setting the mass origin correctly. My model has a base_footprint link as root link, which has and so I didn't care about it's inertia origin, the child link is the base_link which is the main body of the robot, where I set the mass and origin values. I found out that gazebo (or the urdf converter?) is handling the model in a very strange way. The origin value of base_link is ignored and the origin for all (fixed) parts is the origin specified in base_footprint.

So now my question is how this is supposed to be? Is this wanted behaviour or a bug in gazebo? Or am I missing something? It took me weeks to figure out what exactly is the problem, and I couldn't find any information about this problem.

here are some lines from my urdf file:

  <link name="base_link">
    <visual>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <geometry>
        <mesh filename="package://sr1_description/meshes2/robot.stl"/>
      </geometry>
    </collision>
    <inertial>
      <origin xyz="1337 42 1984" rpy="0 0 0" /> <!-- whatever I put here is ignored -->
      <mass value="70.0"/>
      <inertia ixx="1.0" ixy="0" ixz="0" iyy="1.0" iyz="0" izz="1.0"/>
    </inertial>
  </link>
  <link name="base_footprint">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
      <material name="Blue"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 -0.15 0.2"/> <!-- this is the mass origin for every part -->
      <geometry>
        <box size="0.001 0.001 0.001"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.0"/>
      <origin xyz="-0.15 0 0.2"/>
      <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
    </inertial>
  </link>
  <joint name="base_footprint" type="fixed">
    <origin rpy="0 0 1.57075" xyz="0 0 0"/>
    <parent link="base_footprint"/>
    <child link="base_link"/>
  </joint>

edit: Another question. Where should I specify the inertia values and how are they evaluated? e.g. what happens if I give an inertia matrix for both base_footprint and base_link at different origins?

UPDATE2: I removed my previous urdf, now here is a new example:

cube1.urdf:

<robot name="cube1">
    <link name="cube">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
        <collision>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="10"/>
            <origin xyz="5 5 5" />
            <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
        </inertial>
    </link>
</robot>

cube2.urdf:

<robot name="cube2">
    <link name="cube">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
        <collision>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="10"/>
            <origin xyz="5 5 5" />
            <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
        </inertial>
    </link>
    <link name="pseudo_link">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.1"/>
            </geometry>
        </visual>
        <collision>
            <geometry>
                <box size="0.1 0.1 0.1"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="0.00001"/>
            <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
        </inertial>
    </link>
    <joint name="cube_joint" type="fixed">
        <origin xyz="0 0 0" rpy="0 0 0" />
        <parent link="pseudo_link"/>
        <child link="cube"/>
    </joint>
</robot>

Both times it's a simple cube with 1m sides and a mass of 10kg. The mass origin has an offset of 5m in every direction, so it is outside of the geometry. cube2 has an additional pseudo link as parent which has a very small mass and its origin in the center. If gazebo handled the mass origin correctly I would expect both cubes to show the same behavior. If you spawn both models in gazebo you can see that cube1 starts standing on the corner, as expected, because the mass origin is outside. However cube2 is just laying on the floor as normal cubes do. So clearly the mass origin of cube2 is inside the cube (in the center) and not where I set it in the cube link.