直喂原始触觉信号只值 6 个百分点:LingBot-Touch 把「手感」做成了 530 万参数的中间层
2026 年 11 月 10 日,蚂蚁灵波开源触觉基础模型 LingBot-Touch。官方材料里有一个拧瓶盖的例子,给了三档数字:
| 条件 | 任务成功率 |
|---|---|
| 不使用触觉 | 56.25% |
| 直接输入传感器原始信号 | 62.50% |
| 输入 LingBot-Touch 的触觉表征 | 90.00% |
中间那一档是全篇最值得看的地方。它把两件事拆开了:「有没有触觉数据」和「会不会表示触觉数据」,不是一个问题。
装上传感器、把线接进模型,只值 6.25 个百分点。剩下 27.5 个百分点,全部来自中间加的那一层表示学习。
一、三档对照:33.75 个百分点到底是谁贡献的
把上面三档的增量拆开:
| 档位 | 成功率 | 相对上一档 | 归因 |
|---|---|---|---|
| 无触觉 | 56.25% | — | 只有视觉 |
| 直喂原始信号 | 62.50% | +6.25 pp | 多了接触信息,但模型要自己从原始信号里理解 |
| 喂 Touch 表征 | 90.00% | +27.5 pp | 中间层已经把原始信号翻译成统一语义 |
表示方法的贡献是数据本身的 4.4 倍。【推算】三个增量与 4.4 倍比值均为本文据官方三档数字相减相除,原始数字见上表。
这一档设计本身就是方法论。绝大多数硬件或中间件的宣传是「接入 X 之后提升 Y%」,但缺少「接入原始数据会提升多少」这个对照。补上这一档,才能判断价值到底落在数据上还是落在方法上。
这里必须加上限定:上表是单个任务。 官方给出的整体口径是另一组——在 Sharpa Wave 与 XHand 两款灵巧手、26 项真机测试上,接入 LingBot-Touch 后 LingBot-VLA、π0.5、Diffusion Policy、T-Rex 四种动作模型的平均任务成功率较无触觉时提升约 14 至 26 个百分点。14–26 是一个区间,跨任务跨模型,不能当成单一数字引用。
二、为什么直喂原始信号几乎没用
要理解那 6.25 个百分点为什么这么少,得先看原始信号里混了多少非物理因素。
目前商用的触觉传感器至少有三条技术路线,同一次接触在三条路线上产生的原始信号完全不同:
| 路线 | 原始信号形态 | 单指采样点数(预训练支持范围) |
|---|---|---|
| 磁触觉 | 三轴磁场变化,每点 [X,Y,Z] |
24/32/48/64/76/96 |
| 压阻式 | 单通道电阻变化,标量 | 9/16/61(61 点布局中拇指为 124 点) |
| 视触觉 | 单通道图像强度,标量 | 32/96/200 |
12 种分辨率、3 类传感原理、还有不同的触点布局。 同一个空间位置,在 A 传感器上是索引 47,在 B 传感器上可能是索引 12;同一次接触的强度量程,Sharpa 归一化用 Z/255,XHand 用 [128,128,255] 三轴分别除。
所以「原始信号」这个表示里,至少叠了三重与接触本身无关的东西:传感原理、触点布局、量程约定。
模型如果只学会读其中一种,换传感器就等于从头再来——这是触觉数据长期攒不起来的原因。已有的数据和经验,在换硬件那天全部作废。
三、架构拆开看:四个组件,与一个被改写的读取接口
官方描述这套方法的原话是:在潜在空间做掩码预测,用按传感原理分开的分词器,加一个共享 Transformer。
拆开看是四件东西:
| 组件 | 作用 |
|---|---|
| 模态专属 Tokenizer(磁/压阻/视触觉各一套) | 把不同物理信号各自编码成初始 token |
| 统一指尖坐标空间(canonical spherical space) | 把不同布局的触点映射到同一几何参考,见下文公式 |
| 共享 Transformer + 5D RoPE | 跨模态、跨时间、跨手指做注意力 |
| EMA 目标编码器 + 潜在空间预测 | 自监督训练目标:预测被遮挡部分的潜在表示,而不是重建原始信号 |
仓库里的 Python 包名直接写了答案:tactile_jepa_inference。这是 JEPA(联合嵌入预测架构)的触觉版本,做法与 V-JEPA 那一路一致——预测的是潜在表示,不是原始像素或原始信号。
这个选择带来一个必须知道的后果,也是本文认为最容易被忽略的一条。
地址还在,但内容已经不是局部的
输出的 token 保留了三个地址:time_id(时间)、finger_id(手指)、pos_xyz(空间位置)。看上去,想取「食指第 3 帧」的触觉,按地址筛一下就行。
不行。 官方在 README 里明确写了原因:
每个 token 保留时间、手指与空间地址,但 JEPA 表征整合了时空上下文:经过共享 Transformer 的自注意力之后,一个 token 包含来自其他 taxel 和其他时间位置的信息,而不再是单个 taxel 的独立测量。因此按地址选 token、或做 mean/max 池化,都无法隔离出特定手指或特定时间区间的信息。
所以官方强烈建议用注意力查询:用可学习或任务条件化的 query,对所有输出 token 做 cross-attention,取下游任务需要的信息,而不是默认用逐 token 线性投影或 mean/max 池化。
这一条的价值在于:它是一个「接口语义变了」的问题,不是「参数没调好」的问题。 拿到表征之后随便池化一下,指标上不去,很容易归因成「这个模型没用」,实际上是读取方式错了。
同理,推理接口返回的是冻结的目标编码器 token——没有 predictor、没有池化、没有下游 head。官方把中间层交出来,读法是使用者的事。
四、为什么是 JEPA 而不是分词器:一个能从仓库直接验证的推论
同样是「把异构信号变成统一 token」,主流有两条路线,选哪条决定了后面所有的工程约束。
| 重建式(VQ-VAE 一类) | 预测式(JEPA) | |
|---|---|---|
| 训练目标 | 从 token 重建原始信号 | 预测被遮挡部分的潜在表示 |
| 会被保留的信息 | 与重建精度相关的一切细节 | 只保留可预测、可跨样本迁移的部分 |
| 跨传感器统一难度 | 高——各传感器的重建目标本身不同 | 相对低——潜在空间可以共享 |
| 输出是否可反解 | 可以近似还原原始信号 | 不能 |
| 表征是否可解释 | 每个 token 对应可读的信号片段 | 高度纠缠,需注意力查询 |
从上表可以推出一条:如果走重建路线,仓库里必须有解码器;因为走的是预测路线,所以只需要编码器。
这条推论可以直接验证——仓库顶层只有 infer.py、tactile_jepa_inference、data_interfaces 三个代码目录,模型文件只有一个 encoder.pt 加 config.json,加载函数叫 load_encoder。没有任何 decoder 入口。
【推断】这个结构选择与「统一异构信号」的目标是配套的:重建式训练要求模型记住每种传感器的绝对量纲和布局细节,而这些恰恰是跨硬件迁移时最不该保留的东西;预测式训练把「不可预测的细节」当作噪声丢掉,剩下的才有可能是接触本身的语义。
代价同样明确:表征变成不可解释的中间物。 不能反解回信号,不能按地址取某个 taxel 的读数,也不能用 mean/max 池化做降维。第三节那个 readout 问题,不是实现缺陷,是这套架构的必然后果。
换句话说:选了可迁移,就放弃了可读性。 这个交换在跨硬件场景下是划算的,但如果业务需求是「读出某个指尖的受力值」,这套表征不是合适的工具——它给的是语义,不是传感器读数。
五、跨硬件零样本:XHand 那个例子才是硬证据
「统一表征」这个说法很容易变成口号,官方给了一个可以被检验的具体案例:
- XHand 采用的那款磁触觉传感器,型号不在预训练数据中;
- 模型学到的磁触觉经验,全部来自人戴触觉手套采集的数据;
- 换到这只灵巧手上,LingBot-Touch 参数完全不变,只用 XHand 的操作示范去训动作模型。
这就是零样本迁移的完整定义:预训练时没见过这个硬件的原始信号,推理时不做任何微调,只在下游动作模型侧适配。
传统做法要经过「重新采集 → 重新训练 → 重新适配」三步,每一步都是几周到几个月。这条路把前两步省掉了。
支撑这个结论的机制,是前面那个统一指尖坐标空间。公式很短,但几个细节容易抄错:
p_canonical = (p_sensor @ rotation.T - coordinate_origin) / radius + offset_xyz
官方特别说明了两点:这个变换不把每个点投影到单位球面上;rotation 必须是正交矩阵且行列式为 +1,左右手的镜像要单独处理。
六、530 万参数:为什么必须这么小
26 项真机测试全部由轻量版 LingBot-Touch-Tiny 完成,参数量约 530 万。接入 LingBot-VLA、π0.5、T-Rex 后,整个系统的参数量只增加 0.13% 至 0.16%。
这个量级不是省钱,是硬约束。真机触觉反馈对时延极度敏感——感知环节只要和视觉、动作模型抢算力,闭环就断了。530 万参数在整条链路里几乎不占预算,才有资格谈「即插即用」。
两个版本的关键差别在时序粒度:
| LingBot-Touch-Tiny | LingBot-Touch-Small | |
|---|---|---|
| 参数量 | 约 530 万 | 更大(官方未给具体值) |
| tubelet 大小 | 2 帧 | 4 帧 |
| 定位 | 端侧高频推理,26 项测试全部用此版 | 感知能力更强,5000 小时数据上仍在涨 |
tubelet 这一项有直接的使用后果:T(输入帧数)必须能被 tubelet_size 整除。Tiny 要偶数帧,Small 要 4 的倍数,否则直接报错。官方给的 16 帧样本对两者都成立。
Small 在数据量加到近 5000 小时时仍在继续获益,说明触觉预训练还没有撞到数据墙——这是整条路线最重要的一个判断,也是把数据规模继续往上推的理由。
七、自己动手要踩的七个坑
以下全部来自官方仓库的 README 与数据接口指南,属于「抄错不报错、只表现为效果差」的类型。
1. 手指顺序与左右手
固定顺序是 thumb, index, middle, ring, pinky。左右手要分别推理,先做对应的镜像转换,不能拼成 10 个手指槽位一起送进去。
2. 帧数必须被 tubelet 整除
T 必须为正,且能被模型 tubelet_size 整除。Tiny 是 2,Small 是 4。16 帧是示例设置,不是自动重采样——不足就自己补或裁。
3. 信号为 0 不等于该点不存在
coverage_mask 是 [5,M] 的布尔量,控制「哪些空间槽位产生 token 并参与自注意力」。官方强调三点:
- 真实 taxel 即使信号为 0,也仍然标
True; - 它不是接触检测,也不是随机预训练掩码,更不是「丢掉某根手指」的手段;
- 改变 coverage 会改变所有表征,不只是被遮住的那部分。
官方还提醒:不要靠复制信号来「造」出不存在的接触,也不要把不存在的点标成 True。
4. 归一化只能做一次
X_norm = clip(X / s_x, -1, 1)
Y_norm = clip(Y / s_y, -1, 1)
Z_norm = clip(Z / s_z, 0, 1)
三个要点:区间是传感器约定,不是通用物理单位;不要从每一帧自己估 scale 或 clip 阈值;如果出现大量被 clip 的值,说明量程或标定有问题,而不是数据太强。XHand 已经按 [128,128,255] 归一化过,不要再乘除第二个传感器的量程。
5. 几何变换不要自作主张
Sharpa 与 XHand 的官方样本已经包含正确的 canonical 坐标与手部对齐,直接跑,不要再做一次几何变换。只有全新的 raw taxel 布局才需要自己标定——那时才去动 rotation、coordinate_origin、radius、offset_xyz 四个参数。
6. 拿到的不是特征,是 token
输出是 latent([B,N,C])加上 time_id、finger_id、pos_xyz 三个地址数组。没有池化、没有 head。 N 由帧数、tubelet 大小和有效点数共同决定,C 由下载的模型配置决定。
结合第三节:读法用注意力查询,不要用 mean/max。
7. 重采样到预训练支持的分辨率更好
官方明确验证过一个反直觉的点:XHand 的 120 点数据,先降到 96 点再送进去,表征质量优于直接用 120 点。
原因不难推:96 点在预训练支持列表里,120 点不在。模型见过前者的几何布局,没见过后者。
环境与最小可跑路径如下(官方给的参考组合):
conda create -n lingbot-touch python=3.12.13 pip=26.0.1 -y
conda activate lingbot-touch
# torch 需从 PyTorch 官方 CUDA 13.0 索引安装(官方 README 指定 cu130 轮子)
python -m pip install "torch==2.11.0"
python -m pip install .
python -m pip check
for HAND in left right; do
python infer.py --input-format xhand \
--bundle checkpoints/lingbot-touch-tiny \
--input "sample_data/xhand/001_${HAND}.pt" \
--output "outputs/xhand/001_${HAND}_features.pt" \
--device cpu
done
仓库自带 30 对双侧样本、每手 16 帧,合计 120 个单手输入文件,manifest.json 有索引。先跑通这 120 个,比直接上自己的硬件划算得多。
八、怎么判断它对自己的硬件有没有用:一个三天可完成的验证
官方给的是通用能力,落到具体硬件上必须自己验。下面这套顺序按「成本从低到高」排,三天内能走完。
第一天:确认通路能跑通
只做一件事——跑仓库自带的 120 个样本(Sharpa 与 XHand 各 30 对双侧、每手 16 帧)。验收标准不是「没报错」,而是:
latent的形状是[B,N,C],且N与帧数、tubelet、有效点数三者能对上;time_id、finger_id、pos_xyz三个地址数组的长度与N一致;- 左右手分开跑,输出文件不互相覆盖。
第二天:验证 readout 方式的影响
这一步最容易被跳过,但它决定后面所有结论是否可信。做法是拿同一批 token,用两种读法各接一次同样的下游任务:
| 读法 | 预期表现 | 若结果相反说明什么 |
|---|---|---|
| mean/max 池化 | 明显更差 | 说明表征确实是时空纠缠的(符合官方描述) |
| 注意力查询 | 明显更好 | — |
如果两种读法差异很小,先怀疑数据或 mask 有问题,而不是「官方说法不准」——按第三节的机制,这个差异应该显著。
第三天:自己的三个任务做 A/B/C
复刻第一节那个三档设计,用自己硬件的 3–5 个任务各跑一遍:
A 档:不给触觉
B 档:直喂归一化后的原始信号
C 档:喂 LingBot-Touch 表征
判据很干脆:
- B 档 ≈ A 档,C 档明显高 → 表征有效,值得继续投入;这也说明原始信号本身信息量不足,绕不开中间层;
- B 档已经明显高,C 档提升有限 → 自己的任务对表示不敏感,加这一层的收益要重新算;
- 三档都差不多 → 优先查 readout 与 coverage,而不是换模型。
这套验证的价值在于:它把「这个模型好不好」换成了「它对我的任务值不值」,而后者只需要三天和 5 个任务。
九、边界:能推多远,哪里还没有数据
已经成立的部分
- 三类传感原理的统一表征,有论文(arXiv:2611.12806,2026-11-09 提交)与开源代码支撑
- 跨硬件零样本迁移有一个具体、可复现的案例(XHand 磁触觉)
- 26 项真机测试、四种动作模型、两款灵巧手,说明表征不绑定自家 VLA
- 530 万参数、0.13%–0.16% 增量,端侧可承受
需要打折的部分
- 「提升 14–26 个百分点」是区间,覆盖不同任务与不同动作模型,不能当单一数字引用;26 项任务的逐项数据在论文里,公开材料只给了区间与个别单点
- 5000 小时触觉数据的构成(各传感原理占比、真人手套与遥操作各多少)未见细分披露
- 只在 Sharpa Wave 与 XHand 两款灵巧手上验证,其他构型无公开结果
- 商业化侧提到国大药房、零售分拣、物流分拣、工业场景在测,但无量化结果
- 论文为 v1,官方仓库的 BibTeX 引用条目仍标注「待补」
工程侧的现实约束
- 仓库上线不久(2026-11-09 创建),star 数在两位数,第三方复现极少
- 预训练只支持列表内的分辨率,其他布局必须先重采样到邻近档位
- 推理只到 token,下游 readout 要自己写,且写法会显著影响效果
十、关键要点
-
「装传感器」和「用好传感器」之间隔着一层表示。 拧瓶盖一例:无触觉 56.25%、直喂原始信号 62.50%、喂表征 90.00%。中间那一档只值 6.25 个百分点,表示方法值 27.5 个。
-
任何「接入 X 后提升 Y%」的宣称,都该补一档「直接接入原始输入」。 缺了这一档,无法判断收益来自数据还是来自方法。这是本文最可迁移的一条。
-
原始触觉信号里叠了三重非物理因素:传感原理、触点布局、量程约定。 模型只学会读一种,换硬件时已有的数据和经验全部作废——这是触觉数据长期攒不起来的结构性原因。
-
LingBot-Touch 是 JEPA,不是分词器。 按传感原理分开的 Tokenizer + 共享 Transformer(5D RoPE)+ EMA 目标编码器 + 潜在空间掩码预测。包名
tactile_jepa_inference直接写明了架构。 -
输出 token 的「地址」还在,但内容已经不是局部的。 自注意力之后,一个 token 融合了其他 taxel 与时间位置的信息。按地址筛、做 mean/max 池化都无法隔离特定手指或时间区间。
-
官方强烈建议用注意力查询做 readout。 用可学习或任务条件化的 query 对所有 token 做 cross-attention。接口只给冻结的目标编码器 token,没有池化没有 head——读取方式错了,很容易误判成模型没用。
-
跨硬件零样本的证据是具体的。 XHand 那款磁触觉传感器不在预训练数据中,经验全部来自人戴手套采集,参数不变直接迁移。对照传统做法的「重新采集→重新训练→重新适配」三步。
-
530 万参数是硬约束而不是省钱。 真机触觉对时延敏感,感知环节不能和视觉、动作模型抢算力,所以 26 项测试全部用 Tiny 版,接入后系统参数量只增 0.13%–0.16%。
-
Tiny 与 Small 的差别在时序粒度:tubelet 2 帧 vs 4 帧。 直接后果是输入帧数要分别被 2 和 4 整除,16 帧样本两者都成立。
-
Small 在近 5000 小时数据上仍在涨。 说明触觉预训练还没撞到数据墙,这是继续堆数据的依据,也是这条路线最值得跟踪的指标。
-
七个容易踩的坑,共同点是「不报错只掉点」。 手指顺序 thumb→pinky、左右手不可拼成 10 槽、真实 taxel 信号为 0 时 coverage 仍为 True、只归一化一次、官方样本已含 canonical 坐标不要重复变换、输出没有 head、不在列表的分辨率先重采样。
-
120 点降到 96 点反而更好,因为它落在预训练支持列表里。 这条说明「匹配预训练见过的几何布局」比「保留更多原始信息」更重要。
-
选了可迁移,就放弃了可读性。 仓库只有
encoder.pt、没有 decoder,加载函数叫load_encoder——这是「预测潜在表示」而非「重建原始信号」的直接证据。代价是表征不可反解、不能按地址读单个 taxel 的值。要传感器读数就别用它,它给的是语义。 -
先跑通仓库自带的 120 个样本,再上自己的硬件。 30 对双侧、每手 16 帧,覆盖 Sharpa 与 XHand 两个分支,是判断表征是否可用的最短路径。之后按「三档 A/B/C」验自己的任务:B 档≈A 档而 C 档明显高,才说明中间层不可绕开。
- 点赞
- 收藏
- 关注作者
评论(0)