Skip to main content

Chapter 3: Humanoid Representation with URDF

Introduction​

URDF (Unified Robot Description Format) is an XML-based format that describes robot models, including their physical and kinematic properties. For humanoid robots, URDF provides a standardized way to represent the complex structure of human-like robots, enabling AI agents to reason about robot form, capabilities, and interactions with the environment.

3.1 URDF Fundamentals​

XML-Based Robot Description Format​

URDF uses XML to describe robot models in a hierarchical structure. The root element is always a <robot> tag that contains all other elements:

<?xml version="1.0"?>
<robot name="my_humanoid_robot">
<!-- Links and joints go here -->
</robot>

The XML structure defines:

  • Links: Rigid bodies with physical properties
  • Joints: Constraints between links
  • Materials: Visual properties for rendering
  • Transmissions: Motor control specifications
  • Gazebo plugins: Simulation-specific configurations

Kinematic Chain Representation​

URDF represents robots as kinematic chains - a series of rigid bodies (links) connected by joints. Each chain starts from a base link and extends to end effectors:

  • Base Link: The root of the kinematic tree
  • Parent-Child Relationships: Each link has one parent and multiple children
  • Tree Structure: Forms a tree (not a graph) to avoid kinematic loops
  • Transforms: Each joint defines a transformation between parent and child links

Physical Properties and Inertial Parameters​

URDF includes physical properties that are essential for simulation and control:

  • Mass: Mass of each link in kilograms
  • Inertia Tensor: 3x3 matrix describing how mass is distributed
  • Center of Mass: Point where the link's mass is concentrated
  • Collision Geometry: Shapes for collision detection
  • Visual Geometry: Shapes for visualization
<link name="upper_arm">
<inertial>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<mass value="2.0"/>
<inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.001"/>
</inertial>
<visual>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<geometry>
<cylinder length="0.2" radius="0.05"/>
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<geometry>
<cylinder length="0.2" radius="0.05"/>
</geometry>
</collision>
</link>

Joint Types and Degrees of Freedom​

Joints define the allowed motion between links and specify degrees of freedom:

  • Revolute Joints: Single axis rotation with limits (like human joints)
  • Continuous Joints: Single axis rotation without limits
  • Prismatic Joints: Single axis translation with limits
  • Fixed Joints: No motion between links (welded together)
  • Floating Joints: Six degrees of freedom (rarely used)
  • Planar Joints: Motion on a plane (rarely used)

Links represent the rigid parts of a robot. Each link contains:

Visual and Collision Geometry​

<link name="head">
<visual>
<!-- How the link appears in visualizations -->
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.1"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<!-- Used for collision detection -->
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.1"/>
</geometry>
</collision>
</link>

Mass, Center of Mass, and Inertia​

Physical properties are crucial for dynamics simulation and control:

  • Mass: Affects gravitational forces and acceleration
  • Center of Mass: Point where gravitational force acts
  • Inertia: Resistance to rotational acceleration around different axes

Coordinate Frame Definitions​

Each link defines its own coordinate frame (origin) which serves as:

  • Reference for joint connections
  • Attachment point for sensors and actuators
  • Coordinate system for child links

Joints define how links can move relative to each other:

Joint Types: Revolute, Prismatic, Continuous, Fixed​

Revolute Joint (hinge):

<joint name="elbow_joint" type="revolute">
<parent link="upper_arm"/>
<child link="forearm"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="-2.0" upper="2.0" effort="100" velocity="1"/>
</joint>

Prismatic Joint (slider):

<joint name="linear_joint" type="prismatic">
<parent link="base"/>
<child link="slider"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="0" upper="0.5" effort="100" velocity="1"/>
</joint>

Fixed Joint (weld):

<joint name="fixed_joint" type="fixed">
<parent link="base"/>
<child link="sensor_mount"/>
<origin xyz="0.1 0 0.1" rpy="0 0 0"/>
</joint>

Joint Limits and Dynamics​

