Activity 5: Robot Modeling with URDF
- Team: Isaac Antonio Pérez Alemán & Carlos Galicia
This activity focuses on replicating five robots within a simple 3D environment in Linux, using the Unified Robot Description Format (URDF).
The main objective is to simulate robot motion by combining three basic geometric shapes:
- Cylinder
- Cube
- Sphere
URDF Model Features
- Each robot is defined in its own URDF file.
- The models include joints, links, and motion limits to achieve realistic simulation.
- A dedicated launch configuration is provided for execution.
- Visualization screenshots are generated to illustrate robot behavior in the simulated environment.
Learning Goals
Through this activity, you will: - Understand how URDF files are structured and organized. - Explore the relationship between simple geometry and robot motion. - Learn the importance of joints, links, and constraints in accurate robot simulation. - Gain experience in modular robot modeling for reproducible workflows.
To launch one of your robots, use the following command in your terminal:
isaac@Aleman:~/ros2_ws/src/my_robot_example$ ros2 launch urdf_tutorial display.launch.py model:=$HOME/ros2_ws/src/my_robot_example/urdf/my_robot.urdf
Code 1
<?xml version="1.0"?>
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.5 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<joint name="joint" type="fixed">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
<link name="shoulder_link">
<visual>
<geometry>
<cylinder length="0.06" radius="0.04"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 1.5708 0"/>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
</link>
<joint name="joint_1" type="revolute">
<parent link="shoulder_link"/>
<child link="shoulder_extension_link"/>
<origin xyz="0 0 0.2" rpy="0 0 1.5708"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<link name="shoulder_extension_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.05"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
</visual>
<visual>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
<origin xyz="0.1 0 0.2" rpy="0 1.5708 0"/>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<joint name="joint_2" type="prismatic">
<parent link="shoulder_extension_link"/>
<child link="elbow_link"/>
<origin xyz="0.15 0 0" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-0.15" upper="0.15" effort="10" velocity="1"/>
</joint>
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.06" radius="0.03"/>
</geometry>
<origin xyz="0.05 0 0.2" rpy="1.5708 0 0"/>
<material name="blue">
<color rgba="1 0 0 1"/>
</material>
</visual>
<visual>
<geometry>
<cylinder length="0.3" radius="0.05"/>
</geometry>
<origin xyz="0.05 0 0.2" rpy="0 0 0"/>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
</visual>
</link>
</robot>
Code 2
<?xml version="1.0"?>
<robot name="my_robot_v2">
<material name="purple">
<color rgba="0.5 0 0.5 1"/>
</material>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<material name="purple"/>
</visual>
</link>
<!-- LINK: shoulder -->
<link name="shoulder_link">
<visual>
<geometry>
<box size="0.1 0.1 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="1.57 0 0"/>
<material name="blue"/>
</visual>
</link>
<!-- LINK: elbow -->
<link name="elbow_link">
<visual>
<geometry>
<box size="0.1 0.1 0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="0 1.57 0"/>
<material name="pink"/>
</visual>
</link>
<!-- LINK: wrist -->
<link name="wrist_link">
<visual>
<geometry>
<box size="0.1 0.1 0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="green"/>
</visual>
</link>
<!-- JOINTS -->
<joint name="base_shoulder_joint" type="prismatic">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="0.0" upper="0.2" effort="100" velocity="100"/>
</joint>
<joint name="shoulder_elbow_joint" type="prismatic">
<parent link="shoulder_link"/>
<child link="elbow_link"/>
<origin xyz="0 0.2 0.1" rpy="0 0 0"/>
<axis xyz="1 0 0"/>
<limit lower="0.0" upper="0.2" effort="100" velocity="100"/>
</joint>
<joint name="elbow_wrist_joint" type="prismatic">
<parent link="elbow_link"/>
<child link="wrist_link"/>
<origin xyz="0.2 0.1 0" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-0.18" upper="0.18" effort="100" velocity="100"/>
</joint>
</robot>

