
机械臂是如何被控制的
SO-100 用关节位置控制,策略直接输出关节角度即可绕开 IK 的 0% 可达性难题,剩下的纯是学习问题。
如果你是一位刚踏入机器人学习领域的机器学习从业者,直接操控硬件可能看起来令人生畏。我希望这篇文章能帮你跨过这道坎。
我会介绍 SO-100 机械臂是如何构成的、我们如何记录数据、它如何追踪目标、机器学习策略如何驱动它,以及我们可以使用的不同表示方式。我还会解释为什么反直觉的是,机械臂在臂展范围内能到达的夹爪位姿(位置 + 朝向)恰好是 0%。
请注意,本文中的所有内容同样适用于更新的 SO-101,且大部分内容适用于任何机械臂。
这是我在 Speedrunning robot learning 中承诺的系列解读文章的第一篇。其余几篇我会在未来一两周内发布。

SO-100 从动臂的各个关节。
拆解机械臂
我一直在研究的机器人是 SO-100 机械臂。它由六个连杆组成,连杆之间有五个关节,它们共同决定了夹爪的“位姿”(即位置 + 朝向)。夹爪本身可以开合,因此它是一个额外的关节和连杆。
每个关节都包含一个伺服电机,由电机、齿轮箱、编码器和控制器组成。控制器接收该关节的目标角度,并从编码器读取当前角度。它每秒多次确定应施加的扭矩,并向电机发送相应的电压(电压是扭矩、齿轮和速度的函数)。因此,为了控制机械臂,我们每秒向其发送几十次(在 LeRobot 中为 30 Hz)每个关节的目标角度。这被称为(关节)位置控制,虽然它不是控制伺服电机的唯一方式,但它是 SO-100 所采用的方式,因此也是我们这里要介绍的内容。

收集数据
发送目标角度也是记录演示的方式。SO-100 装置由一个主臂和一个从臂组成。主臂的设计使得人类可以用很小的力手动移动它。主臂的关节角度从其伺服电机读取,并作为目标角度发送给从臂。通过同时将主臂关节角度、从臂关节角度以及任何连接相机帧的时间序列写入磁盘,我们得到了一个输入-输出对的“遥操作”数据集(主臂的角度是输出,其余是输入)。

从臂复制主臂的关节角度。曲线颜色与上方的关节标签对应:绿色肘部弯曲、蓝色腕部弯曲、灰色夹爪、紫色腕部旋转、红色肩部平移、黄色肩部抬升。粗浅色:主臂。细线:从臂。
追逐目标角度
SO-100 伺服电机使用 PID 控制器。PID 控制器被建模为一个将关节拉向目标角度的弹簧(“P”代表比例),一个旨在阻止其越过目标的阻尼器(“D”代表微分),以及一个积分项(“I”)。最后一项测量随时间累积的系统偏差,并添加消除该偏差所需的额外扭矩,从而抵消那些否则会使平衡点偏离目标的外力(例如重力抵消弹簧力)。SO-100 机械臂将 I 项设为零,因此不会纠正系统偏差。
平衡 P 项和 D 项并非易事。弹簧欠阻尼,就会冲过目标位置。过阻尼,运动又会变得迟缓。临界阻尼是不产生超调的最小阻尼,对于我们的弹簧而言,当阻尼增益 D(单位角速度所施加的力矩)等于 2·√(P·J) 时即达到临界阻尼,其中 J 是关节需要带动摆动的所有物体的转动惯量。这个惯量并非恒定值,因为它取决于姿态:手臂其余部分伸出关节越远,J 就越大(对于肩部抬升关节,折叠与伸展状态之间相差超过 10 倍,不过电机自身的转子在上面叠加了一个很大的常量,使这个比值大幅缩小)。然而控制器的 D 是固定的,因此关节只能在某一个 J 值处达到临界阻尼。手臂伸得比那更远,关节就会欠阻尼并超调。收得更紧,就会过阻尼并缓慢爬行。

同一关节和弹簧,三种阻尼强度。黑色圆圈:目标夹爪位置。虚线:目标角度。箭头和底部曲线:弹簧力矩和阻尼力矩。
此外,廉价机械臂的电机相当弱,因此它能产生的力矩是有限的。如果目标角度变化过于剧烈或迅速,弹簧力矩与阻尼力矩之和会在电机最大力矩处被截断,从而变成其输入的非线性函数,临界阻尼以及系统的许多其他优良特性也随之消失。

