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
这可以做三件事:

  1. 加载指定的模型并将其保存为参数
  2. 运行节点以发布sensor_msgs/msg/JointState和转换(稍后将详细介绍)
  3. 使用配置文件启动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帧,则它将以白色放置在原点。
posted @ 2022-11-05 20:49  杨孝乾  阅读(586)  评论(0编辑  收藏  举报