前言
本系列文章是由笔者翻译自ROS 2 官方教程。笔者水平有限,如有错误,还请读者指正。
本节教程中部分代码为 Liunx下使用,请使用其他操作系统的读者前往原文查看。
目标
通过安装与使用 turtlesim 包以及 rqt 工具来为后续教程作准备。
背景
Turtlesim 是学习ROS 2的一款轻量级模拟器。它演示了ROS 2在最基础的层面上运作方式,可以让你在后续制作真实机器人或是机器人模拟器前对ROS 2有一定了解。
ros2 工具可以让使用者管理、检查、或是与ROS 系统交互。它支持多种用于系统不同方面的指令以及它的操作。例如启动一个节点,设置参数,订阅(收听)话题,以及其他许多。ros2 工具是ROS 2 核心安装的一部分。
rqt 是一个用于 ROS 2 的图形化用户界面。在 rqt 中能够完成的操作同样也能在命令行之中完成,但 rqt 提供了一个对于用户来说更友好的方式来操作ROS 2。
本教程涉及ROS 2核心概念,例如节点,话题,以及服务。所有的这些概念将会在后续教程中被详细解释;现在你可以简单地配置好工具然后对它们有一个基础的了解。
先觉条件
在过去的教程,环境配置,中将会向你展示如何配置的的环境。
任务
1 Install turtlesim (安装海龟包)
一如既往,在新的终端中添加启动文件,正如过去的教程中提到的那样。
为你的ROS 2发行版本安装 turtlesim 包:
sudo apt update
sudo apt install ros-iron-turtlesim
检查包是否被安装:
ros2 pkg executables turtlesim
上面的命令应该返回 turtlesim 中的可执行命令:
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node
2 Start turtlesim (启动海龟包)
为了启动 turtlesim,在你的终端中输入如下命令:
ros2 run turtlesim turtlesim_node
之后模拟器的界面应该出现,在它的中心应该有一只随机的海龟。
在终端中的已经输入的命令之下,你将会看到来自节点的信息:
[INFO] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
在信息之中你可以看到默认海龟的名字和它生成的坐标。
3 Use turtlesim (使用海龟包)
打开一个新的终端,然后再次添加ROS 2启动文件。
(译者注:如果在shell启动脚本中已经添加ROS 2启动文件,可不再添加,详见环境配置教程)
现在你将会运行一个新的节点来控制上方已经启动的节点中的海龟:
ros2 run turtlesim turtle_teleop_key
目前你应该已经有了三个窗口:两个终端分别运行 turtlesim_node 以及 turtle_teleop_key ,还有一个窗口显示了海龟 。将这些窗口重新安排位置,以便你可以看到海龟窗口,但turtle_teleop_key终端还应该处于选中状态,然后你就可以控制海龟移动了。
使用键盘上的方向键来控制海龟。它将会在屏幕的范围内移动,在它身后留下轨迹。
注意:
按下方向键只会让海龟运动一小段距离然后停下。讲真的,你不会想让机器人持续执行一个指令,例如,操纵者丢失了与机器人的连接。
你可以通如下命令:
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
查看节点的列表,相关的话题列表,服务列表,动作列表。
你将会在后续的教程中学到相关概念的更多知识。既然本教程的目标仅仅是对于 turtlesim 有一个总体了解,你将会使用 rqt 来调用 turtlesim 的一些服务,并且与 turtlesim_node 进行交互。
4 Insatll rqt (安装 rqt)
打开一个新终端来安装 rqt 以及它的插件:
sudo apt update
sudo apt install ~nros-iron-rqt*
运行 rqt :
rqt
5 Use rqt (使用 rqt)
第一次运行 rqt 时,窗口将会是空白的。不要担心;点击 Plugins > Services > Service Caller
注意:
rqt 定位所有插件可能需要一些时间。
假如你点击 Plugins 却没有看见 Services 或其他选项,你应该关闭 rqt ,然后在终端中输入如下命令:
rqt --force-discover
使用在 service 下拉菜单左边的刷新按钮来确保你的 turtlesim 节点中的服务都是可见的。
点击 service 下拉菜单来查看 turtlesim 节点中的服务,然后选择 /spawn 服务。
5.1 Try the spawn service (使用 spawn 服务)
让我们使用 rqt 来调用 /spawn 服务。你可以通过它的名字来猜出它的作用,它将在 turlesim 窗口中生成另一只海龟。
给新海龟一个唯一的名字,例如 turtle2 ,通过双击 name 行的 Expression 列。你可以看到它的类型是字符串(string)。
接下来你可以输入有效的坐标来控制海龟生成的位置,例如 x = 1.0 y = 1.0 。
注意:
如果你尝试生成一只与已经存在的海龟同名的新海龟,例如默认的 turtle1 ,你将会在运行 turtleism_node 的终端得到错误信息:
[ERROR] [turtlesim]: A turtle named [turtle1] already exists
为了生成新海龟,之后你需要点击 call 按钮来调用服务。
如果成功调用服务,你将会看到一只新海龟(随机的外观)生成在你输入的坐标。
如果你刷新 rqt 中的服务列表,你将会看到与新海龟有关的服务。
5.2 Try set_pen service (使用 set_pen 服务)
现在让我们给 turtle1 一个独特的轨迹通过使用 /set_pen 服务:
通过设置r,g,b在 0 - 255 之间的值可以改变 turule1 轨迹的颜色,width 设置轨迹的粗细。
为了让 turtle1 轨迹变为红色,将 r 的值设置为 255,width的值设置为 5,然后调用服务来改变设置。
如果你返回 turtle_teleop_key 运行的终端,按下方向键,你将会看到 turtle1 的轨迹改变了。
你可能会注意到没有办法来移动 turtle2 ,那时应为没有相应的遥控节点。
6 Remapping (重映射)
你需要第二个遥控节点来控制 turtle2 。但时,假如你尝试运行相同的命令来启动遥控节点,你将发现这个节点同样会控制 turtle1。改变这一行为的方法是重映射 cmd_vel 话题。
在新的终端中,添加ROS 2,运行:
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
现在,你可以移动 turtle2 当选中终端的时候,与此同时 turtle1 也可以被另一个终端控制。
7 Close turtlesim (关闭海龟包)
为了停止模拟,你可以在 turtlesim_node 终端中按下 Ctrl + C ;
在 turtle_teleop_kry 终端中输入 q 。
总结
使用 turtlesim 和 rqt 是学习ROS 2核心概念的好方式。