赞
踩
在本教程中,我们将构建一个看起来像 ROS2 的机器人视觉模型。在后面的教程中,您将学习如何阐明模型、添加一些物理属性以及使用 xacro
生成更简洁的代码,但现在,我们将专注于获得正确的视觉几何。
在继续之前,请确保您已安装joint_state_publisher软件包。
joint_state_publisher
是一个ROS包,它可以将关节状态发布到一个ROS主题上,以便其他节点可以订阅它。这个包通常用于机器人模拟,将机器人模型的关节状态发布到
ROS 环境中,让其他节点可以订阅并使用
ros2 humble安装joint_state_publisher功能包
sudo apt install ros-humble-robot-state-publisher
下载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"/>
:这行定义了部件的原点相对于父链接的位置和方向。让我们再来观察一下现在机器人形状在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米(向上)。
新增效果如下:
回顾:在这里我们定义了一个机器人的机身,又定义了它的一条右腿,左腿比机身高一点。接下来 自己尝试着定义机器人的左腿,这样更能加深自己的理解和印象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。