Joint limits specify the range of motion:

  • Lower/Upper: Position limits (for revolute and prismatic joints)
  • Effort: Maximum force/torque the joint can apply
  • Velocity: Maximum joint velocity

Dynamics parameters:

  • Damping: Energy dissipation in the joint
  • Friction: Static friction in the joint

Transmission Specifications​

Transmissions define how actuators connect to joints:

<transmission name="elbow_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="elbow_joint">
<hardwareInterface>PositionJointInterface</hardwareInterface>
</joint>
<actuator name="elbow_motor">
<hardwareInterface>PositionJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>

Sensors: Perception Capabilities​

URDF can describe sensors attached to robot links:

Camera, IMU, Force/Torque Sensors​

Camera Sensor:

<gazebo reference="head">
<sensor name="camera" type="camera">
<camera>
<horizontal_fov>1.047</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.1</near>
<far>100</far>
</clip>
</camera>
<always_on>1</always_on>
<update_rate>30</update_rate>
<visualize>true</visualize>
</sensor>
</gazebo>

IMU Sensor:

<gazebo reference="torso">
<sensor name="imu" type="imu">
<always_on>true</always_on>
<update_rate>100</update_rate>
<imu>
<angular_velocity>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
</noise>
</x>
</angular_velocity>
</imu>
</sensor>
</gazebo>

Sensor Placement and Calibration​

Sensors are placed using transforms relative to their parent link:

  • Position: Where the sensor is located on the robot
  • Orientation: How the sensor is oriented
  • Calibration: Offset from ideal placement

Integration with Robot State​

Sensors provide information to the robot state system:

  • Robot State Publisher: Publishes transforms for all links
  • TF Tree: Defines relationships between all coordinate frames
  • Sensor Fusion: Combines multiple sensor readings

3.3 Kinematic Chains for Humanoid Robots​

Humanoid Anatomy Modeling​

Humanoid robots are designed to mimic human body structure, requiring specific kinematic chains:

  • Torso: Trunk of the robot with head attachment
  • Arms: Shoulder, elbow, and wrist joints for manipulation
  • Legs: Hip, knee, and ankle joints for locomotion
  • Neck: Head orientation for perception

Leg, Arm, and Torso Kinematic Chains​

Leg Chain (from hip to foot):

torso -> hip_joint -> thigh -> knee_joint -> shank -> ankle_joint -> foot

Arm Chain (from shoulder to hand):

torso -> shoulder_joint -> upper_arm -> elbow_joint -> forearm -> wrist_joint -> hand

Spine Chain (torso segmentation):

base -> spine_joint1 -> spine1 -> spine_joint2 -> spine2 -> ...

Redundancy and Inverse Kinematics​

Humanoid robots often have redundant degrees of freedom:

  • Multiple Solutions: Same end-effector position can be achieved in multiple ways
  • Task Prioritization: Handle multiple simultaneous tasks (e.g., reach + balance)
  • Obstacle Avoidance: Navigate around obstacles while achieving goals

Inverse kinematics (IK) solvers:

  • Analytical IK: Closed-form solutions for simple chains
  • Numerical IK: Iterative methods for complex chains
  • Optimization-based IK: Multi-objective optimization

Center of Mass Considerations​

For humanoid robots, center of mass management is critical:

  • Balance Control: Keep CoM within support polygon
  • Dynamic Walking: Shift CoM to achieve locomotion
  • Stability: Minimize CoM acceleration during movements

3.4 URDF for Simulation and Control​

Robot State Publisher Integration​

The robot state publisher is essential for URDF-based systems:

<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher">
<param name="publish_frequency" value="50.0"/>
<param name="use_tf_static" value="false"/>
<param name="ignore_timestamp" value="false"/>
</node>

The robot state publisher:

  • Subscribes to joint state messages
  • Computes forward kinematics
  • Publishes TF transforms for all links
  • Enables visualization and perception systems

Forward Kinematics Computation​

