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 端点路径 — 可选 path | / (默认) |
| 使用 TLS | false = ws / true = wss — 可选 tls | false (默认) |
不支持写入
ROS 2 驱动是只读的。不支持主题发布(例如:/cmd_vel 移动命令),因为需要 rosbridge advertise。机器人命令发送请使用其他路径。
标签的 PLC 地址表示法
地址格式为 <topic>:<field.dot.path> — 以第一个 : 分隔主题和字段路径(ROS 主题包含 /,但不包含 :)。
| 表示法 | 含义 |
|---|---|
/temperature:data | std_msgs/Float64 的 data 字段 |
/imu:orientation.z | sensor_msgs/Imu 的嵌套字段(点路径) |
/scan:ranges.0 | 数组元素 — 数字段为索引 |
/odom | 如果没有 :,则获取整个 msg(JSON 字符串) |
- 叶子字段以文本值返回,object / array 以 JSON 字符串返回。
- lazy subscribe — 主题在首次读取时订阅一次,之后 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 — 首次读取仅执行订阅 | 等待下一个采集周期(timecycle 1次) |
| 连接失败 (connect failed) | rosbridge_server 未运行 / 端口不匹配 | 在 ROS 2 侧启动 rosbridge_server 并确认端口 (9090) |
wss 连接失败 | TLS 设置 / 证书 | 如果使用 tls=true,rosbridge 也必须以 TLS 方式运行(wss 默认端口 9443) |
| 值更新后停止 | WebSocket 断开 — 驱动会立即切换到未连接状态(不会持续返回旧缓存值) | 确认网络 / 重启 rosbridge |
| 主题名称正确但值为空 | 字段点路径拼写错误(msg 中不存在的路径) | 使用 ros2 topic echo <topic> 检查 msg 结构并修正路径 |
其他集成路径(参考)
在无法使用 rosbridge 的环境中,也可以使用以下路径。
| 情况 | 替代方案 |
|---|---|
| 多机器人 + 需要云端采集 | MQTT 桥接 → Sparkplug B / MQTT 客户端 |
| 工业机器人控制器 (ABB / KUKA / UR) | OPC UA Robotics Companion → OPC-UA |