信息中枢 WebSocket 接口

信息中枢只消费统一的 MocapState,不监听 IMU UDP 端口,也不解析 ESP32 数据包。这样 动捕解算、Web 页面、ROS 2 和 Unity 共享一套 body_rh、时间同步和 claw 语义。

启动

python3 -m pip install -r SOFTWARE/信息中枢/requirements.txt
python3 SOFTWARE/信息中枢/mocap_ws_hub.py

默认 WebSocket 地址是 ws://127.0.0.1:8765,本地状态页是 http://127.0.0.1:8766。状态页可通过 ?ws=ws://host:port 指向其他 hub。

发布 JSONL demo:

python3 SOFTWARE/信息中枢/mocap_hub_bridge.py \
  --replay examples/demo_replay.jsonl

另一个终端可运行最小订阅者:

python3 SOFTWARE/信息中枢/examples/ws_subscriber.py

入站消息

发布者先发送:

{"type":"hello","role":"publisher"}

随后提交由 MocapState.to_dict() 生成的状态:

{"type":"mocap_state","state":{"schema_version":1,"frame_id":42,"frame":"body_rh","wear_side":"right","target":{}}}

事件可直接发送:

{"type":"event","event":"calibration_completed","details":{}}

出站通道

  • control:约 50 Hz。含控制目标、frame_idframe_time_ns、同步质量和人体坐标系。 慢客户端的未发送控制帧会被新帧替换,不会积压过期遥操作指令。

  • status:约 5 Hz。完整携带最新 MocapState,用于节点、校准和骨架调试。

  • event:立即发送。用于校准、录制、掉线等离散事件。

订阅者发送:

{"type":"hello","role":"subscriber"}
{"type":"subscribe","channels":["control","status","event"]}

连接时与每次订阅时都会先收到最近的 controlstatus,因此不必等待下一帧。 所有出站包均含 schema_versionhub_time_ns;有动捕帧时还含 frame_idframe_time_nsframewear_side。 形式化 JSON Schema 位于 schemas/mocap_hub_frame.schema.json

MocapState.nodes 为每个节点提供角色、在线状态、包速率、累计序号缺口、乱序计数、 采样时间和同步质量。累计缺失包数只适合作为当前服务会话的链路诊断,不应与真机端到端 丢包率混为一谈。

运行边界

实时模式下,mocap_hub_bridge.py 独占 MultiImuService 数据入口并发布状态。不要同时 启动另一个会绑定同一 UDP 端口的实时接收程序。回放模式无需硬件。