概述
本篇实践介绍如何用async/await 订阅 Wuji Hand 2 的 joint_states 实时状态流,并在协程中按顺序读取关节状态。应用场景包括接入基于 asyncio 的应用、并发读取多台设备的数据,以及与其他异步 I/O 任务协同运行。
对应的 Python 示例为 1.subscribe_async.py。 字段定义见 JointStateFrame 与 JointStateEntry,本页说明集成流程和运行时行为。
C 接口没有对应的异步形式。C 侧订阅统一走回调,见数据订阅:回调。
前置条件
硬件
软件
数据流
subscribe() 拿到的句柄同时支持两种取法:await recv_async() 异步取,recv() 同步取。帧结构与回调式完全一致。
集成步骤
完整实现见Python 示例。1. 发现并连接设备
使用SdkManager.instance() 获取管理器,通过 scan() 筛选 Wuji Hand 2,确认结果非空后再连接。Python 示例 会连接发现的全部 Wuji Hand 2,下面展示连接其中一台的关键调用。
2. 在协程中读取状态帧
subscribe() 建立订阅,recv_async() 等待下一帧。读取当前帧中的关节列表,通过 nid 识别关节。将订阅的关闭操作放入 finally,使协程取消时也能释放资源。
3. 运行消费任务并断开设备
在main() 协程中等待消费任务。多设备时,为每台设备创建一个任务并交给 asyncio.gather()。任务结束后断开连接,入口使用 asyncio.run(main())。这条路径只读取状态,无需使能电机。
运行与输出
实测数据
在 20 关节全在线的右手 Wuji Hand 2 上实跑:
异步与同步两种取法的吞吐一致,都跟得上设备约 1 kHz 的广播。选哪种取决于应用结构,不是性能问题。
注意事项
扩展用法
与回调式的取舍
多设备并发
每台设备一个协程,asyncio.gather() 并发即可。设备之间互不阻塞。
降低输出率
约 1 kHz 对多数应用偏高。用同一句柄的set_rate() 降频,注意有固件版本要求,见输出率调节。