ROS2-2-turtlesim

Catalogue
  1. 1. 安装turtlesim
    1. 1.1. 检查软件包是否已安装:
  2. 2. 开始运行
  3. 3. 控制turtlesim
  4. 4. 安装Rqt
    1. 4.1. 尝试spawn服务
    2. 4.2. 尝试set_pen服务
  5. 5. 重映射remap

安装turtlesim

1
2
3
sudo apt update

sudo apt install ros-eloquent-turtlesim

检查软件包是否已安装:

1
ros2 pkg executables turtlesim

上面的命令应该返回turtlesim可执行文件的列表:

1
2
3
4
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node

开始运行

要启动turtlesim,请在终端中输入以下命令:

1
ros2 run turtlesim turtlesim_node

终端会显示节点消息:

在这里,您可以看到默认乌龟的名称是turtle1,以及它产生的默认坐标。

控制turtlesim

打开一个新终端,然后再次获取ROS 2。

现在,您将运行一个新节点来控制第一个节点中的乌龟:

1
ros2 run turtlesim turtle_teleop_key

此时,您应该打开三个窗口:一个正在运行turtlesim_node的终端,一个正在运行的终端turtle_teleop_key和turtlesim窗口。排列这些窗口,以便您可以看到turtlesim窗口,还可以使终端turtle_teleop_key处于活动状态,以便您可以在turtlesim中控制turtle。

使用键盘上的箭头键控制乌龟。它将使用其附带的“笔”在屏幕上四处移动,以绘制到目前为止所遵循的路径。

可以使用以下list命令查看节点及其关联的服务,主题和操作:

1
2
3
4
ros2 node list
ros2 topic list
ros2 service list
ros2 action list

安装Rqt

打开一个新的终端以安装rqt其插件:

1
2
3
sudo apt update

sudo apt-get install ros-eloquent-rqt

运行rqt:

1
rqt

第一次运行rqt后,该窗口将为空白。别担心; 只需从顶部菜单栏中选择插件 > 服务 > 服务调用方即可

使用服务下拉列表左侧的刷新按钮,确保您的turtlesim节点的所有服务均可用。

单击服务下拉列表以查看turtlesim的服务,然后选择/spawn服务。

尝试spawn服务

让我们使用rqt调用/spawn服务。您可以从其名称中猜测,这/spawn将在turtlesim窗口中创建另一只乌龟。

给新乌龟一个唯一的名称,例如turtle2在“ 表达式”列中的空单引号之间双击。您可以看到该表达式对应于名称值,并且类型为string

输入要生成的海龟的新坐标,例如和。x = 1.0``y = 1.0

注意

如果尝试生成与现有乌龟同名的新乌龟(如默认乌龟),turtle1则会在运行turtlesim_node以下终端中收到错误消息:

1
[ERROR] [turtlesim]: A turtle named [turtle1] already exists

要生成turtle2,必须通过单击rqt窗口右上角的“ 呼叫”按钮来调用该服务。

您将在为xy输入的坐标处看到一只新的乌龟(同样具有随机设计)。

尝试set_pen服务

现在,让我们使用该/set_pen服务为turtle1提供一支独特的笔:

rgb的值介于0到255之间,将设置笔turtle1绘制的颜色,而width则设置线条的粗细。

要使turtle1用明显的红线绘制,请将r的值更改为255,将width的值更改为5。不要忘记在更新值后调用该服务。

如果返回到turtle_teleop_node正在运行的终端,然后按箭头键,您将看到turtle1的笔已更改。

现在有个问题:

无法移动turtle2。您可以通过将turtle1的cmd_vel主题重新映射到turtle2 来完成此操作。

重映射remap

在新的终端中,输入ROS 2,然后运行:

1
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel

现在,您可以在此终端处于活动状态时移动turtle2,而在运行该终端的另一个终端处于活动状态时移动turtle1 turtle_teleop_key