信息中枢 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_id、frame_time_ns、同步质量和人体坐标系。 慢客户端的未发送控制帧会被新帧替换,不会积压过期遥操作指令。status:约 5 Hz。完整携带最新MocapState,用于节点、校准和骨架调试。event:立即发送。用于校准、录制、掉线等离散事件。
订阅者发送:
{"type":"hello","role":"subscriber"}
{"type":"subscribe","channels":["control","status","event"]}
连接时与每次订阅时都会先收到最近的 control 和 status,因此不必等待下一帧。
所有出站包均含 schema_version、hub_time_ns;有动捕帧时还含
frame_id、frame_time_ns、frame 和 wear_side。
形式化 JSON Schema 位于 schemas/mocap_hub_frame.schema.json。
MocapState.nodes 为每个节点提供角色、在线状态、包速率、累计序号缺口、乱序计数、
采样时间和同步质量。累计缺失包数只适合作为当前服务会话的链路诊断,不应与真机端到端
丢包率混为一谈。
运行边界¶
实时模式下,mocap_hub_bridge.py 独占 MultiImuService 数据入口并发布状态。不要同时
启动另一个会绑定同一 UDP 端口的实时接收程序。回放模式无需硬件。