背景
Turtlesim 是用于学习 ROS 2 的轻量级模拟器。它阐述了 ROS 2 能做的最基本的工作,以使您对以后使用真实机器人或机器人仿真将要做什么有所了解。
rqt 是 ROS 2 的 GUI 工具。rqt 中完成的所有操作都可以在命令行上完成,但是它提供了一种更简单,更用户友好的方式来操作 ROS 2 元素。
本教程涉及 ROS 2 的核心概念,例如节点,topic 和 service 的区别。所有的概念都将在以后的教程中进行详细介绍。现在,您只需简单设置这些工具并对其进行体验。
前提条件
上一教程 ROS 2 环境配置,向您展示了如何配置开发环境。
Turtlesim 和 rqt 仅在 ROS 2 Dashing 之后可用。
任务
1 安装 turtlesim
与往常一样,首先按照上一教程中的步骤在新终端中 source ROS 2 的配置文件。
为您的 ROS 2 发行版安装 turtlesim 软件包:
sudo apt update
sudo apt install ros-<distro>-turtlesim
检查软件包是否已安装:
ros2 pkg executables turtlesim
上述命令应该会返回 turtlesim 的可执行文件列表:
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node
2 启动 turtlesim
要启动 turtlesim,请在终端中输入以下命令:
ros2 run turtlesim turtlesim_node
应该会出现一个模拟器窗口,窗口中心有一只随机的乌龟。
在终端的命令下,您将看到来自该节点的消息:
[INFO] [1590135720.584280041] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1590135720.588933661] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
在这里,您可以看到默认乌龟的名称是 turtle1
,以及它生成时的默认坐标。
3 使用 turtlesim
打开一个新终端,然后再次 source ROS 2 的配置文件。
现在,您将运行一个新节点来控制第一个节点中的乌龟:
ros2 run turtlesim turtle_teleop_key
此时,您应该打开了三个窗口:一个正在运行 turtlesim_node
的终端,一个正在运行 turtle_teleop_key
的终端,还有一个是 turtlesim 窗口。排列这些窗口,使您能够看到 turtlesim 窗口的同时,还可以激活运行 turtle_teleop_key
的终端,这样以便您可以控制 turtlesim 窗口中的乌龟。
使用键盘上的箭头键控制乌龟。它将使用其附带的笔在屏幕上四处移动,以绘制迄今为止行走的路径。
注意
按下箭头键只会使乌龟移动一小段距离然后停下来。这是因为,如果操作者失去了与机器人的连接,则您将不希望机器人继续执行指令。
您可以使用下述 list
命令来查看节点及其关联的 service,topic 和 action:
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
您将在接下来的教程中了解更多有关这些概念的信息。由于本教程的目的只是为了大致了解 turtlesim,因此我们将使用 rqt( ROS 2 的一个图形用户界面)来更仔细地研究 service。
4 安装 rqt
打开一个新的终端以安装 rqt
及其插件:
sudo apt update
sudo apt install ros-<distro>-rqt-*
运行 rqt:
rqt
5 使用 rqt
第一次运行rqt后,该窗口将是空白的。别担心,只需从顶部菜单栏中选择 Plugins > Services > Service Caller 即可。
注意
rqt 可能需要一些时间才能找到所有插件。如果点击 Plugins,但没有看到 Services 或任何其它选项,则应关闭 rqt,在终端中输入
rqt --force-discover
命令。
使用 Service 下拉列表左侧的刷新按钮,确保 turtlesim 节点的所有 service 均可用。
单击 Service 下拉列表以查看 turtlesim 节点的 service,然后选择 /spawn
service。
5.1 尝试 spawn service
让我们使用 rqt 调用 /spawn
service。您可以从其名称中猜到,/spawn
将在 turtlesim 窗口中创建另一只乌龟。
在 Expression 列中的空单引号之间双击给新乌龟一个唯一的名称,例如 turtle2
。您可以看到该 Expression 对应于 name 值,并且类型为 string。
输入要生成乌龟的新坐标,例如 x = 1.0
和 y = 1.0
。
注意
如果您尝试生成一个与现有乌龟同名的新乌龟(如您的默认乌龟名称
turtle1
),则会在运行turtlesim_node
的终端中收到错误消息:[ERROR] [1590136557.841528877] [turtlesim]: A turtle named [turtle1] already exists
要生成 turtle2,必须通过单击 rqt 窗口右上角的 Call 按钮来调用该服务。
您将在输入的 x 和 y 坐标处看到一只新的乌龟。
如果您刷新 rqt 中的 service 列表,除了现有 service /turtle1/…
,您还将看到与新生成乌龟相关的 service /turtle2/…
。
5.2 尝试 set_pen service
现在,让我们使用 /set_pen
service 为 turtle1 提供一支独特的笔:
r,g 和 b 的值介于0到255之间,将用来设置 turtle1 绘制笔的颜色,而 width 则用来设置线条的粗细。
要使 turtle1 用明显的红线绘制路径,请将 r 的值改成255,并将 width 的值改成5。不要忘记在更改数据后调用该 service。
如果返回到正在运行 turtle_teleop_key
的终端,然后按箭头键,您将看到 turtle1 的笔已发生变化。
您可能已经注意到,目前无法移动 turtle2。但您可以通过将 turtle1 的 cmd_vel
topic 重映射到 turtle2 来完成其移动。
6 重映射
在新终端中,source ROS 2 的配置文件,然后运行:
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
现在,您可以在此终端处于活动状态时移动 turtle2,而在另一个运行 turtle_teleop_key
的终端处于活动状态时移动 turtle1。
7 关闭 turtlesim
要停止模拟,只需关闭运行 turtlesim_node
和 turtle_teleop_key
的终端窗口。如果想要保持这些终端打开,您可以在 turtlesim_node
终端输入 Ctrl + C
并且在 turtle_teleop_key
终端输入 q
来结束模拟。
总结
使用 turtlesim 和 rqt 是学习 ROS 2 核心概念的好方法。