Forward kinematics computes link positions from joint angles:

  • Geometric Transformations: Chain of rotation and translation matrices
  • DH Parameters: Denavit-Hartenberg convention for link descriptions
  • Spatial Algebra: Modern approach using screw theory

Collision Detection Setup​

URDF collision geometry enables:

  • Self-Collision Detection: Prevent robot from colliding with itself
  • Environment Collision: Detect collisions with world objects
  • Safety Systems: Stop robot when collisions are imminent

Visualization in RViz and Gazebo​

URDF files work with visualization tools:

RViz:

  • Displays robot model with real joint positions
  • Shows sensor data overlaid on robot
  • Visualizes planning and control information

Gazebo:

  • Provides physics simulation
  • Simulates sensor data generation
  • Tests control algorithms in virtual environment

3.5 Best Practices and Extensions​

Xacro Macro Language for Complex URDFs​

Xacro (XML Macros) extends URDF with programming capabilities:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="humanoid_with_xacro">

<!-- Define a macro for a simple arm -->
<xacro:macro name="simple_arm" params="prefix parent_link">
<link name="${prefix}_upper_arm">
<visual>
<geometry>
<cylinder length="0.3" radius="0.05"/>
</geometry>
</visual>
<collision>
<geometry>
<cylinder length="0.3" radius="0.05"/>
</geometry>
</collision>
<inertial>
<mass value="1.0"/>
<inertia ixx="0.01" iyy="0.01" izz="0.001" ixy="0" ixz="0" iyz="0"/>
</inertial>
</link>

<joint name="${prefix}_shoulder_joint" type="revolute">
<parent link="${parent_link}"/>
<child link="${prefix}_upper_arm"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="100" velocity="1"/>
<origin xyz="0 0.1 0" rpy="0 0 0"/>
</joint>
</xacro:macro>

<!-- Use the macro to create left and right arms -->
<xacro:simple_arm prefix="left" parent_link="torso"/>
<xacro:simple_arm prefix="right" parent_link="torso"/>

</robot>

Xacro features:

  • Macros: Reusable components
  • Properties: Parameter definitions
  • Mathematical Expressions: Calculations in URDF
  • Conditionals: Include/exclude based on conditions

Modular Design and Reusability​

Best practices for URDF design:

  • Component-Based: Build robots from reusable components
  • Parameterized: Use properties for easy customization
  • Hierarchical: Organize files logically
  • Version Control: Track changes to robot models

Validation and Debugging Techniques​

URDF validation methods:

  • XML Validation: Check syntax and structure
  • Kinematic Validation: Verify joint limits and ranges
  • Collision Checking: Ensure no overlapping geometries
  • Forward Kinematics: Verify transforms are correct

Integration with MoveIt and Other Tools​

URDF integrates with planning and control tools:

MoveIt:

  • Motion planning for manipulation and navigation
  • Collision-aware trajectory generation
  • Inverse kinematics solvers
  • Safety-aware execution

Other Tools:

  • URDF Viewer: Visualize robot models
  • Forward/Inverse Kinematics: Compute kinematic solutions
  • Dynamics Simulation: Physics-based simulation

Summary​

URDF provides a standardized way to represent humanoid robots, enabling AI agents to understand robot structure and capabilities. By defining links, joints, and sensors in URDF, AI systems can reason about robot kinematics, plan movements, and interact with the physical robot. The combination of URDF with tools like MoveIt enables sophisticated AI-robot integration for complex humanoid applications.

The concepts covered in this module - ROS 2 fundamentals, AI agent integration with rclpy, and humanoid representation with URDF - provide the foundation for connecting AI agents to humanoid robots. These concepts prepare you for simulation environments and advanced control systems that will be covered in future modules.

Next Steps​

You've completed Module 1: The Robotic Nervous System (ROS 2). To review the fundamentals, you can return to the Module Introduction. For the complete learning path, continue with upcoming modules that will cover simulation, control systems, and advanced AI integration patterns.