ROS2(Galactic) URDF教程
从零开始构建机器人可视的模型
在本教程中,我们将构建一个机器人可视的模型,该模型看起来很像R2D2。
在后面的教程中,你将学习如何清晰地表达模型,添加一些物理属性,并使用xacro生成更整洁的代码,但目前,我们将重点关注视觉几何结构的正确性。
继续之前,请确保已安装joint_state_publisher包。
如果你安装了urdf_tutorial二进制文件,事实应该已经如此。
如果没有,请更新你的安装以包含该包(使用rosdep进行检查)。
本教程中提到的所有机器人模型(以及源文件)都可以在urdf_tutorial包中找到。
sudo apt install ros-galactic-urdf-tutorial
一个形状
首先,我们将探究一个简单的形状。
这里有一个你能做的最简单的urdf。
来源
<?xml version="1.0"?>
<robot name="myfirst">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</visual>
</link>
</robot>
要将XML翻译成英语,这是一个名为myfirst的机器人,
它只包含一个链接(也称为部件),其视觉组件只是一个0.6米长、0.2米半径的圆柱体。
对于一个简单的“hello world”
类型示例来说,这可能看起来像是很多封闭标签,但相信我,它会变得更复杂。
要检查模型,请启动display.launch.py文件:
ros2 launch urdf_tutorial display.launch.py model:=urdf/01-myfirst.urdf
这可以做三件事:
- 加载指定的模型并将其保存为参数
- 运行节点以发布sensor_msgs/msg/JointState和转换(稍后将详细介绍)
- 使用配置文件启动Rviz
请注意,上面的启动命令假定你是从urdf_tutorial包目录执行的(即:urdf目录是当前工作目录的直接子目录)。
如果事实并非如此,则01-myfirst.urdf的相对路径将无效,当启动程序尝试将urdf作为参数加载时,您将收到一个错误。
稍加修改的参数允许无论当前工作目录如何,都可以执行此操作:
ros2 launch urdf_tutorial display.launch.py model:=
ros2 pkg prefix --share urdf_tutorial/urdf/01-myfirst.urdf
如果不是从urdf_tutorial包位置运行这些教程中给出的所有示例启动命令,则必须更改这些命令。
启动display.launch.py后,最后您应该看到RViz向您显示以下内容:
需要注意的事项:
- 固定帧是栅格中心所在的变换帧。
这里,它是由我们的一个链接base_link定义的帧。 - 默认情况下,可视的元素(圆柱体)的原点位于其几何体的中心。
因此,圆柱体的一半位于栅格之下。
多个形状
现在让我们看看如何添加多个形状/链接。
如果我们只是向urdf中添加更多的链接元素,解析器将不知道将它们放在哪里。
所以,我们必须添加关节。
关节元件可以指柔性关节和非柔性关节。
我们将从非柔性或固定的关节开始。
来源
<?xml version="1.0"?>
<robot name="multipleshapes">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</visual>
</link>
<link name="right_leg">
<visual>
<geometry>
<box size="0.6 0.1 0.2"/>
</geometry>
</visual>
</link>
<joint name="base_to_right_leg" type="fixed">
<parent link="base_link"/>
<child link="right_leg"/>
</joint>
</robot>
- 请注意我们如何定义0.6m x 0.1m x 0.2m长方体
- 关节是根据父级和子级定义的。
URDF最终是一个具有一个根链接的树结构。
这意味着腿的位置取决于base_link的位置。
ros2 launch urdf_tutorial display.launch.py model:=urdf/02-multipleshapes.urdf
这两个形状彼此重叠,因为它们共享相同的原点。
如果我们希望它们不重叠,我们必须定义更多的原点。
原点
R2D2的腿在侧面连接到躯干的上半部。
所以这就是我们指定关节的原点的地方。
而且,它不会附着在腿的中部,而是附着在上部,所以我们也必须偏移腿的原点。
我们还旋转腿,使其直立。
来源
<?xml version="1.0"?>
<robot name="origins">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</visual>
</link>
<link name="right_leg">
<visual>
<geometry>
<box size="0.6 0.1 0.2"/>
</geometry>
<origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
</visual>
</link>
<joint name="base_to_right_leg" type="fixed">
<parent link="base_link"/>
<child link="right_leg"/>
<origin xyz="0 -0.22 0.25"/>
</joint>
</robot>
- 让我们从检查关节的原点开始。
它是根据父级参照系定义的。
所以我们在y方向上是-0.22米(在我们的左边,但相对于轴是向右的),在z方向上是0.25米(向上)。
这意味着无论子链接的可视的原点标记如何,子链接的原点都将向上向右。
由于我们没有指定rpy(横滚-俯仰-偏航)属性,因此子帧将默认为与父帧具有相同的方向。 - 现在,看看腿的视觉原点,它有xyz和rpy偏移。
这定义了视觉元素的中心相对于其原点的位置。
因为我们希望腿附着在顶部,所以我们将z偏移设置为-0.3米,从而向下偏移原点。
因为我们希望腿的长部分与z轴平行,所以我们绕Y轴旋转视觉部分PI/2
。
ros2 launch urdf_tutorial display.launch.py model:=urdf/03-origins.urdf
- 启动文件运行的包将基于URDF为模型中的每个链接创建TF帧。
Rviz使用这些信息来确定每个形状的显示位置。 - 如果给定URDF链路不存在TF帧,则它将以白色放置在原点。