6.4 URDF使用语法【万字解析赶紧码住】
6.4 URDF使用语法
URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单的,可以主要简化为两部分:连杆(link标签) 与 关节(joint标签),本节会介绍这些标签的使用语法,并通过相关案例强化大家对标签的认识,主要标签如下:
robot 标签,这是整个 urdf 文件的根标签;
link 标签,用于描述机器人刚体部分的标签;
joint 标签,是用于连接不同刚体的“关节”。
除了 URDF 的使用语法之外,本节还会介绍一些常用的 urdf 工具,通过工具可以验证 urdf 文件是否存在语法或逻辑异常。
6.4.1 URDF语法01_robot
1.简介
urdf 中为了保证 xml 语法的完整性,使用了robot标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称。
2.属性
name:主文件必须具有名称属性, name 属性在被包含的文件中是可选的。如果在被包含文件中指定了属性名称,则它必须具有与主文件中相同的值。
3.子标签
其他标签都是其子级标签。
4.示例

6.4.2 URDF语法02_link
1.简介
urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 机器人底座、轮子、激光雷达、摄像头...每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性。

2.属性
name(必填):为连杆命名。
3.子标签
<visual>(可选):用于描述link的可视化属性,可以设置link的形状(立方体、球体、圆柱等)。
name(可选):指定link名称,此名称会映射为同名坐标系,还可以通过引用该值定位定位link。
<geometry>(必填):用于设置link的形状,比如:立方体、球体或圆柱。
<box>:立方体标签,通过size属性设置立方体的边长,原点为其几何中心。
<cylinder>:圆柱标签,通过radius属性设置圆柱半径,通过length属性设置圆柱高度,原点为其几何中心。
<sphere>:球体标签,通过radius属性设置球体半径,原点为其几何中心。
<mesh>:通过属性filename引用“皮肤”文件,为link设置外观,该文件必须是本地文件。使用 package://<packagename>/<path>为文件名添加前缀。
<origin>(可选):用于设置link的相对偏移量以及旋转角度,如未指定则使用默认值(无偏移且无旋转)。
xyz:表示x、y、z三个维度上的偏移量(以米为单位),不同数值之间使用空格分隔,如未指定则使用默认值(三个维度无偏移)。
rpy:表示翻滚、俯仰与偏航的角度(以弧度为单位),不同数值之间使用空格分隔,如未指定则使用默认值(三个维度无旋转)。
<material>(可选):视觉元素的材质。也可以在根标签robot中定义material标签,然后,可以在link中按名称进行引用。
name(可选):为material指定名称,可以通过该值进行引用。
<color>(可选):rgba 材质的颜色,由代表red/green/blue/alpha 的四个数字组成,每个数字的范围为 [0,1]。
<texture>(可选):材质的纹理,可以由属性filename设置。
<collision>(可选):link的碰撞属性。可以与link的视觉属性一致,也可以不同,比如:我们会通常使用更简单的碰撞模型来减少计算时间,或者设置的值大于link的视觉属性,以尽量避免碰撞。另外,同一链接可以存在多个 <collision>标签实例,多个几何图形组合表示link的碰撞属性。
name(可选):为collision设置名称。
<geometry>(必须):请参考visual标签的geometry使用规则。
<origin>(可选):请参考visual标签的origin使用规则。
<inertial>(可选):用于设置link的质量、质心位置和中心惯性特性,如果未指定,则默认为质量为0、惯性为0。
<origin>(可选):该位姿(平移、旋转)描述了链接的质心框架 C 相对于链接框架 L 的位置和方向。
xyz:表示从 Lo(链接框架原点)到 Co(链接的质心)的位置向量为 x L̂x + y L̂y + z L̂z,其中 L̂x、L̂y、L̂z 是链接框架 L 的正交单位向量。
rpy:将 C 的单位向量 Ĉx、Ĉy、Ĉz 相对于链接框架 L 的方向表示为以弧度为单位的欧拉旋转序列 (r p y)。注意:Ĉx、Ĉy、Ĉz 不需要与连杆的惯性主轴对齐。
<mass>(必填):通过其value属性设置link的质量。
<inertia>(必填):对于固定在质心坐标系 C 中的单位向量 Ĉx、Ĉy、Ĉz,该连杆的惯性矩 ixx、iyy、izz 以及关于 Co(连杆的质心)的惯性 ixy、ixz、iyz 的乘积。
注意:<collision> 和 <inertial> 在仿真环境下才需要使用到,如果只是在 rviz2 中集成 urdf,那么不必须为 link 定义这两个标签。
4.示例
1.需求
分别生成长方体、圆柱与球体的机器人部件。
2.实现
功能包 cpp06_urdf 的 urdf/urdf 目录下,新建 urdf 文件 demo02_link.urdf,并编辑文件,输入如下内容:


6.4.3 URDF语法03_joint
1.简介
urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以”关节“的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制....,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。

