【ROS2】Beginner: CLI tools
CLI tools
- 一、配置 ROS 2 环境
- 目录
- 背景
- 前提条件
- 任务
- 1. 执行 setup 文件
- 2. 将 source 命令添加到 shell 启动脚本
- 3. 检查环境变量
- 3.1 `ROS_DOMAIN_ID` 变量
- 3.2 `ROS_AUTOMATIC_DISCOVERY_RANGE` 变量
- 总结
- 下一步
- 二、使用 turtlesim、ros2 和 rqt
- 目录
- 背景
- 前提条件
- 任务
- 1. 安装 turtlesim
- 2. 启动 turtlesim
- 3. 使用 turtlesim
- 4. 安装 rqt
- 5. 使用 rqt
- 5.1 尝试 spawn 服务
- 5.2 尝试 set_pen 服务
- 6. 重映射
- 7. 关闭 turtlesim
- 总结
- 下一步
- 三、理解 ROS 2 节点
- 目录
- 背景
- 1. ROS 2 图
- 2. ROS 2 中的节点
- 前提条件
- 任务
- 1. ros2 run
- 2. ros2 node list
- 2.1 重映射
- 3. ros2 node info
- 总结
- 下一步
一、配置 ROS 2 环境
目标:本教程将向你展示如何准备 ROS 2 环境。
难度级别:初学者
预计时间:5 分钟
目录
- 背景
- 前提条件
- 任务
- 执行 setup 文件
- 将 source 命令添加到 shell 启动脚本
- 检查环境变量
- 总结
- 下一步
背景
ROS 2 依赖于使用 shell 环境组合工作空间的概念。
"工作空间"是 ROS 中用于描述你在系统上进行 ROS 2 开发的位置的术语。核心 ROS 2 工作空间称为底层(underlay),后续的本地工作空间称为叠加层(overlay)。在进行 ROS 2 开发时,你通常会同时激活多个工作空间。
组合工作空间使你可以更轻松地针对不同版本的 ROS 2 或不同的软件包集进行开发。它还允许在同一台计算机上安装多个 ROS 2 发行版(如 Dashing 和 Eloquent)并在它们之间切换。
这是通过每次打开新 shell 时执行 setup 文件,或一次性将 source 命令添加到 shell 启动脚本来实现的。如果不执行 setup 文件,你将无法访问 ROS 2 命令,也无法找到或使用 ROS 2 软件包。换句话说,你将无法使用 ROS 2。
前提条件
在开始这些教程之前,请按照 ROS 2 安装页面上的说明安装 ROS 2。
本教程使用的命令假设你已按照适用于你操作系统的二进制包安装指南(Linux 的 deb 包)进行安装。如果你是从源码编译安装的,仍然可以跟随本教程,但 setup 文件的路径可能不同。并且如果你从源码安装,将无法使用 sudo apt install ros-<distro>-<package>
命令(该命令在初级教程中经常使用)。
如果你使用 Linux 或 macOS,但对 shell 不熟悉,可以参考相关教程学习。
任务
1. 执行 setup 文件
你需要在每个新打开的 shell 中运行以下命令才能访问 ROS 2 命令:
Linux
source /opt/ros/kilted/setup.bash
如果不是使用 bash,将 .bash
替换为你的 shell。可能的值有:setup.bash
、setup.sh
、setup.zsh
。
macOS
. ~/ros2_install/ros2-osx/setup.bash
Windows
call C:\dev\ros2\local_setup.bat
注意:确切的命令取决于你安装 ROS 2 的位置。如果遇到问题,请确保文件路径指向你的安装目录。
2. 将 source 命令添加到 shell 启动脚本
如果你不想每次打开新 shell 都要执行 setup 文件(跳过任务 1),可以将命令添加到 shell 启动脚本:
Linux
echo "source /opt/ros/kilted/setup.bash" >> ~/.bashrc
要撤销此操作,找到系统的 shell 启动脚本并删除添加的 source 命令。
macOS
echo "source ~/ros2_install/ros2-osx/setup.bash" >> ~/.bash_profile
要撤销此操作,找到系统的 shell 启动脚本并删除添加的 source 命令。
Windows (PowerShell)
- 在 “My Documents” 中创建名为 “WindowsPowerShell” 的文件夹
- 在 “WindowsPowerShell” 中创建文件 “Microsoft.PowerShell_profile.ps1”
- 在文件中粘贴:
C:\dev\ros2_kilted\local_setup.ps1
PowerShell 每次打开新 shell 时都会请求运行此脚本的权限。要避免这个问题,可以运行:
Unblock-File C:\dev\ros2_kilted\local_setup.ps1
要撤销此操作,删除新创建的 “Microsoft.PowerShell_profile.ps1” 文件。
3. 检查环境变量
执行 ROS 2 setup 文件会设置几个运行 ROS 2 所需的环境变量。如果你在查找或使用 ROS 2 软件包时遇到问题,请使用以下命令检查环境是否正确设置:
Linux / macOS
printenv | grep -i ROS
Windows
set | findstr -i ROS
检查变量如 ROS_DISTRO
和 ROS_VERSION
是否已设置:
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DISTRO=kilted
如果环境变量未正确设置,请返回你遵循的安装指南中的 ROS 2 软件包安装部分。如果需要更具体的帮助(因为环境设置文件可能来自不同位置),你可以向社区寻求答案。
3.1 ROS_DOMAIN_ID
变量
有关 ROS 域 ID 的详细信息,请参阅域 ID 文章。
一旦你确定了一组 ROS 2 节点的唯一整数,就可以使用以下命令设置环境变量:
Linux / macOS
export ROS_DOMAIN_ID=<your_domain_id>
要在 shell 会话之间保持此设置,可以将命令添加到 shell 启动脚本:
echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc # Linux
echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bash_profile # macOS
Windows
set ROS_DOMAIN_ID=<your_domain_id>
如果想在 shell 会话之间永久保存此设置,还需运行:
setx ROS_DOMAIN_ID <your_domain_id>
3.2 ROS_AUTOMATIC_DISCOVERY_RANGE
变量
默认情况下,ROS 2 通信不限于本地主机。ROS_AUTOMATIC_DISCOVERY_RANGE
环境变量允许你限制 ROS 2 的发现范围。在某些环境(如教室)中,多个机器人可能会发布到相同的话题,导致奇怪的行为,此时使用 ROS_AUTOMATIC_DISCOVERY_RANGE
会很有帮助。
总结
ROS 2 开发环境需要在使用前正确配置。这可以通过两种方式完成:要么在每个新 shell 中执行 setup 文件,要么将 source 命令添加到启动脚本中。
如果你在使用 ROS 2 查找或使用软件包时遇到任何问题,首先应该检查环境变量,确保它们设置为你期望的版本和发行版。
下一步
现在你已经完成了 ROS 2 的安装并知道如何执行其 setup 文件,可以开始使用 turtlesim 工具学习 ROS 2 的更多细节。
二、使用 turtlesim、ros2 和 rqt
目标:安装并使用 turtlesim 包和 rqt 工具,为后续教程做准备。
难度级别:初学者
预计时间:15 分钟
目录
- 背景
- 前提条件
- 任务
- 安装 turtlesim
- 启动 turtlesim
- 使用 turtlesim
- 安装 rqt
- 使用 rqt
- 重映射
- 关闭 turtlesim
- 总结
- 下一步
背景
turtlesim 是一个轻量级的 ROS 2 学习模拟器。它以最基本的方式展示了 ROS 2 的工作原理,让你了解稍后在真实机器人或机器人仿真中会做的事情。
ros2 工具是用户管理、查看和与 ROS 系统交互的方式。它支持多种命令,用于系统不同方面的操作。你可以用它来启动节点、设置参数、监听话题等等。ros2 工具是 ROS 2 核心安装的一部分。
rqt 是 ROS 2 的图形用户界面(GUI)工具。在 rqt 中能做的事,在命令行中都能做,但 rqt 提供了更友好的方式来操作 ROS 2 元素。
本教程涉及 ROS 2 的核心概念,如节点、话题和服务。这些概念将在后续教程中详细讲解;现在,你只需设置工具并感受它们的使用方式。
前提条件
前一篇教程《配置环境》会教你如何设置环境。
任务
1. 安装 turtlesim
像往常一样,先在新终端中执行 setup 文件(如前一篇教程所述)。
安装适用于你 ROS 2 发行版的 turtlesim 包:
Linux
sudo apt update
sudo apt install ros-kilted-turtlesim
macOS
只要你安装 ROS 2 的压缩包包含 ros_tutorials
仓库,就应该已经安装了 turtlesim。
Windows
同上,标准安装包已包含 turtlesim。
检查包是否安装成功,运行以下命令,应该会返回 turtlesim 的可执行文件列表:
ros2 pkg executables turtlesim
输出示例:
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node
2. 启动 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. 使用 turtlesim
打开一个新终端并再次执行 ROS 2 setup 文件。
现在运行一个新节点来控制第一个节点中的乌龟:
ros2 run turtlesim turtle_teleop_key
此时你应该有三个窗口打开:
- 运行
turtlesim_node
的终端 - 运行
turtle_teleop_key
的终端 - turtlesim 窗口
调整这些窗口,让你既能看到 turtlesim 窗口,又能让运行 turtle_teleop_key
的终端处于活动状态,这样你就能控制乌龟了。
使用键盘上的方向键控制乌龟。它会在屏幕上移动,并用附带的"笔"绘制它走过的路径。
注意:按方向键只会让乌龟移动一小段距离然后停下。这是因为在现实中,如果操作员与机器人失去连接,你不会希望机器人继续执行指令。
你可以使用以下命令查看节点及其相关话题、服务和动作:
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
你将在后续教程中学习更多关于这些概念的知识。由于本教程的目标只是对 turtlesim 有个总体了解,接下来你将使用 rqt 来调用 turtlesim 的一些服务并与 turtlesim_node
交互。
4. 安装 rqt
打开新终端安装 rqt
及其插件:
Ubuntu
sudo apt update
sudo apt install '~nros-kilted-rqt*'
RHEL
sudo dnf install 'ros-kilted-rqt*'
macOS / Windows
标准安装包已包含 rqt 及其插件,所以应该已经安装好了。
运行 rqt:
rqt
5. 使用 rqt
首次运行 rqt 时,窗口将是空白的。没关系,只需从顶部菜单栏选择 Plugins > Services > Service Caller。
注意:rqt 可能需要一些时间来定位所有插件。如果你点击 Plugins 但看不到 Services 或其他选项,应关闭 rqt 并在终端中输入
rqt --force-discover
。
使用 Service 下拉列表左侧的刷新按钮,确保 turtlesim 节点的所有服务都可用。
点击 Service 下拉列表查看 turtlesim 的服务,然后选择 /spawn
服务。
5.1 尝试 spawn 服务
让我们用 rqt 调用 /spawn
服务。从名字可以猜到,/spawn
会在 turtlesim 窗口中创建另一只乌龟。
给新乌龟起一个唯一的名字,比如 turtle2
,方法是双击 Expression 列中的单引号之间并输入名字。你可以看到这个表达式对应 name 的值,类型为 string。
然后输入一些有效的坐标来放置新乌龟,比如 x = 1.0
和 y = 1.0
。
注意:如果你尝试用已存在的名字(如默认的
turtle1
)创建新乌龟,运行turtlesim_node
的终端会显示错误:[ERROR] [turtlesim]: A turtle named [turtle1] already exists
点击 rqt 窗口右上角的 Call 按钮来调用服务。
如果服务调用成功,你应该会在指定的 x、y 坐标处看到一只新乌龟(同样是随机样式)出现。
如果在 rqt 中刷新服务列表,你还会看到除了 /turtle1/...
之外,现在还有与新乌龟相关的服务 /turtle2/...
。
5.2 尝试 set_pen 服务
现在让我们使用 /set_pen
服务给 turtle1
设置一支独特的笔:
r、g、b 的值(0-255)设置 turtle1
绘制线条的颜色,width 设置线条的粗细。
要让 turtle1
用明显的红线绘制,将 r 的值改为 255,width 的值改为 5。更新值后别忘了点击 Call 按钮调用服务。
回到运行 turtle_teleop_key
的终端并按方向键,你会看到 turtle1
的画笔已经改变。
你可能也注意到无法移动 turtle2
,这是因为没有为 turtle2
提供 teleop 节点。
6. 重映射
要控制 turtle2
,你需要第二个 teleop 节点。但是如果你尝试运行与之前相同的命令,会发现它仍然控制 turtle1
。改变这种行为的方法是重映射 cmd_vel
话题。
在新终端中,执行 ROS 2 setup 文件,然后运行:
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
现在,当这个终端处于活动状态时,你可以移动 turtle2
;而当另一个运行 turtle_teleop_key
的终端处于活动状态时,你可以移动 turtle1
。
7. 关闭 turtlesim
要停止仿真,可以在运行 turtlesim_node
的终端中按 Ctrl + C
,在运行 turtle_teleop_key
的终端中按 q
。
总结
使用 turtlesim 和 rqt 是学习 ROS 2 核心概念的好方法。
下一步
现在你已经让 turtlesim 和 rqt 运行起来,并且对它们的工作方式有了初步了解,接下来让我们深入学习第一个 ROS 2 核心概念,继续下一篇教程《理解节点》。
三、理解 ROS 2 节点
目标:了解 ROS 2 中节点的功能,以及与之交互的工具。
难度级别:初学者
预计时间:10 分钟
目录
- 背景
- ROS 2 图
- ROS 2 中的节点
- 前提条件
- 任务
- ros2 run
- ros2 node list
- ros2 node info
- 总结
背景
1. ROS 2 图
在接下来的几个教程中,你将学习一系列构成"ROS(2)图"的核心 ROS 2 概念。
ROS 图是 ROS 2 元素协同处理数据的网络。它包含所有正在运行的可执行文件及其之间的连接,如果把它们全部绘制出来并可视化,就能看到完整的 ROS 图。
2. ROS 2 中的节点
ROS 中的每个节点应该负责单一、模块化的功能,例如控制车轮电机或发布激光测距仪的传感器数据。每个节点可以通过话题、服务、动作或参数与其他节点发送和接收数据。
一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中,一个可执行文件(C++ 程序、Python 程序等)可以包含一个或多个节点。
前提条件
前一篇教程展示了如何安装这里使用的 turtlesim
包。
和往常一样,不要忘记在每个新打开的终端中执行 ROS 2 的 setup 文件。
任务
1. ros2 run
ros2 run
命令用于从包中启动一个可执行文件。
ros2 run <package_name> <executable_name>
要运行 turtlesim,打开一个新终端,输入以下命令:
ros2 run turtlesim turtlesim_node
turtlesim 窗口将会打开,正如你在前一篇教程中看到的那样。
这里,包名是 turtlesim
,可执行文件名是 turtlesim_node
。
不过我们还不知道节点名称。你可以使用 ros2 node list
命令找到节点名称。
2. ros2 node list
ros2 node list
会显示所有正在运行的节点名称。当你想与某个节点交互,或者系统运行了许多节点需要跟踪它们时,这特别有用。
在 turtlesim 仍在运行的情况下,打开一个新终端,输入以下命令。终端会返回节点名称:
ros2 node list
/turtlesim
再打开一个新终端,用以下命令启动 teleop 节点:
ros2 run turtlesim turtle_teleop_key
这里我们再次使用 turtlesim
包,但这次目标是名为 turtle_teleop_key
的可执行文件。
回到运行 ros2 node list
的终端,再次运行它。现在你会看到两个活跃节点的名称:
ros2 node list
/turtlesim
/teleop_turtle
2.1 重映射
重映射允许你将默认的节点属性(如节点名称、话题名称、服务名称等)重新分配为自定义值。在上一篇教程中,你在 turtle_teleop_key
上使用了重映射来改变 cmd_vel 话题并控制 turtle2。
现在,让我们重新分配 /turtlesim
节点的名称。在新终端中,运行以下命令:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
由于你再次调用 ros2 run
启动 turtlesim,另一个 turtlesim 窗口将会打开。但是,如果你回到运行 ros2 node list
的终端并再次运行它,你会看到三个节点名称:
/my_turtle
/turtlesim
/teleop_turtle
3. ros2 node info
现在你知道了节点的名称,可以使用以下命令获取更多关于它们的信息:
ros2 node info <node_name>
要查看最新的节点 my_turtle
,运行以下命令:
ros2 node info /my_turtle
输出将显示:
/my_turtleSubscribers:/parameter_events: rcl_interfaces/msg/ParameterEvent/turtle1/cmd_vel: geometry_msgs/msg/TwistPublishers:/parameter_events: rcl_interfaces/msg/ParameterEvent/rosout: rcl_interfaces/msg/Log/turtle1/color_sensor: turtlesim_msgs/msg/Color/turtle1/pose: turtlesim_msgs/msg/PoseService Servers:/clear: std_srvs/srv/Empty/kill: turtlesim_msgs/srv/Kill/my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters/my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes/my_turtle/get_parameters: rcl_interfaces/srv/GetParameters/my_turtle/list_parameters: rcl_interfaces/srv/ListParameters/my_turtle/set_parameters: rcl_interfaces/srv/SetParameters/my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically/reset: std_srvs/srv/Empty/spawn: turtlesim_msgs/srv/Spawn/turtle1/set_pen: turtlesim_msgs/srv/SetPen/turtle1/teleport_absolute: turtlesim_msgs/srv/TeleportAbsolute/turtle1/teleport_relative: turtlesim_msgs/srv/TeleportRelativeService Clients:Action Servers:/turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsoluteAction Clients:
ros2 node info
返回节点的订阅者、发布者、服务和动作列表,即与该节点交互的 ROS 图连接。
现在尝试对 /teleop_turtle
节点运行相同的命令,看看它的连接与 my_turtle
有何不同。
你将在后续教程中学习更多关于 ROS 图连接概念的知识,包括消息类型。
总结
节点是 ROS 2 的基本元素,在机器人系统中承担单一、模块化的功能。
在本教程中,你通过运行 turtlesim_node
和 turtle_teleop_key
可执行文件,使用了 turtlesim
包中创建的节点。
你学习了如何使用 ros2 node list
发现活跃节点名称,以及使用 ros2 node info
查看单个节点的详细信息。这些工具对于理解复杂的现实机器人系统中的数据流至关重要。
下一步
现在你理解了 ROS 2 中的节点,可以继续学习话题教程。话题是连接节点的一种通信方式。