Skip to main content
Wuji Hand 2 的 Python 语义化 API。统一模式:hand.{resource}().{action}()。所有操作都针对整只手(20 关节)。
本页聚焦 Wuji Hand 2 专属的语义化 API。SDK 基于通用的 Wuji SDK(wuji_sdk,pip install wuji-sdk)——通用的安装、设备连接与数据订阅模型见 Wuji SDK 文档,源码见 wuji-sdk 仓库。

连接

网络连接前提:Wuji Hand 2 使用静态 IP,不使用 DHCP。设备按左右手出厂分配固定地址——左手 192.168.1.110,右手 192.168.1.111,网关 192.168.1.1,子网掩码 255.255.255.0。首次连接前将电脑对应网卡设置为同一网段(如 192.168.1.50),再按地址连接。出厂 IP 可后续修改,见 ip(SET/GET)。

通过 SdkManager 连接(推荐)

auto_connect 和 connect 的 device_name="wuji_hand_2" 重载会直接返回 WujiHand2 实例(带类型提示)。handedness 与 sn、address 互斥。多只同手性 Hand 2 在网时会抛 AmbiguousHandedness,请改用 sn 指定。

ConnectOptions

设 enable_bridge=False 切换成独占单客户端模式。

实例属性

hand.hw_version().get() 返回出厂硬件版本 HwVersion(major, minor, patch)。0.0.0 表示未在工厂端写入。

Hand 级资源

本节覆盖整手 API(20 关节)。单关节的读取与动作通过 hand.joint(k) / hand.joints() 返回的 JointHandle 进行(见 关节遍历)。设备默认运行在 MIT 控制模式,控制模式不通过 Python API 设置。

handedness(GET)

获取左右手识别结果(left / right)。

online_joints_count(GET)

获取在线关节数(0–20)。

joint_diagnostics(SUB)

关节诊断流:订阅逐关节的状态字 / 电流 / 母线电压 / 温度 / 错误码。帧变长,仅含在线关节,用每条的 nid 定位关节。本流与 joint_states 共用同一条设备流,调低其中一个的推送频率,另一个会同步降低,见 joint_states(SUB)。
error_code_current 用静态方法 WujiHand2.describe_error(code) 解码,返回对象含错误名、说明、severity(Warning / DeferredStop / ImmediateStop / Fatal)与 clear_policy(AutoClear / ManualClear / NonClearable),未知错误码返回 None。返回对象的 code 字段是整数,与传入的错误码相同。直接打印诊断条目对象时,错误码按 16 进制显示。
关节角请用 joint_states 流的 position,诊断流不含关节角。

comm_diag(GET,1 Hz)

通信诊断:每秒返回 5 根手指的吞吐 / 错误率。
用于排查关节与控制板之间的通信问题。

effort_limit(SET/GET)

力矩限幅:读写各关节的力矩上限(A)。
写入拒绝 NaN / Inf / 负值与超出设备上限的值,整手与单关节写入同样校验。写入被拒时报错,当前生效值保持不变。上限由固件设定,常见异常与处理见 Wuji SDK 故障排查。

mit_params(SET/GET)

MIT 阻抗参数:读写各关节的 kp / kd。
写入拒绝 NaN / Inf / 负值。

clear_fault(EXEC)

清除故障:直接动作,无参数时作用于整手。

用户零点(origin)

把当前物理位置标定为关节侧零位。关节正在运动时延迟到下次 IDLE 才生效。

使能 / 失能 / 急停

joint_states(SUB)

关节状态流:订阅 20 关节的实时状态帧,原生输出率 1000 Hz。可通过订阅句柄调低推送频率:sub.set_rate(hz) 返回实际生效值,传 0 恢复原生输出率,完整用法见 Wuji SDK 数据订阅。本流与 joint_diagnostics 共用同一条设备流,调低其中一个的推送频率,另一个会同步降低。
推送频率调节适用于 joint_states、joint_diagnostics、指尖触觉与 imu 流。固件与 Wuji SDK 需同批升级到支持该能力的版本,版本要求见对应发布记录。
回调模式:
position 为关节侧角度(rad),velocity 为关节侧角速度(rad/s),这是获取关节角与关节速度的唯一推荐路径。帧变长、仅含在线关节,用每条的 nid 定位关节。joint_diagnostics 流不包含关节角。

joint_command(PUB)

关节命令:发布 20 关节的位置 / 速度 / 力矩前馈。每次发送恰好 20 个 JointCommand,每个携带该关节的 position / velocity / effort。
要把人手关键点转换成这里的 20 维关节命令,用 Wuji SDK 的手部重定向。

指尖触觉数据流(SUB)

指尖触觉需要配备指尖触觉传感器的 Wuji Hand 2.2 (Beta) 硬件,以及固件 v2.1.0 与 SDK v2026.7.21 及以上版本配套。
自描述的按指传感器数据流:先获取该指的 FingertipSensorInfo 元数据(其 format JSON 描述数据帧布局),再订阅该指的 FingertipSensorData 流并按 format 解码。拇指 40 个触点,其余手指 34 个,原生输出率 100 Hz,可通过订阅句柄调低。
固件 v2.4.0 起,每个触点的分点力改为按传感器满量程归一化:法向轴取 0 到 1,两个切向轴取 -1 到 1,超出满量程的读数截断到边界。v2.4.0 之前的固件把分点力按牛顿上报。三轴合力仍以牛顿为单位,温度仍以摄氏度为单位,不受此变更影响。解码时从 info.format 读取 scale 与 unit,不要写死其中一种。固件升级后 info 的 digest 会变,示例中的 digest 比对会重建解码器,新量程随之生效。归一化需要 Wuji SDK v2026.8.17 及以上。
完整的消费端参考(含解码器构建)见 examples/python/wuji_hand_2/ 下的 3.fingertip_typed.py 示例。

