Create robot models using URDF with proper links, joints, visual geometry, collision shapes, and physical properties
Think like a robotics mechanical engineer who designs robot models for simulation. You understand the relationship between visual appearance, collision geometry, and physical dynamics. You create URDFs that load without errors, simulate realistically, and are maintainable through xacro modularity.
Before creating or modifying any URDF, ask yourself:
Q: What is the kinematic chain of this robot?
Q: What joint types are needed?
Q: Does every link have mass and inertia?
Q: Are collision shapes simpler than visual shapes?
Q: Is the origin at the correct location?
Q: Are all rotations in radians (not degrees)?
<link name="base_link">
<!-- Visual: What you see -->
<visual>
<geometry><box size="0.3 0.2 0.1"/></geometry>
<material name="blue"/>
</visual>
<!-- Collision: What physics uses -->
<collision>
<geometry><box size="0.3 0.2 0.1"/></geometry>
</collision>
<!-- Inertial: How it responds to forces -->
<inertial>
<mass value="5.0"/>
<inertia ixx="0.01" ixy="0" ixz="0" iyy="0.02" iyz="0" izz="0.03"/>
</inertial>
</link>
Missing any element causes problems:
<joint name="wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="wheel_link"/>
<!-- Origin: Where child attaches relative to parent -->
<origin xyz="0 0.15 0" rpy="1.5708 0 0"/>
<!-- Axis: Direction of rotation/translation -->
<axis xyz="0 0 1"/>
</joint>
Common mistakes:
Box (dimensions a, b, c; mass m):
ixx = m/12 * (b² + c²)
iyy = m/12 * (a² + c²)
izz = m/12 * (a² + b²)
Cylinder (radius r, length h; mass m):
ixx = iyy = m/12 * (3r² + h²)
izz = m/2 * r²
Sphere (radius r; mass m):
ixx = iyy = izz = 2/5 * m * r²
# Check URDF syntax
check_urdf robot.urdf
# Visualize in RViz
ros2 launch urdf_tutorial display.launch.py model:=robot.urdf
# Expected output for valid URDF:
# robot name is: my_robot
# ---------- Successfully Coverage [6] link(s) ----------
<?xml version="1.0"?>
<robot name="diff_drive">
<!-- Base -->
<link name="base_link">
<visual><geometry><box size="0.3 0.2 0.1"/></geometry></visual>
<collision><geometry><box size="0.3 0.2 0.1"/></geometry></collision>
<inertial>
<mass value="5.0"/>
<inertia ixx="0.02" ixy="0" ixz="0" iyy="0.03" iyz="0" izz="0.04"/>
</inertial>
</link>
<!-- Left Wheel -->
<link name="left_wheel">
<visual><geometry><cylinder radius="0.05" length="0.02"/></geometry></visual>
<collision><geometry><cylinder radius="0.05" length="0.02"/></geometry></collision>
<inertial>
<mass value="0.5"/>
<inertia ixx="0.0003" ixy="0" ixz="0" iyy="0.0003" iyz="0" izz="0.0006"/>
</inertial>
</link>
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<origin xyz="0 0.11 -0.03" rpy="-1.5708 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<!-- Right Wheel (similar, opposite y) -->
<!-- Caster (sphere, fixed joint) -->
</robot>
<link name="camera_link">
<visual><geometry><box size="0.02 0.04 0.02"/></geometry></visual>
<collision><geometry><box size="0.02 0.04 0.02"/></geometry></collision>
<inertial>
<mass value="0.1"/>
<inertia ixx="0.00001" ixy="0" ixz="0" iyy="0.00001" iyz="0" izz="0.00001"/>
</inertial>
</link>
<joint name="camera_joint" type="fixed">
<parent link="base_link"/>
<child link="camera_link"/>
<origin xyz="0.15 0 0.05" rpy="0 0 0"/>
</joint>
Before finalizing any URDF:
check_urdf passes without errorsThis skill is used by:
content-implementer agent when generating Module 2 lessonsDependencies:
gazebo-world-builder - for placing robots in worldssensor-simulation - for adding sensors to robotsros2-gazebo-bridge - for controlling robots from ROS 2Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer