在本教程中,我们将学习如何在机器人操作系统 (ROS) 中创建四轮移动机器人的 URDF 文件和模型。我们解释了如何使用 ROS Noetic 分布对机器人进行建模。
- 在统一机器人描述格式 (URDF) 文件中定义机器人几何图形以及链接和关节。
- 创建一个lanch文件,用于可视化机器人几何形状。
- 在 RViz ROS 仿真环境中可视化机器人的几何形状。
四轮机器人机器人几何形状
最终的机器人模型在下面使用 Rviz 进行可视化。
它由一个机器人底座和 4 个轮子组成。底座和轮子在 ROS 术语中称为链接。 在机器人底座和轮子之间,我们有 4 个关节,可以让轮子旋转。 也就是说,在 ROS URDF 文件中,机器人几何体由链接和关节组成。下图显示了机器人几何形状的顶视图。
此俯视图定义了几乎所有几何参数,但轮子中心的 z 轴位置和机器人身体的 z轴高度除外。轮子的中心位于 z=-0.1m。z 轴机器人高度为 0.3 m。也就是说,身体的中心在(0,0,0)m,底面在z=-0.15m,顶面在z=0.15m。
第 1 步:安装必要的软件包
我们假设已安装 ROS Noetic 发行版。首先,我们需要安装 RViz。RViz 是一款 ROS 可视化软件。我们通过打开 Linux 终端并输入
sudo apt-get install ros-noetic-rviz
然后,要测试安装,请打开一个新终端并启动Roscore。Roscore是我们在运行ROS程序或包时始终需要运行的程序。我们通过输入来做到这一点
roscore
接下来,在原始终端中,我们通过输入打开 RViz 软件
rosrun rviz rviz
接下来,我们安装 URDF 建模包
sudo apt-get install ros-noetic-urdf
第 2 步:创建 WORKSPACE 和 CATKIN 包
打开一个新终端,以便从头开始该过程。首先,我们创建一个工作区文件夹,运行“catkin_make”,并获取工作区
mkdir -p ~/robot_dd/src
cd ~/robot_dd
catkin_make
source ~/robot_dd/devel/setup.bash
接下来,我们更改工作文件夹,并创建包
cd ~/robot_dd/src
catkin_create_pkg robot_dd_model_pkg roscpp tf2 geometry_msgs urdf rviz joint_state_publisher_gui
为了创建包,我们使用 ROS 命令“catkin_create_pkg”。我们将创建的包的名称是“robot_dd_model_pkg”。如果需要,可以修改此名称。最后 6 个参数是 ROS 包依赖项。他们是
- roscpp – 对 ROS 包的 C++ 支持
- tf2 – 允许用户跟踪一段时间内的多个坐标帧。
- geometry_msgs – 常见几何基元(如点、向量和姿势)的 ROS 消息。
- urdf – URDF 包的 C++ 解析器
- rviz – RVIZ 软件包
- joint_state_publisher_gui – 包含一个 GUI 工具,用于设置和发布给定 URDF 的联合状态值。
步骤 3:创建 URDF 文件并启动文件
首先,我们创建机器人的 URDF 文件。缩写 URDF 表示 统一机器人描述格式。这是一种文件格式,其中包含我们机器人的描述。要创建此文件,我们首先创建一个文件夹,然后移动到创建的文件夹。
cd ~/robot_dd/src/robot_dd_model_pkg/
mkdir urdf
cd urdf
然后,在文件夹“~/robot_dd/src/robot_dd_model_pkg/”中,我们使用“gedit”创建 urdf 文件
gedit robot.urdf
robot.urdf文件内容如下。
<?xml version="1.0"?>
<!-- http://wiki.ros.org/urdf/XML/link -->
<robot name="differential_drive_robot">
<!-- 这是机器人的身体 -->
<link name="body_link">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="1 0.6 0.3" />
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<!-- 这是机器人的后右轮 -->
<joint name="wheel1_joint" type="continuous" >
<parent link="body_link"/>
<child link="wheel1_link" />
<origin xyz="-0.3 -0.35 -0.1" rpy="0 0 0" />
<axis xyz="0 1 0"/>
</joint>
<link name="wheel1_link">
<visual>
<origin rpy="1.570795 0 0" xyz="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.15"/>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<!-- 这是机器人的左后轮 -->
<joint name="wheel2_joint" type="continuous" >
<parent link="body_link"/>
<child link="wheel2_link" />
<origin xyz="-0.3 0.35 -0.1" rpy="0 0 0" />
<axis xyz="0 1 0"/>
</joint>
<link name="wheel2_link">
<visual>
<origin rpy="1.570795 0 0" xyz="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.15"/>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<!-- 这是机器人的右前轮 -->
<joint name="wheel3_joint" type="continuous" >
<parent link="body_link"/>
<child link="wheel3_link" />
<origin xyz="0.3 -0.35 -0.1" rpy="0 0 0" />
<axis xyz="0 1 0"/>
</joint>
<link name="wheel3_link">
<visual>
<origin rpy="1.570795 0 0" xyz="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.15"/>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<!-- 这是机器人的前左轮 -->
<joint name="wheel4_joint" type="continuous" >
<parent link="body_link"/>
<child link="wheel4_link" />
<origin xyz="0.3 0.35 -0.1" rpy="0 0 0" />
<axis xyz="0 1 0"/>
</joint>
<link name="wheel4_link">
<visual>
<origin rpy="1.570795 0 0" xyz="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.15"/>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
</robot>
urdf文件内容解释:
机器人在环境中的描述
<robot name="differential_drive_robot">
...
</robot>
在这里,我们指定机器人的描述。对于注释,我们使用以下符号
<!-- 注释内容 -->
然后,机器人的身体、轮子和链接被称为“链接”,使用ROS和URDF术语。机器人的身体被描述为如下。
<!-- 这是机器人的身体 -->
<link name="body_link">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="1 0.6 0.3" />
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
“link”URDF 环境用于定义机器人本体。链接的名称是“body_link”,这是我们稍后在代码中用来指代机器人身体的引用。“视觉”环境用于定义链接的视觉表示。然后,使用“原点”环境来指定连接到链接质量中心相对于固定的第一个参考系的位置和方向。为了清楚起见,我们在这里重复本网页顶部的图 2:
在原始环境中,“rpy”代表横滚、俯仰和偏航。这些是指定坐标系方向的欧拉角。符号“xyz”表示坐标系沿 x、y 和 z 轴相对于固定框架的平移。在几何环境中,我们指定了机器人的几何形状。它是一个盒子,尺寸如上图所示。最后,我们指定链接的颜色。
下面显示的代码将对机器人的右后轮进行建模
<!-- 这是机器人的右后轮 -->
<joint name="wheel1_joint" type="continuous" >
<parent link="body_link"/>
<child link="wheel1_link" />
<origin xyz="-0.3 -0.35 -0.1" rpy="0 0 0" />
<axis xyz="0 1 0"/>
</joint>
<link name="wheel1_link">
<visual>
<origin rpy="1.570795 0 0" xyz="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.15"/>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
由于轮子是相对于机器人底座旋转的,因此在轮子和机器人底座之间,我们需要添加一个关节。联合环境以联合“wheel1_joint”的名称开始。类型是连续的。这意味着轮子可以相对于机器人底座连续旋转。每个关节都应该有其父链接和子链接。在我们的例子中,父链接是“body_link”,子链接是“wheel1_link”。环节“wheel1_link”其实就是我们的轮子,它是在关节环境之后定义的。然后,我们定义关节的起源。关节的原点是关节的坐标系相对于固定坐标系的位置。“rpy”代表方向,“xyz”代表翻译。这些参数取自上面的图 3。然后,参数“axis”定义旋转轴。在我们的例子中,旋转是相对于关节的 y 轴执行的。接下来,我们定义车轮连杆。附着在车轮质量中心的坐标系的原点围绕滚动轴(即 x 轴)旋转“1.570795”弧度。也就是说,我们围绕 x 轴旋转定义轮子的圆柱体,以将圆柱体放置在正确的位置。轮子是一个圆柱体,半径为 0.15,长度为 0.1。最后,我们指定轮子颜色。以同样的方式,我们将其他 3 个轮子添加到我们的机器人配置中(完整的代码位于本节的顶部。
下一步是创建一个启动文件,以便我们可以在 RViz 中可视化机器人结构。首先,我们需要创建相应的文件夹:
cd ~/robot_dd/src/robot_dd_model_pkg/
mkdir launch
cd ~/robot_dd/src/robot_dd_model_pkg/launch
然后,创建如下所示的启动文件
gedit robot.launch
robot.launch 启动文件内容如下。
<?xml version="1.0" ?>
<launch>
<arg name="model" />
<param name= "robot_description"
textfile="$(find robot_dd_model_pkg)/urdf/robot.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 robot_dd_model_pkg)/robot.rviz" required="true"
/>
</launch>
此启动文件将从创建的 URDF 文件中加载机器人几何描述,并将与 RViz 一起启动必要的节点。
最后一步是制作包和工作区。我们通过输入来做到这一点
cd ~/robot_dd
catkin_make
步骤 4:在 RVIZ 中测试模型
首先,打开一个新终端(不要关闭原来的终端),然后通过键入来运行roscore
roscore
然后,在原来的终端中
roslaunch robot_dd_model_pkg robot.launch
这将调出 RViz。但是,不会显示任何内容。要显示机器人模型,请进行以下调整
– 在显示窗口(左上角)的“全局选项”下,将固定帧更改为“body_link”
– 在显示窗口中,单击添加并单击 RobotModel,然后单击确定 – 此选项实际上将显示机器人。
运行结果如下: