用URDF建立可移动机器人模型 [待校准@8974]

Goal目标: Learn学习如何在URDF中定义活动关节 [待校准@8975]

教程级别: 初学者 [Alyssa@7088]

在本教程中,我们将修改我们在 previous tutorial 中制作的R2D2模型,使其具有可移动的接头。在之前的模型中,所有的关节都是固定的。现在我们将探索其他三种重要的关节类型: 连续关节、旋转关节和棱柱关节。 [待校准@8976]

在继续之前,请确保已安装所有先决条件。有关需要什么的信息,请参阅 previous tutorial[待校准@8977]

同样,本教程中提到的所有机器人模型都可以在 urdf_tutorial 包中找到。 [待校准@8978]

带有柔性接头的 Here is the new urdf 。您可以将它与以前的版本进行比较,看看所有已经改变的东西,但是我们将只关注三个示例关节。 [待校准@8979]

要可视化和控制此模型,请运行与上一教程相同的命令: [待校准@8980]

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

但是,现在这也将弹出一个GUI,允许您控制所有非固定关节的值。玩一些模型,看看它是如何移动的。然后,我们可以看看我们是如何做到这一点的。 [待校准@8981]

柔性模型截图 `[待校准@8982] <http://dev.ros2.fishros.com/calibpage/#/home?msgid=8982>`_

[待校准@8983]

<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>

身体和头部之间的连接是一个连续的关节,这意味着它可以从负无穷大到正无穷大的任何角度。车轮也是这样建模的,因此它们可以永远向两个方向滚动。 [待校准@8984]

我们必须添加的唯一附加信息是旋转轴,此处由xyz三元组指定,它指定了头部将围绕其旋转的矢量。因为我们希望它绕过z轴,所以我们指定矢量 "0 0 1" 。 [待校准@8985]

抓爪 [待校准@8986]

<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>

左右夹持器接头都被建模为旋转接头。这意味着它们以与连续关节相同的方式旋转,但是它们有严格的限制。因此,我们必须包括限制标签,指定关节的上限和下限 (以弧度为单位)。我们还必须为这个关节指定一个最大速度和努力,但是实际值对我们这里的目的并不重要。 [待校准@8987]

抓臂 [待校准@8988]

<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>

夹持器臂是一种不同的接头,即棱柱形接头。这意味着它沿着轴移动,而不是围绕它。这种平移运动使得我们的机器人模型能够延伸和缩回它的抓臂。 [待校准@8989]

棱柱形臂的极限以与旋转接头相同的方式规定,除了单位是米而不是弧度。 [待校准@8990]

其他类型的接头 [待校准@8991]

还有另外两种关节在太空中四处移动。而棱柱形关节只能沿着一个维度移动,而平面关节可以在一个平面或两个维度上移动。此外,浮动接头不受约束,并且可以在三个维度中的任何一个上移动。这些关节不能仅由一个数字指定,因此不包括在本教程中。 [待校准@8992]

指定姿势 [待校准@8993]

当你在图形用户界面中移动滑块时,模型在Rviz中移动。这是怎么做到的?首先, GUI 解析URDF并找到所有非固定关节及其极限。然后,它使用滑块的值发布 sensor_msgs/msg/JointState 乙消息。然后这些被 robot_state_publisher 用来计算不同部分之间的所有变换。然后,生成的变换树用于显示Rviz中的所有形状。 [待校准@8994]

下一步

既然你有了一个明显的功能模型,你就可以 add in some physical properties, or start using xacro to simplify your code 了。 [待校准@8995]