目标角度的大幅跳变会使关节超调。只有 140° 的阶跃变化快到无法及时制动。黑色圆圈:目标夹爪位置。虚线:目标角度。底部条:电机处于 MuJoCo 模型 3.5 N·m 力矩限制时显示红色(先用于加速关节,再用于减速),否则显示灰色。
表示状态
现在再来看完整的机械臂。五个关节,每个都有合法活动范围,这就构成了一个 5 维的“关节空间”:一个存在于 R^5 中的长方体,其中坐标 i 描述第 i 个关节的角度(夹爪还会增加第六个坐标,这里先略去,因为它并不移动机械臂)。而我们通常真正关心的是任务空间:表示夹爪位置 (x, y, z) 和姿态 (roll, pitch, yaw) 的 6 维空间。注意,关节空间中并非所有点都在物理上合法,因为其中超过 10% 的点会导致连杆发生碰撞。

正运动学(FK)是从关节空间变换到任务空间的任务。它无非就是从基座开始,依次执行一串刚性变换(旋转 + 平移),每一步都由某个关节的角度以及紧随其后的连杆几何形状决定。像 MuJoCo 这样的仿真器会在每个物理步(默认 500 Hz)运行 FK,以计算机械臂每个部分在空间中的位置,并施加相应的物理效果。
逆运动学(IK)是 FK 的逆过程:给定任务空间中的一个点,找到关节空间中一个会被 FK 映射到该点的点。FK 本身没什么问题,IK 却可能很麻烦,原因有三。
第一,FK 通常不是单射函数:关节空间中的每个点都对应任务空间中的唯一一个点,但关节空间中的多个点可能对应任务空间中的同一个点。

不同的关节角度,相同的夹爪位姿。
因此,如果机器人策略输出一系列目标坐标,我们就必须谨慎选择每个坐标对应的 IK 解,以免在不同关节角度之间大幅跳变。

同一个 UR5e 上的夹爪圆圈,两种求解 IK 的方式。左图:每一步都从头求解 IK。右图:IK 从上一步的解开始求解。
其次,FK 不是满射:任务空间中的大多数点都没有 FK 原像(即 FK 会映射到该点的点),例如因为距离太远,或所需的关节角超出合法范围。这对 SO-100 来说尤其突出:FK 是光滑的,其定义域(关节空间)位于 R^5 中,而其陪域(任务空间)是 6 维的,因此它的像只是陪域中的一个低维子集,故其 Lebesgue 测度为 0。简单说,如果你在臂长范围内(均匀)随机抽取一个目标姿态和一个目标位置,SO-100 机械臂能够(精确)到达该位姿的概率是 0%。
第三,FK 存在奇异点(即雅可比矩阵——FK 的导数——降秩的构型),例如当机械臂完全伸展时。以恒定速度迎面接近或离开奇异点时(例如在保持夹爪速度恒定的同时将机械臂完全伸展),所需的角速度(以及力矩)会趋于无穷大。原因在于,完全伸展时可达距离最大,因而在肘关节角处是驻定的,所以最后 ε 的可达距离需要约 √ε 的肘关节角,而 √ε 在零点处的斜率是无穷大。然而,我们的电机对其角速度(以及力矩)有上限,结果控制器就会落后于计划。

接近完全伸展时关节速度骤增,尽管夹爪以恒定速度移动。绿色:肘部弯曲。蓝色:腕部弯曲。黄色:肩部抬升。竖直虚线:快照时刻(第一个在 t=0)。
选择我们的空间
由于我们的控制器读取的是目标角度,因此一个输出任务空间点的策略,必须先对其输出运行 IK,然后才能把关节空间中对应的点发送给伺服电机。如果策略的训练集涵盖不同的机械臂——例如 OpenVLA 就是这种情况——那么学习任务空间增量可能比学习关节角度更容易,因为每只机械臂都有一个夹爪位姿,而关节则因臂而异。反之,如果策略只在单只机械臂上训练(或通过对缺失自由度进行零填充来训练),我们就可以教它直接输出关节角度——这本来就是示教数据的呈现形式——从而完全绕开对 IK 的需求。ACT 和 π0 就是直接输出关节角度的策略示例。至于这些角度是绝对角度还是相对于当前位姿的增量,则是一个独立的选择,两种策略都有。增量在机械臂当前所处的任何位置看起来都一样,因此易于归一化。ACT 输出绝对目标角度(并报告说增量对它效果更差),而 π0 的官方实现则基于增量进行训练。
因此,在单只机械臂上,那 0% 永远不必发作,因为我们可以让策略输出关节角度,直接发送给伺服电机即可。
接下来是什么
剩下的就是真正的学习问题了,即如何从相机图像和当前关节角度得到下一组目标角度。最直接的做法(从当前状态预测下一个目标角度)有两个大问题。一个能同时解决这两个问题的方案就是 ACT,也就是下一篇讲解的主题。