Code 3
<?xml version="1.0"?>
<robot name="my_robot_v3">
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
<material name="gray">
<color rgba="0.6 0.6 0.6 1"/>
</material>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
<joint name="base_rotation_shoulder_joint" type="revolute">
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="rotation_shoulder_link"/>
<axis xyz="0 0 1"/>
<limit lower="-2.618" upper="2.618" effort="10" velocity="1"/>
</joint>
<!-- LINK: base -->
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.4 0.3"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="green"/>
</visual>
</link>
<!-- JOINT: rotation shoulder to shoulder -->
<joint name="rotation_shoulder_shoulder_joint" type="revolute">
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<parent link="rotation_shoulder_link"/>
<child link="shoulder_link"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<!-- LINK: rotation shoulder -->
<link name="rotation_shoulder_link">
<visual>
<geometry>
<cylinder length="0.01" radius="0.01"/>
</geometry>
<origin xyz="0 0 0.005" rpy="0 0 0"/>
<material name="green"/>
</visual>
</link>
<!-- JOINT: shoulder to elbow -->
<joint name="shoulder_elbow_joint" type="revolute">
<origin xyz="0 0 0.75" rpy="0 0 0"/>
<parent link="shoulder_link"/>
<child link="elbow_link"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<!-- LINK: shoulder -->
<link name="shoulder_link">
<visual>
<geometry>
<cylinder length="0.75" radius="0.15"/>
</geometry>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<material name="red"/>
</visual>
</link>
<!-- JOINT: elbow to wrist1 -->
<joint name="elbow_wrist1_joint" type="revolute">
<origin xyz="0.75 0 0" rpy="0 0 0"/>
<parent link="elbow_link"/>
<child link="wrist_link1"/>
<axis xyz="1 0 0"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
<!-- LINK: elbow -->
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.75" radius="0.1"/>
</geometry>
<origin xyz="0.375 0 0" rpy="0 1.5708 0"/>
<material name="blue"/>
</visual>
</link>
<!-- JOINT: wrist1 to wrist2 -->
<joint name="wrist1_wrist2_joint" type="revolute">
<origin xyz="0.3 0 0" rpy="0 0 0"/>
<parent link="wrist_link1"/>
<child link="wrist_link2"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<!-- LINK: wrist1 -->
<link name="wrist_link1">
<visual>
<geometry>
<cylinder length="0.3" radius="0.08"/>
</geometry>
<origin xyz="0.15 0 0" rpy="0 1.5708 0"/>
<material name="yellow"/>
</visual>
</link>
<!-- JOINT: wrist2 to wrist3 -->
<joint name="wrist2_wrist3_joint" type="revolute">
<origin xyz="0.2 0 0" rpy="0 0 0"/>
<parent link="wrist_link2"/>
<child link="wrist_link3"/>
<axis xyz="1 0 0"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
<!-- LINK: wrist2 -->
<link name="wrist_link2">
<visual>
<geometry>
<cylinder length="0.2" radius="0.07"/>
</geometry>
<origin xyz="0.1 0 0" rpy="0 1.5708 0"/>
<material name="gray"/>
</visual>
</link>
<!-- LINK: wrist3 -->
<link name="wrist_link3">
<visual>
<geometry>
<box size="0.2 0.2 0.2"/>
</geometry>
<origin xyz="0.1 0 0" rpy="0 0 0"/>
<material name="white"/>
</visual>
</link>
</robot>
Code 4
<?xml version="1.0"?>
<robot name="4">
<material name="blue">
<color rgba = "0 0 1 1" />
</material>
<material name="gray">
<color rgba = "0.5 0.5 0.5 1" />
</material>
<material name="red">
<color rgba = "1 0 0 1" />
</material>
<material name="green">
<color rgba = "0 1 0 1" />
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.4 0.2" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="red"/>
</visual>
</link>
<link name="shoulder_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.15"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<material name="green"/>
</visual>
<visual>
<geometry>
<cylinder length="1.0" radius="0.1"/>
</geometry>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
</visual>
</link>
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.2" radius="0.1"/>
</geometry>
<origin xyz="0 0 0.0" rpy="1.57 0 0"/>
<material name="blue"/>
</visual>
</link>
<link name="wrist_link">
<visual>
<geometry>
<box size="0.7 0.3 0.2" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="green"/>
</visual>
</link>
<link name="finger_link">
<visual>
<geometry>
<cylinder length="0.2" radius="0.1"/>
</geometry>
<origin xyz="0 -0.2 0" rpy="1.57 0 0"/>
<material name="blue"/>
</visual>
</link>
<link name="nail_link">
<visual>
<geometry>
<box size="0.7 0.07 0.2" />
</geometry>
<origin xyz="0.3 -0.2 0" rpy="0 0 0"/>
<material name="green"/>
</visual>
</link>
<link name="nail1_link">
<visual>
<geometry>
<cylinder length="0.2" radius="0.1"/>
</geometry>
<origin xyz="0 0.155 0" rpy="0 1.57 0"/>
<material name="blue"/>
</visual>
</link>
<link name="nail2_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.1"/>
</geometry>
<origin xyz="0 0.155 0" rpy="1.57 0 0"/>
<material name="red"/>
</visual>
</link>
<link name="nail3_link">
<visual>
<geometry>
<cylinder length="0.4" radius="0.1"/>
</geometry>
<origin xyz="0 0.155 -0.2" rpy="0 0 0"/>
<material name="gray"/>
</visual>
</link>
<link name="tip_link">
</link>
<joint name="base_shoulder_joint" type="revolute">
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<parent link="base_link"/>
<child link= "shoulder_link"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="100" velocity="100"/>
</joint>
<joint name="shoulder_elbow_joint" type="revolute">
<origin xyz="0 0 1.1" rpy="0 0 0"/>
<parent link="shoulder_link"/>
<child link= "elbow_link"/>
<axis xyz="0 1 0"/>
<limit lower="0.0" upper="0.4" effort="100" velocity="100"/>
</joint>
<joint name="elbow_wrist_joint" type="fixed">
<parent link="elbow_link"/>
<child link="wrist_link"/>
<origin xyz="0.45 0 0.0" rpy="0 0 0"/>
</joint>
<joint name="wirst_finger_joint" type="revolute">
<origin xyz="0.2 0 0" rpy="0 0 0"/>
<parent link="wrist_link"/>
<child link= "finger_link"/>
<axis xyz="0 1 0"/>
<limit lower="0.0" upper="0.4" effort="100" velocity="100"/>
</joint>
<joint name="finger_nailt_joint" type="fixed">
<parent link="finger_link"/>
<child link="nail_link"/>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
</joint>
<joint name="nail_nail1_joint" type="revolute">
<origin xyz="0.7 -0.35 0" rpy="0 0 0"/>
<parent link="nail_link"/>
<child link= "nail1_link"/>
<axis xyz="1 0 0"/>
<limit lower="0.0" upper="0.4" effort="100" velocity="100"/>
</joint>
<joint name="nail1_nail2_joint" type="revolute">
<origin xyz="0.15 0 0" rpy="0 0 0"/>
<parent link="nail1_link"/>
<child link= "nail2_link"/>
<axis xyz="0 1 0"/>
<limit lower="0.0" upper="0.4" effort="100" velocity="100"/>
</joint>
<joint name="nail2_nail3_joint" type="revolute">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="nail2_link"/>
<child link= "nail3_link"/>
<axis xyz="0 0 1"/>
<limit lower="0.0" upper="0.4" effort="100" velocity="100"/>
</joint>
<joint name="nail3_tip_joint" type="fixed">
<parent link="nail3_link"/>
<child link="tip_link"/>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
</joint>
</robot>

