逆运动学:解析与数值Inverse Kinematics: Analytic & Numerical
任务说的是"手爪放到这里、姿态这样",电机只听得懂关节角。逆运动学(IK)就是这中间的翻译:它可能无解、可能有几个解、也可能有无穷多个。能写出闭式解的机械臂几微秒就能给出全部解;一般的机构则要靠 SE(3) 上的牛顿迭代,一次只找到一个解,找到哪一个还取决于初值。本节从平面 2R 的"两圆相交"出发,推出一台带球腕的真实 6R 臂的 8 个解,再看数值 IK 如何收敛、为什么会失败,以及沿路径跟踪时该选哪一个解。 The task says "put the hand HERE, oriented like THIS"; the motors only understand joint angles. Inverse kinematics (IK) is the translator in between, and it may return no solution, a few, or a whole continuum. Arms with a closed-form solution produce all solutions in microseconds; general mechanisms need Newton iteration on SE(3), which finds one solution at a time, and which one depends on the initial guess. We start from the "two circles meet" picture of the planar 2R, derive the 8 solutions of a real 6R arm with a spherical wrist, then watch numerical IK converge and fail, and finally decide which solution to pick while tracking a path.
1为什么机器人需要它Why robots need this
你对机械臂下的命令是"手爪去那个杯子的把手,朝向这样",电机能执行的却是"每个关节转到多少度"。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)。
The command you give an arm is "put the gripper on that mug's handle, oriented like this", while the motors can only execute "turn each joint to this angle". Forward kinematics \(T(\mathbf q)\) (Lesson 7.3) maps joint angles to a hand pose, and it is a function. Inverse kinematics runs it backwards: given a desired pose \(T_d\in\SE\), find \(\mathbf q\) with \(T(\mathbf q)=T_d\). The backwards problem is no longer a function:
- It may have no solution: the target is too far, or sits in a "hole" the arm cannot fold into.
- It may have finitely many: for one hand pose the arm can bend "elbow up" or "elbow down", and the wrist can flip or not.
- It may have infinitely many: a redundant arm can reshape itself while the hand stays put (the null space of Lesson 3.4), and even non-redundant arms do so at some singular postures.
Every Cartesian velocity command, every grasp candidate (hundreds are tried at once), every frame of teleoperation and every goal a planner samples has to pass through IK first. It therefore has to be fast and reliable: know whether a solution exists, how many there are, and which to choose now.
Two schools exist. Analytic (closed-form) IK exploits the mechanism's geometry, solves the equations as formulas, returns all solutions in microseconds, but must be derived per arm geometry and exists only for mechanisms meeting a condition (Pieper's criterion below). Numerical IK carries Lesson 3.4's "linearize, solve one step, repeat" over to SE(3); it works for any mechanism, but returns one solution at a time, depends on the initial guess, and can fail. Lesson 3.4 already did numerical IK for planar arms with the pseudo-inverse and damped least squares, so we do not repeat that. Instead:
- first see why the planar 2R has two solutions and where they disappear (FIG 1), and how position vs. pose constraints set the number and dimension of the solutions (FIG 2);
- then derive the closed-form solution of a real 6R arm and its 8 branches (FIG 3);
- then run numerical IK on SE(3) and watch it converge, fail, and "let the initial guess decide" (FIG 4, FIG 5);
- finally track a path and see what choosing the wrong branch does to the joints (FIG 6).
2直觉:两个圆相交Intuition: two circles meet
最小的例子:平面两连杆臂,连杆长 \(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\),看圆环的"洞"怎样随两根连杆的长短变化。
The smallest example: a planar two-link arm with link lengths \(l_1,l_2\) must bring the hand to \(\mathbf p=(x,y)\). Joint 1 sits at the origin, so the elbow lies on the circle of radius \(l_1\) around the origin. The hand must end at the target, so the elbow is exactly \(l_2\) from the target: it also lies on the circle of radius \(l_2\) around the target. The elbow is on both circles at once, so it is one of their intersection points.
The number of intersections reads off the number of solutions: two (elbow up and elbow down, mirror images across the line from the origin to the target), one (the circles touch: the arm is fully stretched or fully folded), or none (too far, or inside the inner "hole"). The reachable region is therefore an annulus \(|l_1-l_2|\le r\le l_1+l_2\), \(r=\|\mathbf p\|\). Drag the target; then change \(l_2\) with the slider and watch the hole change with the relative link lengths.
- 把目标拖到外边界(完全伸直,\(r=l_1+l_2\))。两个解变成了几个?Drag the target onto the outer boundary (fully stretched, \(r=l_1+l_2\)). How many solutions are left?
- 把目标拖进内圈的"洞",离原点很近、却无解。再想想:\(l_2=l_1\) 时洞会变成什么?Drag the target into the inner hole: very close to the origin, yet no solution. Then think: what happens to the hole when \(l_2=l_1\)?
逆运动学是方程组而不是公式:解的个数随目标位置变化,在可达区域的边界上,两个解合并成一个然后消失。这不是数值误差,而是几何本身。闭式 IK 把"几个解、在哪里"一次说清;数值 IK 只能告诉你它走到了哪一个。
Inverse kinematics is a system of equations, not a formula: the number of solutions changes with the target, and on the boundary of the reachable region two solutions merge into one and then vanish. That is geometry, not numerical error. Closed-form IK states "how many, and where" in one go; numerical IK only tells you which one it happened to reach.
3动手玩:位置、位姿与解的维数Play: position, pose and the dimension of the solution set
"到那个点"与"到那个点,并且手爪朝这个方向"不是一回事。数一数未知数(关节数 \(n\))和约束数(\(m\):平面里位置 2 个,位姿 3 个):\(n-m>0\) 时解是一个 \((n-m)\) 维的连续族(可以在手爪不动时"自运动"),\(n=m\) 时通常是有限个解,\(n<m\) 时一般无解。这正是 7.1 节的自由度计数在逆运动学里的样子,也是 3.4 节零空间的非线性版本:零空间是解集在一点处的切空间。
下图用 3R 或 4R 平面臂演示。右图把关节角画成自由参数的函数:3R 只要位置时,自由参数是手爪朝向 \(\varphi\),每条曲线是一族连续解(实线肘上、虚线肘下);要求位姿就是在 \(\varphi\) 处竖直切一刀,只剩下有限个点。切刀落在曲线的空隙里,就是"位置够得着、这个朝向却做不到"。
"Reach that point" and "reach that point with the hand pointing this way" are different problems. Count the unknowns (the number of joints \(n\)) and the constraints (\(m\): 2 for a planar position, 3 for a planar pose). If \(n-m>0\) the solutions form an \((n-m)\)-dimensional continuous family (the arm can "self-move" while the hand stays), if \(n=m\) there are generically finitely many, and if \(n<m\) there are generically none. This is Lesson 7.1's degrees-of-freedom count in its inverse-kinematics form, and the nonlinear version of Lesson 3.4's null space: the null space is the tangent space of the solution set at a point.
The figure uses a planar 3R or 4R arm. The right panel draws the joint angles as functions of the free parameter: for 3R with a position-only target the free parameter is the hand heading \(\varphi\), and each curve is a continuous family of solutions (solid: elbow up, dashed: elbow down). Asking for a pose means slicing the picture vertically at \(\varphi\), which leaves finitely many points. If the cut falls in a gap between the curves, the position is reachable but not with that heading.
- 选 3R、"位置 + 朝向",让目标留在手臂够得着的范围内,调 \(\varphi\) 直到精确解个数为 0:位置本来够得着,这个朝向却不行。Choose 3R and "Pose", keep the target well within reach, and tune \(\varphi\) until the number of exact solutions is 0: the position is reachable, this heading is not.
- 切到 4R、"只要位置":解集的维数是几?灰色手臂铺成了什么?Switch to 4R, "Position only": what is the dimension of the solution set, and what do the faint arms fill out?
几何:解是几个圆(球)的交点,交点个数随目标变化。计数:未知数减约束数给出解集的维数 \(n-m\)。线性化:在某个解处,\(J\Delta\mathbf q=\mathbf 0\) 的解(3.4 节的零空间)是解集的切空间。三者说的是同一件事:IK 的解集是构型空间里的一个"流形",维数 \(n-m\),有限个解只是 0 维的特例。
Geometry: solutions are intersections of circles (spheres), and their number changes with the target. Counting: unknowns minus constraints gives the solution-set dimension \(n-m\). Linearization: at a solution, the solutions of \(J\Delta\mathbf q=\mathbf 0\) (Lesson 3.4's null space) form the tangent space of the solution set. All three say the same thing: the IK solution set is a "manifold" in configuration space of dimension \(n-m\), and finitely many solutions is just the 0-dimensional special case.
4第二、第三视角:真实 6R 臂的闭式解,与数值 IKSecond and third views: closed form for a real 6R arm, and numerical IK
腕心解耦:8 个解Wrist decoupling: eight solutions
这里用的是 7.3、7.4 节同一台 Robot.arm6:J1 绕竖直轴偏航,J2、J3 是肩与肘的俯仰(正俯仰让 \(+x\) 方向向下倾,右手定则),J4–J6 是"滚转–俯仰–滚转"的腕,三根腕轴交于腕心 \(\mathbf p_w\),工具原点在腕心前方 \(d_6\) 处。关键观察:腕心的位置只由前三个关节决定,不管手腕怎么转。于是六个未知数拆成两个小问题:
- 位置:由目标位姿算出腕心 \(\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 问题(肘上、肘下)。
- 姿态:前三个关节已知后,剩下的旋转 \(R_3^6=(R_0^3)^\top R\) 必须由腕补上。腕是"滚转–俯仰–滚转",把一个旋转矩阵分解成这三个角,有两个分支(\(q_5\) 的符号,即腕翻转)。
三个二选一,共 \(2\times2\times2=8\) 个解。下图把它们全部画出来:灰度淡的是越出关节限位的解,实心的是当前选中的解,表格给出每个解的关节角、FK 往返误差(把解代回正运动学,再与目标位姿求 SE(3) 误差)与限位检查。拖滑块改变目标位姿,或用"随机可达位姿"生成一个按构造一定可达的目标。
This is the same Robot.arm6 as in Lessons 7.3 and 7.4: J1 yaws about the vertical axis, J2 and J3 are shoulder and elbow pitch (positive pitch tips the \(+x\) direction down, by the right-hand rule), and J4–J6 form a "roll–pitch–roll" wrist whose three axes meet at the wrist centre \(\mathbf p_w\); the tool origin is \(d_6\) ahead of it. The key observation: the position of the wrist centre depends only on the first three joints, however the wrist turns. The six unknowns therefore split into two small problems:
- Position: from the target pose compute the wrist centre \(\hl{pw}{\mathbf p_w}=\mathbf p-d_6R\,\mathbf e_x\) and use it to solve \(q_1,q_2,q_3\). \(q_1\) is the azimuth of the wrist centre (two branches: \(q_1\) and \(q_1+\pi\): the arm reaches the target "from the front", or turns J1 by 180° and reaches "over its back"); then in the vertical plane through the shoulder it is FIG 1's 2R problem (elbow up, elbow down).
- Orientation: with the first three joints known, the remaining rotation \(R_3^6=(R_0^3)^\top R\) must be supplied by the wrist. The wrist is "roll–pitch–roll", so decomposing a rotation matrix into these three angles has two branches (the sign of \(q_5\), the wrist flip).
Three binary choices give \(2\times2\times2=8\) solutions. The figure draws all of them: faint ones violate a joint limit, the solid one is the current selection, and the table lists each solution's joint angles, its FK round-trip error (substitute the solution into forward kinematics and measure the SE(3) error against the target) and the limit check. Move the sliders to change the target pose, or use "Random reachable" to get a target that is reachable by construction.
- 用"随机可达位姿"得到 8 个解后,在表格里点一个不是当前最近的解:手臂会翻过去。FK 误差是否仍是 \(10^{-13}\) 以下?With 8 solutions on screen (e.g. after "Random reachable"), click a row that is not the nearest one and watch the arm flip over. Is the FK error still below \(10^{-13}\)?
- 点"手腕在 J1 轴上"。腕心落在底座正上方时,\(q_1\) 为什么可以取任意值?(读数里怎么说?)Press "Wrist over J1 axis". With the wrist centre directly above the base, why can \(q_1\) take any value? (What does the readout say?)
- 把目标移到某处,使关节限位筛掉至少一半的解(表中"✓"不超过 4 个、至少 1 个)。解的个数没变,可用的变少了。Move the target so that joint limits remove at least half the solutions (at most 4 but at least 1 "✓" in the table). The number of solutions has not changed; the number of usable ones has.
这台臂的 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 系列),前 / 后两个肩分支才是形状不同的"左 / 右肩"。
This arm's J1 and J2 axes intersect (no shoulder offset). Turn J1 a further 180°, flip J2 over the vertical (\(q_2\to-\pi-q_2\)) and negate \(q_3\), and links 1 and 2 return to exactly the same place: the arm "reaches over its back", merely with the joint axes pointing the other way. The wrist flip is the same trick: \(q_4\to q_4+\pi,\ q_5\to-q_5,\ q_6\to q_6+\pi\) gives the same hand pose. FK sees these as different \(\mathbf q\), yet geometrically it is one posture; the differences are joint limits (with link 1 held low, the over-the-back solution needs \(q_2\) beyond its range), cable wrap and continuity (FIG 6). For arms with a lateral shoulder offset (such as the UR series) the front / back shoulder branches are genuinely different "left / right shoulder" shapes.
数值 IK:在 SE(3) 上线性化、重复Numerical IK: linearize on SE(3), repeat
没有闭式解(或懒得推导)时,就用 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(相当于速度限制)。四种目标位姿分别演示:正常收敛、手臂伸直的奇异位形、刚好够不着、远超范围。
With no closed form (or no patience to derive one), use Lesson 3.4's recipe, only with a pose error in place of a position error. The error between the current pose \(T(\mathbf q)\) and the goal \(T_d\) is expressed with Lesson 5.6's logarithm as a body-frame twist: \(\mathbf e=\Log\big(T(\mathbf q)^{-1}T_d\big)\in\R^6\) (first three components: rotation vector, last three: translation). That is exactly the natural input of Lesson 7.4's body Jacobian \(J_b\): \(J_b\Delta\mathbf q\approx\mathbf e\). Solve for \(\Delta\mathbf q\) (pseudo-inverse or damped least squares), update \(\mathbf q\leftarrow\mathbf q+\Delta\mathbf q\), repeat. This is Lesson 6.6's Newton / Gauss–Newton method with the residual living on SE(3).
The figure starts four different initial guesses at once (numbered 1–4, four colours) and iterates them on the same target pose. Drag "iteration k" or press Play to see the arms walk toward the goal; the right panel shows the error \(\|\mathbf e\|\) (log scale) per iteration. Each step \(\|\Delta\mathbf q\|\) is clamped to 0.8 rad (a speed limit). Four targets demonstrate: normal convergence, the stretched-arm singularity, just out of reach, and far out of reach.
- 选"可达位姿",反复点"换一批随机初值",直到四条手臂收敛到至少三个不同的分支:同一个目标,不同的关节角。观察误差曲线:接近解时每步误差大致平方(\(10^{-2}\to10^{-4}\to10^{-8}\)),这就是牛顿法的二次收敛。Choose "Reachable" and press "Random starts" until the four arms converge to at least three different branches: same target, different joint angles. Watch the error curves: near the solution the error roughly squares each step (\(10^{-2}\to10^{-4}\to10^{-8}\)), the quadratic convergence of Newton's method.
- 选"刚好够不着"和"牛顿 / 伪逆",读出"最大未限幅步长"(超过 5 rad 才算)。再换"阻尼最小二乘",把 \(\lambda\) 调到 0.1 左右,比较步长和最终误差。Choose "Just out of reach" with "Newton / pseudo-inverse" and read the "largest unclamped step" (it must exceed 5 rad). Then switch to "Damped LS" with \(\lambda\) around 0.1 and compare the steps and the final error.
初值决定去哪:吸引域The initial guess decides where you land: basins of attraction
FIG 4 里同一个目标,从不同初值走向不同的解,有些初值根本不收敛。把这一点画清楚最容易用平面 2R:构型空间只有 \((\theta_1,\theta_2)\) 两维,可以给每一个初值着色,颜色是牛顿迭代最终落到的解。下图右侧就是这张"吸引域地图":青色 = 肘上,紫色 = 肘下,红色 = 没有收敛。两个解是地图上带描边的圆点。点击地图中任一点,作为初值,左边的手臂就沿着迭代路径走过去。虚线是 \(\theta_2=0,\pm\pi\)(雅可比奇异的位置),吸引域的边界总是沿着它们"撕开"。
In FIG 4 the same target is reached from different starts at different solutions, and some starts do not converge at all. The planar 2R shows this most clearly: configuration space has just two dimensions \((\theta_1,\theta_2)\), so we can colour every initial guess by the solution Newton's iteration ends up at. The right panel is that "basin map": cyan = elbow-up, purple = elbow-down, red = no convergence. The two solutions are the outlined dots. Click anywhere on the map to use that point as the initial guess and watch the left-hand arm follow the iteration path. The dashed lines are \(\theta_2=0,\pm\pi\) (where the Jacobian is singular), and basin boundaries always "tear" along them.
- 用"纯牛顿"点出三种结局:收敛到肘上解、收敛到肘下解、和不收敛(点在红色斑点上,或者把目标拖到虚线圆之外再点一次)。两个相邻的初值,结局可以完全不同。With "Plain Newton" click out all three outcomes: convergence to the elbow-up solution, to the elbow-down solution, and no convergence (click on a red speckle, or drag the target outside the dashed circle and click again). Two neighbouring starts can end up in completely different places.
| 解析(闭式)Analytic (closed form) | 数值(牛顿 / DLS)Numerical (Newton / DLS) | 优化式(QP / NLP)Optimization-based (QP / NLP) | |
|---|---|---|---|
| 适用机构Applies to | 满足 Pieper 准则等条件的机构,逐个推导mechanisms meeting Pieper-type conditions, derived per arm | 任何机构,包括冗余臂any mechanism, including redundant arms | 任何机构 + 任意约束与代价any mechanism + arbitrary constraints and costs |
| 给出Returns | 全部解(可筛选、可排序)all solutions (filter, rank) | 一个解,取决于初值one solution, depends on the start | 一个(局部最优)解one (locally optimal) solution |
| 速度Speed | 微秒级,确定microseconds, deterministic | 几十微秒到毫秒,迭代次数不定tens of µs to ms, iteration count varies | 毫秒级milliseconds |
| 关节限位、避障Limits, obstacles | 事后筛选filtered afterwards | 截断 / 投影,较粗糙clamping / projection, crude | 直接写进约束written into the constraints |
5再看数学The math
提示:把鼠标悬停在公式中带底色的符号上,FIG 1 或 FIG 3 中对应的元素会被高亮。Tip: hover the highlighted symbols in the formulas; the matching element in FIG 1 or FIG 3 lights up.
平面 2R 的闭式解The planar 2R in closed form
设目标 \(\mathbf p=(x,y)\),\(r=\|\mathbf p\|\)。由原点、肘、目标构成的三角形,边长分别是 \(l_1,l_2,r\),余弦定理给出 \(\theta_2\);\(\theta_1\) 等于目标的方位角 \(\gamma=\operatorname{atan2}(y,x)\) 减去连杆 1 与"原点–目标"连线的夹角:
Let the target be \(\mathbf p=(x,y)\) and \(r=\|\mathbf p\|\). The triangle formed by the origin, the elbow and the target has sides \(l_1,l_2,r\); the law of cosines gives \(\theta_2\), and \(\theta_1\) is the bearing \(\gamma=\operatorname{atan2}(y,x)\) of the target minus the angle between link 1 and the origin–target line:
\(|\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 节里雅可比奇异的位置:解的数目变化的地方,就是雅可比降秩的地方。
\(|\cos\theta_2|>1\) means no solution, which is the same as the two circles missing each other. The two signs give two solutions that are mirror images across the origin–target line: \((\theta_1,\theta_2)\mapsto(2\gamma-\theta_1,\,-\theta_2)\). At \(\cos\theta_2=\pm1\) the two merge and \(\theta_2\) as a function of \(r\) has a diverging slope (\(\mathrm d\theta_2/\mathrm dr\propto1/\sin\theta_2\)): this is exactly where Lesson 3.4's Jacobian is singular. Where the number of solutions changes, the Jacobian drops rank.
Pieper 准则:什么时候有闭式解Pieper's criterion: when a closed form exists
一般的 6R 臂,逆运动学是 6 个耦合的三角方程。Pieper(1968)发现:若三个相邻关节的轴交于一点(典型情形是球腕),位置与姿态解耦,方程组分裂成两个小问题,闭式解存在,且至多 8 个解。原因很直接:这个交点(腕心)的位置只由它之前的关节决定,不受腕转动的影响,所以
For a general 6R arm, inverse kinematics is six coupled trigonometric equations. Pieper (1968) found that if three adjacent joint axes meet at a point (the typical case is a spherical wrist), position and orientation decouple: the system splits into two small problems with a closed-form solution and at most 8 solutions. The reason is direct: the intersection point (the wrist centre) is moved only by the joints before it, not by the wrist rotation, so
三根轴平行(如 UR 系列的肩、肘、腕 1)也能得到闭式解,只是推导不同。反过来,一旦腕有偏置(三轴不再交于一点),上面的分解就不精确了,必须换成别的几何构造,或改用数值 IK。
Three parallel axes (the shoulder, elbow and first wrist joint of UR-type arms) also lead to a closed form, derived differently. Conversely, as soon as the wrist is offset (three axes no longer meet), the decomposition above is no longer exact: use another geometric construction or fall back on numerical IK.
Robot.arm6 的完整推导The full derivation for Robot.arm6
用 PoE(5.10 节)读出这台臂的结构:轴依次是 \(\hat z,\hat y,\hat y,\hat x,\hat y,\hat x\),所以旋转部分就是
Read the structure off the PoE form (Lesson 5.10): the axes are \(\hat z,\hat y,\hat y,\hat x,\hat y,\hat x\), so the rotation part is simply
(\(\sin\) 前的负号来自约定:绕 \(+y\) 的正转动让 \(+x\) 向下倾。)逐步求解:
(The minus signs on \(\sin\) come from the convention: a positive rotation about \(+y\) tips \(+x\) down.) Solve step by step:
第 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),余弦定理给出
Step 1, shoulder. \(x_w^2+y_w^2=\rho^2\), so \(q_1=\operatorname{atan2}(y_w,x_w)\) (then \(\rho=+\sqrt{x_w^2+y_w^2}\)) or \(q_1=\operatorname{atan2}(y_w,x_w)+\pi\) (then \(\rho=-\sqrt{x_w^2+y_w^2}\)).
Step 2, elbow and shoulder pitch. Write \(h=z_w-d_1\). \((\rho,h)\) is a planar 2R problem (FIG 1), and the law of cosines gives
第 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\):
Step 3, wrist. With the first three joints known, \(W=R_3^6=\big(R_z(q_1)R_y(q_2+q_3)\big)^\top R\). Multiplying out \(R_x(q_4)R_y(q_5)R_x(q_6)\) with \(a,b,c=q_4,q_5,q_6\):
第一行和第一列只含 \(\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 的表格每次都在实时重复这个检验。
The first row and first column contain only a single product with \(\sin b\), so they can be read off directly. The second branch takes \(\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})\). That is FIG 3's wrist flip: two Euler-angle decompositions of the same rotation matrix.
Singular cases need their own handling. (i) Shoulder singularity: \(x_w=y_w=0\), the wrist centre is on the J1 axis and \(q_1\) is arbitrary (keep the previous value for continuity); (ii) Elbow singularity: \(\cos q_3=\pm1\), the arm is fully stretched or folded, the two elbow branches merge, and a small change of \(r\) needs a large change of \(q_3\); (iii) Wrist singularity: \(\sin q_5=0\), the J4 and J6 axes line up, and only \(q_4+q_6\) (for \(q_5=0\)) or \(q_6-q_4\) (for \(q_5=\pi\)) is determined, leaving one free parameter. Each special branch in the code corresponds to one of these three cases.
How do we know it is right? By an FK round trip: pick any \(\mathbf q\), compute \(T=\operatorname{FK}(\mathbf q)\), run IK, and check (1) every returned solution maps back to \(T\) under FK, and (2) the original \(\mathbf q\) is among the solutions. The author ran this in Node on 20,000 random \(\mathbf q\) inside the joint limits: every call returned exactly 8 solutions, all with FK = target to within \(6\times10^{-13}\), and the original \(\mathbf q\) was never missing; the singular configurations above pass too, with fewer solutions. The table in FIG 3 repeats the check live.
有几个解How many solutions
球腕 6R 臂:肩 2 × 肘 2 × 腕 2 = 8(FIG 3)。一般的 6R 臂(没有交点)最多 16 个解:Raghavan–Roth(1993)把问题消元成关于某个关节半角正切的一个 16 次多项式,其中的实根就是实解。冗余臂(\(n>6\))有连续的解族,维数 \(n-6\);7R 臂对完整位姿的解是 1 维的曲线(肘部绕"肩–腕"连线转动的"摆动角"),常见做法是把这个自由参数固定或优化,再套闭式解。
A spherical-wrist 6R arm: shoulder 2 × elbow 2 × wrist 2 = 8 (FIG 3). A general 6R arm (no intersection) has at most 16: Raghavan and Roth (1993) eliminated the unknowns down to a degree-16 polynomial in the tangent of a half-angle of one joint, whose real roots are the real solutions. Redundant arms (\(n>6\)) have a continuous family of dimension \(n-6\); for a 7R arm and a full pose it is a 1-dimensional curve (the elbow's "swivel angle" about the shoulder–wrist line), and a common strategy is to fix or optimize that parameter and then apply a closed form.
数值 IK = SE(3) 上的牛顿法Numerical IK = Newton's method on SE(3)
这是对 \(\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\) 取得更小。
This is Gauss–Newton on \(\tfrac12\|\mathbf e(\mathbf q)\|^2\) (Lessons 6.6, 6.9). The body-frame error \(\mathbf e\) pairs with the body Jacobian \(J_b\) (Lesson 7.4); an error written in the space frame pairs with \(J_s\) instead. The exact derivative of \(\mathbf e\) with respect to \(\mathbf q\) is \(-J_l^{-1}(\mathbf e)\,J_b\), where \(J_l\) is the left Jacobian of SE(3), which differs from the identity by \(O(\|\mathbf e\|)\). Using \(-J_b\) instead therefore still converges quadratically near a solution (FIG 4's \(10^{-2}\to10^{-4}\to10^{-8}\)), provided \(J_b\) has full rank. Far from a solution nothing is guaranteed: that is the basin picture of FIG 5, and it takes clamping, backtracking line search (Lesson 6.5) or damping (Levenberg–Marquardt) to protect the iteration. Damping changes the path but not the fixed points (\(\mathbf e=\mathbf 0\)); when \(J_b\) drops rank, however, it can stall on an error plateau (FIG 4's "stretched" target).
Units and weights. The first three components of \(\mathbf e\) are radians and the last three are metres, and "1 rad" is not equivalent to "1 m". Weight the rows: \(\min_{\Delta\mathbf q}\|W(J_b\Delta\mathbf q-\mathbf e)\|^2+\lambda^2\|\Delta\mathbf q\|^2\) with \(W=\operatorname{diag}(w_\omega I_3,\,w_vI_3)\). A typical choice makes each weight the inverse of its tolerance (1 mm gives \(w_v=10^3\), 0.1° gives \(w_\omega\approx570\)); a position-first task uses a smaller \(w_\omega\).
限位、次要任务与优化式 IKJoint limits, secondary tasks and optimization-based 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 的初值或解。
A closed-form solver first returns all solutions and then filters them by joint limits, collisions and distance from the current configuration. A numerical solver has to put the limits into the iteration: the crudest way clamps \(\mathbf q\) into its limits (and can get stuck); better is to write each step as a QP with inequality constraints, \(\min\|J_b\Delta\mathbf q-\mathbf e\|^2+\lambda^2\|\Delta\mathbf q\|^2\) subject to \(\mathbf q_{\min}\le\mathbf q+\Delta\mathbf q\le\mathbf q_{\max}\) (Lesson 6.8). A redundant arm can, as in Lesson 3.4, project secondary goals (stay away from limits, keep the elbow oriented) into the null space with \((I-J^+J)\mathbf z\). One step further treats the whole IK as a nonlinear optimization problem (Lesson 6.9) with any costs and constraints (reachability, collision distance, orientation, smoothness) solved by SQP or interior-point methods; Part VI will also use neural networks to give IK initial guesses or solutions directly.
6机器人中的它:沿路径跟踪时选哪个解In robotics: which solution to pick while tracking a path
IK 在机器人里最常见的用法不是"解一次",而是每个控制周期解一次:笛卡尔直线运动、遥操作、视觉伺服都是这样。这时候最重要的不是解得对不对,而是前后两次选的是不是同一个分支。下图让工具沿一条路径运动,比较三种策略:
- 固定分支:永远取起点所在的那个(肩、肘、腕)分支;
- 最近的解:闭式解的 8 个解里,取离上一时刻关节角最近的(不管限位);
- 数值 IK 热启动:以上一时刻的 \(\mathbf q\) 为初值迭代,天然连续。
两条路径都经过奇异位形。"手爪转过腕奇异":腕心不动,工具朝向转过 \(q_5=0\);"手腕越过底座上方":腕心在水平面里从 J1 轴一侧移到另一侧,经过肩奇异。红色竖线标出关节突变(单步超过 0.5 rad)的位置。
In robotics, IK is rarely "solve once"; it is solve every control cycle: Cartesian line moves, teleoperation and visual servoing all work like that. What matters then is not only whether each solution is right, but whether consecutive solutions are on the same branch. The figure moves the tool along a path and compares three policies:
- Fixed branch: always take the (shoulder, elbow, wrist) branch of the start;
- Nearest solution: of the 8 closed-form solutions take the one closest to the previous joint angles (ignoring limits);
- Numerical IK, warm start: iterate from the previous \(\mathbf q\), which is continuous by construction.
Both paths pass through a singularity. "Hand turns through the wrist singularity": the wrist centre stays put while the tool heading sweeps through \(q_5=0\). "Wrist passes over the base": the wrist centre crosses the J1 axis in the horizontal plane, through the shoulder singularity. Red vertical lines mark joint jumps (more than 0.5 rad in one step).
- 选"手爪转过腕奇异",先用"固定分支"播放,看红线处 \(\theta_4,\theta_6\) 一起跳 180°;再换"最近的解"或"热启动"播放到底,最大单步变化 < 0.3 rad。Choose "Hand turns through the wrist singularity", play with "Fixed branch" and see \(\theta_4,\theta_6\) jump by 180° together at the red line; then switch to "Nearest solution" or "warm start" and play to the end: the largest step stays below 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)等启发式方法以极低成本给出看起来自然的解。
IKFast (Diankov's OpenRAVE) generates closed-form C++ solvers automatically for a given serial arm (usually 6 DoF), returning all solutions in microseconds, and is a common MoveIt IK plugin. UR-series arms have a published closed form (Hawkins 2013); the 7-DoF Franka Panda has no unique closed form, and the published analytic solvers typically fix one redundant parameter (such as \(q_7\) or the elbow swivel angle) and then solve analytically. Trac-IK (Beeson & Ames 2015) runs two solvers concurrently, a KDL Newton iteration with random restarts and an SQP solver, and returns whichever succeeds first, which markedly raises the success rate of numerical IK with joint limits. KDL (Orocos) offers Newton–Raphson and LM solvers; MoveIt's kinematics-plugin interface swaps between KDL, Trac-IK, IKFast, BioIK and others; Pinocchio provides the \(\mathrm{SE}(3)\) errors and Jacobians and is used to write differential and QP-based IK (libraries such as Pink and mink); Drake's InverseKinematics poses IK as a constrained nonlinear program. Teleoperation and VR retargeting map the operator's wrist pose to robot joints every frame, which is exactly the warm-started numerical IK above, usually with damping and secondary tasks for smoothness and singularity avoidance; humanoid motion retargeting is the whole-body version of the same idea, typically a QP that meets several hand and foot targets, balance and joint limits at once. In computer animation, heuristics such as FABRIK (Aristidou & Lasenby 2011) give natural-looking solutions at very low cost.
7常见误区Common pitfalls
闭式 IK 返回的是一个无序的集合。取"第一个"或"误差最小的",随着目标移动,下标对应的分支会变,关节在一帧里翻转 180°(FIG 6)。要按与上一帧的关节距离(含 \(\pm\pi\) 回绕)选,同时检查限位与碰撞;起点处才用别的准则(离"舒适姿态"最近)。选"最近"也不是万能:路径必须经过奇异位形或限位时,连续的分支可能不可行,只能重新规划。
Closed-form IK returns an unordered set. Taking "the first one" or "the one with the smallest error" lets the branch behind that index change as the target moves, and the joints flip by 180° in one frame (FIG 6). Choose by joint-space distance to the previous frame (with \(\pm\pi\) wrap-around) and check limits and collisions; only at the start use another criterion (closest to a "comfortable posture"). "Nearest" is not magic either: when the path must cross a singularity or a limit, the continuous branch may be infeasible and the path has to be replanned.
目标不可达、停在局部极小、迭代次数用完,求解器都会返回一个 \(\mathbf q\)。FIG 4 里"远超范围"的目标让误差停在一个非零的平台上;FIG 5 里红色区域根本不收敛。务必检查残差 \(\|\mathbf e\|\)(分别按位置和姿态容差),失败时换初值重启,或者用上一帧的解、闭式解当种子。Trac-IK 的随机重启就是这个思路。
If the target is unreachable, the iteration sits in a local minimum or the iteration budget runs out, the solver still returns a \(\mathbf q\). FIG 4's "far out of reach" target leaves the error on a non-zero plateau, and FIG 5's red regions never converge. Always check the residual \(\|\mathbf e\|\) (separately against position and orientation tolerances), restart from another initial guess on failure, or seed with the previous frame's solution or a closed-form one. Trac-IK's random restarts follow this idea.
\(\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。
\(\operatorname{atan2}\) returns angles in \((-\pi,\pi]\), yet \(q\) and \(q\pm2\pi\) are the same posture. With a joint limit of \([0^\circ,340^\circ]\), the \(-170^\circ\) returned by \(\operatorname{atan2}\) looks out of range while the equivalent \(190^\circ\) is perfectly feasible; many real joints travel more than one turn, so map each solution to its equivalent angle inside the limits before judging it. Distances must be wrapped too (take \(\operatorname{wrap}(q_i-q_i')\)); otherwise \(3.1\) and \(-3.1\) look 6.2 rad apart.
\(\|\mathbf e\|\) 里转角与平移直接相加,等于规定了"1 rad ≡ 1 m";换成毫米,位置就压倒了姿态。手腕离工具越远,同一个转角造成的手爪位置偏差越大。务必按任务的容差加权(见上一节),收敛判据也要分开写:位置小于几个 mm 且姿态小于零点几度。
Adding rotation and translation inside \(\|\mathbf e\|\) declares "1 rad ≡ 1 m"; switch to millimetres and the position swamps the orientation. The farther the wrist is from the tool, the more the same angle displaces the hand. Always weight by the task tolerances (previous section), and write the stopping criterion separately: position within a few mm and orientation within a fraction of a degree.
本节的推导依赖精确的几何:腕轴交于一点、零偏置、特定的零位与轴方向。真实手臂常有小偏置(如 Franka 的腕偏置、UR 的肩偏置)、标定误差和不同的关节符号约定;一个 5 mm 的偏置就让上面的腕心解耦不再精确。要么用对应构型的专门推导(或 IKFast 自动生成),要么用闭式解当种子、再用数值 IK 精修。
This lesson's derivation depends on exact geometry: wrist axes meeting at a point, no offsets, a specific zero pose and axis directions. Real arms have small offsets (the Franka's wrist offset, the UR's shoulder offset), calibration errors and different joint sign conventions; a 5 mm offset makes the wrist-centre decoupling above inexact. Either use a derivation for that exact geometry (or let IKFast generate it), or use the closed form as a seed and polish with numerical IK.
8小练习Check yourself
9延伸阅读Further reading
- K. Lynch & F. Park, Modern Robotics, Ch. 6 — 逆运动学:解析(6.1)与基于 SE(3) 误差的数值牛顿法(6.2)Inverse kinematics: analytic (6.1) and numerical Newton iteration on the SE(3) error (6.2)
- D. L. Pieper, The Kinematics of Manipulators Under Computer Control, PhD thesis, Stanford University, 1968 (Stanford AI Memo 72) — 三轴交于一点则有闭式解的原始出处The original result: three axes meeting at a point give a closed form
- M. Raghavan & B. Roth, Inverse Kinematics of the General 6R Manipulator and Related Linkages, ASME J. Mechanical Design 115(3), 1993 — 一般 6R 臂至多 16 个解的 16 次多项式The degree-16 polynomial and the 16-solution bound for the general 6R arm
- M. W. Spong, S. Hutchinson & M. Vidyasagar, Robot Modeling and Control, Ch. 3 — 运动学解耦与球腕的几何推导Kinematic decoupling and the geometric derivation for spherical wrists
- B. Siciliano, L. Sciavicco, L. Villani & G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 2 and §3.7 — 逆运动学的解法与逆微分运动学算法Inverse kinematics solutions and inverse differential kinematics algorithms
- S. R. Buss, Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares Methods (2004) — 3.4 节引用的三种迭代 IK 的对比The comparison of three iterative IK methods cited in Lesson 3.4
- S. Sugihara, Solvability-Unconcerned Inverse Kinematics by the Levenberg–Marquardt Method, IEEE Trans. Robotics 27(5), 2011 — 用 LM 方法处理无解与奇异情形Handling unreachable targets and singularities with Levenberg–Marquardt
- P. Beeson & B. Ames, TRAC-IK: An Open-Source Library for Improved Solving of Generic Inverse Kinematics, IEEE-RAS Humanoids 2015 — 并行牛顿 + SQP 与随机重启Concurrent Newton + SQP with random restarts
- R. Diankov, Automated Construction of Robotic Manipulation Programs, PhD thesis, Carnegie Mellon University, 2010 — IKFast 的设计与闭式 IK 的自动生成The design of IKFast and automatic generation of closed-form IK
- K. P. Hawkins, Analytic Inverse Kinematics for the Universal Robots UR-5/UR-10 Arms, Georgia Tech technical report, 2013 — 无球腕的真实工业臂的闭式解A closed form for a real industrial arm without a spherical wrist
- A. Aristidou & J. Lasenby, FABRIK: A fast, iterative solver for the Inverse Kinematics problem, Graphical Models 73(5), 2011 — 动画领域常用的启发式 IKThe heuristic IK popular in animation