In URDF, Does origin of a Link matter since the origin values of Joint is the one being implemented?

(Similar question was posted by rongjin980704, unfortunately, there was no followup with query, so i am posting again)

The questions are into two:

  1. What is the purpose of defining origin in a link <origin rpy="0 0 0" xyz="0 0 0"/>, since the value of origin in a joint <origin xyz="0.0023 0 -0.0005" rpy="0 0 0"/> is the one that is being implemented. (I have attached a sample URDF for comparison). Its useful for defining the base link’s position, but i don’t see its use for the rest of the links? Could someone elaborate?

  2. Is the usage of effort in joint definitions <limit lower="-0.2" upper="0.2" effort="0.1" velocity="0.005"/> meant to convey the force to be applied? what is the range of values for effort?

<?xml version="1.0"?>
<robot name="mira">
    <link name="base_link">
        <visual>
       <origin rpy="0 0 0" xyz="0 0 0"/>
          <geometry>
            <cylinder radius="0.06" length="0.09"/>
          </geometry>
        </visual>
    </link>
  
    <link name="roll_M1_link">
        <visual>
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <geometry>
                <cylinder radius="0.01" length="0.005"/>
            </geometry>
        </visual>
    </link>
    
    <joint name="roll_joint" type="revolute">
        <parent link="base_link"/>
        <child link="roll_M1_link"/>
        <origin xyz="0.0023 0 -0.0005" rpy="0 0 0"/>
        <limit lower="-0.2" upper="0.2" effort="0.1" velocity="0.005"/>
        <axis xyz="1 0 0"/>
    </joint>

    <link name="pitch_M2_link">
        <visual>
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <geometry>
                <cylinder radius="0.01" length="0.005"/>
            </geometry>
        </visual>
    </link>

    <joint name="pitch_joint" type="revolute">
        <parent link="roll_M1_link"/>
        <child link="pitch_M2_link"/>
        <origin xyz="0 0 0" rpy="0 -1.5708 0"/>
        <limit lower="0" upper="0.44" effort="0.1" velocity="0.005"/>
        <axis xyz="0 1 0"/>
    </joint>

Hi @Joseph1001 ,

  1. The origin of the first link defines where it starts in relation to the robot model (it is generated a single object that represents the robot in gazebo). And yes, the joint position is the place where the next link will be created from, in relation to the original link. It is important to know that the link dimensions increase to all the directions in space, so you must take it into account if you creating an arm, for example. This is why you should change the link origin in relation to its joint, because you would like to have the arm binded in one of its edges, not in the center.

I have two examples where you can check the creation of robots from the scratch:


  1. The effort attribute defines the maximum force to be applied by a controller to the given joint.You can check the official docs here:

It says:

“The effort limit is an attribute of the limit tag. In this case, a controller cannot command an effort of more than 30 N (N-m for revolute) nor less than -30 N (N-m for revolute) on the joint. If the controller tries to command an effort beyond the effort limit, the magnitude of the effort is truncated.”

Thanks @marco.nc.arruda for the detailed explanations and the links, really appreciate it.

1 Like