多设备通信
框架是框架,功能是功能,本章节重点讨论ROS2框架为我们节省了哪些时间。
通信
丰富的通信类型
ROS2节省自己搭建网络、定义通信类型、管理连接的时间。
通信类型 | 适用场景 |
---|---|
Topic | 单向:发布订阅模式通信 |
Action | 双向:持续获取反馈状态式通信 |
Service | 双向:一次性获得反馈状态 |
自动发现机制
相同ROS2版本且在同一网段下的不同设备可以自动发现。
自动发现前提:指要求中继设备允许子设备自由通信。
中继设备可能是路由器、或者手机的热点、随 身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安装包一样。安装后即可实现"一行代码"实现某个功能。