Bird
Raised Fist0
ROSframework~10 mins

Building a simple robot arm URDF in ROS - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Building a simple robot arm URDF
Start URDF file
Define robot tag
Add base_link
Add joint1 connecting base_link to link1
Add link1
Add joint2 connecting link1 to link2
Add link2
Close robot tag
URDF ready for use
The URDF file starts with a robot tag, then defines links and joints step-by-step to build the robot arm structure.
Execution Sample
ROS
<robot name="simple_arm">
  <link name="base_link"/>
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
  </joint>
  <link name="link1"/>
</robot>
This URDF snippet defines a robot with a base link and one revolute joint connecting to link1.
Execution Table
StepActionElement CreatedParent ElementAttributes Applied
1Start URDF filerobotnonename="simple_arm"
2Add base linklinkrobotname="base_link"
3Add joint1jointrobotname="joint1", type="revolute"
4Add parent link to joint1parentjoint1link="base_link"
5Add child link to joint1childjoint1link="link1"
6Add link1linkrobotname="link1"
7Close robot tagnonenoneURDF structure complete
💡 All robot parts defined, URDF file is complete and ready for use.
Variable Tracker
ElementStartAfter Step 2After Step 3After Step 6Final
robotnonecreatedcreatedcreatedcreated
base_linknonecreatedcreatedcreatedcreated
joint1nonenonecreatedcreatedcreated
link1nonenonenonecreatedcreated
Key Moments - 2 Insights
Why do we define links before joints in the URDF?
Because joints connect two links, the parent and child links must exist first as shown in execution_table steps 2 and 6.
What does the 'type' attribute in a joint specify?
It defines how the joint moves, for example 'revolute' means it rotates, as seen in step 3 of the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what element is created at step 4?
Aparent tag inside joint1
Blink1 element
Crobot element
Dbase_link element
💡 Hint
Check the 'Element Created' column for step 4 in the execution_table.
At which step is the 'link1' element created?
AStep 3
BStep 6
CStep 5
DStep 2
💡 Hint
Look at the 'Element Created' column and find when 'link' with name 'link1' appears.
If we add another joint connecting link2 to link3, which step would come next after step 6?
AClose robot tag
BAdd base_link again
CAdd joint connecting link2 to link3
DAdd parent link to joint1
💡 Hint
After defining link1, the next logical step is to add the next joint before closing the robot tag.
Concept Snapshot
URDF files describe robot parts as links and joints.
Start with <robot> tag.
Define <link> elements first.
Define <joint> elements connecting links.
Use parent and child tags inside joints.
Close with </robot> tag.
Full Transcript
Building a simple robot arm URDF involves creating a robot tag, then adding links and joints step-by-step. First, define the base link, then add joints that connect this base to other links. Each joint specifies its type and which links it connects. The process ends by closing the robot tag, resulting in a complete URDF file ready for use in ROS.

Practice

(1/5)
1. What is the main purpose of a URDF file in ROS when building a robot arm?
easy
A. To describe the robot's parts and how they connect
B. To write the robot's control software
C. To store sensor data from the robot
D. To compile the robot's firmware

Solution

  1. Step 1: Understand URDF role

    A URDF file defines the robot's physical structure, including parts and joints.
  2. Step 2: Differentiate from other files

    Control software, sensor data, and firmware are handled separately, not in URDF.
  3. Final Answer:

    To describe the robot's parts and how they connect -> Option A
  4. Quick Check:

    URDF = robot structure description [OK]
Hint: URDF = robot parts + connections description [OK]
Common Mistakes:
  • Confusing URDF with control code
  • Thinking URDF stores sensor data
  • Assuming URDF compiles firmware
2. Which of the following is the correct way to define a link in a URDF file?
easy
A.
B.
C.
D.

