此文用于记录URDF模型中最重要和最常用的两个标签,文章的内容大部分都来自官方

http://wiki.ros.org/urdf/XML/link

http://wiki.ros.org/urdf/XML/joint

对于各个标签的理解和使用,不定时更新。

各标签

子标签或属性
(带<>为标签,不带为属性)
子标签和属性 描述 是否理解
name(必填) 用于描述 link 的名称
<inertial>(可选) 物理惯性
<origin> (可选) 位置和姿态
<mass> 质量
<inertia> 3x3的旋转惯性矩阵
<visual>(可选) 连杆的外观,可存在多个
name(可选) 名称
<origin> (可选) 位置和姿态
<geometry>(必填) 形状
<material>(可选) 纹理外观
<collision>(可选) 碰撞,可存在多个
name(可选) 名称
<origin> (可选) 位置和姿态
<geometry>(必填) 形状

针对上面的第二列中的子标签描述,同名的意义相同,只描述一次

子标签或属性
(带<>为标签,不带为属性)
子标签和属性 描述
<origin>(可选) 位置和姿态
xyz(可选) x、y、z的偏移,以米为单位。
rpy(可选) x、y、z的旋转,以弧度为单位
<mass> value 质量
<inertia> ixx
ixy
ixz
iyy
iyz
izz
<geometry>(必填)
<box> 长方体
size属性对应长宽高
<cylinder> 圆柱体
radius对应半径
length对应高度
<sphere> 球体
radius对应半径
<mesh> 外部文件引入
filename设置外部文件
scale设置缩放比例
<material>(可选) 纹理外观
name 名称
<color> 颜色
rgba设置颜色值,取值[0, 1]
<texture> 外部文件引入
filename设置外部文件

例子

长方体

1
2
3
4
5
6
7
8
9
<robot name="my_box">
<link name="base_link">
<visual>
<geometry>
<box size="1 2 3" />
</geometry>
</visual>
</visual>
</robot>

创建了一个简单的长方体,长宽高分别为1、2、3。

圆柱

1
2
3
4
5
6
7
8
9
<robot name="my_cylinder">
<link name="base_link">
<visual>
<geometry>
<cylinder length="1" radius="0.5" />
</geometry>
</visual>
</visual>
</robot>

创建了一个简单的圆柱,长度为1,半径为0.5

球体

1
2
3
4
5
6
7
8
9
<robot name="my_cylinder">
<link name="base_link">
<visual>
<geometry>
<sphere radius="0.5" />
</geometry>
</visual>
</visual>
</robot>

创建一个简单的球体,半径为0.5

Mesh 加载自定义的文件

1
2
3
4
5
6
7
8
9
<robot name="my_mesh">
<link name="base_link">
<visual>
<geometry>
<mesh filename="package://demo_urdf/meshes/bowl.dae" />
</geometry>
</visual>
</link>
</robot>

从文件中读取形状,使用package开头,一般将对应的纹理文件dae放在文件夹meshes中。

位置和姿势

1
2
3
4
5
6
7
8
9
10
<robot name="my_box">
<link name="base_link">
<visual>
<origin xyz="0.1 0.2 0.3" rpy="1.57 1.57 1.57"></origin>
<geometry>
<box size="1 2 3" />
</geometry>
</visual>
</visual>
</robot>

使用originxyz控制位置,rpy控制姿态,旋转遵循右手螺旋法则

设置视觉纹理

  1. 内部设置的方式
1
2
3
4
5
6
7
8
9
10
11
12
<robot name="my_box">
<link name="base_link">
<visual>
<geometry>
<box size="1 2 3" />
</geometry>
<material name="red">
<color rgba="1.0 0 0 1.0" />
</material>
</visual>
</link>
</robot>
  1. 外部设置的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<robot name="my_box">
<material name="red">
<color rgba="1.0 0 0 1.0" />
</material>

<link name="base_link">
<visual>
<geometry>
<box size="1 2 3" />
</geometry>
<material name="red" />
</visual>
</link>
</robot>

建议使用第二种方式,因为一个颜色很有可能在多个地方需要使用。

joint

各标签

子标签或属性
(带<>为标签,不带为属性)
子标签和属性 描述 是否理解
name(必填) 用于描述joint的名称
type(必填) 用于描述joint的类型:
1. fixed:固定关节
2. revolute:限制旋转关节
3. continuous:无限旋转关节
4. prismatic:滑动关节
5. floating:悬浮关节
6. planar:2T1R
<origin>(可选) 位置和姿态
xyz(可选) x、y、z的偏移,以米为单位。
rpy(可选) x、y、z的旋转,以弧度为单位
<parent>(必填) 被连接的那个link
link link的名称
<child>(必填) 连接的link
link link的名称
<axis>(可选) 指定的关节轴
xyz(必填) x、y、z 偏移或旋转
<calibration>(可选) 校准位置
rising(可选) 上升沿
falling(可选) 下降沿
<dynamics>(可选) 动力
damping(可选) 物理阻尼
friction(可选) 物理静摩擦力
<limit>
(可选,revoluteprismatic必填)
限制约束
lower(可选) 下限
upper(可选) 上限
effort(必填) 最大承受力
velocity(必填) 最大速度
<mimic>(可选) 模拟现有一个关节
value = multi * joint + offset
joint(必填) 要模拟的关节
multiplier
(可选)
乘法因子
offset(可选) 偏移量
<safety_controller>(可选) 安全控制器
soft_lower_limit
(可选)
限制关节位置的下关节边界
soft_upper_limit
(可选)
限制关节位置的上关节边界
k_position
(可选)
k_velocity
(必填)

例子

在上面的表格中共有六种类型,实际使用中只有4中能使用,fixedrevolutecontinuousprismatic

以下都定义了两个link,从而展示例子,只写关节部分代码

以下为公共区域代码,...表示加入后面的关节代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<robot name="my_box">
<material name="red">
<color rgba="1.0 0 0 1.0"/>
</material>
<material name="green">
<color rgba="0 1.0 0 1.0"/>
</material>

<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.2 1"/>
</geometry>
<material name="red"/>
</visual>
</link>
<link name="link1">
<visual>
<geometry>
<box size="0.1 0.2 1"/>
</geometry>
<material name="green"/>
</visual>
</link>

...

</robot>
  1. 关节1的名字为base_link,颜色为红色
  2. 关节2的名字为link1,颜色为绿色

fixed关节

1
2
3
4
5
<joint name="joint0" type="fixed">
<origin xyz="0 0 1" rpy="0 0 0" />
<parent link="base_link"/>
<child link="link1"/>
</joint>

该关节仅仅起到连接作用

revolute 关节

1
2
3
4
5
6
7
<joint name="joint0" type="revolute">
<origin xyz="0 0 1" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="link1"/>

<limit effort="30" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>

旋转关节,必须要加上限制约束,因为该关节有限制条件。

continuous 关节

1
2
3
4
5
<joint name="joint0" type="continuous">
<origin xyz="0 0 1" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="link1"/>
</joint>

旋转关节,没有限制约束,无限旋转

prismatic 关节


-

平移关节,必须加限制约束。

总结

如果需要多自由度,可以加入多关节,必须说6自由度,可以加3个旋转和3个平移,分别对应x、y、z三个不同的方向即可。

launch 启动文件

1
2
3
4
5
6
7
8
9
10
11
12
<launch>
<arg name="model" default="geometry_box.urdf"/>
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find demo_urdf)/rviz/urdf.rviz" />

<param name="robot_description" command="$(find xacro)/xacro --inorder $(find demo_urdf)/urdf/$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>

<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
  1. arg:大致相当于设置变量
  2. find:查找package

评论