指尖触觉标定(EXEC)与状态查询(GET)

零基线重标定:一次调用对全部 5 个指尖做零基线重标定。
调用时必须保持所有传感器表面无负载(无接触力),否则标定出的零基线不正确。
调用成功表示标定命令已下发到每个手指,不代表标定已完成。用状态查询轮询确认:
tactile_status 为阻塞查询(最长约 1 s)。轮询到 state == TactileState.Ready 即标定完成。

Flash 日志导出(诊断)

SDK 会在 out_dir 中写入一个 flash_<serial>_<YYYY-MM-DD_HHMMSS>.jsonl 文件。省略 out_dir 时,文件保存到 ~/.wuji/logs。 SDK 先写入临时文件,导出完成后再将其保存为 JSONL 文件。导出失败时,SDK 会自动清理临时文件,输出目录中不会出现残缺的导出结果。
多个会话同时导出同一设备的日志时,SDK 会自动重试。若重试后仍无法完成,本次导出会报设备忙。SDK 会清除临时文件,不会保留未完成的日志。
日志导出要求设备固件和 Wuji SDK 使用兼容版本。版本不匹配时,导出会报错且不会生成日志文件。请同步升级设备固件和 Wuji SDK 后重试。

ip(SET/GET)

读写设备静态 IP 地址。set 把新 IP 写入设备 flash,固件不会热切换正在运行的以太网栈,新 IP 下次重启才生效。set 之后、重启之前,get 仍返回当前生效的 IP。
IP 在同网段内必须唯一,避开其他设备与电脑网卡。 修改 IP 分四步:set 写入新地址、reboot 重启设备、按新 IP 重连、get 确认。
新 IP 重启后才生效。set 只写入 flash,不改变正在运行的连接。重启前 get 返回的仍是当前 IP。

reboot(EXEC)

重启设备。设备会断连,重启后需重新连接。常与 ip().set() 搭配,让写入 flash 的新 IP 生效。

imu(SUB)

板载 IMU 流:以 100 Hz 的原生输出率推送加速度与角速度,可通过订阅句柄调低。设备不做板载姿态融合,orientation 字段不可用,按 ROS sensor_msgs/Imu 约定以 orientation_covariance[0] = -1 标记朝向无效。数据按 IMU 传感器自身坐标系输出,各轴与手部结构的对应关系将随手部模型后续更新明确。
ImuData 是跨设备通用类型,字段定义见 Wuji SDK 数据类型参考。

关节遍历

JointHandle 提供 label / index(用于与 effort_limit() / mit_params() 等 20 元素返回数组做下标对应),以及单关节资源与动作。FingerHandle 用于按手指遍历关节。

JointHandle

关节句柄:提供 label / index、单关节资源与单关节动作。

FingerHandle

手指句柄:遍历该手指的 4 个关节。

数据类型

JointDiagnosticsFrame / JointDiagnosticsEntry

关节诊断帧:hand.joint_diagnostics().subscribe() 流的帧类型。变长,仅含在线关节。

MitParam

MIT 参数:mit_params().get() 返回元素。
set 接受单个 (kp, kd)(应用到全部关节)或长度 20 的列表(逐关节)。get 返回 20 个元素,离线关节为 None。

JointStateFrame

关节状态帧:hand.joint_states().subscribe().recv() 返回值。变长,仅含在线关节。

JointStateEntry

单关节状态。

JointCommand

关节命令:joint_command().publish().send() 入参元素。

HandCommunicationDiagnostics

通信诊断数据。

FingertipSensorInfo / FingertipSensorData

指尖传感器元数据与数据帧:get_fingertip_info(finger) 返回值与 fingertip_{finger}_data 订阅帧。

TactileStatus / TactileType / TactileState

触觉状态:hand.tactile_status(finger) 返回值。
枚举成员与固件整数等值比较,如 TactileState.Calibrating == 1。

StatusWord

状态字:JointDiagnosticsEntry 的 status_word 字段类型,SDK 暴露的公开状态视图。

Hand2CommSummary

帧级通信健康摘要:JointDiagnosticsFrame 的 comm 字段类型,同时覆盖设备内部总线与 SDK 本地端到端(以太网)两段。设备内部快照由 SDK 常驻任务以 1 Hz 自动刷新,无需手动轮询。
设备内部字段的判读:age_ms、tactile_* 以及每关节的 comm_* 字段同属一份快照,由 SDK 以 1 Hz 刷新。固件升级或触觉标定进行期间会有意跳过这次刷新,因此短暂的陈旧值属预期状态而非故障。用 comm_get_failures 区分两种情况:age_ms 增大而 comm_get_failures 不变 = 正在有意跳过,comm_get_failures 持续增加 = 刷新本身在失败。
计数器饱和,不回绕:本表所有计数达到上限后即停在上限(16 位的 e2e_reordered、e2e_duplicates、rpc_retries、rpc_timeouts、comm_get_failures 停在 65535,32 位的停在 4294967295),不会归零重新计数。1 kHz 流长时间运行时确实可能触顶,因此应按两次采样之间的增量判读,而非当作全生命周期的绝对累计值。

关节编号

标签格式:{finger}_S{1..4}(如 thumb_S1、pinky_S4)。

异常处理

所有 SDK 操作错误统一抛 WujiException,消息中携带错误类型前缀(Disconnected、Timeout、PathNotFound、SchemaMismatch、SerializeError、…)。业务侧按需 try / except 即可。