URDF 文件是一个标准的 XML 文件格式,用于在 ROS 中描述机器人模型的结构。URDF 通过预定义的一系列标签,简洁地表达机器人的组成和运动关系。虽然机器人模型可能非常复杂,但在 URDF 中可以主要简化为两个核心部分:
连杆(link标签):描述机器人各个部件的形状、尺寸、质量、惯性等物理属性。连杆是机器人的“基本组成单元”,每个部件都由一个连杆表示。
关节(joint标签):定义各个连杆之间的连接关系和运动方式。关节描述了连杆的运动类型(如旋转、平移等)以及其在三维空间中的位置和方向。
通过合理使用link
和joint
标签,可以构建出符合物理和运动特性的机器人模型,并结合其他ROS工具进行仿真和可视化。这种简化使得复杂机器人模型在URDF中也能轻松描述并应用于多种仿真任务。
参考学习资料:urdf/XML - ROS Wiki
robot 根标签,类似于 launch文件中的launch标签;
link 连杆标签;
joint 关节标签;
gazebo 集成gazebo需要使用的标签。
1 URDF语法详解-robot
在 URDF 文件中,robot
标签是整个文件的根标签,用于确保XML语法的完整性。所有描述机器人的标签(如link
和joint
等)都必须嵌套在robot
标签内。该标签的作用是定义机器人模型的整体框架,并通过name
属性为机器人模型命名。
(1)属性
name:用于指定机器人模型的名称,方便在不同的仿真环境中进行标识和引用。
(2)子标签
所有其他的标签(如link
、joint
、material
、sensor
等)都是robot
标签的子标签,用来定义机器人的物理结构、运动方式、材质等属性。
2 URDF语法详解-link
在 URDF 文件中,link
标签用于描述机器人某个部件(即刚体部分)的外观和物理属性。每一个机器人部件都由一个link
标签表示,例如机器人底座、轮子、激光雷达、摄像头等。通过link
标签,可以详细定义该部件的形状、尺寸、颜色、质量属性,以及与仿真相关的惯性、碰撞和视觉参数。
(1)属性
name: 用于为该连杆命名,确保在机器人模型中唯一识别该部件。
(2)子标签
visual ---> 描述外观(对应的数据是可视的),定义连杆的视觉外观,包括形状、颜色和材质等,用于 Rviz 等工具中的可视化。
geometry 设置连杆的形状
标签1: box(盒状)
属性:size=长(x) 宽(y) 高(z)
标签2: cylinder(圆柱)
属性:radius=半径 length=高度
标签3: sphere(球体)
属性:radius=半径
标签4: mesh(为连杆添加皮肤)
属性: filename=资源路径(格式:package://<packagename>/<path>/文件)
origin 设置偏移量与倾斜弧度
属性1: xyz=x偏移 y偏移 z偏移
属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
material设置材料属性(颜色)
属性: name
标签: color
属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1])
collision ---> 连杆的碰撞属性了,定义碰撞模型,用于物理仿真,描述与其他物体碰撞时的行为。
Inertial ---> 连杆的惯性矩阵,定义连杆的质量和惯性矩阵属性,用于动力学仿真。
geometry ---> 用于定义连杆的几何形状,可以是简单的形状(如盒子、圆柱体、球体)或者通过网格文件指定复杂模型(如 .stl 文件)。
3 URDF语法详解-joint
在URDF文件中,joint
标签用于定义机器人关节的运动学和动力学属性。它描述了两个连杆(分别称为父连杆 parent link
和子连杆child link
)通过关节的连接方式。joint
标签还可以指定关节的运动范围、限制以及运动方式。关节的运动形式可以多样,如旋转、滑动、固定等,具体取决于机器人的设计需求。
(1)属性
name ---> 为关节命名
type ---> 关节运动形式
continuous: 旋转关节,可以绕单轴无限旋转
revolute: 旋转关节,类似于 continues,但是有旋转角度限制
prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
planer: 平面关节,允许在平面正交方向上平移或旋转
floating: 浮动关节,允许进行平移、旋转运动
fixed: 固定关节,不允许运动的特殊关节
(2)子标签
parent(必需的)
parent link的名字是一个强制的属性:
link:父级连杆的名字,是这个link在机器人结构树中的名字。
child(必需的)
child link的名字是一个强制的属性:
link:子级连杆的名字,是这个link在机器人结构树中的名字。
origin
属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
axis
属性: xyz用于设置围绕哪个关节轴运动。
需求:创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。
base_footprint 优化 URDF 是为了解决机器人模型在仿真中“半沉入地面”的问题。通常情况下,机器人模型的底盘中心点会默认位于地图原点,这就会导致部分机器人部件渗入地面,影响仿真效果。为了解决这一问题,可以采取以下优化策略:
优化策略:
- 设置初始 link 为尺寸极小的连杆: 将初始
link
定义为一个非常小的几何形状,如半径为 0.001m 的球体或边长为 0.001m 的立方体。 - 添加底盘等主要连杆: 在这个尺寸极小的初始
link
上,再添加实际的底盘或其他机器人部件。通过这种方式,即便初始link
仍然存在“半沉”的情况,但由于其尺寸极小,对整体仿真效果的影响可以忽略不计。
base_footprint 的作用:该初始 link
一般被称为 base_footprint,它用作机器人模型的参考起点或基座,确保机器人在仿真中保持合理的初始位置,并避免大范围的部件渗入地面的现象。
遇到问题以及解决:
问题1: 编码问题导致的URDF显示异常
错误提示:
UnicodeEncodeError: 'ascii' codec can't encode characters in position xxx-xxx……
Rviz问题:提示坐标变换异常,导致机器人部件显示结构异常。
原因: 这是由于 URDF 文件中的中文注释引发的编码问题。默认情况下,某些系统或程序无法处理非 ASCII 字符,因此会出现编码错误,导致仿真环境中的坐标变换出现问题,最终影响机器人的显示结构。
解决方法:
- 去除 URDF 文件中的中文注释,确保文件内容全部为 ASCII 字符。
- 确保文件保存为 UTF-8 编码格式,这有助于避免其他潜在的编码问题。
问题2:缺少 joint_state_publisher_gui 包
错误提示:
[ERROR] [1584370263.037038]: Could not find the GUI, install the 'joint_state_publisher_gui' package
原因: 缺少joint_state_publisher_gui
包,这是一个用于在 Rviz 中可视化和调试机器人关节状态的工具。
解决方法: 运行以下命令安装缺失的包
sudo apt install ros-noetic-joint-state-publisher-gui
安装完成后,再次运行仿真程序,即可解决此问题。
4 URDF练习-创建四轮圆柱状机器人模型的 URDF 文件
根据需求描述,机器人模型将包括一个圆柱状底盘、两个驱动轮和两个万向轮。底盘的离地间距为 1.5 cm。以下是满足需求的 URDF 文件的简化代码示例:
- 底盘(base_link): 使用半径为 10 cm,高度为 8 cm 的圆柱体。
- 驱动轮: 两个驱动轮位于机器人底盘的前端,半径为 3.25 cm,轮胎宽度为 1.5 cm。
- 万向轮: 两个球状万向轮位于机器人底盘的后方,半径为 0.75 cm。
- 底盘离地间距: 万向轮的直径为 1.5 cm,因此机器人底盘离地间距为 1.5 cm。
5 URDF工具
check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题
urdf_to_graphiz命令可以查看 urdf 模型结构,显示不同 link 的层级关系