ROS 2 — 机器人 / AGV 中间件
ROS 2 (Robot Operating System 2) 是移动机器人 / AGV / 协作机器人 / 无人机领域的标准中间件,基于 DDS (Data Distribution Service, RTPS over UDP/TCP) 提供 publish / subscribe / service / action。通常通过订阅话题(例如 /odom、/imu、/battery_state)来监控机器人状态。
网关的 ROS2 驱动是连接 ROS 2 标准桥接组件 rosbridge_suite (rosbridge_server) 的 JSON over WebSocket 端点并订阅话题的实机实现驱动。由于不直接接入 DDS,ROS 2 侧只需运行 rosbridge_server 即可。仅支持读取。
前期准备 — rosbridge_server
在 ROS 2 侧(机器人本体或同一网络的 PC)安装并运行标准软件包 rosbridge_suite。
# 예: ROS 2 Humble
sudo apt install ros-humble-rosbridge-suite
ros2 launch rosbridge_server rosbridge_websocket_launch.xml # 기본 ws 포트 9090
注册表单输入项
| 输入栏 | 填写内容 | 示例 |
|---|---|---|
| IP 地址 | rosbridge_server 主机 | 192.168.0.30 |
| 端口 | rosbridge WebSocket 端口 | 9090(ws 默认)/ 9443(wss 默认) |
| 路径 (rosbridge) | WebSocket endpoint 路径 — 选项 path | /(默认) |
| 使用 TLS | false = ws / true = wss — 选项 tls | false(默认) |
不支持写入
ROS 2 驱动仅支持读取。话题 publish(例如 /cmd_vel 移动指令)需要 rosbridge advertise,因此不予支持。机器人指令下发请使用其他通道。
标签的 PLC 地址表示法
地址格式为 <topic>:<field.dot.path> — 以第一个 : 分隔话题与字段路径(ROS 话题包含 / 而不含 :)。
| 表示法 | 含义 |
|---|---|
/temperature:data | std_msgs/Float64 的 data 字段 |
/imu:orientation.z | sensor_msgs/Imu 的嵌套字段 (dot-path) |
/scan:ranges.0 | 数组元素 — 数字段为索引 |
/odom | 无 : 时表示整个 msg(JSON 字符串) |
- 叶子字段以文本值返回,object / array 以 JSON 字符串返回。
- lazy subscribe — 话题在首次 read 时订阅一次,之后由 rosbridge 推送新样本。因此首个值从下一个采集周期开始才会进来。
数据格式匹配
| msg 字段 | 数据格式 |
|---|---|
float 字段(data、orientation.z …) | Float / Double |
| int / enum 字段 | Integer |
| bool 字段 | Boolean |
| 字符串 / 整个 msg (JSON) | String |
常用话题映射(参考)
| 地址 | 含义 | 推荐格式 |
|---|---|---|
/battery_state:percentage | 电池剩余量 (sensor_msgs/BatteryState) | Float |
/odom:pose.pose.position.x | 机器人位置 x (nav_msgs/Odometry) | Float |
/odom:twist.twist.linear.x | 前进速度 (nav_msgs/Odometry) | Float |
/diagnostics | 整个诊断消息 | String (JSON) |
对于 /scan (LiDAR raw) 这类大消息,请避免采集整个 msg,仅注册所需元素(例如 /scan:ranges.0)。
常见问题
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 注册后立即读取值为空 | lazy subscribe — 首次 read 仅执行订阅 | 等待下一个采集周期(1 次 timecycle) |
| 连接失败 (connect failed) | rosbridge_server 未运行 / 端口不一致 | 确认 ROS 2 侧已运行 rosbridge_server 并核对端口(9090) |
wss 连接失败 | TLS 设置 / 证书 | 若为 tls=true,则 rosbridge 也必须以 TLS 方式运行(wss 默认端口 9443) |
| 值更新后停止 | WebSocket 断开 — 驱动会立即切换为未连接状态(不会继续返回过期缓存值) | 检查网络 / 重启 rosbridge |
| 话题名称正确但值为空 | 字段 dot-path 拼写错误(msg 中不存在该路径) | 用 ros2 topic echo <topic> 确认 msg 结构后修正路径 |
其他集成路径(参考)
在无法使用 rosbridge 的环境中,也可采用以下路径。
| 场景 | 替代方案 |
|---|---|
| 多台机器人 + 需要云端采集 | MQTT bridge → Sparkplug B / MQTT 客户端 |
| 工业机器人控制器 (ABB / KUKA / UR) | OPC UA Robotics Companion → OPC-UA |