Skip to main content

概述

本篇实践介绍如何通过 hand_model_path 为当前连接设置自定义手部模型。应用场景包括加载自定义 URDF 和比较不同模型的关节角及骨骼求解结果。 对应的 C 示例为 2_set_hand_model_path.c。Python 侧没有独立示例,但订阅示例的 --hand-model-path 参数走的是同一套接口。 接口与参数见 自定义 URDF 覆盖。

前置条件

硬件

本示例只设置 SDK 侧参数,不写固件,手套不会动。

软件

前序步骤

先切到具名 SDK 用户。 见 SDK 本地用户管理。这是前置条件,不是建议。

数据流

两条硬约束实测

一、默认用户下直接报错

切到默认用户后调用,错误信息把原因和解法都写清楚了:
默认用户下在线求解永远用内置通用手模,没有例外。

二、设置不跨连接

完整实测序列,全程在同一个具名用户下: 结论是 hand_model_path 存在会话级参数里,不落盘。每建立一次连接都要重新设一次,写成连接后的固定步骤。
未设置时 get() 抛异常,不是返回空字符串或 None。判断「当前是否设置自定义手模」要用 try/except,不能靠真假值判断。

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 用户。连接前将路径展开为绝对路径,并确认文件可读。

2. 连接并设置手模

每次连接后都要重新设置路径。设置成功后读取一次确认实际生效的路径。

3. 订阅使用新手模计算的结果

设置完成后再订阅关节角。订阅句柄和设备在退出时按顺序释放。

运行与输出

第二个参数可以省略,省略时示例连扫到的第一只手套。共用网络里建议显式传序列号。 具名用户下的实测输出:
以上为实机运行结果,设备是右手 Wuji Glove,手套静置无人佩戴,当前 SDK 用户为具名用户。 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 参数

离线管线有等价能力,而且是构造参数,不受会话限制:
路径不存在时立刻抛错,不会静默回落默认手模。

相关内容