ROS 中的 joint 和 link
在实际使用 urdf 描述机器人时,老是忘记它们的关系,这里做一个记录,争取一次理清楚二者关系。
首先编写一个简单的 urdf 文件,并编写 launch 文件加载 urdf 模型在 rviz 中显示。
urdf 文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com)
Commit Version: 1.6.0-1-g15f4949 Build Version: 1.6.7594.29634
For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
<robot name="test_joint_link">
<link name="link1">
<visual>
<origin xyz="0 0 0.5" rpy="0 0 0" />
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
</link>
<joint name="link1_link2" type="continuous">
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<parent link="link1"/>
<child link="link2"/>
<axis xyz="0 0 1"/>
</joint>
<link name="link2">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="0.1" length="0.08" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
</link>
</robot>
urdf 中加载了两个 link,并通过 joint 将 link 连接起来。
<launch>
<arg
name="model" />
<param
name="robot_description"
textfile="$(find ranger_mini)/urdf/test_joint_link.urdf" />
<node
name="joint_state_publisher_gui"
pkg="joint_state_publisher_gui"
type="joint_state_publisher_gui" />
<node
name="robot_state_publisher"
pkg="robot_state_publisher"
type="robot_state_publisher" />
<node
name="rviz"
pkg="rviz"
type="rviz"
args="-d $(find ranger_mini)/test_joint_link.rviz"
/>
</launch>
为了方便理解,我们将每一个 link 视为一个部件,每一个 joint 视为一个坐标系。
launch 文件加载 urdf 模型并启动 rviz 显示加载模型。对于每个 urdf 文件来说,会有一个根 link,该 link 的参考 rviz 中 fixed_frame 坐标系,这里可以理解为大地坐标系。
我们注意到,在 link 和 joint 中均有 origin这个参数,这里也是容易产生混淆的地方。
其中每一个 joint 都参考 parent link 所在的 joint ,也就是 parent link 所在的坐标系进行偏移旋转等操作。link本身的偏移参考自身的 joint 坐标系。根 link 中 origin 参数参考fixed_frame进行调整,对于其他 link,查看它是哪一级 joint 的 child_link,相应的该 link 就在该级 joint 中进行调整。