Solution

  1. Step 1: Identify correct URDF tag for a link

    The <link> tag with a name attribute defines a robot part.
  2. Step 2: Check syntax correctness

    <link name="arm_link"/> uses correct self-closing tag with name attribute. <link arm_link></link> misses quotes and uses open-close tags unnecessarily. Options A and B use wrong tags.
  3. Final Answer:

    <link name="arm_link"/> -> Option A
  4. Quick Check:

    Link tag syntax = <link name="arm_link"/> [OK]
Hint: Use to define parts [OK]
Common Mistakes:
  • Using <joint> instead of <link> for parts
  • Missing quotes around name
  • Using non-existent <part> tag
3. Given this URDF snippet, what is the parent link of the joint named elbow_joint?
<joint name="elbow_joint" type="revolute">
  <parent link="upper_arm"/>
  <child link="forearm"/>
</joint>
medium
A. wrist
B. elbow_joint
C. forearm
D. upper_arm

Solution

  1. Step 1: Locate parent link in joint tag

    The <parent> tag inside the joint defines the parent link connected by the joint.
  2. Step 2: Read the parent link attribute

    Here, parent link="upper_arm" means the joint connects from upper_arm to forearm.
  3. Final Answer:

    upper_arm -> Option D
  4. Quick Check:

    Parent link = upper_arm [OK]
Hint: Parent link is inside [OK]
Common Mistakes:
  • Confusing parent and child links
  • Choosing joint name as parent
  • Picking child link as parent
4. Identify the error in this URDF joint definition:
<joint name="wrist_joint" type="fixed">
  <parent link="forearm"/>
  <child link="hand">
</joint>
medium
A. Incorrect joint type 'fixed'
B. Parent link name is invalid
C. Missing closing tag for <child>
D. Joint name cannot have underscore

Solution

  1. Step 1: Check XML tag completeness

    The <child> tag is opened but not closed properly.
  2. Step 2: Verify joint type and names

    Joint type 'fixed' is valid, parent link name looks correct, underscores in names are allowed.
  3. Final Answer:

    Missing closing tag for <child> -> Option C
  4. Quick Check:

    Unclosed tag error = Missing closing tag for <child> [OK]
Hint: Check all XML tags are properly closed [OK]
Common Mistakes:
  • Ignoring unclosed tags
  • Thinking 'fixed' is invalid joint type
  • Assuming underscores are disallowed
5. You want to add a new joint connecting the 'forearm' link to a new 'wrist' link with a revolute joint rotating around the Z axis. Which of these URDF snippets correctly defines this joint?
hard
A.
B.
C.
D.

Solution

  1. Step 1: Confirm joint type and link order

    The joint should be revolute, connecting parent 'forearm' to child 'wrist'.
  2. Step 2: Check rotation axis

    The axis must be around Z axis: xyz="0 0 1".
  3. Step 3: Validate options

    <joint name="wrist_joint" type="revolute"> <parent link="forearm"/> <child link="wrist"/> <axis xyz="0 0 1"/> </joint> matches all requirements. <joint name="wrist_joint" type="fixed"> <parent link="wrist"/> <child link="forearm"/> <axis xyz="0 0 1"/> </joint> reverses parent and child and uses fixed type. <joint name="wrist_joint" type="revolute"> <parent link="wrist"/> <child link="forearm"/> <axis xyz="1 0 0"/> </joint> reverses links and uses wrong axis. <joint name="wrist_joint" type="continuous"> <parent link="forearm"/> <child link="wrist"/> <axis xyz="0 1 0"/> </joint> uses continuous type and wrong axis.
  4. Final Answer:

    <joint name="wrist_joint" type="revolute"> <parent link="forearm"/> <child link="wrist"/> <axis xyz="0 0 1"/> </joint> -> Option B
  5. Quick Check:

    Correct joint type + parent-child + axis = <joint name="wrist_joint" type="revolute"> <parent link="forearm"/> <child link="wrist"/> <axis xyz="0 0 1"/> </joint> [OK]
Hint: Parent link first, child second, axis xyz="0 0 1" for Z rotation [OK]
Common Mistakes:
  • Swapping parent and child links
  • Using wrong joint type
  • Setting axis to wrong vector