ROS 2(机器人中间件)驱动
概述
ROS 2(Robot Operating System 2)是移动机器人 / AGV / 协作机器人 / 无人机领域的标准中间件,
在 DDS(Data Distribution Service,RTPS over UDP/TCP)之上提供 publish / subscribe / service / action。
通过订阅话题(如 /odom、/scan、/battery_state)来监视机器人状态。
| 项目 | 值 |
|---|---|
opc_type | ROS2 |
| 实现类 | plantpulse.driver.protocol.ros2.ROS2Driver |
| 库 | rosbridge_suite (JSON over WebSocket,自研客户端) |
| read | ✅ 话题订阅 — <topic>:<field.dot.path> |
| write | ⛔ 不支持(只读) |
| 安全 | DDS-Security / SROS2 (取决于厂商) |
ROS2 是通过 WebSocket 接入 rosbridge_server 并订阅话题的实际实现。
注册方法与地址约定以 连接类型 — ROS 2 为准,以下请使用
替代运行方案 中的某一种 bridge 模式。
为什么 native 实现困难
ROS 2 的 Java 客户端 rcljava 并非纯 Java 库,
而是 C++ 内核 (rcl、rmw) + JNI 绑定 的结构。
| 依赖要素 | 说明 | 部署影响 |
|---|---|---|
rcl (C) | ROS 2 client library 内核 | 需要各平台的 .so / .dll |
rmw middleware | 对实际 DDS 实现的抽象 | 使用哪种 DDS 在构建时决定 |
rmw_cyclonedds_cpp | Eclipse CycloneDDS 后端 | native lib + license (EPL/EDL) |
rmw_fastrtps_cpp | eProsima Fast DDS 后端 | native lib + license (Apache 2.0) |
| 依赖 ROS 2 distro | Humble / Iron / Jazzy / Rolling 每个 LTS 的 ABI 都不同 | 需与网关 OS 版本匹配 |
| JNI bridge | rcljava 自身 | 存在 Java 内存模型与 DDS thread pool 冲突的风险 |
因此,对于像 PlantPulse Edge 这样必须在多种 OS / 架构(x86-64 Linux、ARM64 Linux、Windows Server) 上运行的 Java 应用而言,直接内嵌 native ROS 2 客户端在 部署 / 库冲突 / 版本匹配 方面成本极高。
替代运行方案
ROS 2 社区已为外部系统集成标准化了 bridge 节点。 PlantPulse 只需接收 bridge 的输出接口即可。
方案 1. rosbridge_server (WebSocket / REST)
在 ROS 2 侧启动 rosbridge_suite,
即可通过 JSON over WebSocket / HTTP 订阅话题。
| 使用的 PlantPulse 驱动 | 页面 |
|---|---|
HTTP (REST 轮询或 WebSocket bridge) | HTTP |
方案 2. MQTT bridge
使用 ros2-mqtt-bridge 等 bridge 将 ROS 2 话题
转换为 MQTT 话题。
| 使用的 PlantPulse 接入口 | 页面 |
|---|---|
| Sparkplug B 输入 | Sparkplug B |
方案 3. OPC UA Robotics Companion Specification
支持由 OPC Foundation + VDMA 标准化的 OPC UA Robotics Companion Spec 的机器人控制器(如 ABB OmniCore、KUKA KR C5、Universal Robots PolyScope X)越来越多。 这种情况下可以不经过 ROS 2 本身,直接连接控制器的 OPC UA 服务器。
| 使用的 PlantPulse 驱动 | 页面 |
|---|---|
OPCUA | OPC-UA |
应该选择哪个方案
| 场景 | 推荐 |
|---|---|
| 自研 ROS 2 系统(移动 AGV 等) | rosbridge_server + HTTP 驱动 |
| 多台机器人 + 需要云端采集 | MQTT bridge → Sparkplug B |
| 工业机器人控制器 (ABB / KUKA / UR) | OPC UA Robotics Companion → OPCUA 驱动 |
| 仅 1~2 个简单状态遥测话题 | rosbridge_server REST 轮询 |
今后进行 native 实现时的考量事项
| 方案 | 依赖 | 难度 |
|---|---|---|
| 内嵌 rcljava | rcl + rmw + DDS 的 native .so / .dll | 极高 |
| ROS 2 Java 客户端 (jros2client 等 fork) | 非官方,维护薄弱 | 高 |
| 自研 RTPS 解析器 (UDP 组播) | 需自行实现 RTPS 规范 | 极高 |
在 PlantPulse Edge 的单一 jar 部署模型中,没有内嵌 native ROS 2 客户端的计划。 官方推荐的集成路径是 rosbridge_server (HTTP) 或 OPC UA Robotics Companion (OPCUA)。
stub 注册(仅供测试)
curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_ROS2_STUB",
"opc_type": "ROS2",
"opc_name": "ROS 2 stub",
"opc_agent_ip": "192.168.0.0",
"opc_agent_port": "0",
"site_id": "SITE_00001",
"auto_collect": false,
"timecycle": 5000,
"tag_list": []
}'