2.属性
name(必填):为关节命名,名称需要唯一。
type(必填):设置关节类型,可用类型如下:
continuous:旋转关节,可以绕单轴无限旋转。
revolute:旋转关节,类似于 continues,但是有旋转角度限制。
prismatic:滑动关节,沿某一轴线移动的关节,有位置极限。
planer:平面关节,允许在平面正交方向上平移或旋转。
floating:浮动关节,允许进行平移、旋转运动。
fixed:固定关节,不允许运动的特殊关节。
3.子标签
<parent>(必填):指定父级link。
link(必填):父级link的名字,是这个link在机器人结构树中的名字。
<child>(必填):指定子级link。
link(必填):子级link的名字,是这个link在机器人结构树中的名字。
<origin>(可选):这是从父link到子link的转换,关节位于子link的原点。
xyz:各轴线上的偏移量。
rpy:各轴线上的偏移弧度。
<axis>(可选):如不设置,默认值为(1,0,0)。
xyz:用于设置围绕哪个关节轴运动。
<calibration>(可选):关节的参考位置,用于校准关节的绝对位置。
rising(可选):当关节向正方向移动时,该参考位置将触发上升沿。
falling(可选):当关节向正方向移动时,该参考位置将触发下降沿。
<dynamics>(可选):指定接头物理特性的元素。这些值用于指定关节的建模属性,对仿真较为有用。
damping(可选):关节的物理阻尼值,默认为0。
friction(可选):关节的物理静摩擦值,默认为0。
<limit>(关节类型是revolute或prismatic时为必须的):
lower(可选):指定关节下限的属性(旋转关节以弧度为单位,棱柱关节以米为单位)。如果关节是连续的,则省略。
upper(可选):指定关节上限的属性(旋转关节以弧度为单位,棱柱关节以米为单位)。如果关节是连续的,则省略。
effort(必填):指定关节可受力的最大值。
velocity(必填):用于设置最大关节速度(旋转关节以弧度每秒 [rad/s] 为单位,棱柱关节以米每秒 [m/s] 为单位)。
<mimic>(可选):此标签用于指定定义的关节模仿另一个现有关节。该关节的值可以计算为value = multiplier * other_joint_value + offset。
joint(必填):指定要模拟的关节的名称。
multiplier(可选):指定上述公式中的乘法因子。
offset(可选):指定要在上述公式中添加的偏移量,默认为 0(旋转关节的单位是弧度,棱柱关节的单位是米)。
<safety_controller>(可选):安全控制器。
soft_lower_limit(可选):指定安全控制器开始限制关节位置的下关节边界,此限制需要大于joint下限。
soft_upper_limit(可选):指定安全控制器开始限制关节位置的关节上边界的属性,此限制需要小于joint上限。
k_position(可选):指定位置和速度限制之间的关系。
k_velocity(必填):指定力和速度限制之间的关系。
4.示例
1.需求
创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。

2.实现
功能包 cpp06_urdf 的 urdf/urdf 目录下,新建 urdf 文件 demo03_joint.urdf,并编辑文件,输入如下内容:

执行指令后,会弹出一个新的窗口,在该窗口中有一个”进度条“,通过拖拽进度条可以控制相机旋转。
5.使用base_footprint优化urdf
1.需求
前面实现的机器人模型是半沉到地下的,因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生,可以使用的优化策略,将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体,或边长为 0.001m 的立方体),然后再在初始 link 上添加底盘等刚体,这样实现,虽然仍然存在初始link半沉的现象,但是基本可以忽略了,这个初始 link 一般称之为 base_footprint。

2.实现
功能包 cpp06_urdf 的 urdf/urdf 目录下,新建 urdf 文件 demo04_basefootprint.urdf,并编辑文件,输入如下内容:

编译后,工作空间终端下调用如下命令执行:
ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/urdf/demo04_basefootprint.urdf
执行指令后,在 rviz2 将Fixed Frame设置为base_footprint,机器人模型将正常显示在”地面“上。
6.4.4 URDF练习
1.需求
创建一个四轮机器人模型,机器人参数如下:底盘为长方体状,长20cm宽12cm高7cm,车轮半径为2.5cm,车轮厚度为2cm,底盘离地间距为 1.5cm。

2.实现
功能包 cpp06_urdf 的 urdf/urdf 目录下,新建 urdf 文件 demo05_exercise.urdf,并编辑文件,输入如下内容:

编译后,工作空间终端下调用如下命令执行:
ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/urdf/demo05_exercise.urdf
命令执行后,rviz2 中可以显示与需求类似的机器人模型。
6.4.5 URDF工具
在 ROS2 中,提供了一些URDF文件相关的工具,比如:
check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题;
urdf_to_graphviz命令可以查看 urdf 模型结构,显示不同 link 的层级关系。
当然,要使用工具之前,请先安装,安装命令:sudo apt install liburdfdom-tools。
1.check_urdf 语法检查
进入urdf文件所属目录,调用:check_urdf urdf文件,如果不抛出异常,说明文件合法,否则非法。
示例,终端下进入功能包 cpp06_urdf 的 urdf/urdf 目录,执行如下命令:
check_urdf demo05_exercise.urdf
urdf 文件如无异常,将显示urdf中link的层级关系,如下图所示:

否则将会给出错误提示。
2.urdf_to_graphviz 结构查看
进入urdf文件所属目录,调用:urdf_to_graphviz urdf文件,当前目录下会生成 pdf 文件。
示例,终端下进入功能包 cpp06_urdf 的 urdf/urdf 目录,执行如下命令:
urdf_to_graphviz demo05_exercise.urdf
当前目录下,将生成以urdf中robot名称命名的.pdf和.gv文件,打开pdf文件会显示如下图内容:

在上图中会以树形结构显示link与joint的关系。
注意:该工具以前名为urdf_to_graphiz现建议使用urdf_to_graphviz替代。

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践
更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站