Skip to main content

多设备通信

框架是框架,功能是功能,本章节重点讨论ROS2框架为我们节省了哪些时间。

通信

丰富的通信类型

ROS2节省自己搭建网络、定义通信类型、管理连接的时间。

通信类型适用场景
Topic单向:发布订阅模式通信
Action双向:持续获取反馈状态式通信
Service双向:一次性获得反馈状态

自动发现机制

相同ROS2版本且在同一网段下的不同设备可以自动发现

info

自动发现前提:指要求中继设备允许子设备自由通信。

中继设备可能是路由器、或者手机的热点、随身WIFI等。

允许子设备自由通信有利有弊,如果你在商场或者咖啡馆连接他们的WIFI,你的电脑可能提醒你:你的网络活动可能被其他设备发现。自由通信会带来一定的安全隐患。因此并不是所有的路由器都默认允许允许子设备自由通信。

有的设备会有防火墙,临时关闭防火墙:sudo ufw disable,另外要允许UDP多播端口(默认7400~7500)。

如果一切正常,你应该可以通过ping <其他机器的IP>并联通成功。

此时你可以通过ros2运行节点发布消息,其他设备的接收者会收到你的消息。

隔离机制

如果你同个网段下有10台无人机,10台机器狗。

你想将其编队。例如编为:空军、陆军。又或者5台无人机、5台机器狗为一组,编为2组。

ROS2提供了隔离机制

在同个编队的所有设备终端中执行:export ROS_DOMAIN_ID=1。(值范围为0~101,0为默认值)

这个命令是设置了一个环境变量。ROS2通过判断这个环境变量来识别是否为一组。不同ID节点无法通信。

因此如果你想将其分为两组,只需要在一半的设备上改为非0的相同ID即可。

多设备跨域通信

如果你的设备分别在两个城市,可以通过配置一台公网下的服务器(也可以在两个网段下,配置一个都能访问的设备作为中继),将两个城市的设备连接到这台服务器上。这种通信方式被称为Fast-DDS

在服务器上运行:fastdds discovery --server-id 0

服务器开放11888端口。sudo ufw allow 11888/tcp

在设备上运行:export ROS_DISCOVERY_SERVERS=<服务器IP>:<服务器端口>。(端口默认11888)

设置ROS中间件为rmw_fastrtps_cpp(别人写好的包):export RMW_IMPLEMENTATION=rmw_fastrtps_cpp 然后重新监听:ros2 daemon stop,再重新启动:ros2 daemon start

模块仓库

ROS2有大量写好的机器人相关的包,包也称:模块、功能包、库。

安装相机标定: sudo apt install ros-jazzy-camera-calibration

安装SLAM: sudo apt install ros-jazzy-slam-toolbox

你会发现你只需要安装一个包,就可以获得一个功能。和Python通过pip安装包一样。安装后即可实现"一行代码"实现某个功能。