Skip to content

feat(hostlink): 增加无 ROS 分布式 backend - #306

Open
Xuwznln wants to merge 17 commits into
devfrom
feat/hostlink-backend
Open

feat(hostlink): 增加无 ROS 分布式 backend#306
Xuwznln wants to merge 17 commits into
devfrom
feat/hostlink-backend

Conversation

@Xuwznln

@Xuwznln Xuwznln commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

做了什么

  • 新增 --backend hostlink:直接加载 Python 设备驱动,不安装、不启动 ROS。

  • 引入通用 DeviceNode。设备驱动可以用同一套日志、异步任务、状态、物料和跨设备动作接口;ROS2 与 Basic/HostLink 分别提供实现。

  • 补齐通用 Publisher/Subscription。驱动可以继续使用 node.create_publisher(...).publish(...)node.create_subscription(...)@subscribe;ROS2 走 DDS,Basic 在进程内转发,HostLink 通过 7302/TCP 转发 JSON 消息。

  • HostLink 支持 Host → Slave、Slave → Host、Slave → Slave 的设备动作调用。每次调用带 action ID,并传递进度反馈、协作取消、执行结果和错误。

  • 相对 Topic(例如 value)按设备解析为 /devices/<device_id>/value。Host 作为 Topic 转发中心;Slave 重连后自动恢复订阅。

  • Slave 上报设备类型、display name、动作、状态字段和设备 UUID。状态变化立即通知,心跳补发完整状态。

  • Slave 启动时同步本地设备物料树;后续 update_resource / get_resource 通过 HostLink 交给 Host 保存和查询,不依赖 ROS service 或 Web API。

  • HostLink 同一连接上的请求并发处理,慢动作不会阻塞心跳;单条消息上限提高到 8 MB;设备分配发生交集变化时继续识别为同一个逻辑 Slave。

  • 注册表支持 class.supported_backends。需要外部 ROS 图的驱动会在 HostLink 启动时明确提示使用 ros2

启动方式

# Host


unilab -g host.json --backend hostlink --hostlink-port 7302





# Slave


unilab -g slave.json --backend hostlink --is-slave \


  --host-node-ip 192.168.1.10 --hostlink-port 7302

现在可以使用

  • Host/Slave 设备发现、在线状态和设备描述同步。

  • 本地及远端 Python 驱动动作调用。

  • 三种跨节点调用方向的动作反馈、取消和结果返回。

  • Basic/HostLink 的 JSON Topic 发布订阅,以及 @subscribe

  • 状态快照、状态通知和物料树初始化、更新、替换、查询。

  • Slave 自动重连和 Topic 订阅恢复。

  • basichostlinkros2 驱动兼容声明和启动检查。

ROS2 与 HostLink 怎么选

  • 注册表声明的设备动作可以在 HostLink 上传递动作名称和 JSON 参数。action_type 可以保留在驱动调用里作为兼容信息,不要求驱动为 HostLink 删除这个参数。

  • 普通状态和 JSON 可表示的消息可以使用通用 Publisher/Subscription,在 HostLink 上传输。

  • MoveIt、相机图像、规划场景以及直接连接外部 ROS 节点的 Action/Topic 继续使用 --backend ros2

  • HostLink 的取消由驱动配合完成:长动作接收 ActionContext 并检查取消;已经进入的阻塞硬件调用不会被强制中断。

对 feat/edge-networking-and-scheduler 的梳理

该分支包含多条工作线,不只是 HostLink:

  • HostLink 辅助 ROS 组网:稳定 Slave 身份、ROS domain/发现参数、心跳、物料查询和诊断工具。

  • F002 本地 DAG 调度:并发走图、持久化游标、恢复和不变量测试。

  • F003 本地工作流桥:工作流翻译、WebSocket、8014 本地 API 和前端。

  • Edge 控制面:调度、库存/站点/物料、SQLite、云端同步和 OpenTelemetry。

  • Action lock、持久化职责和部署文档。

该分支的设备 Action 和 Topic 仍由 ROS2 传输;HostLink 负责发现和组网辅助。本 PR 只吸收了与当前目标直接相关的连接并发、8 MB 消息上限和逻辑 Slave 身份保持,没有把调度器、8014 页面或 Edge 控制面一起合入。

还要继续做

  • HostLink backend 目前不启动 WebSocket/FastAPI,因此 8002 管理页面和微前端还不能使用;7302 用于 Host/Slave 通信。

  • 工作站跨设备物料搬运目前仍使用 ROS service。HostLink 已能同步物料树,但还没有同步目标驱动内部的 PLR 资源对象。

  • HostLink 物料树暂存在 Host 进程内,尚未自动上传云端。

  • HostLink 使用明文 TCP,跨网络部署需要防火墙、VPN 或安全隧道。

验证



76 passed:包含真实 README LAN 驱动、多进程 HostLink、networking、Basic、DeviceNode、backend 配置和注册表 metadata


Topic 重连恢复与 Slave → Slave Action 反馈/取消连续执行 5 轮,全部通过
LAN 虚拟设备在回环和非回环 IPv4 上各连续执行 5 轮;CI 固定检查 README 中的两个外部设备仓库


ruff / compileall / git diff --check 通过


Windows Jazzy CI 通过(含 ROS2 合约、注册表全量导入和工作区检查)


Python 原生异步适配

  • HostLink Client/Server 请求可直接 await Python Future,不再用 asyncio.to_thread 包住整次 RPC。
  • DeviceNode.call_device_action_async() 支持 Host→Slave、Slave→Host 和 Slave→Slave。
  • 取消 async task 会继续向远端 Action 转发取消;旧同步驱动和 API 保持可用。
  • HostLink/simple 驱动使用标准 Python asyncio;同时支持 ROS 时优先调用通用 DeviceNode 帮助方法。
  • 本地 CI 同款非 ROS 套件:80 passed;异步核心用例连续 5 轮通过。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant