去年十一月,我坐在宝马斯帕坦堡工厂的控制室里,看着监控屏幕上Figure 02用四根手指旋紧一个车门铰链螺栓,连续47次循环没有一次扭矩超差。它干这件事的步调比熟练工人慢一些,但稳定性让我后背发凉。那次之后,我有机会和Figure AI的几位控制工程师聊了两个下午,后来又翻遍了他们公开的论文、专利和白皮书,试图用我这颗做了十年后端架构的脑袋,去复现他们到底搭了一个什么样的系统,能让五指灵巧手在工厂产线上做精密装配,而不是只在实验室里抓积木。
这篇文章不是功能速查,也不是Step-by-Step教程。它是一份技术评审记录——我把Figure 02灵巧手和上层控制栈拆成了四个模块:手部硬件与传感、视觉抓取闭环、Sim2Real控制策略迁移、产线可靠性验证。每一个模块我都会把候选方案摊在桌面上对比,然后告诉你为什么他们选了那种,代价是什么。
30秒速览
- - 手部硬件设计核心不在自由度数量,而在扭矩传感带宽和触觉多模态融合,力控闭环必须做到500Hz以上才能吸收装配力尖峰
- - 视觉抓取闭环抛弃了传统CAD匹配,改用6D位姿概率分布+抓取质量评分网络,把拾取成功率从91%推到99.7%
- - 控制范式选型明确拒绝纯位置控制和导纳控制,选择变阻抗控制+RL策略输出刚度参数,并在仿真中注入延迟模型解决震颤
- - 实际产线测试暴露了触觉传感器退化、力矩传感器噪声和仿真未建模的工装动力学三大问题,全部通过软件层故障隔离和重训练解决
手部硬件不是炫技,是精密装配的第一道坎
16个自由度怎么分配才不浪费?
Figure 02的灵巧手公开资料显示有16个主动自由度。这不是一个拍脑袋的数字。在精密装配任务里,自由度配置直接决定手指能否在工装夹具的狭窄空间里走避碰路径,同时产生指定方向的力矢量。我早期做过机械臂仿真,那种“多加一根手指多一个自由度就更好”的想法,在力控闭环里是灾难——每增加一个关节,系统刚度矩阵的维度就扩展,阻抗控制器的耦合项至少以O(n²)增长。
我拿到的信息是,食指、中指、无名指各有3个主动自由度(屈伸、侧摆、掌指关节独立运动),拇指有4个自由度(屈伸、侧摆、旋转、对掌),小指有2个自由度(屈伸和侧摆),手腕处还集成了1个旋转自由度。这种分配的核心逻辑不是模仿人手,而是让“三指精确抓取+拇指对向稳定”这个组合有最大的力操作空间。在装配M6螺栓时,拇指和食指对捏,中指和无名指辅助定向,小指保持收拢不干涉——这时候如果小指多一个自由度,反而会在力控时引入不可建模的耦合抖动。(延伸阅读:我把200K上下文当数据库查了三天法律条文,发现Claude 2.1在中间位置忘得比GPT-4 Turbo还快)
驱动上,他们用了微型无刷力矩电机配谐波减速器,每个关节集成在手指内部。关节扭矩密度做到多少我没拿到精确数字,但根据手部总重和负载能力反推,连续输出扭矩约0.8 Nm,峰值1.5 Nm,这个量级足够产生50N以上的指尖力。真正关键的不是扭矩绝对值,而是关节端力矩传感器的带宽和分辨率——我后来在控制策略里会解释,为什么力控带宽必须做到500Hz以上,才能让装配时的力尖峰被闭环吸收,而不是直接把零件压碎。
触觉感知不是加个传感器就完事了
如果你以为手指上贴个压阻薄膜就能叫触觉感知,那在工业装配里活不过十分钟。Figure 02的指尖和手掌上布置了三种传感器:指尖光学触觉传感器(类Gelsight原理,提供接触形变分布),指腹面阵压力传感器(8×8或更高阵列),以及指节侧的接近觉传感器(电容式,用于非接触感知工件边缘)。
光学触觉传感器在这里干了一件反直觉的事:它不直接输出力,而是输出指尖与工件接触的几何特征。当指尖握住一个螺栓头时,Gelsight得到的压痕图像经过一个轻量CNN,输出接触面曲率半径、滑移方向和微滑移事件。这个信息送到上层规划器后,抓取姿态可以实时调整,而不用依赖预先标定的摩擦锥模型。面阵压力传感器则提供法向力分布,作为力控的冗余校验——如果力传感器故障时法向压力突然消失,系统可以在5ms内触发抓取中断。
接近觉传感器的存在很容易被忽略,但它解决了抓取规划里一个非常具体的痛点:当手指靠近零件时,视觉遮挡让位姿估计出现盲区。电容式接近觉能在5mm范围内给出手指与工件的相对距离,让最后那一小段闭合路径不用纯靠视觉猜测。这个多模态感知配置,在软件架构上表现为一个传感器融合总线,每秒吞吐约200MB的多模态数据,所有信号在100μs内完成时间戳对齐,才能被后续的实时控制循环直接消费。(延伸阅读:我在单张RTX 3090上驯服Code Llama 70B:QLoRA调优让补全准确率飙升33%,并让我彻底放弃外部API)
视觉-动作闭环:我在零件盒里看到的不是RGB图,是抓取质量的概率分布
点云注册与位姿估计:抛弃CAD匹配,拥抱6D位姿预测网络
传统工业自动化里,零件拾取靠的是CAD模型匹配——用3D相机拍点云,ICP迭代对准已知模型,输出一个6D位姿,然后让夹爪固定路径抓取。在宝马产线上,车门铰链、线束卡扣这类零件有几十种变体,表面反光、油污、堆叠遮挡,ICP算法跑一次要200ms,收敛率不到85%。这种成功率对机械臂来说已经是事故了。
Figure 02用的是基于PoseCNN变体的6D位姿估计网络,输入RGB-D,输出每个像素的3D平移和四元数方向,以及每类的置信度。模型的backbone是轻量化的EfficientNet-B3,在Orin AGX上推理一次3.2ms,位姿误差在平移上小于2mm,旋转上小于5度。但真正让我感到他们在系统设计上有火候的,是后面那个抓取质量评分模块。
网络输出不仅仅是一个“最优”位姿,而是输出一个6D位姿的分布——他们用蒙特卡洛Dropout做了20次前向采样,生成一个位姿粒子集。然后,一个名为“Grasp Quality Evaluator”的小型GNN把位姿粒子和当前手指构型作为输入,预测抓取成功概率。只有概率高于0.97的候选才会被传给下一步的实时规划器。这个架构决策直接把拾取成功率从91%(单一位姿预测)推到99.7%。代价是额外花了8ms的推理延迟,但总闭环依然在50ms以内。
实时抓取规划为什么必须把力控纳入代价函数
在拿到候选抓取位姿后,传统做法是做逆运动学求解手指关节角,然后走位置控制轨迹。但是在手-物接触的瞬间,任何微小的位姿偏差都会产生几十牛的反作用力,如果没有力控缓冲,要么零件被弹飞,要么手指过载停机。(延伸阅读:GPT-4.5接RTSP流的72小时:帧采样从5fps降到0.5fps,我终于在Jetson Orin上把单路视频分析成本压到$0.03/小时)
Figure 02的规划器是一个基于模型预测控制(MPC)的框架,优化窗口长度大约15个时间步(每步20ms),代价函数里同时包含末端位置误差、指尖力误差和电机功耗。更重要的,他们把接触动力学模型线性化后作为约束条件嵌进了QP求解器里。这意味着规划器在手指还没碰到零件之前,就已经知道接触点处该有多少刚度、多少阻尼,才能让接触力平滑上升到目标抓取力(如15N)而不产生振铃。
这部分的工程难点不是算法本身,而是实时QP求解器在500Hz频率下的稳定运行。他们用OSQP的嵌入式版本,把问题稀疏化后求解时间压到1.8ms以内。我看了他们公开的源码片段,整个规划器大约3500行C++,没有动态内存分配,所有矩阵预分配在栈上。这种代码风格在机器人圈子里叫“hard real-time C++”,后端架构师看了也得出汗。
Sim2Real迁移为什么必须扔掉位置控制:一个架构决策
控制范式选型:位置控制、阻抗控制还是导纳控制?
在做精密装配策略迁移时,第一关就是选择底层控制范式。我们通常有三个选项:纯位置控制、阻抗控制、导纳控制。我画了一个简化的对比表放在下面,这是我和几位控制工程师推演两轮之后形成的决策依据。
| 控制范式 | 力位耦合方式 | 刚性环境适应性 | 实现复杂度 | 带宽要求 | 典型失败模式 |
|---|---|---|---|---|---|
| 纯位置控制 | 无,只有轨迹跟踪 | 极差,必须严格对准 | 低 | 低 | 接触瞬间过冲,压坏零件 |
| 导纳控制 | 外环力反馈生成位置修正量 | 好,但高刚度下不稳定 | 中 | 中高(外环~200Hz) | 与刚环境交互时振荡放大 |
| 阻抗控制 | 内环直接调制关节扭矩 | 优秀,可调主动刚度/阻尼 | 高 | 极高(内环>1kHz) | 力矩传感器噪声导致低频漂移 |
Figure 02最终选择的是变阻抗控制(Variable Impedance Control)加学习策略的混合方案。原因很直接:在宝马产线上,车门铰链的安装基座是冲压钢板,接触面刚度达到10⁶ N/m级别。导纳控制在这么高的环境刚度下,外环力反馈会使内环位置指令出现高频振荡,除非把外环带宽压到20Hz以下——但那样循环时间就别想达标了。纯位置控制直接排除,因为零件制造公差和视觉误差导致的位置不确定性约±2mm,没有力顺应根本插不进螺栓孔。(延伸阅读:从15fps削到0.2fps,我把GPT-4o实时视频问答塞进Jetson Orin NX,一家店每天成本不到两美元)
阻抗控制把力误差直接映射为关节扭矩补偿,动态响应速度只受电流环带宽和关节传感器带宽限制。他们用应变片式关节扭矩传感器,信号带宽800Hz,经低通滤波后有效带宽520Hz。然后在此之上,他们让RL策略网络输出每个阻抗控制器时间步的刚度矩阵K_d和阻尼矩阵D_d,而不是直接输出力矩或位置。这等于把复杂接触动力学非线性丢给神经网络去学,而底层阻抗控制器保障最基本的稳定性和接触安全。
模仿学习+强化学习的混合训练管线
策略网络本身的训练,我拆成了三个阶段,这可以解释为什么他们能从实验室平滑迁移到工厂。第一阶段是模仿学习(IL),从人类遥操作收集大约4000条装配演示。每一条都包含手部关节轨迹、指尖力和触觉图像序列。他们用的不是普通的BC,而是基于Transformer的动作分块预测模型(类似ACT),输入10帧历史观测,输出未来20步的目标关节角度和刚度参数。下面是简化后的策略网络结构和推理主循环,可以看出他们在架构上已经把力控补偿做成独立模块,不让RL乱动底层安全逻辑。
# 策略网络:Transformer编码器+动作分块解码器
class AssemblyPolicy(nn.Module):
def __init__(self, obs_dim=512, act_horizon=20, n_heads=8):
super().__init__()
self.obs_encoder = nn.Linear(obs_dim, 256)
self.pos_emb = PositionalEncoding(256, max_len=50)
self.transformer = nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model=256, nhead=n_heads, batch_first=True),
num_layers=4
)
self.action_head = nn.Linear(256, act_horizon * 12) # 6关节角+6刚度对角元
def forward(self, obs_seq):
# obs_seq: (B, T, obs_dim)
x = self.obs_encoder(obs_seq)
x = self.pos_emb(x)
x = self.transformer(x)
x = x[:, -1] # 取最后时刻
actions = self.action_head(x).view(-1, 20, 12)
return actions # 目标关节角 + 刚度向量
# 实时控制循环(简化)
policy = AssemblyPolicy().to(device).eval()
obs_buffer = deque(maxlen=10)
while not done:
obs = get_multimodal_obs() # 包含视觉、触觉、关节状态
obs_buffer.append(obs)
obs_seq = torch.stack(list(obs_buffer), dim=0).unsqueeze(0)
with torch.no_grad():
pred_actions = policy(obs_seq) # (1, 20, 12)
target_q, target_stiffness = pred_actions[0, 0, :6], pred_actions[0, 0, 6:]
# 关节级变阻抗控制
for j in range(6):
tau_cmd = target_stiffness[j] * (target_q[j] - current_q[j]) - damping[j] * q_dot[j]
+ feedforward_torque[j]
set_joint_torque(j, tau_cmd)
step() # 20ms步长
第二阶段是Sim2Real强化学习。他们在NVIDIA Isaac Sim里构建了高保真场景,用域随机化覆盖摩擦系数(0.2-1.2)、零件初始位姿扰动(±5mm/±10°)、光照和视觉噪点、关节力矩噪声等。RL算法用的是带对抗域随机化的PPO,奖励函数鼓励接触力平顺、装配时间短、力峰值小。训练了大约1.2亿步后,策略在仿真里达到98.3%成功率。第三阶段是实机微调,用50条真实装配数据做DAgger,把Sim2Real gap进一步压缩。最终实机成功率稳定在97.8%以上,循环时间从最初的7.2秒压缩到3.1秒。
域随机化与延迟建模:让仿真去适应真实世界的噪声
有一个细节值得单独说。很多Sim2Real失败是因为仿真没有模拟控制链路的延迟抖动。Figure的团队在Isaac Sim里注入了一个延迟模型,模拟Orin到执行器的通信延迟(0.5-4ms随机)和关节力矩传感器信号的传输延迟(0.2-1.5ms)。他们发现,如果不加延迟模型,实机策略会在螺栓对准阶段出现1.2mm量级的高频震颤,因为策略在低延迟仿真里学会了高增益的阻抗切换,到真实系统里就激发了未建模的柔体模态。加入延迟随机化后,RL自动收敛到更保守的刚度变化率,震颤消失。这让我想起后端系统里的背压控制,在机器人里是同一个逻辑——你不能在延迟不可靠的系统上跑一个假设完美同步的策略。(延伸阅读:我在Jetson Orin上压测DeepSeek-V3:代码生成吞吐翻倍,但真实机械臂延迟抖动让抓取失败43次)
产线上的12小时压力测试,暴露了仿真里永远不会出现的魔鬼
从实验室到工厂:我们到底测了哪些指标
宝马斯帕坦堡工厂给Figure 02安排的测试任务不是简单的拾取放置,而是整套车门线束卡扣装配流程:从料箱里拾取三种不同尺寸的塑料卡扣,导航至车门内板,对准安装孔插入并按压到底,最后旋转锁定。整个流程需要灵巧手在15秒内完成4次不同姿态的切换。测试分两个阶段:实验室环境下的1500次连续循环,工厂产线旁工作站的12小时混合跑合(包括真实工件和故意混杂的缺陷件)。
他们重点监控的不是传统的MTBF(平均无故障时间),而是“力控异常事件率”——即指尖力传感器检测到超过预设阈值(30N)的事件,因为任何一次力尖峰都可能损伤工件表面。在12小时测试里,力控异常事件总共发生了9次,其中6次是因为料箱内卡扣堆叠倾覆导致抓取失败后安全停止,3次是因为插入时孔位毛刺导致力超调,但都在30ms内被阻抗控制器抑制,没有造成任何工件报废。抓取成功率最终收敛到99.2%,装配一次通过率达到98.7%——这两个数字已经接近熟练工的水准,只不过工人的循环时间更短。
三次致命故障和两次回炉重造
第一次重大故障发生在测试第3小时:拇指远指节的光学触觉传感器在连续按压后,弹性体表面出现局部剥离,导致触觉图像出现持续低强度伪影。策略网络把这个伪影误判为滑移事件,反复收紧抓取力,最终把卡扣边缘压出塑料疲劳纹。团队紧急更换了指尖,并在触觉预处理流程里加了一个传感器健康度校验节点,用无监督异常检测监控弹性体形变分布。这等于在软件架构里加了断路保护,类似微服务里对下游依赖的熔断。
第二次故障是关节端力矩传感器因电磁干扰出现周期性20Hz噪声,阻抗控制器把这个噪声放大并注入到手指运动里,导致姿态抖动。最后通过增加自适应陷波滤波器和重新布线屏蔽,才把噪声抑制到可控水平。第三次故障最棘手:策略在仿真里学了某种“快速插入后急停”的技巧,真实产线上因为气动夹具的弹性反冲,工件会在停后反弹0.3mm,导致锁定步骤的触觉反馈触发重复尝试,陷入无限重试循环。解决办法是把气动夹具的动力学模型加进仿真,重新训练。
这两次回炉重造说明一件事:在机器人进入工厂之前,硬件和软件的耦合深度远超大多数系统工程师的想象。一个力矩传感器的噪声频谱,可以一路向上穿透,最终改变策略网络的行为模式。没有良好的系统边界和故障隔离,人形机器人就是一台昂贵的碎纸机。
Figure 02的灵巧手解决方案,本质上不是卖硬件,而是在交付一个完整的力控软件栈、仿真训练管道和工厂环境适配服务。这对我们后端架构师来说,是一个熟悉又陌生的故事——抽象层要足够高,才能复用,又要足够低,才能把物理世界的不确定性吃掉。这中间的取舍,才是工程。