Part II · 第 7 章 结构与运动学 · 7.5

逆运动学:解析与数值

任务说的是"手爪放到这里、姿态这样",电机只听得懂关节角。逆运动学(IK)就是这中间的翻译:它可能无解、可能有几个解、也可能有无穷多个。能写出闭式解的机械臂几微秒就能给出全部解;一般的机构则要靠 SE(3) 上的牛顿迭代,一次只找到一个解,找到哪一个还取决于初值。本节从平面 2R 的"两圆相交"出发,推出一台带球腕的真实 6R 臂的 8 个解,再看数值 IK 如何收敛、为什么会失败,以及沿路径跟踪时该选哪一个解。

约 35 分钟 前置:3.4 机器人雅可比 · 5.6 指数与对数映射 · 6.6 牛顿与高斯–牛顿 · 7.3 正运动学 · 7.4 速度运动学 6 个交互

    1为什么机器人需要它

    你对机械臂下的命令是"手爪去那个杯子的把手,朝向这样",电机能执行的却是"每个关节转到多少度"。7.3 节的正运动学 \(T(\mathbf q)\) 把关节角映成手爪位姿,是一个函数;逆运动学要反过来:给定想要的位姿 \(T_d\in\SE\),求 \(\mathbf q\) 使 \(T(\mathbf q)=T_d\)。反方向的问题却不再是函数了:

    • 可能无解:目标太远,或者落在手臂折不进去的"洞"里。
    • 可能有有限多个解:同一个手爪位姿,手臂可以"肘上"也可以"肘下",腕可以翻也可以不翻。
    • 可能有无穷多个解:冗余臂能在手爪不动时改变形状(3.4 节的零空间),一些奇异位形下非冗余臂也会如此。

    每个笛卡尔速度指令、每个抓取候选(一次要试成百上千个)、遥操作里的每一帧、规划器采样出的每个目标,都要先过 IK 这一关,所以它既要快,又要可靠:知道有没有解,知道有几个,知道现在该选哪一个。

    两大流派各有所长。解析(闭式)IK 利用机构的几何,把方程解成公式,几微秒内给出全部解,但每种构型都要单独推导,只对满足条件的机构存在(本节的 Pieper 准则)。数值 IK 把 3.4 节的"线性化、解一步、重复"搬到 SE(3) 上,对任何机构都适用,但一次只给出一个解,依赖初值,并且可能失败。3.4 节已经在平面上用伪逆和阻尼最小二乘做过数值 IK,这里不再重复,而是:

    • 先看为什么平面 2R 有两个解、解在哪里消失(FIG 1),以及位置与位姿约束如何决定解的"个数"与"维数"(FIG 2);
    • 再推导一台真实 6R 臂的闭式解,得到 8 个分支(FIG 3);
    • 然后在 SE(3) 上做数值 IK,看它怎样收敛、怎样失败,以及"初值决定去哪"(FIG 4、FIG 5);
    • 最后沿一条路径跟踪,看选错分支会让关节突然翻转(FIG 6)。

    2直觉:两个圆相交

    最小的例子:平面两连杆臂,连杆长 \(l_1,l_2\),手爪要到点 \(\mathbf p=(x,y)\)。关节 1 在原点,所以肘部一定在以原点为圆心、半径 \(l_1\) 的圆上;手爪必须落在目标,所以肘部离目标的距离恰是 \(l_2\),即肘部又在以目标为圆心、半径 \(l_2\) 的圆上。肘部同时在两个圆上,就是两个圆的交点。

    两个圆交于几点,立刻读出解的个数:两点("肘上"和"肘下",关于原点到目标的连线互为镜像)、一点(两圆相切,手臂完全伸直或完全折回)、零点(太远,或落在内圈的"洞"里)。可达区域因此是一个圆环 \(|l_1-l_2|\le r\le l_1+l_2\),\(r=\|\mathbf p\|\)。拖动目标试试;再用滑块改变 \(l_2\),看圆环的"洞"怎样随两根连杆的长短变化。

    FIG 1平面 2R:两圆相交的解析 IK
    拖动琥珀色目标。蓝色虚线圈是肘部的轨迹(半径 \(l_1\)),紫色虚线圈是"离目标 \(l_2\)"的点集;它们的交点就是两种肘部位置。青色圆环是可达区域,目标会"吸附"到内外边界上,方便你恰好停在边界。读数里的 FK 误差是把解代回正运动学得到的手爪位置与目标之差,应是 \(10^{-16}\) 量级。
    试一试
    • 把目标拖到外边界(完全伸直,\(r=l_1+l_2\))。两个解变成了几个?
    • 把目标拖进内圈的"洞",离原点很近、却无解。再想想:\(l_2=l_1\) 时洞会变成什么?
    核心洞见

    逆运动学是方程组而不是公式:解的个数随目标位置变化,在可达区域的边界上,两个解合并成一个然后消失。这不是数值误差,而是几何本身。闭式 IK 把"几个解、在哪里"一次说清;数值 IK 只能告诉你它走到了哪一个。

    3动手玩:位置、位姿与解的维数

    "到那个点"与"到那个点,并且手爪朝这个方向"不是一回事。数一数未知数(关节数 \(n\))和约束数(\(m\):平面里位置 2 个,位姿 3 个):\(n-m>0\) 时解是一个 \((n-m)\) 维的连续族(可以在手爪不动时"自运动"),\(n=m\) 时通常是有限个解,\(n<m\) 时一般无解。这正是 7.1 节的自由度计数在逆运动学里的样子,也是 3.4 节零空间的非线性版本:零空间是解集在一点处的切空间。

    下图用 3R 或 4R 平面臂演示。右图把关节角画成自由参数的函数:3R 只要位置时,自由参数是手爪朝向 \(\varphi\),每条曲线是一族连续解(实线肘上、虚线肘下);要求位姿就是在 \(\varphi\) 处竖直切一刀,只剩下有限个点。切刀落在曲线的空隙里,就是"位置够得着、这个朝向却做不到"。

    FIG 2位置 vs 位姿:数一数解
    工作空间:淡色手臂 = 满足约束的解族
    构型空间中的解集(沿自由参数)
    琥珀色菱形是目标位置,箭头是手爪朝向 \(\varphi\)(只要位置时变淡)。青色和紫色的淡色手臂是同一个约束下的一族解(青:肘上,紫:肘下);实心的手臂是当前滑块处的精确解(灰:肘上,紫:肘下)。右图中红、绿、蓝、紫曲线分别是 \(\theta_1,\dots,\theta_4\),曲线中断的地方就是该自由参数下 2R 子问题无解之处。4R 时横轴是连杆 3 的朝向,朝向 \(\varphi\) 取滑块的值。
    试一试
    • 选 3R、"位置 + 朝向",让目标留在手臂够得着的范围内,调 \(\varphi\) 直到精确解个数为 0:位置本来够得着,这个朝向却不行。
    • 切到 4R、"只要位置":解集的维数是几?灰色手臂铺成了什么?
    同一个想法的三个视角

    几何:解是几个圆(球)的交点,交点个数随目标变化。计数:未知数减约束数给出解集的维数 \(n-m\)。线性化:在某个解处,\(J\Delta\mathbf q=\mathbf 0\) 的解(3.4 节的零空间)是解集的切空间。三者说的是同一件事:IK 的解集是构型空间里的一个"流形",维数 \(n-m\),有限个解只是 0 维的特例。

    4第二、第三视角:真实 6R 臂的闭式解,与数值 IK

    腕心解耦:8 个解

    这里用的是 7.3、7.4 节同一台 Robot.arm6:J1 绕竖直轴偏航,J2、J3 是肩与肘的俯仰(正俯仰让 \(+x\) 方向向下倾,右手定则),J4–J6 是"滚转–俯仰–滚转"的腕,三根腕轴交于腕心 \(\mathbf p_w\),工具原点在腕心前方 \(d_6\) 处。关键观察:腕心的位置只由前三个关节决定,不管手腕怎么转。于是六个未知数拆成两个小问题:

    1. 位置:由目标位姿算出腕心 \(\hl{pw}{\mathbf p_w}=\mathbf p-d_6R\,\mathbf e_x\),用它解 \(q_1,q_2,q_3\)。\(q_1\) 是腕心的方位角(有两个分支:\(q_1\) 与 \(q_1+\pi\),手臂"从前面"够,或者 J1 转 180° 后从"身后"翻过来够);然后在过肩部的竖直平面里,就是 FIG 1 的 2R 问题(肘上、肘下)。
    2. 姿态:前三个关节已知后,剩下的旋转 \(R_3^6=(R_0^3)^\top R\) 必须由腕补上。腕是"滚转–俯仰–滚转",把一个旋转矩阵分解成这三个角,有两个分支(\(q_5\) 的符号,即腕翻转)。

    三个二选一,共 \(2\times2\times2=8\) 个解。下图把它们全部画出来:灰度淡的是越出关节限位的解,实心的是当前选中的解,表格给出每个解的关节角、FK 往返误差(把解代回正运动学,再与目标位姿求 SE(3) 误差)与限位检查。拖滑块改变目标位姿,或用"随机可达位姿"生成一个按构造一定可达的目标。

    FIG 36R 球腕臂:闭式 IK 与 8 个分支
    拖动画面旋转视角
    预设
    分支标记 = 肩(F 前 / B 后)、肘(U 上 / D 下,指在竖直平面内的形状)、腕(+ / − 即 \(\sin q_5\ge0\) 或 <0)。淡色手臂按肘的形状着色:肘上青、肘下紫。注意画面里只有两种手臂形状:肩的"前 / 后"分支与腕翻转都不改变腕心之前连杆的位置(见下面的说明),所以这些解的手臂互相重合,只有关节角不同;腕心处的小坐标系(J4 之后的坐标系)显示腕的朝向。虚线球圈是腕心能到的最大半径 \(l_1+l_2\)。"自动"模式下,选中的是离上一时刻构型最近、且不越限位的解;"手动"模式点表格任意一行,手臂会沿关节空间插值过去。
    试一试
    • 用"随机可达位姿"得到 8 个解后,在表格里点一个不是当前最近的解:手臂会翻过去。FK 误差是否仍是 \(10^{-13}\) 以下?
    • 点"手腕在 J1 轴上"。腕心落在底座正上方时,\(q_1\) 为什么可以取任意值?(读数里怎么说?)
    • 把目标移到某处,使关节限位筛掉至少一半的解(表中"✓"不超过 4 个、至少 1 个)。解的个数没变,可用的变少了。
    为什么 8 个解只看得到 2 种手臂形状

    这台臂的 J1 与 J2 轴相交(肩没有偏置)。把 J1 多转 180°,再让 J2 翻过竖直方向(\(q_2\to-\pi-q_2\))、\(q_3\to-q_3\),连杆 1、2 回到完全相同的位置:手臂"从身后翻过来",只是关节轴的指向反了。腕翻转同理:\(q_4\to q_4+\pi,\ q_5\to-q_5,\ q_6\to q_6+\pi\) 给出同一个手爪位姿。这些"翻转"在 FK 看来是不同的 \(\mathbf q\),几何上却是同一个姿势,区别在于关节限位(例如连杆 1 放得较低时,背身解需要 \(q_2\) 超出它的范围)、线缆缠绕与连续性(FIG 6)。有横向肩偏置的臂(如 UR 系列),前 / 后两个肩分支才是形状不同的"左 / 右肩"。

    数值 IK:在 SE(3) 上线性化、重复

    没有闭式解(或懒得推导)时,就用 3.4 节的老办法,只是把"位置误差"换成位姿误差。当前位姿 \(T(\mathbf q)\) 与目标 \(T_d\) 之间的误差,用 5.6 节的对数映射表示成机体系下的一个 twist:\(\mathbf e=\Log\big(T(\mathbf q)^{-1}T_d\big)\in\R^6\)(前三个分量是转角向量,后三个是平移)。它正好是 7.4 节机体雅可比 \(J_b\) 的"自然输入":\(J_b\Delta\mathbf q\approx\mathbf e\),解出 \(\Delta\mathbf q\)(伪逆或阻尼最小二乘),更新 \(\mathbf q\leftarrow\mathbf q+\Delta\mathbf q\),重复。这就是 6.6 节的牛顿 / 高斯–牛顿法,只不过残差活在 SE(3) 上。

    下图从 4 个不同的初值同时出发(编号 1–4,四种颜色),对同一个目标位姿迭代。拖动"迭代 k"或按播放,看手臂怎样走向目标,右侧是每次迭代的误差 \(\|\mathbf e\|\)(对数)。每一步的关节增量 \(\|\Delta\mathbf q\|\) 被限幅到 0.8 rad(相当于速度限制)。四种目标位姿分别演示:正常收敛、手臂伸直的奇异位形、刚好够不着、远超范围。

    FIG 4SE(3) 上的牛顿 / 阻尼最小二乘 IK
    四个初值 → 同一个目标(拖动旋转视角)
    误差 ‖e‖(对数)vs 迭代
    每条手臂是第 \(k\) 次迭代的构型,细线是工具原点走过的路径,数字是起点编号。收敛到的分支用 FIG 3 的记号标出("—"表示没收敛到任何精确解)。"整段最大未限幅步长"是算法想走的步长(限幅前):伪逆在奇异位形附近想走几十弧度。绿色虚线是 \(10^{-6}\)。回溯线搜索把步长折半直到误差真的下降(6.5 节)。注意:不同分支的解在画面上常常重合(见 FIG 3 下面的说明),请对照读数里的分支标记。
    试一试
    • 选"可达位姿",反复点"换一批随机初值",直到四条手臂收敛到至少三个不同的分支:同一个目标,不同的关节角。观察误差曲线:接近解时每步误差大致平方(\(10^{-2}\to10^{-4}\to10^{-8}\)),这就是牛顿法的二次收敛。
    • 选"刚好够不着"和"牛顿 / 伪逆",读出"最大未限幅步长"(超过 5 rad 才算)。再换"阻尼最小二乘",把 \(\lambda\) 调到 0.1 左右,比较步长和最终误差。

    初值决定去哪:吸引域

    FIG 4 里同一个目标,从不同初值走向不同的解,有些初值根本不收敛。把这一点画清楚最容易用平面 2R:构型空间只有 \((\theta_1,\theta_2)\) 两维,可以给每一个初值着色,颜色是牛顿迭代最终落到的解。下图右侧就是这张"吸引域地图":青色 = 肘上,紫色 = 肘下,红色 = 没有收敛。两个解是地图上带描边的圆点。点击地图中任一点,作为初值,左边的手臂就沿着迭代路径走过去。虚线是 \(\theta_2=0,\pm\pi\)(雅可比奇异的位置),吸引域的边界总是沿着它们"撕开"。

    FIG 5平面 2R 的吸引域
    工作空间(拖动目标)
    构型空间(横 θ₁,纵 θ₂):点击选初值
    地图为 \(110\times110\) 个初值,每个跑至多 20 次(阻尼最小二乘 40 次)迭代,误差小于 \(10^{-9}\) 算收敛,并按落到的解着色。"纯牛顿"没有任何保护;"步长上限"把每步限制在 0.5 rad;阻尼最小二乘(\(\lambda=0.3\))更稳但更慢。拖动目标会重新计算整张地图。
    试一试
    • 用"纯牛顿"点出三种结局:收敛到肘上解、收敛到肘下解、和不收敛(点在红色斑点上,或者把目标拖到虚线圆之外再点一次)。两个相邻的初值,结局可以完全不同。
    解析 · 数值 · 优化:三种做法
    解析(闭式)数值(牛顿 / DLS)优化式(QP / NLP)
    适用机构满足 Pieper 准则等条件的机构,逐个推导任何机构,包括冗余臂任何机构 + 任意约束与代价
    给出全部解(可筛选、可排序)一个解,取决于初值一个(局部最优)解
    速度微秒级,确定几十微秒到毫秒,迭代次数不定毫秒级
    关节限位、避障事后筛选截断 / 投影,较粗糙直接写进约束

    5再看数学

    提示:把鼠标悬停在公式中带底色的符号上,FIG 1 或 FIG 3 中对应的元素会被高亮。

    平面 2R 的闭式解

    设目标 \(\mathbf p=(x,y)\),\(r=\|\mathbf p\|\)。由原点、肘、目标构成的三角形,边长分别是 \(l_1,l_2,r\),余弦定理给出 \(\theta_2\);\(\theta_1\) 等于目标的方位角 \(\gamma=\operatorname{atan2}(y,x)\) 减去连杆 1 与"原点–目标"连线的夹角:

    $$ \cos\theta_2=\frac{r^2-l_1^2-l_2^2}{2\,l_1l_2},\qquad \theta_2=\pm\arccos(\cdot) $$ $$ \theta_1=\gamma-\operatorname{atan2}\!\big(l_2\sin\theta_2,\;l_1+l_2\cos\theta_2\big). $$

    \(|\cos\theta_2|>1\) 即无解,与两圆不相交完全等价。两个符号对应的两个解,是关于原点–目标连线的镜像:\((\theta_1,\theta_2)\mapsto(2\gamma-\theta_1,\,-\theta_2)\)。\(\cos\theta_2=\pm1\) 时两个解合并,\(\theta_2\) 对 \(r\) 的导数发散(\(\mathrm d\theta_2/\mathrm dr\propto1/\sin\theta_2\)),这正是 3.4 节里雅可比奇异的位置:解的数目变化的地方,就是雅可比降秩的地方。

    Pieper 准则:什么时候有闭式解

    一般的 6R 臂,逆运动学是 6 个耦合的三角方程。Pieper(1968)发现:若三个相邻关节的轴交于一点(典型情形是球腕),位置与姿态解耦,方程组分裂成两个小问题,闭式解存在,且至多 8 个解。原因很直接:这个交点(腕心)的位置只由它之前的关节决定,不受腕转动的影响,所以

    $$ \hl{pw}{\mathbf p_w}=\mathbf p-d_6\,R\,\mathbf e_x \;=\; \operatorname{FK}_{\text{position}}(q_1,q_2,q_3)\quad\text{(no }q_4,q_5,q_6\text{)} $$ $$ R=R_0^3(q_1,q_2,q_3)\,\underbrace{R_3^6(q_4,q_5,q_6)}_{\text{wrist}}. $$

    三根轴平行(如 UR 系列的肩、肘、腕 1)也能得到闭式解,只是推导不同。反过来,一旦腕有偏置(三轴不再交于一点),上面的分解就不精确了,必须换成别的几何构造,或改用数值 IK。

    Robot.arm6 的完整推导

    用 PoE(5.10 节)读出这台臂的结构:轴依次是 \(\hat z,\hat y,\hat y,\hat x,\hat y,\hat x\),所以旋转部分就是

    $$ R=R_z(q_1)\,R_y(q_2+q_3)\,\underbrace{R_x(q_4)R_y(q_5)R_x(q_6)}_{R_3^6} $$ $$ \mathbf p_w=\begin{bmatrix}\rho\cos q_1\\ \rho\sin q_1\\ d_1-l_1\sin q_2-l_2\sin(q_2+q_3)\end{bmatrix},\quad \rho=l_1\cos q_2+l_2\cos(q_2+q_3). $$

    (\(\sin\) 前的负号来自约定:绕 \(+y\) 的正转动让 \(+x\) 向下倾。)逐步求解:

    第 1 步,肩。 \(x_w^2+y_w^2=\rho^2\),所以 \(q_1=\operatorname{atan2}(y_w,x_w)\)(此时 \(\rho=+\sqrt{x_w^2+y_w^2}\)),或 \(q_1=\operatorname{atan2}(y_w,x_w)+\pi\)(\(\rho=-\sqrt{x_w^2+y_w^2}\))。

    第 2 步,肘与肩的俯仰。 记 \(h=z_w-d_1\)。\((\rho,h)\) 是一个平面 2R 问题(FIG 1),余弦定理给出

    $$ \cos q_3=\frac{\rho^2+h^2-l_1^2-l_2^2}{2\,l_1l_2},\quad q_3=\pm\arccos(\cdot)\ \ (\text{front shoulder: }q_3>0\text{ is elbow up}) $$ $$ q_2=-\operatorname{atan2}(h,\rho)-\operatorname{atan2}\!\big(l_2\sin q_3,\;l_1+l_2\cos q_3\big). $$

    第 3 步,腕。 前三个关节已知,\(W=R_3^6=\big(R_z(q_1)R_y(q_2+q_3)\big)^\top R\)。把 \(R_x(q_4)R_y(q_5)R_x(q_6)\) 乘开,记 \(a,b,c=q_4,q_5,q_6\):

    $$ W=\begin{bmatrix} \cos b & \sin b\sin c & \sin b\cos c\\ \sin a\sin b & \cos a\cos c-\sin a\cos b\sin c & -\cos a\sin c-\sin a\cos b\cos c\\ -\cos a\sin b & \sin a\cos c+\cos a\cos b\sin c & -\sin a\sin c+\cos a\cos b\cos c\end{bmatrix} $$ $$ q_5=\operatorname{atan2}\!\big(\sqrt{W_{12}^2+W_{13}^2},\,W_{11}\big) $$ $$ q_4=\operatorname{atan2}(W_{21},-W_{31}),\qquad q_6=\operatorname{atan2}(W_{12},W_{13}). $$

    第一行和第一列只含 \(\sin b\) 的乘积,所以直接读出。第二个分支取 \(\sin q_5<0\):\(q_5\to-q_5\),\(q_4\to\operatorname{atan2}(-W_{21},W_{31})\),\(q_6\to\operatorname{atan2}(-W_{12},-W_{13})\)。这就是 FIG 3 中的腕翻转:同一个旋转矩阵的两种欧拉角分解。

    奇异情形必须单独处理。 (i) 肩奇异:\(x_w=y_w=0\),腕心在 J1 轴上,\(q_1\) 任意(取上一时刻的值保持连续);(ii) 肘奇异:\(\cos q_3=\pm1\),手臂完全伸直或折回,两个肘分支合并,且 \(r\) 的小变化需要 \(q_3\) 大变化;(iii) 腕奇异:\(\sin q_5=0\),J4 与 J6 的轴共线,只有 \(q_4+q_6\)(\(q_5=0\))或 \(q_6-q_4\)(\(q_5=\pi\))确定,其余是一个自由度。代码里的每个分支都对应这三种情形之一。

    怎么知道它是对的? 用 FK 往返:任取 \(\mathbf q\),算 \(T=\operatorname{FK}(\mathbf q)\),求 IK,检查(1)返回的每个解代回 FK 都等于 \(T\);(2)原来的 \(\mathbf q\) 在解集中。作者在 Node 里对 20000 个关节限位内的随机 \(\mathbf q\) 做了这个检验:每次都恰好返回 8 个解,全部满足 FK = 目标,误差不超过 \(6\times10^{-13}\),\(\mathbf q\) 无一遗漏;奇异位形(上面三种)同样通过,只是解的个数减少。FIG 3 的表格每次都在实时重复这个检验。

    有几个解

    球腕 6R 臂:肩 2 × 肘 2 × 腕 2 = 8(FIG 3)。一般的 6R 臂(没有交点)最多 16 个解:Raghavan–Roth(1993)把问题消元成关于某个关节半角正切的一个 16 次多项式,其中的实根就是实解。冗余臂(\(n>6\))有连续的解族,维数 \(n-6\);7R 臂对完整位姿的解是 1 维的曲线(肘部绕"肩–腕"连线转动的"摆动角"),常见做法是把这个自由参数固定或优化,再套闭式解。

    数值 IK = SE(3) 上的牛顿法

    $$ \mathbf e(\mathbf q)=\Log\!\big(T(\mathbf q)^{-1}T_d\big)\in\R^6,\qquad \mathbf q\leftarrow\mathbf q+\Delta\mathbf q $$ $$ \Delta\mathbf q=J_b^{+}\,\mathbf e\quad\text{or}\quad J_b^\top\big(J_bJ_b^\top+\lambda^2I\big)^{-1}\mathbf e $$

    这是对 \(\tfrac12\|\mathbf e(\mathbf q)\|^2\) 的高斯–牛顿法(6.6、6.9 节)。机体系下的误差 \(\mathbf e\) 与机体雅可比 \(J_b\)(7.4 节)配对;若误差写在空间系里,就改用 \(J_s\)。\(\mathbf e\) 对 \(\mathbf q\) 的精确导数是 \(-J_l^{-1}(\mathbf e)\,J_b\),其中 \(J_l\) 是 SE(3) 的左雅可比,它与单位阵相差 \(O(\|\mathbf e\|)\);所以用 \(-J_b\) 代替它,迭代在解附近仍是二次收敛(FIG 4 里的 \(10^{-2}\to10^{-4}\to10^{-8}\)),前提是 \(J_b\) 满秩。远离解时不保证任何事:这就是 FIG 5 的吸引域,需要限幅、回溯线搜索(6.5 节)或阻尼(Levenberg–Marquardt)来保护。阻尼只改变路径,不改变不动点(\(\mathbf e=\mathbf 0\)),但在 \(J_b\) 降秩时会停在误差平台上(FIG 4 的"伸直"目标)。

    量纲与权重。 \(\mathbf e\) 的前三个分量是弧度,后三个是米。"1 弧度"与"1 米"并不等价,所以把行加权:\(\min_{\Delta\mathbf q}\|W(J_b\Delta\mathbf q-\mathbf e)\|^2+\lambda^2\|\Delta\mathbf q\|^2\),\(W=\operatorname{diag}(w_\omega I_3,\,w_vI_3)\)。典型做法是取 \(w\) 为各自的容差的倒数(如 1 mm 对应 \(w_v=10^3\),0.1° 对应 \(w_\omega\approx570\))。位置优先的任务则把 \(w_\omega\) 取得更小。

    限位、次要任务与优化式 IK

    闭式解先求全部解,再按关节限位、碰撞、离当前构型的距离筛选;数值 IK 则要把限位放进迭代:最粗糙的是把 \(\mathbf q\) 截断到限位内(容易卡住),更好的是把每一步写成带不等式约束的 QP:\(\min\|J_b\Delta\mathbf q-\mathbf e\|^2+\lambda^2\|\Delta\mathbf q\|^2\),\(\mathbf q_{\min}\le\mathbf q+\Delta\mathbf q\le\mathbf q_{\max}\)(6.8 节)。冗余臂可以像 3.4 节那样把次要目标(远离限位、保持肘部朝向)投影到零空间 \((I-J^+J)\mathbf z\)。再往前一步是把整个 IK 当作一个非线性优化问题(6.9 节),代价和约束写成什么都行(可达、碰撞距离、姿态、平滑),用 SQP/内点法求解;Part VI 还会看到用神经网络直接给出 IK 的初值或解。

    6机器人中的它:沿路径跟踪时选哪个解

    IK 在机器人里最常见的用法不是"解一次",而是每个控制周期解一次:笛卡尔直线运动、遥操作、视觉伺服都是这样。这时候最重要的不是解得对不对,而是前后两次选的是不是同一个分支。下图让工具沿一条路径运动,比较三种策略:

    • 固定分支:永远取起点所在的那个(肩、肘、腕)分支;
    • 最近的解:闭式解的 8 个解里,取离上一时刻关节角最近的(不管限位);
    • 数值 IK 热启动:以上一时刻的 \(\mathbf q\) 为初值迭代,天然连续。

    两条路径都经过奇异位形。"手爪转过腕奇异":腕心不动,工具朝向转过 \(q_5=0\);"手腕越过底座上方":腕心在水平面里从 J1 轴一侧移到另一侧,经过肩奇异。红色竖线标出关节突变(单步超过 0.5 rad)的位置。

    FIG 6跟踪路径:分支选择
    琥珀色线 = 工具原点的路径
    六个关节角 vs 路径位置
    路径上取 201 个样本,每个样本解一次 IK。"固定分支"在 \(q_5\) 穿过 0(腕)或腕心穿过 J1 轴(肩)的那一帧,对应关节突然转 180°,实际机器人在一个控制周期里做不到,会报速度超限或直接停机。"最近的解"和"热启动"保持连续;但请注意读数里的限位:越过底座时,连续的解要求 \(q_2\)(以及 \(q_5\))超出限位,连续不等于可行,这时需要换一条路径或换一个肘部分支。
    试一试
    • 选"手爪转过腕奇异",先用"固定分支"播放,看红线处 \(\theta_4,\theta_6\) 一起跳 180°;再换"最近的解"或"热启动"播放到底,最大单步变化 < 0.3 rad。
    真实系统里

    IKFast(Diankov 的 OpenRAVE):对给定的串联臂(通常 6 自由度)自动生成闭式 C++ 求解器,给出全部解,几微秒,常作为 MoveIt 的 IK 插件。UR 系列有公开的闭式解(Hawkins 2013);7 自由度的 Franka Panda 没有唯一闭式解,已发表的解析求解器通常先固定一个冗余参数(如 \(q_7\) 或肘部摆动角)再解析求解。Trac-IK(Beeson & Ames 2015)同时跑两个求解器——带随机重启的 KDL 牛顿迭代和一个 SQP 求解器——谁先成功取谁,显著提高了带关节限位的数值 IK 成功率。KDL(Orocos)提供牛顿–拉弗森与 LM 求解器;MoveIt 的运动学插件接口可换用 KDL、Trac-IK、IKFast 或 BioIK 等;Pinocchio 提供 \(\mathrm{SE}(3)\) 上的误差与雅可比,常用来写微分 IK 与基于 QP 的 IK(Pink、mink 等库);Drake 的 InverseKinematics 把 IK 写成带约束的非线性规划。遥操作与 VR 重定向:把操作者的手腕位姿每帧映射到机器人关节,就是上面的"热启动数值 IK",为了平滑和避奇异通常加阻尼与次要任务;人形机器人动作重定向则是同一思想的全身版本,常用 QP 形式同时满足多个手脚目标、平衡与关节限位。在计算机动画里,FABRIK(Aristidou & Lasenby 2011)等启发式方法以极低成本给出看起来自然的解。

    7常见误区

    误区 1:每一帧"挑一个解",不管上一帧

    闭式 IK 返回的是一个无序的集合。取"第一个"或"误差最小的",随着目标移动,下标对应的分支会变,关节在一帧里翻转 180°(FIG 6)。要按与上一帧的关节距离(含 \(\pm\pi\) 回绕)选,同时检查限位与碰撞;起点处才用别的准则(离"舒适姿态"最近)。选"最近"也不是万能:路径必须经过奇异位形或限位时,连续的分支可能不可行,只能重新规划。

    误区 2:数值 IK 总会"给出一个答案",就以为成功了

    目标不可达、停在局部极小、迭代次数用完,求解器都会返回一个 \(\mathbf q\)。FIG 4 里"远超范围"的目标让误差停在一个非零的平台上;FIG 5 里红色区域根本不收敛。务必检查残差 \(\|\mathbf e\|\)(分别按位置和姿态容差),失败时换初值重启,或者用上一帧的解、闭式解当种子。Trac-IK 的随机重启就是这个思路。

    误区 3:忘了角度回绕与限位的先后

    \(\operatorname{atan2}\) 给出 \((-\pi,\pi]\) 的角度,但 \(q\) 与 \(q\pm2\pi\) 是同一个姿态。若关节限位是 \([0^\circ,340^\circ]\),\(\operatorname{atan2}\) 返回的 \(-170^\circ\) 看起来越限,而等价的 \(190^\circ\) 完全可行;许多真实关节的行程超过一圈,必须把每个解换成限位内的等价角再判断。计算距离时也要先回绕(\(q_i-q_i'\) 取 \(\operatorname{wrap}(\cdot)\)),否则 \(3.1\) 与 \(-3.1\) 会被认为相差 6.2 rad。

    误区 4:把弧度和米直接加在一起

    \(\|\mathbf e\|\) 里转角与平移直接相加,等于规定了"1 rad ≡ 1 m";换成毫米,位置就压倒了姿态。手腕离工具越远,同一个转角造成的手爪位置偏差越大。务必按任务的容差加权(见上一节),收敛判据也要分开写:位置小于几个 mm 且姿态小于零点几度。

    误区 5:把某一台臂的闭式解当成通用公式

    本节的推导依赖精确的几何:腕轴交于一点、零偏置、特定的零位与轴方向。真实手臂常有小偏置(如 Franka 的腕偏置、UR 的肩偏置)、标定误差和不同的关节符号约定;一个 5 mm 的偏置就让上面的腕心解耦不再精确。要么用对应构型的专门推导(或 IKFast 自动生成),要么用闭式解当种子、再用数值 IK 精修。

    8小练习

    1. 平面 2R 臂,\(l_1=1.2\),\(l_2=0.8\)。目标离基座 \(r=0.3\)。有几个 IK 解?
    可达环是 \(|l_1-l_2|=0.4\le r\le l_1+l_2=2.0\)。\(r=0.3<0.4\):目标在内圈的"洞"里,即使手臂完全折回,手爪也停在离基座 0.4 处。无穷多个解只出现在 \(l_1=l_2\) 且目标恰好在基座上的特殊情形。
    2. 球腕 6R 臂,目标位姿在工作空间内部且不是奇异位形。闭式 IK 一般返回几个解?
    肩(\(q_1\) 与 \(q_1+\pi\))× 肘(上 / 下)× 腕(\(q_5\) 的两个符号)= 8(其中有的在几何上是同一个姿势的"翻转",见 FIG 3 的说明)。16 是一般 6R 臂(没有交点)的上界(Raghavan–Roth)。
    3. 三根腕轴交于一点,为什么让 IK 变简单?
    腕心 \(\mathbf p_w=\mathbf p-d_6R\mathbf e_x\) 可以直接由目标位姿算出,又只依赖 \(q_1,q_2,q_3\)。先用它解前三个关节,剩下的旋转交给腕。这与质量、雅可比是否为常数、解是否唯一都无关(解有 8 个)。
    4. 牛顿 IK 的误差依次是 \(3\times10^{-2},\ 9\times10^{-4},\ 8\times10^{-7},\ 6\times10^{-13}\)。这是什么收敛速度?
    \((3\times10^{-2})^2=9\times10^{-4}\),\((9\times10^{-4})^2\approx8\times10^{-7}\),\((8\times10^{-7})^2\approx6\times10^{-13}\):有效数字的位数每步翻倍,这是牛顿法在非奇异解附近的二次收敛。阻尼最小二乘或奇异位形附近则表现为线性甚至平台。
    5. 一台 7R 臂要到达一个完整的 6D 位姿,解集(一般情况下)是什么?
    未知数 7、约束 6,\(n-m=1\):解是构型空间里的一条曲线(肘部绕肩–腕连线转动)。这条曲线在每一点的切方向,就是 3.4 节的一维零空间。未知数多于约束恰好意味着有(无穷)多个解,而不是没有。

    9延伸阅读

    • K. Lynch & F. Park, Modern Robotics, Ch. 6 — 逆运动学:解析(6.1)与基于 SE(3) 误差的数值牛顿法(6.2)
    • D. L. Pieper, The Kinematics of Manipulators Under Computer Control, PhD thesis, Stanford University, 1968 (Stanford AI Memo 72) — 三轴交于一点则有闭式解的原始出处
    • M. Raghavan & B. Roth, Inverse Kinematics of the General 6R Manipulator and Related Linkages, ASME J. Mechanical Design 115(3), 1993 — 一般 6R 臂至多 16 个解的 16 次多项式
    • M. W. Spong, S. Hutchinson & M. Vidyasagar, Robot Modeling and Control, Ch. 3 — 运动学解耦与球腕的几何推导
    • B. Siciliano, L. Sciavicco, L. Villani & G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 2 and §3.7 — 逆运动学的解法与逆微分运动学算法
    • S. R. Buss, Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares Methods (2004) — 3.4 节引用的三种迭代 IK 的对比
    • S. Sugihara, Solvability-Unconcerned Inverse Kinematics by the Levenberg–Marquardt Method, IEEE Trans. Robotics 27(5), 2011 — 用 LM 方法处理无解与奇异情形
    • P. Beeson & B. Ames, TRAC-IK: An Open-Source Library for Improved Solving of Generic Inverse Kinematics, IEEE-RAS Humanoids 2015 — 并行牛顿 + SQP 与随机重启
    • R. Diankov, Automated Construction of Robotic Manipulation Programs, PhD thesis, Carnegie Mellon University, 2010 — IKFast 的设计与闭式 IK 的自动生成
    • K. P. Hawkins, Analytic Inverse Kinematics for the Universal Robots UR-5/UR-10 Arms, Georgia Tech technical report, 2013 — 无球腕的真实工业臂的闭式解
    • A. Aristidou & J. Lasenby, FABRIK: A fast, iterative solver for the Inverse Kinematics problem, Graphical Models 73(5), 2011 — 动画领域常用的启发式 IK