create® 3入门教程-使用多个机器人
说明:
- 介绍如何使用多个 Create® 3 机器人
相关设备
- Turtlebot4机器人套件:采购地址
ROS 2 通信的基本概念
ROS 2 1通信基于底层 DDS 中间件。两个 ROS 进程发现彼此后,如果它们的主题、服务或操作匹配,它们将自动开始通信。
ROS 2 使用的默认发现协议是基于广播的。这意味着当一个 ROS 2 进程启动时,它会将自己的发现消息通告给连接到同一网络的所有其他 ROS 进程。
使用广播发现协议的主要优点是,只要你的 ROS 2 进程连接到同一个网络,它们就会自动相互连接并开始通信。基本用例不需要用户进行任何特殊配置。
多个机器人的潜在问题
让 ROS 2 进程自动开始通信并不总是一件好事。通常,如果两个原本要单独执行的 ROS 2 进程开始通信,它们最终会在进程之间混淆消息,而无法理解它们接收到的信息是针对它们还是针对其他进程(或者在这种情况下) , 机器人)。
在某些情况下,机器人内部的两个 ROS 2 进程无意进行通信,但碰巧这样做是因为它们具有相同的主题名称并且恰好位于同一网络下。另一方面,同时运行多个机器人的用户可能希望能够从他们的笔记本电脑选择与哪个机器人进行通信,同时仍然阻止它们相互通信。
以下部分将描述如何缓解和解决这些问题。提出了不同的解决方案,因为每种解决方案都适用于不同的场景。
ROS 2 命名空间
防止多个 ROS 2 进程相互通信的最简单方法是使用 ROS 2 命名空间。您可能知道,每个 ROS 2 实体都由其名称唯一标识(例如,命名的主题cmd_vel用于控制机器人)。通过为 ROS 2 进程指定命名空间,您实际上是在它创建的所有实体的名称前面添加了一个单词。
ROS 2 命名空间可以从 Create® 3 机器人网络服务器的应用程序 → 配置菜单中设置。请注意,命名空间名称必须以斜杠开头/。
如果您有两个机器人并指定以下命名空间:/robot_1然后/robot_2您将能够看到它们各自的主题被很好地分开:
$ ros2 topic list
/robot_1/cmd_vel
/robot_1/dock
/robot_1/odom
...
/robot_2/cmd_vel
/robot_2/dock
/robot_2/odom
...
- 请注意,如果您想发布或订阅特定主题,现在您必须在其前面添加适当的命名空间。例如:
$ ros2 topic echo /robot_1/odom
- 如果您没有太多机器人,或者如果您有一个需要同时与所有机器人通信的附加应用程序,则推荐为您的机器人使用自定义 ROS 2 命名空间
ROS 2 域 ID
隔离多个 ROS 2 进程的另一种方法是指定ROS_DOMAIN_ID环境变量。
如果两个进程使用不同的ROS_DOMAIN_ID值,它们将彼此完全隔离,这意味着它们不仅会避免通信,而且它们也将无法发现彼此。您可以在ROS 2 官方文档中阅读有关此变量的更多详细信息。
ROS 2 域 ID 可以从 Create® 3 机器人网络服务器的应用程序 → 配置菜单中设置。请注意,域 ID 必须是介于 0 和 101 之间的值。默认情况下,ROS 2 进程使用ROS_DOMAIN_ID值 0。
如果您想通过笔记本电脑与特定机器人进行通信,则需要为域 ID 设置相应的值。例如:
$ export ROS_DOMAIN_ID=42
$ ros2 topic list
/cmd_vel
/dock
/odom
...
请注意,ROS 2 进程一次只能使用一个域 ID。如果需要,您始终可以在同一个域 ID 下拥有多个机器人,然后还可以添加命名空间以防止它们通信。
当您拥有大量机器人并且您希望您的工具仅与其中的一部分机器人进行通信时,推荐为您的机器人使用自定义 ROS 2 域 ID 的解决方案。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号