概述
本篇实践介绍如何采集引导动作并训练和安装触觉接触模型。应用场景包括建立手套触觉基线和为接触判定及残差信号处理准备模型。 对应的 Python 示例为 7.tactile_calibration.py,C 示例为 5_tactile_calibration.c。 标定的适用场景、产物存储与版本要求见标定与配置,本页说明集成流程和运行时行为。前置条件
硬件
标定只读传感器、只写 SDK 侧模型文件,不写固件。
软件
训练那一步需要 SDK 构建时带上
model-export 特性。缺了这个特性的构建会在训练阶段失败。
- Python
- C
前序步骤
无硬性前置。触觉标定与手部模型标定互相独立,两条链路各标各的。数据流
四组引导动作
step_total 实测为 4,顺序固定:
四组动作合起来要覆盖整个触觉阵列——哪个区域没被按到,训练器就认为那片 taxel 是死的。
prompt 协议实测
on_pose_prompt 是这套流程的交互枢纽,实测每组动作触发两次,一轮标定共 8 次。
两种 kind
pose_ready 用于提示用户准备,pose_review 给出这一组的采集质量,让用户决定留还是重录。
返回值只能是这四个
返回别的值直接抛
RuntimeError,不是警告。这是接入时第一个会撞上的坑。
状态机实测
一轮完整流程捕获到 11 次状态转移,seconds_per_pose=3.0、epochs=5:
check 与 train 不带 step_index,这两个阶段没有「第几步」的概念。写进度条时要处理这种情况,别无条件读 step_index。
采集耗时与参数严格对应:四组各 3.0 秒,实测每组 394 帧。131 Hz × 3 s = 393,完全吻合。
无人佩戴的后果:dead_pct 99.3%
把静置在桌上、无人佩戴的手套跑完整轮标定,训练出的模型 summary 是:done,没有任何报错,产物也正常落盘——但这个模型完全不能用。
原因是:训练器靠「这个 taxel 在动作过程中是否出现过有意义的信号变化」来判断它是不是活的。手套静置,全部通道纹丝不动,自然全被判死。
这条实测给出的操作准则是:dead_pct 是标定质量的第一判据。 拿到 summary 先看它,数值高说明覆盖不够——要么没戴手套,要么动作幅度太小、按压力度不够、没覆盖到全部区域。
alive_taxels 的正常量级参考原始阵列:744 个通道里约 526 个有效,其余 218 个本来就是硬件屏蔽的无效通道。健康的标定结果里 alive_taxels 应该接近 526 这个量级。
产物布局实测
标定数据按用户与序列号分目录:~/.wuji/sdk/tactile/<序列号>/,具名用户各自存在自己的 users/<user_id>/ 下。
contact.json 是清单文件,带契约与校验信息:
tactile_pixels: 744 与原始 tactile 流的通道数一致,模型是按完整阵列训练的。
install=False 时模型只留在 run 目录,运行时目录不会被创建。 实测 summary 的 installed 为 false,model/ 目录不存在。想先评估再决定要不要用,就传这个。
一次标定的原始数据实测约 6.6 MB(四个 bag 加模型)。每跑一次就多一个 run_<timestamp> 目录,旧的不会自动清理。
参数实测
完整签名:
默认参数一轮是 4 × 30 秒采集加 60 轮训练。调小只适合验证流程,正式标定用默认值——采集时长直接决定覆盖度。
标定前后的差别
实测未标定时三条流的状态,同一时刻采样:
原始流照常有数据,两条派生流精确恒为 0,不是「接近 0」。所以判断一只手套是否完成标定,直接看这两条流是不是全零就行,不用去翻目录。
集成步骤
完整示例:Python 触觉标定 和 C 触觉标定。 以下为接入片段。Python 导入与 manager 初始化、C 初始化与连接错误分支、回调定义均沿用 Python 示例 和 C 示例。C 每次调用应检查返回状态,失败时按 Python 示例 和 C 示例 释放已有资源并退出。1. 连接目标手套
使用目标手套序列号连接。Python 示例显式关闭桥接,C 示例使用默认连接选项。- Python
- C
2. 运行引导标定
使用默认每组 30 秒和正式训练轮数。提示回调负责等待动作确认,反馈回调显示采集和训练状态。- Python
- C
3. 检查质量并收尾
将上一步调用包在try/finally 中,读取 dead_pct 和安装状态后断开连接。C 调用成功后释放 summary,再断开设备。提示回调须处理 pose_ready 和 pose_review,只返回 proceed、retry、abort 或 None,
- Python
- C
运行与输出
- Python
- C
seconds_per_pose=3.0、epochs=5、install=False、无人佩戴)的结果:
dead_pct 冲到 99.3%。本次验证的产物已全部删除,未安装到运行时目录。
注意事项
扩展用法
先检查 dead_pct
标定跑完不报错不代表成功。先看dead_pct,再看 alive_taxels 是不是接近 526 这个量级。数值不对就重标,确认质量后再安装。
用 pose_review 的 warnings 决定重录
每组动作采完都会给一次pose_review,里面的 warnings 是针对这一组的。发现问题当场返回 'retry' 重录,比整轮跑完再返工省事。
别为了快而调小 seconds_per_pose
采集时长直接决定阵列覆盖度。默认 30 秒是有道理的,调到 3 秒只适合验证代码能不能跑通。定期清理 run 目录
每次标定新建一个run_<timestamp> 目录,约 6.6 MB 起,不会自动清理。多标几次要手动收拾。
标定完就去看网格
装好模型后跑接触网格视图,用手碰一碰确认响应正常,比看数字直观。见触觉接触网格视图。相关内容
- 触觉接触网格视图:标定后用它验证效果
- 触觉残差网格视图:看接触判定背后的连续信号
- 数据订阅:回调:744 / 526 / 218 这几个通道数的来历
- 手部模型标定:另一条标定链路,产出手部模型
- SDK 本地用户管理:标定产物按 SDK 用户进行管理