第3章 第一个URDF模型:创建最简单的连杆、理解link标签、使用Rviz可视化
说实话,每次带新人入门URDF,我都是从这一章开始的。因为只有亲手写出一个能动的模型,你才能真正理解机器人描述文件到底在干什么。这一章我们只做一件事:创建一个最简单的连杆,然后用Rviz把它显示出来。不涉及关节,不涉及运动学,就一个孤零零的零件——但别小看它,这是你整个机器人模型的基石。
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米的蓝色方块。
<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。你应该立刻看到一个蓝色的方块出现在网格中央。
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,结果颜色全白——嗯,我也犯过这个错。
<link> 标签的基本结构,并且用Rviz成功可视化。虽然只是一个不会动的方块,但这是你机器人建模之路的第一步。下一章我们会加入关节,让零件真正“活”起来。