在本教程中,我们将构建一个看起来像 ROS2 的机器人视觉模型。在后面的教程中,您将学习如何阐明模型、添加一些物理属性以及使用 xacro
生成更简洁的代码,但现在,我们将专注于获得正确的视觉几何。
在继续之前,请确保您已安装joint_state_publisher软件包。
joint_state_publisher
是一个ROS包,它可以将关节状态发布到一个ROS主题上,以便其他节点可以订阅它。这个包通常用于机器人模拟,将机器人模型的关节状态发布到
ROS 环境中,让其他节点可以订阅并使用
安装joint_state_publisher
ros2 humble安装joint_state_publisher功能包
sudo apt install ros-humble-robot-state-publisher
安装urdf_tutorial
下载urdf_tutorial 示例工程源代码
cd ~/ros2_study
git clone -b ros2 https://github.com/ros/urdf_tutorial.git src/urdf_tutorial
在工作区的根目录中运行rosdep以检查是否缺少依赖项。
rosdep install -i --from-path src --rosdistro humble -y
仍然在工作区的根目录中构建您的包:
colcon build --packages-select urdf_tutorial
打开一个新终端,导航到工作区的根目录,然后获取安装文件:
. install/setup.bash
定义单个形状的
首先,我们将探索一个简单的形状。这就像您可以制作的 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,仅包含一个链接link (也称为零件),其视觉visual组件只是一个长 0.6 米、半径 0.2 米的圆柱体。
要检查模型,请启动文件display.launch.py:
ros2 launch urdf_tutorial display.launch.py model:=urdf/01-myfirst.urdf
display.launch.py 做了三件事:
-
加载指定的模型并将其保存为robot_state_publisher节点的参数。
-
运行节点来发布sensor_msgs/msg/JointState并进行转换
-
使用配置文件启动 Rviz
启动后display.launch.py,RViz 应该会向您显示以下内容:
上面演示了单个形状的urdf 定义后的效果,接下来继续添加形状
多个形状
现在让我们看看如何添加多个形状/链接。
如果我们只是向 urdf 添加更多链接元素,解析器将不知道将它们放在哪里。所以,我们必须添加关节。
关节元件可以指柔性关节和非柔性关节。我们将从不灵活或固定的关节开始
新增一个形状,也就是新增一个零件,定义零件的名字以及大小
<link name="right_leg">
<visual>
<geometry>
<box size="0.6 0.1 0.2"/>
</geometry>
</visual>
</link>
然后定义这个新增的零件放在什么位置
- 定义关节的名称
name="base_to_right_leg"
type="fixed"
类型为 固定关节parent link="base_link"
就是依赖零件
<joint name="base_to_right_leg" type="fixed">
<parent link="base_link"/>
<child link="right_leg"/>
</joint>
这样就定义了两个零件形状的机器人,新的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.6mx 0.1mx 0.2m 的盒子
关节是根据父项和子项定义的。 URDF 最终是一种具有一个根链接的树结构。这意味着腿的位置取决于 base_link 的位置。
<joint name="base_to_right_leg" type="fixed">
:定义了一个名为 “base_to_right_leg” 的关节,并指定了关节类型为 “fixed”。固定关节(fixed joint)意味着两个链接之间没有相对运动,即 “right_leg” 与 “base_link” 固定不动。<parent link="base_link"/>
:这行指定了父链接为 “base_link”。在URDF中,父链接是子链接附加的对象。<child link="right_leg"/>
:这行指定了子链接为 “right_leg”。在这种情况下,“right_leg” 将被固定到 “base_link” 上。
定义好之后我们重新走一遍上面的流程,编译-运行-看效果
-
注意我们如何定义 0.6mx 0.1mx 0.2m 的盒子
-
关节是根据父项和子项定义的。 URDF 最终是一种具有一个根链接的树结构。这意味着腿的位置取决于 base_link 的位置。
-
两个形状相互重叠,因为它们具有相同的起源。如果我们希望它们不重叠,我们必须定义更多的原点。
调整附加零件的坐标位置以及方向
新增的零件在侧面连接到他躯干的上半部分。这就是我们指定 JOINT 的起源的地方。另外,它不会附着在腿的中间,而是附着在上部,因此我们也必须偏移腿的原点。我们还旋转腿,使其直立。
修改这个零件的定义,新的定义如下:
修改前:
<link name="right_leg">
<visual>
<geometry>
<box size="0.6 0.1 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>
新增了这行: <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
<origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
:这行定义了部件的原点相对于父链接的位置和方向。
rpy=“0 1.57075 0”:这表示围绕x、y、z轴的旋转(Roll, Pitch, Yaw),单位是弧度。这里的设置意味着围绕y轴旋转约90度(π/2 或 1.57075 弧度)。
xyz=“0 0 -0.3”:这定义了部件的位移,沿着z轴向下移动0.3米。
让我们再来观察一下现在机器人形状在Rviz 里是一个怎么样的形态。
老套路,编译-运行
再定义关节位置属性
新增的关节urdf表示如下:
<joint name="base_to_right_leg" type="fixed">
<parent link="base_link"/>
<child link="right_leg"/>
<origin xyz="0 -0.22 0.25"/>
</joint>
:这行定义了关节的原点相对于父链接(“base_link”)的位置。
xyz=“0 -0.22 0.25”:这表示关节的位置位于父链接的原点之上,在y轴方向上偏移-0.22米(向左),在z轴方向上偏移0.25米(向上)。
新增效果如下:
回顾:在这里我们定义了一个机器人的机身,又定义了它的一条右腿,左腿比机身高一点。接下来 自己尝试着定义机器人的左腿,这样更能加深自己的理解和印象。