概述
本篇实践介绍如何通过hand_model_path 为当前连接设置自定义手部模型。应用场景包括加载自定义 URDF 和比较不同模型的关节角及骨骼求解结果。
对应的 C 示例为 2_set_hand_model_path.c。Python 侧没有独立示例,但订阅示例的 --hand-model-path 参数走的是同一套接口。 接口与参数见 自定义 URDF 覆盖。
前置条件
硬件
本示例只设置 SDK 侧参数,不写固件,手套不会动。
软件
- Python
- C
前序步骤
先切到具名 SDK 用户。 见 SDK 本地用户管理。这是前置条件,不是建议。数据流
两条硬约束实测
一、默认用户下直接报错
切到默认用户后调用,错误信息把原因和解法都写清楚了:二、设置不跨连接
完整实测序列,全程在同一个具名用户下:
结论是
hand_model_path 存在会话级参数里,不落盘。每建立一次连接都要重新设一次,写成连接后的固定步骤。
URDF 来源的三种取值
离线管线的urdf_source 属性实测有这些取值,在线侧同理:
换手模的影响有多大
拿同一批 200 帧真实电磁位姿数据,分别用内置默认手模和一份来自另一只手套的标定手模求解,逐元素比较:
按手指拆开看最大偏差:
拇指最敏感。 它的自由度最多,手模几何的差异被放大得最明显。
这组数字说明手模不是可有可无的配置项。用错手模,求解结果看上去正常、置信度也不低,但和真实手势差出半个关节的角度。重放别人采的数据时尤其要对上手模。
C 侧的缓冲区两段式查询
wuji_glove_get_hand_model_path 用的是 C 里常见的两段式模式,示例封装得很规整,值得照抄:
WUJI_STATUS_ERR_BUFFER_TOO_SMALL。 按 == WUJI_STATUS_OK 判断会永远走进错误分支。
集成步骤
完整示例:Python 订阅回调 和 C 手模设置。以下片段只保留接入顺序。 以下为接入片段。Python 导入与 manager 初始化、C 初始化与连接错误分支、回调定义均沿用 Python 示例 和 C 示例。C 每次调用应检查返回状态,失败时按 Python 示例 和 C 示例 释放已有资源并退出。1. 确认用户并检查 URDF
自定义手模需要具名 SDK 用户。连接前将路径展开为绝对路径,并确认文件可读。- Python
- C
2. 连接并设置手模
每次连接后都要重新设置路径。设置成功后读取一次确认实际生效的路径。- Python
- C
3. 订阅使用新手模计算的结果
设置完成后再订阅关节角。订阅句柄和设备在退出时按顺序释放。- Python
- C
运行与输出
hand_joint_angles 的 frame_id 是 r_hand_emf_tx,与 hand_skeleton 的 r_wrist 不同,两条流的参考系本来就不一样。
非拇指的第 5 个角度恒为 0,是对齐用的填充位,与手模无关。
注意事项
手别不符是最隐蔽的一种。SDK 不做校验,照样算出置信度正常的结果。
扩展用法
把设置写进连接流程
因为不跨连接,正确的做法是封一个连接函数:校验手别
设置之前检查 URDF 的根节点:right_hand。SDK 不校验这个,配错不会报错。
想要贴合自己的手就去标定
自定义路径解决的是「用哪份现成模型」,不解决「模型准不准」。要一份贴合本人手型的模型,走手部模型标定,产物自动落到~/.wuji/sdk/models/<序列号>_hand.urdf,标定过之后不设置也会自动用上。
离线重放用 urdf_path 参数
离线管线有等价能力,而且是构造参数,不受会话限制:相关内容
- SDK 本地用户管理:切到具名用户,这是本篇的前置条件
- 手部模型标定:生成贴合本人手型的 URDF
- 离线数据处理:重放时按需指定手模,含本篇那组对比数据的来源
- 数据订阅:回调:
hand_joint_angles与hand_skeleton的帧结构