2. 用URDF构建移动机器人模型

目标:学习如何在URDF中定义可移动的关节

教程级别:入门

在本教程中,将会修改在上一教程中制作的R2D2机器人模型,以使其具有可移动的关节。在之前的模型中,所有的关节都是固定的。现在将会探讨其它三种重要的关节类型:连续(continuous)关节、转动(revolute)关节和棱柱(prismatic)关节。

在继续本教程之前,请确保已安装好所有前提条件要求的软件包。 有关所需软件包的信息,请参阅上一教程

同样地,本教程中涉及的所有机器人模型都可以在urdf_tutorial软件包中找到。

具有柔性关节新urdf在这里。可以将其与前一版本进行比较,以查看发生了哪些变化,而在本教程中仅会关注三个示例关节

要对这个模型进行可视化和控制,请运行与上一个教程相同的命令:

ros2 launch urdf_tutorial display.launch.py model:=urdf/06-flexible.urdf

但是现在执行该命令后还会弹出一个允许您控制所有非固定关节值的GUI。玩一会儿该机器人模型并看看它是如何移动的。然后我们会查看是如何让该机器人模型移动的。

2.1 头部连续关节

<joint name="head_swivel" type="continuous">
  <parent link="base_link"/>
  <child link="head"/>
  <axis xyz="0 0 1"/>
  <origin xyz="0 0 0.3"/>
</joint>

机器人躯干和头部之间的连接是一个连续关节,这意味着头部可以转动到从负无穷到正无穷的任何角度。各个轮子也是这样建模的,这样轮子就可以永远在前后两个方向上滚动。

这里必须添加的唯一额外信息就是旋转轴,该旋转轴由xyz三元组指定,规定了头部将绕哪个轴旋转。由于我们想要头部绕z轴旋转,因此指定该向量值为“0 0 1”。

2.2 抓手(Gripper)旋转关节

<joint name="left_gripper_joint" type="revolute">
  <axis xyz="0 0 1"/>
  <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
  <origin rpy="0 0 0" xyz="0.2 0.01 0"/>
  <parent link="gripper_pole"/>
  <child link="left_gripper"/>
</joint>

左右两个抓手关节都被建模为旋转关节。这意味着它们会以与连续关节相同的方式旋转,但旋转关节有严格的限制。因此必须包含指定关节上限和下限(以弧度为单位)的限制标签。还必须为该关节指定最大速度和作用力,但其实际值对本教程目的而言无关紧要。

2.3 抓手手臂棱柱关节

<joint name="gripper_extension" type="prismatic">
  <parent link="base_link"/>
  <child link="gripper_pole"/>
  <limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/>
  <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
</joint>

抓手手臂(gripper arm)是一种不同类型的关节,其关节名称为“棱柱(prismatic)关节”。这意味着该关节会沿着一个轴移动,而不是绕该轴旋转。这种平移运动使得机器人模型能够伸出和缩回其抓手手臂。

棱柱手臂的限制是以与旋转关节相同的方式指定的,不同之处在于其单位是米(表示平移距离或长度),而不是弧度(表示旋转角度)。

2.4 其它关节类型

还有另外两种可以在空间中移动的关节。棱柱关节只能沿一个维度移动,而平面(planar)关节则可以在某个平面中或两个维度上移动。另外,浮动(floating)关节不受约束,可以在三个维度中的任何一个维度上移动。这些关节不能仅由一个数值来指定,因此未包含在本教程中。

2.5 指定位姿

当您在GUI中移动各个滑块时,该模型会在Rviz中移动。这是怎么做到的呢?首先,该GUI会解析URDF并找到所有非固定关节及其限制。然后它会使用滑块的值来发布sensor_msgs/msg/JointState消息。接着robots_state_publisher会使用这些消息来计算不同部件之间的所有坐标变换。然后使用生成的坐标变换树在Rviz中显示该模型的所有形状。

2.6 下一步

现在您有了一个功能明显(可移动)的机器人模型,您可以向该机器人模型添加一些物理属性,或者开始使用xacro来简化您的代码

英语原文地址:docs.ros.org/en/galacti