第3章 第一个URDF模型:创建最简单的连杆、理解link标签、使用Rviz可视化

说实话,每次带新人入门URDF,我都是从这一章开始的。因为只有亲手写出一个能动的模型,你才能真正理解机器人描述文件到底在干什么。这一章我们只做一件事:创建一个最简单的连杆,然后用Rviz把它显示出来。不涉及关节,不涉及运动学,就一个孤零零的零件——但别小看它,这是你整个机器人模型的基石。

第一个URDF模型 创建URDF文件 理解 link 标签 Rviz 可视化 文件名规范 XML 结构 visual / collision / inertial geometry / origin / material robot_state_publisher Fixed Frame 设置

3.1 创建一个最简单的URDF文件

我个人习惯把每个实验都放在独立的包里。先创建一个功能包,名字就叫 my_first_robot,依赖 urdf 和 rviz2(如果你用ROS2)。当然,ROS1也一样,只是包名略有不同。

cd ~/ros2_ws/src
ros2 pkg create my_first_robot --build-type ament_cmake
cd my_first_robot
mkdir urdf

然后在 urdf/ 目录下新建文件 simple_link.urdf。嗯,这里要注意:文件名最好全小写,不要有空格,否则后面解析容易出一些莫名其妙的错。我曾经因为文件名里带了个大写字母,排查了半天……

打开文件,写入下面这段代码。这是你能写出的最简URDF——只有一个连杆,没有关节。

<?xml version="1.0"?>
<robot name="simple_robot">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.2 0.1"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <material name="blue">
                <color rgba="0.2 0.5 0.8 1.0"/>
            </material>
        </visual>
    </link>
</robot>

你看,整个文件就一个 <robot> 根标签,里面包了一个 <link>。这个 base_link 就是我们的第一个零件——一个长0.4米、宽0.2米、高0.1米的蓝色方块。

核心要点: 一个URDF文件至少要有一个 <robot> 标签和一个 <link> 标签。没有关节的模型也能被Rviz加载,只是它不会动而已。

3.2 理解 link 标签的结构

说白了,<link> 就是描述机器人身上的一个刚体零件。它有三个主要子标签,但这一章我们只用到 <visual>。

  • <visual> —— 视觉外观。定义这个零件长什么样,用什么颜色,在什么位置。Rviz里看到的就是它。
  • <collision> —— 碰撞模型。物理引擎用这个算碰撞,可以比视觉模型更简单(比如用长方体代替复杂网格)。
  • <inertial> —— 惯性参数。质量、惯性矩阵,Gazebo仿真必须,纯可视化可以省略。

在 <visual> 内部,我们用了三个子标签:

子标签作用常用取值
<geometry>几何形状box, cylinder, sphere, mesh
<origin>相对连杆原点的偏移和旋转xyz="0 0 0" rpy="0 0 0"
<material>材质颜色name="blue" + color rgba

你想想看,<origin> 如果不写,默认就是零偏移。但如果你想让方块的中心不在连杆原点,就可以调整 xyz。比如 xyz="0.2 0 0" 会让方块沿X轴偏移0.2米。

我的经验: 刚开始学的时候,<origin> 和 <geometry> 的坐标关系容易搞混。记住:<origin> 是几何体相对于连杆坐标系的变换,不是世界坐标系。

3.3 用Rviz可视化你的第一个模型

文件写好了,怎么看到它?Rviz 是 ROS 生态里最常用的可视化工具。我们需要一个启动文件来加载URDF并发布到话题上。

在 my_first_robot 包下创建 launch 目录,新建 display.launch.py(ROS2)或 display.launch(ROS1)。这里我用ROS2的Python启动文件举例:

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    urdf_path = os.path.join(
        get_package_share_directory('my_first_robot'),
        'urdf',
        'simple_link.urdf'
    )
    return LaunchDescription([
        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            arguments=[urdf_path]
        ),
        Node(
            package='rviz2',
            executable='rviz2',
            name='rviz2'
        )
    ])

启动之后,Rviz 会弹出来。左侧面板找到 Fixed Frame,输入 base_link。然后点击左下角的 Add,选择 RobotModel。你应该立刻看到一个蓝色的方块出现在网格中央。

避坑指南: 我曾经忘记设置 Fixed Frame,结果Rviz里一片空白,还以为模型没加载成功。其实只要把 Fixed Frame 改成你的连杆名字(比如 base_link),模型就会显示出来。另外,确保 robot_state_publisher 节点正常运行,可以用 ros2 topic list 检查是否有 /robot_description 话题。

3.4 调整视角与颜色

在Rviz里,你可以用鼠标中键平移,右键旋转,滚轮缩放。试着从各个角度观察你的第一个连杆。如果觉得蓝色太深,可以修改URDF里的 <color> 值。比如改成 rgba="0.8 0.2 0.2 1.0" 就是红色。

我个人习惯把颜色调得鲜艳一点,这样在复杂模型中容易区分不同零件。但注意,rgba 的四个值范围是0到1,不是0到255。很多新手在这里写255,结果颜色全白——嗯,我也犯过这个错。

本章小结: 你刚刚亲手创建了第一个URDF模型,理解了 <link> 标签的基本结构,并且用Rviz成功可视化。虽然只是一个不会动的方块,但这是你机器人建模之路的第一步。下一章我们会加入关节,让零件真正“活”起来。