Wuji Glove 用 EMF 解算手部关节角度前,需要先做一次手部模型标定,生成与穿戴者手型匹配的 URDF 模型。标定产物按 SDK 用户与左右手保存,同一用户下任意同侧手套共享,更换手套无需重新标定。
何时需要标定
- 某个 SDK 用户首次使用某一侧手套
- 更换穿戴者,为新用户单独标定
SDK 用户前提
标定产物归属具名 SDK 用户。默认用户既不保存也不加载标定产物,实时 IK 始终使用内置默认模型。标定前先创建并切换到具名用户:create_user 与 switch_user。
标定流程
标定要求穿戴者按提示完成一组规定动作,SDK 采集 EMF 数据并解算出适配的 URDF。标定采集期间 SDK 自动把 EMF 链路恢复满速,采集结束(成功、失败或取消)后恢复原输出率。预先用
set_rate() 降低 emf_poses 输出率不会拉长标定时间。详见 输出率调节。同步阻塞调用
适合脚本与命令行工具:calibrate_blocking() 在标定结束或超时前不返回,Ctrl+C 延迟到方法返回后才响应。
异步调用
asyncio 程序使用异步 API,支持标准 cancellation:
参数
实时反馈
通过on_feedback 回调获取标定过程中的状态:
fb 字典包含当前姿势序号、状态、进度、采集帧数、姿势偏差诊断指标 (metrics) 与提示文本 (hints) 等字段。
回调内抛出的异常会被 SDK 记录到日志,不会中断标定。
自定义 URDF 覆盖
glove.hand_model_path().set(path) 指定用户提供的外部 URDF 文件,是 calibration.hand_model_path 资源的规范访问器,在 URDF 查找顺序中优先级最高:
hand_joint_angles / tip_poses / hand_skeleton)按自定义 URDF 重载。传入空路径则回退到当前用户的标定模型。仅 SDK 托管目录之外的路径算作外部覆盖,指向托管目录内的路径不生效。
自定义 URDF 覆盖仅具名 SDK 用户可用。默认用户调用 set() 会被拒绝,需先切换到具名用户,与标定产物的用户隔离一致。
URDF 查找顺序
实时 IK、tf_static 加载手部 URDF 的优先级:
- 外部自定义路径:
calibration.hand_model_path指向 SDK 托管目录之外的文件 - 当前用户的标定模型:该 SDK 用户对应左右手的稳定文件
left_hand.urdf/right_hand.urdf - 内置默认 URDF:按左右手返回 SDK 自带模型
SDK 不读取任何旧格式产物——旧 profile 路径、旧版本写入的托管
hand_model_path、按序列号命名的旧标定文件运行时都不再加载,也没有自动迁移。旧数据重新标定即可。离线管线接口另支持显式传入 urdf_path,传参时优先于上述所有来源。返回字段
calibrate() / calibrate_blocking() 返回的标定汇总:
标定产物存储
标定生成的稳定文件按 SDK 用户与左右手命名,同一用户下所有同侧手套共享同一模型:
唯一性由
(user_id, 左右手) 二元组保证,不再绑定设备序列号。切换 SDK 用户时,已连接设备自动重新加载该用户名下对应的模型,无需重连。写入走原子替换,标定失败不会损坏已有产物。
标定 bundle 采用新格式:手部模型提为用户级,触觉数据仍按设备序列号保存。导入旧版本 bundle 时只保留触觉数据,旧的按序列号标定一律跳过(已失效,不做迁移)。本版本导出的 bundle 需用最新 SDK 导入。
从旧版本升级
calibration.hand_profile与calibration.hand_model_paths.*(含hand_1/hand_2别名)参数已移除。对这些路径执行 SET 会报PathNotFound,磁盘上的旧值仍可读取但运行时忽略。- 标定结果不再含
device_sn、hand_profile、active_hand_profile、generated_hand_profiles、calibrated_urdfs字段。改用handedness与calibrated_urdf。
错误处理
所有失败路径都保留上一次成功的标定结果,失败的本轮不会污染已有模型,可直接重试。
资源路径速查
- Python
- C
Python:本页前文已展示 Python 接口。