Code 5
<?xml version="1.0"?>
<robot name="my_robot">
<material name="gray">
<color rgba="0.6 0.6 0.6 1"/>
</material>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
<link name="base_link">
<visual>
<geometry>
<box size="1 1 0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
</link>
<link name="rotation_shoulder_link">
<visual>
<geometry>
<cylinder length="0.1" radius="0.3"/>
</geometry>
<origin xyz="0 0 0.005" rpy="0 0 0"/>
<material name="green">
</material>
</visual>
</link>
<link name="shoulder_link">
<visual>
<geometry>
<cylinder length="0.75" radius="0.2"/>
</geometry>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<material name="red"/>
</visual>
</link>
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.2" radius="0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="1.5708 0 0"/>
<material name="green"/>
</visual>
<visual>
<geometry>
<cylinder length="0.75" radius="0.1"/>
</geometry>
<origin xyz="0.375 0 0" rpy="0 1.5708 0"/>
<material name="red"/>
</visual>
</link>
<link name="wrist_link1">
<visual>
<geometry>
<cylinder length="0.3" radius="0.08"/>
</geometry>
<origin xyz="0.15 0 0" rpy="0 1.5708 0"/>
<material name="green"/>
</visual>
</link>
<link name="wrist_link2">
<visual>
<geometry>
<cylinder length="0.1" radius="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="1.5708 0 0"/>
<material name="red"/>
</visual>
<visual>
<geometry>
<cylinder length="0.2" radius="0.07"/>
</geometry>
<origin xyz="0.1 0 0" rpy="0 1.5708 0"/>
<material name="gray"/>
</visual>
</link>
<link name="wrist_link3">
<visual>
<geometry>
<sphere radius="0.08"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<joint name="base_rotation_shoulder_joint" type="revolute">
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="rotation_shoulder_link"/>
<axis xyz="0 0 1"/>
<limit lower="-2.618" upper="2.618" effort="10" velocity="1"/>
</joint>
<joint name="rotation_shoulder_shoulder_joint" type="revolute">
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<parent link="rotation_shoulder_link"/>
<child link="shoulder_link"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<joint name="shoulder_elbow_joint" type="revolute">
<origin xyz="0 0 0.75" rpy="0 0 0"/>
<parent link="shoulder_link"/>
<child link="elbow_link"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<joint name="elbow_wrist1_joint" type="revolute">
<origin xyz="0.75 0 0" rpy="0 0 0"/>
<parent link="elbow_link"/>
<child link="wrist_link1"/>
<axis xyz="1 0 0"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
<joint name="wrist1_wrist2_joint" type="revolute">
<origin xyz="0.3 0 0" rpy="0 0 0"/>
<parent link="wrist_link1"/>
<child link="wrist_link2"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<joint name="wrist2_wrist3_joint" type="revolute">
<origin xyz="0.2 0 0" rpy="0 0 0"/>
<parent link="wrist_link2"/>
<child link="wrist_link3"/>
<axis xyz="1 0 0"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
</robot>