在 ROS2 项目中,URDF (Unified Robot Description Format) 扮演着至关重要的角色。它是描述机器人结构的 XML 文件,包含了机器人各个连杆 (link)、关节 (joint) 以及它们之间的连接关系。本文将深入探讨 URDF 在 ROS2 中的应用,从基础概念到实际案例,助你掌握机器人建模的核心技能。尤其是在复杂的机器人系统,如移动底盘+机械臂的组合,URDF更是不可或缺的工具,相当于整个机器人的“骨架”。
什么是 URDF?
URDF 是一种 XML 格式,用于描述机器人的物理结构。它定义了机器人的连杆、关节、以及它们之间的连接关系。URDF 文件不仅仅描述了机器人的几何形状,还包含了质量、惯性、视觉属性和碰撞属性等信息。这些信息对于机器人的仿真、运动规划和控制至关重要。
URDF 的基本元素
<robot>: URDF 文件的根元素,包含了整个机器人的描述。<link>: 描述机器人的一个刚性部分,例如底盘、轮子或机械臂的连杆。每个<link>都有自己的几何形状、质量和惯性属性。<joint>: 描述连接两个<link>的关节,定义了它们之间的运动关系。关节可以是固定的 (fixed)、旋转的 (revolute)、连续的 (continuous)、棱柱的 (prismatic) 或球形的 (spherical)。<material>: 定义了<link>的视觉颜色和纹理。<geometry>: 描述<link>的几何形状,可以是立方体 (box)、球体 (sphere)、圆柱体 (cylinder) 或网格 (mesh)。<origin>: 定义了<link>或<joint>相对于其父坐标系的位置和方向。
创建你的第一个 URDF 文件
让我们从一个简单的例子开始,创建一个描述单连杆的 URDF 文件。
<?xml version="1.0" ?>
<robot name="single_link">
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 1.0"/> <!-- 长方体,尺寸为 0.1x0.1x1.0 米 -->
</geometry>
<material name="blue">
<color rgba="0 0 0.8 1"/> <!-- 蓝色,RGBA 值 -->
</material>
</visual>
<collision>
<geometry>
<box size="0.1 0.1 1.0"/> <!-- 碰撞检测也使用长方体 -->
</geometry>
</collision>
<inertial>
<mass value="1.0"/> <!-- 质量为 1 千克 -->
<inertia ixx="0.084" iyy="0.084" izz="0.0017" ixy="0.0" ixz="0.0" iyz="0.0"/> <!-- 惯性矩阵 -->
</inertial>
</link>
</robot>
这个 URDF 文件描述了一个名为 base_link 的连杆,它是一个蓝色的长方体,质量为 1 千克。 惯性矩阵的计算也很重要,影响仿真效果。可以使用 SolidWorks 等软件计算。
使用 check_urdf 命令验证 URDF 文件
ROS2 提供了 check_urdf 命令,用于验证 URDF 文件的语法是否正确。使用方法如下:
ros2 run urdfdom check_urdf single_link.urdf
如果 URDF 文件有效,该命令将输出 “OK”。 否则,它将显示错误信息,帮助你找到并修复问题。
将 URDF 文件加载到 ROS2 中
在 ROS2 中,可以使用 robot_state_publisher 节点将 URDF 文件加载到 ROS2 图中,并将机器人的状态发布到 /robot_state 主题。 这个过程类似于 Web 开发中,使用 Nginx 部署静态资源,robot_state_publisher 相当于 Nginx,URDF 相当于 HTML。 为了提高性能,可以使用 Xacro 文件来简化 URDF 文件的编写。
首先,创建一个 launch 文件 display.launch.py:
import launch
from launch.substitutions import Command, LaunchConfiguration
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
import os
def generate_launch_description():
pkg_share = FindPackageShare(package='my_robot').find('my_robot') # 替换为你的包名
default_model_path = os.path.join(pkg_share, 'urdf/single_link.urdf') # 替换为你的URDF文件路径
robot_state_publisher_node = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': Command(['xacro ', LaunchConfiguration('model')])}]
)
joint_state_publisher_node = Node(
package='joint_state_publisher',
executable='joint_state_publisher',
name='joint_state_publisher' # 为了使用GUI控制,添加这一行
)
return launch.LaunchDescription([
launch.actions.DeclareLaunchArgument(name='model', default_value=default_model_path, description='Absolute path to robot urdf file'),
joint_state_publisher_node,
robot_state_publisher_node
])
然后,运行 launch 文件:
ros2 launch my_robot display.launch.py
接下来,使用 rviz2 可视化机器人模型。在 rviz2 中,添加 RobotModel 显示,并确保 Fixed Frame 设置为 base_link。
实战避坑经验总结
- URDF 文件路径问题:在 launch 文件中,使用绝对路径或相对于包的路径来指定 URDF 文件。避免使用相对路径,否则可能会导致找不到文件的问题。
- 惯性矩阵计算错误:惯性矩阵的计算对于机器人的仿真至关重要。如果惯性矩阵计算错误,可能会导致机器人仿真出现不稳定的现象。建议使用专业的 CAD 软件来计算惯性矩阵,或者使用 ROS 提供的
inertia_tensor工具。 - 碰撞属性设置不合理:碰撞属性决定了机器人与其他物体之间的碰撞行为。如果碰撞属性设置不合理,可能会导致机器人无法正常运动或与其他物体发生不正常的碰撞。 比如,某个连杆的碰撞属性设置得过大,导致在仿真环境中无法通过狭窄的区域。
- Xacro 文件使用不当:Xacro 文件可以简化 URDF 文件的编写,但如果使用不当,可能会导致 URDF 文件解析错误。 例如,忘记定义某个 Xacro 宏,或者在 Xacro 文件中使用了错误的语法。
URDF 和 Xacro 的关系
Xacro(XML Macros)是 URDF 的一种扩展,它允许在 URDF 文件中使用宏定义和变量,从而简化 URDF 文件的编写。 使用 Xacro 可以避免在 URDF 文件中重复编写相同的代码,提高代码的可维护性。 Xacro 的作用类似于 C 语言中的宏定义,或者 Python 中的函数,它可以将一些常用的代码片段封装起来,方便重复使用。
例如,可以使用 Xacro 定义一个通用的轮子模型:
<xacro:macro name="wheel" params="prefix reflect">
<link name="${prefix}_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.1"/>
</geometry>
</visual>
<collision>
<geometry>
<cylinder length="0.05" radius="0.1"/>
</geometry>
</collision>
<inertial>
<mass value="0.1"/>
<inertia ixx="0.000520833" iyy="0.000520833" izz="0.000125" ixy="0.0" ixz="0.0" iyz="0.0"/>
</inertial>
</link>
<joint name="${prefix}_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="${prefix}_wheel"/>
<origin xyz="${reflect*0.2} 0 -0.2" rpy="${pi/2} 0 0"/>
<axis xyz="0 1 0"/>
</joint>
</xacro:macro>
然后,可以在 URDF 文件中使用这个宏来创建左右两个轮子:
<xacro:wheel prefix="left" reflect="1"/>
<xacro:wheel prefix="right" reflect="-1"/>
总结
URDF 是 ROS2 中机器人建模的重要工具。通过学习 URDF 的基本元素和语法,你可以创建描述各种机器人结构的 URDF 文件。 结合 Xacro,可以更加高效地完成复杂的机器人建模任务。 在实际应用中,需要注意 URDF 文件路径、惯性矩阵计算、碰撞属性设置和 Xacro 文件使用等问题。掌握了这些技巧,你就能在 ROS2 的世界里自由地搭建你的机器人!
冠军资讯
代码一只喵