PAPER DEEP DIVE
FACTR 2:通用机械臂外力感知与策略学习
FACTR 2 的 NEXT 仅用十分钟自由运动数据估计外部力矩,让普通机械臂获得力反馈;FIRST 重采样关键接触阶段,五项长程任务超过力感知基线 17%。
一句话总结
NEXT 只用十分钟无接触运动数据学习机械臂的自由空间力矩,并把电流力矩减去预测值得到外力矩;FIRST 再利用这个信号识别接触前与接触阶段,重采样行为克隆数据,在五项长程接触任务上把平均任务进度提升到 0.818。
研究背景与动机
插入、拧盖、皮带装配和工具归位都依赖接触过程中的细微力变化。视觉可以告诉机器人物体大致在哪里,却很难单独判断插头是否已经卡住、螺纹是否拧紧,或者动作是否因为侧向摩擦而需要回调。对于这类任务,力反馈不是可有可无的附加模态,而是决定动作何时继续、减速、回退或停止的状态量。
问题在于,高质量力觉通常意味着昂贵硬件。Franka、Flexiv、KUKA 等平台可以配备关节力矩传感或末端力力矩传感器,但大量低成本机械臂只提供电机电流、编码器和基础控制接口。额外加装末端力传感器不仅增加采购成本,还可能引入安装结构、线缆、标定和负载偏置等工程负担,某些传感器的整套成本甚至接近或超过机械臂本身。
最直接的替代办法是用刚体动力学模型计算自由空间所需力矩,再把电机力矩和模型预测的差值视为外力矩。这个思路在理论上很清楚,实际却高度依赖质量矩阵、科氏项、重力项、摩擦、间隙、迟滞、温度漂移和驱动器的非线性。对低价机械臂而言,精确辨识这些参数本身就很困难,残余误差又很容易被误认为接触。
论文的出发点是换一个建模对象:既然显式辨识整台机器人的动力学很困难,就让神经网络从数据中学习“没有接触时电机力矩应该是什么”。模型不需要力传感器来采集训练集,只需要机器人执行十分钟无接触运动。部署时,实测电机力矩减去预测的自由空间力矩,剩余部分就是外部关节力矩。
得到外力矩还不足以自动改善策略。作者进一步观察到,接触任务中的失败集中在接触发生前的一小段对齐期,以及接触后的微调期,而普通行为克隆按时间均匀采样,会让大量自由空间样本主导训练批次。FIRST 因此把外力矩当作演示轨迹的自动分段器,针对性地增加接触前和接触阶段样本。
预备知识:外力矩为什么可以写成残差
多数机械臂能够读取每个关节的电机电流。论文采用近似关系把电流映射为电机力矩:
其中 $I_m$ 是测量电流,$K$ 是力矩常数,$\tau_m$ 是估计的电机侧力矩。这个关系并不要求额外传感器,但它也意味着绝对尺度从一开始就依赖厂商参数。论文在局限性中明确承认,若 $K$ 不准确,外力矩的数值尺度就会偏移。
在经典刚体动力学中,无接触运动所需力矩可以写成惯性、科氏离心、重力及其他传动项之和:
若自由空间力矩 $\tau_f$ 已知,外部力矩就是 $\tau_{\mathrm{ext}}=\tau_m-\tau_f$。真正困难的是 $\tau_f$:解析模型在理想机器人上成立,但低成本执行器往往带有难以建模的历史依赖效应。NEXT 保留“残差”这一物理结构,只把 $\tau_f$ 的计算替换成神经网络预测。
方法详解
从模型残差改为学习残差
NEXT 不去估计接触力本身,而是先训练一个自由空间逆动力学网络 $f_\theta$。给定一段本体感知历史 $\mathbf{x}$,网络输出没有外部接触时应出现的电机力矩:
这个设计让物理意义和数据学习各承担一半工作。网络不需要凭空识别“力”,而是学习每个具体机械臂、控制器和传动链在自由运动中的力矩规律;最终外部力矩仍通过可解释的减法得到。与端到端直接从图像预测接触相比,外部力矩成为独立、可复用的中间状态。
用五十步历史描述控制器和传动状态
训练集由无接触轨迹组成,每条样本包含关节位置、速度和指令跟随误差。第 $i$ 个时刻的输入被组织成固定长度历史窗口:
$\Delta\mathbf{q}_d=\mathbf{q}_d-\mathbf{q}$ 表示指令位置与当前位置的差。只给瞬时位置,网络很难区分负载、摩擦和控制器正在追赶目标这几种情况;历史窗口则同时包含速度变化、跟踪误差和近期控制努力。论文的消融显示,位置、速度、跟踪误差三模态联合输入明显优于只用位置或位置加速度,最终采用 $H=50$ 的历史,在 100 赫兹控制频率下覆盖半秒。
作者使用无接触数据监督电机力矩:
因为采集数据时机械臂不与环境接触,所以电机力矩就等于自由空间所需的力矩,不需要额外标签。这个训练目标不是把外力压到零,而是拟合电流中包含的自由运动基线;部署时的外力矩来自新观测与基线之间的差。
网络结构与部署速度
自由空间逆动力学模型采用两层 LSTM,隐藏维度 128,接一个两层 MLP 回归头,隐藏维度 256,丢弃率 0.1,历史长度 50。这里刻意使用无持久状态的滑动窗口:每个窗口单独重置隐藏状态,避免长时间部署时状态漂移,同时保留最近半秒的动态信息。
论文报告的训练成本很低:十分钟无接触数据在单张 RTX 3090 上约训练一分钟。单线程 Intel Core i9-10920X 上前向传播约 1.76 毫秒,相当于 568 赫兹,实际遥操作以 100 赫兹运行。这个余量很重要,因为外力估计必须赶在控制器执行下一拍之前完成,不能成为闭环中的慢速离线模块。
FIRST:从力信号到训练分布
FIRST 接收图像、关节位置和外力矩作为策略输入,但它最关键的改变不在网络结构,而在批次采样。首先用外部力矩的 $\ell_1$ 范数构造接触分数:
单一阈值会在接触开始和结束时产生抖动,因此 FIRST 使用高低两个阈值形成迟滞状态机。分数超过 $T_{\mathrm{high}}$ 时把接触标志打开,低于 $T_{\mathrm{low}}$ 时才关闭,其余时刻保持上一拍状态:
迟滞避免单个噪声峰值被当成接触。检测到从非接触变为接触的时刻后,将其记为接触起点:
每个起点之前一秒被标为接触前,接触状态持续期间标为接触,其余部分标为自由空间。这个定义把“接近目标但尚未接触”的对齐阶段单独抽了出来,而不是把所有非接触时间混成同一种状态。
flowchart LR
A[10 min contact-free data] --> B[q, qdot, tracking error history]
B --> C[Two-layer LSTM]
C --> D[Predicted free-space torque]
D --> E[Measured torque minus prediction]
E --> F[External torque]
F --> G[L1 contact score]
G --> H[Hysteresis onset detection]
H --> I[Free Space]
H --> J[One-second Pre-Contact]
H --> K[Contact]
I --> L[Weighted behavior cloning]
J --> L
K --> L
只改变采样分布,不改变回归目标
三个阶段的采样权重分别为 $w_{\mathrm{F}}$、$w_{\mathrm{PC}}$、$w_{\mathrm{C}}$。训练时第 $t$ 个样本被抽到的概率是:
多数任务使用 $1:5:1$,也就是把接触前样本相对自由空间和接触样本提高到五倍;拧盖任务使用 $1:3:3$,因为持续接触和结束时机同样关键。FIRST 没有修改动作回归损失,只是在每个小批次中改变样本构成。论文的对照实验显示,直接加权损失反而可能让优化不稳定,而增加关键阶段在批次中的出现频率更有效。
策略端使用流匹配模型时,专家动作块为 $\mathbf{x}_1$,高斯噪声为 $\mathbf{x}_0$,通过插值得到 $\mathbf{x}_\alpha$,网络学习从噪声指向专家动作块的速度:
动作块长度为 30,视觉编码使用 DINOv3-Base,策略同时使用 ACT 和流匹配 Diffusion Transformer 进行验证。FIRST 改变的是行为克隆的数据分布,因此可以叠加在不同策略骨干上,而不是绑定某一种生成模型。
开源实现如何对应论文公式
公开仓库的训练数据构建与论文公式一一对应。下面的代码把当前时刻以前的关节位置、速度和指令误差拼成输入,并把窗口最后一个时刻的测量力矩作为监督:
# src/factr2_next/factr2_next/training/dataset.py:60-63
x_step = np.concatenate(
[pos[:n], vel[:n], cmd[:n] - pos[:n]], axis=1
)
return x_step, torque[:n]
网络结构也与论文附录一致:两层 LSTM、隐藏维度 128,取最后一个时间步,再经过回归头输出各关节自由空间力矩。训练脚本使用均方误差,对应公式中的 $L_2$ 目标:
# src/factr2_next/factr2_next/training/models.py:86-105
self.lstm = nn.LSTM(
input_size=input_size,
hidden_size=hidden_size,
num_layers=num_layers,
batch_first=True,
bidirectional=bidirectional,
)
def forward(self, x):
y, _ = self.lstm(x)
return self.head(y[:, -1])
推理节点在滚动缓存填满后预测自由空间力矩,并计算 measured - tau_free。接触分数使用 L1 范数,高低阈值状态机也与论文一致。需要注意,仓库中的平滑、门控、斜坡和裁剪属于部署保护措施,README 明确说明这些保护没有用于论文报告实验。
实验分析
Franka 上的外力估计
作者使用带内置关节力矩估计的 Franka 作为参照。接触实验采集五分钟未见过的数据,由人向机械臂施加外力;自由空间实验同样采集五分钟无接触数据,并把真实外部力矩视为零。比较对象包括 FILIC、动量扰动观测器和 Franka 自带外力估计。表 1 给出平均关节 L1 误差。
| 运动类型 | 方法 | 平均 L1 误差(Nm) |
|---|---|---|
| 接触 | FILIC | 4.395 |
| 接触 | 扰动观测器 | 1.471 |
| 接触 | NEXT | 0.547 |
| 自由空间 | FILIC | 2.460 |
| 自由空间 | 扰动观测器 | 2.429 |
| 自由空间 | Franka 外力传感器 | 0.449 |
| 自由空间 | NEXT | 0.414 |
NEXT 在接触场景的平均误差为 0.547 Nm,比 FILIC 低 87.6%,比扰动观测器低 62.8%。更值得注意的是自由空间结果:真实外力为零,但 Franka 自带传感器仍有 0.449 Nm 的残差,NEXT 的 0.414 Nm 更低。这说明从具体硬件数据中学到的自由运动基线可以减少传感器噪声和未建模传动效应。
Piper 没有关节力矩传感器,因此接触阶段无法给出同样定义的数值真值。作者在自由空间仍可把零外力作为真值,NEXT 的平均误差只有 0.018 Nm,而 FILIC 为 0.435 Nm、扰动观测器为 0.248 Nm。这个差距表明模型确实适应了低价机械臂自身的摩擦和传动特征,但这组数据不能替代接触力的绝对精度评估。
用户研究:外力反馈是否真的有用
Franka 用户研究招募 20 名参与者,执行擦拭任务,并比较无反馈、扰动观测器反馈、位置-位置反馈、使用原装力矩传感的 FACTR Teleop,以及使用 NEXT 的 FACTR Teleop。两种 FACTR 方法都按外部力矩乘以反馈增益生成主手力矩:
参与者给出 1 到 5 分的易用性评分,同时记录完成任务所需施加的关节力矩。论文报告 NEXT 的易用性高于基线,所需施力接近依赖原装传感器的 FACTR Teleop。Piper 上重复实验时不能比较原装力矩传感版本,但 NEXT 仍优于其余反馈方式。这里的核心结论不是“学习信号完全等价于力传感器”,而是它已经足以支撑可用的闭环触觉反馈。
五项长程任务上的策略学习
策略实验使用双臂 Piper、四个 RGB 相机,每项任务采集 250 条演示,每项策略执行 20 次 rollout。任务包括乐高装配、NIST 皮带装配、NIST 插入、工具清理和拧盖。每项任务被拆成多个阶段,报告的是阶段完成比例,而不是只看最终成功或失败。这个指标能区分“完全不会做”和“已经完成大部分步骤,但在接触阶段失败”。
FIRST 的采样消融给出了最直接的设计证据。只增加接触样本时平均进度为 0.670,低于完整配置;只增加接触前样本达到 0.818;同时增加接触前和接触样本为 0.811。除拧盖外,多数任务的最佳设置偏向接触前 $1:5:1$,说明决定后续能否顺利接触的对齐阶段比“已经发生接触”更值得重复训练。
| 任务 | 仅接触 | 仅接触前 | 接触前 + 接触 |
|---|---|---|---|
| 乐高装配 | 0.697 | 0.913 | 0.875 |
| NIST 皮带 | 0.494 | 0.767 | 0.649 |
| NIST 插入 | 0.800 | 0.933 | 0.933 |
| 工具清理 | 0.650 | 0.805 | 0.775 |
| 拧盖 | 0.707 | 0.673 | 0.825 |
| 平均 | 0.670 | 0.818 | 0.811 |
拧盖是重要例外。它需要持续旋转并在盖子拧紧后停止,过早结束或继续过转都会降低得分,因此同时增加接触前与接触样本效果最好。论文还指出,过大重采样倍率会造成饱和甚至退化,最佳值通常在五倍附近,这说明 FIRST 不是“关键阶段越多越好”,而是在长尾失败样本和整体轨迹覆盖之间寻找平衡。
外力矩是否优于原始电流
由于很多低价机械臂本来就能读取电流,一个自然疑问是:为什么不直接把电流输入策略?作者在 NIST 插入和拧盖两项任务上比较了原始电流与 NEXT 外力矩。电流同时包含自由运动、负载、摩擦和控制努力,策略必须自己从瞬时观测中拆分这些因素;NEXT 则用五十步历史先完成拆分,再交给策略一个更紧凑的接触量。
| 方法 | NIST 插入 | 拧盖 |
|---|---|---|
| ACT | 0.220 | 0.440 |
| ACT + 原始电流 | 0.431 | 0.440 |
| ACT + NEXT 外力矩 | 0.567 | 0.525 |
原始电流在 NIST 插入上带来提升,但对拧盖没有帮助;NEXT 外力矩在两项任务上都最好。作者进一步用注意力图观察拧盖过程,发现外力矩策略在盖子拧紧附近提高了对力信号的关注,而电流策略的事件对齐更弱。注意力只是诊断,不是因果证明,但它与“外力矩更容易表达接触状态变化”的解释一致。
讨论:这项工作的真正贡献
FACTR 2 的贡献不只是降低传感器成本。它把“力感知”和“策略训练”之间的接口定义得更清楚:NEXT 输出一个具有物理单位的中间量,遥操作可以直接用它做反馈,行为克隆可以把它作为观测,也可以只把它用来给演示分段。一个估计模块因此服务多种下游用途,而不必为每个任务重新训练端到端接触检测器。
FIRST 的方法论意义在于,数据重采样可以在不改策略结构的情况下提高关键阶段曝光率。与辅助重建损失或强制增加接触加权损失相比,按批次改变样本分布保留了原来的回归目标,避免少量高权重样本主导梯度。这个结论对更多接触任务有可迁移性,但最优比例仍需要按任务验证。
从工程部署角度看,十分钟采集和一分钟训练显著降低了新机械臂的接入门槛。自由空间数据可以由遥操作、运动规划或已知轨迹回放产生,不需要力传感器、负载标定或人工动力学辨识。真实部署仍要处理安全门控、传感器噪声和反馈稳定性,但这些属于明确的下游工程问题,而不是数据准备阶段无法跨越的门槛。
局限性
第一项作者自述局限是力矩常数 $K$ 的准确性。NEXT 学习的是自由空间力矩基线,但电机电流到绝对力矩的换算仍依赖厂商参数或电流-力矩曲线。如果 $K$ 有系统偏差,外力矩的绝对尺度也会偏。论文指出,遥操作反馈通常会为了手感重新缩放,策略输入也会归一化,因此绝对尺度误差在报告场景中影响有限;若要断言真实牛顿值或做精密力控制,仍需要外部传感器标定。
第二项作者自述局限是机器人特异性。不同机械臂的摩擦、传动、控制器和动态特性会改变自由空间力矩分布,NEXT 可能需要在每台机器人上重新训练。十分钟数据和一分钟训练让重新部署很便宜,但这仍不是零样本跨平台迁移,也没有证明同一模型能直接覆盖不同夹爪、负载和磨损状态。
独立来看,低成本机械臂缺少接触力真值是最主要的证据边界。Piper 的自由空间可以精确评估,因为真实外力为零;接触性能只能用用户研究和策略任务间接验证,无法像 Franka 那样给出逐关节 L1 误差。用户研究能证明信号有用,却不能单独分离力矩估计误差、反馈增益和操作者适应带来的影响。
此外,FIRST 的接触阶段依赖阈值和任务内选出的采样比例。论文对多数任务采用 $1:5:1$,对拧盖采用 $1:3:3$,这些比例通过任务进度选择,而不是从统一规则自动推出。实际部署到新任务时,需要确认外力估计的阈值、接触起点定义和阶段权重仍能对应真正的失败集中区。公开仓库主要覆盖 NEXT,也限制了外部研究者完整复现 FIRST 策略侧实验的便利性。
总结与展望
NEXT 用十分钟无接触数据学习自由空间力矩,再从电机电流残差中恢复外部关节力矩;FIRST 把这个信号转化成接触阶段标签,通过重采样把行为克隆的注意力集中到对齐和接触阶段。两者组合后在五项长程任务上取得了 0.818 的平均进度,在 Franka 接触估计中把平均误差降到 0.547 Nm,并让无原装力传感器的 Piper 获得可用的遥操作反馈。
这项工作提供了一条实用的低成本力觉路线:不追求一次建立完整解析模型,而是让每台机器人学习自己的自由运动基线。下一步值得关注的是跨机器人预训练与少量微调、在线适应负载和磨损、以及把接触阈值和重采样比例从人工选择变成基于策略失败的可学习机制。
先学会机器人“没有接触时应该用多大力”,剩下的电流变化才会变成真正可用的触觉。



