📘 机器人学笔记:正运动学 (FK) 与 MDH 建模


1. 核心概念:正运动学 (Forward Kinematics)

1.1 定义

正运动学回答的是**“已知关节角,求末端位姿”**的问题。

  • 输入 (关节空间)Θ=[θ1,θ2,…,θn]T\Theta = [\theta_1, \theta_2, \dots, \theta_n]^TΘ=[θ1,θ2,,θn]T
  • 输出 (笛卡尔空间):末端执行器相对于基座的位置 (Px,Py,Pz)(P_x, P_y, P_z)(Px,Py,Pz) 和姿态 (R)(R)(R)

1.2 核心思想

通过在每一个连杆上建立一个坐标系,利用齐次变换矩阵将它们串联起来:

n0T=10T(θ1)⋅21T(θ2)⋅⋯⋅nn−1T(θn) {}^{0}_{n}T = {}^{0}_{1}T(\theta_1) \cdot {}^{1}_{2}T(\theta_2) \cdot \dots \cdot {}^{n-1}_{n}T(\theta_n) n0T=10T(θ1)21T(θ2)nn1T(θn)


2. 建模标准:MDH (Modified DH) 参数法

工业界常用 Craig 提出的 MDH 方法。其核心特征是将坐标系 {i}\{i\}{i} 固连在连杆 iii 的首端(即关节 iii 处)。

2.1 四个“魔法参数”

描述从坐标系 {i−1}\{i-1\}{i1}{i}\{i\}{i} 的变换,只需 4 个参数:

参数 符号 定义 (参照基准) 记忆口诀
连杆扭转角 αi−1\alpha_{i-1}αi1 Zi−1Z_{i-1}Zi1ZiZ_iZi 的夹角 (绕 Xi−1X_{i-1}Xi1) 上根轴歪没歪?
连杆长度 ai−1a_{i-1}ai1 Zi−1Z_{i-1}Zi1ZiZ_iZi 的距离 (沿 Xi−1X_{i-1}Xi1) 上根杆有多长?
关节角 θi\theta_iθi Xi−1X_{i-1}Xi1XiX_iXi 的夹角 (绕 ZiZ_iZi) 电机转了多少?
连杆偏距 did_idi Xi−1X_{i-1}Xi1XiX_iXi 的距离 (沿 ZiZ_iZi) 关节有没有凸出?

关键点:MDH 的参数下标 i−1i-1i1 表示它是上一根连杆的固有属性,而 iii 表示它是当前关节的变量或属性。


3. 通用齐次变换矩阵 ii−1T{}^{i-1}_{i}Tii1T

根据 MDH 定义,从坐标系 {i}\{i\}{i}{i−1}\{i-1\}{i1} 的变换矩阵公式如下(严格对应您提供的图片公式):

ii−1T=[cθi−sθi0ai−1sθicαi−1cθicαi−1−sαi−1−sαi−1disθisαi−1cθisαi−1cαi−1cαi−1di0001] {}^{i-1}_{i}T = \begin{bmatrix} c\theta_i & -s\theta_i & 0 & a_{i-1} \\ s\theta_i c\alpha_{i-1} & c\theta_i c\alpha_{i-1} & -s\alpha_{i-1} & -s\alpha_{i-1}d_i \\ s\theta_i s\alpha_{i-1} & c\theta_i s\alpha_{i-1} & c\alpha_{i-1} & c\alpha_{i-1}d_i \\ 0 & 0 & 0 & 1 \end{bmatrix} ii1T= cθisθicαi1sθisαi10sθicθicαi1cθisαi100sαi1cαi10ai1sαi1dicαi1di1

注:cθic\theta_icθi 代表 cos⁡(θi)\cos(\theta_i)cos(θi)sθis\theta_isθi 代表 sin⁡(θi)\sin(\theta_i)sin(θi),以此类推。


4. 📝 3自由度平面机械臂实例

我们以经典的平面三轴机械臂为例,一步步演示如何从零开始算到末端位置。

第一步:建立坐标系 (Frame Assignment)

  1. Z 轴:所有关节都是旋转关节,且在同一平面运动 →\rightarrow 所有 ZZZ 轴 (Z1,Z2,Z3Z_1, Z_2, Z_3Z1,Z2,Z3) 垂直纸面向外,相互平行
  2. X 轴
    • X0X_0X0:任意设定(通常水平向右)。
    • X1X_1X1:沿着 Link 1 指向下一个关节。
    • X2X_2X2:沿着 Link 2 指向下一个关节。
    • X3X_3X3:沿着 Link 3 指向末端。
  3. 原点:坐标系 {i}\{i\}{i} 的原点建在关节 iii 的中心。

第二步:提取 MDH 参数表

我们需要逐行填写表格。

变换层级 (ii−1T{}^{i-1}_{i}Tii1T) αi−1\alpha_{i-1}αi1 ai−1a_{i-1}ai1 did_idi θi\theta_iθi 解析 (为什么这样填?)
10T{}^{0}_{1}T10T (基座→\toJ1) 000 000 000 θ1\theta_1θ1 原点重合(a0=0a_0=0a0=0),Z轴平行(α0=0\alpha_0=0α0=0)
21T{}^{1}_{2}T21T (J1→\toJ2) 000 L1L_1L1 000 θ2\theta_2θ2 沿 X1X_1X1 走了 L1L_1L1 到 J2,Z轴平行
32T{}^{2}_{3}T32T (J2→\toJ3) 000 L2L_2L2 000 θ3\theta_3θ3 沿 X2X_2X2 走了 L2L_2L2 到 J3,Z轴平行

注意:图中的末端点 PPP 并不是关节,它是在坐标系 {3}\{3\}{3} 中的一个固定点,距离为 L3L_3L3。我们将在最后一步处理它。

第三步:生成单关节变换矩阵

将参数代入通用公式。由于所有 α=0,d=0\alpha=0, d=0α=0,d=0,矩阵会大幅简化(cα=1,sα=0c\alpha=1, s\alpha=0cα=1,sα=0)。

1. 关节 1 矩阵 (10T{}^{0}_{1}T10T)
代入:a0=0,θ=θ1a_0=0, \theta=\theta_1a0=0,θ=θ1
10T=[c1−s100s1c10000100001] {}^{0}_{1}T = \begin{bmatrix} c_1 & -s_1 & 0 & 0 \\ s_1 & c_1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 10T= c1s100s1c10000100001

2. 关节 2 矩阵 (21T{}^{1}_{2}T21T)
代入:a1=L1,θ=θ2a_1=L_1, \theta=\theta_2a1=L1,θ=θ2
21T=[c2−s20L1s2c20000100001] {}^{1}_{2}T = \begin{bmatrix} c_2 & -s_2 & 0 & L_1 \\ s_2 & c_2 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 21T= c2s200s2c2000010L1001

3. 关节 3 矩阵 (32T{}^{2}_{3}T32T)
代入:a2=L2,θ=θ3a_2=L_2, \theta=\theta_3a2=L2,θ=θ3
32T=[c3−s30L2s3c30000100001] {}^{2}_{3}T = \begin{bmatrix} c_3 & -s_3 & 0 & L_2 \\ s_3 & c_3 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 32T= c3s300s3c3000010L2001

第四步:链式乘法 (Chain Multiplication)

我们需要计算总变换矩阵 30T=10T⋅21T⋅32T{}^{0}_{3}T = {}^{0}_{1}T \cdot {}^{1}_{2}T \cdot {}^{2}_{3}T30T=10T21T32T。为了演示清楚,我们分两步乘。

1. 先算前两节 (20T=10T⋅21T{}^{0}_{2}T = {}^{0}_{1}T \cdot {}^{1}_{2}T20T=10T21T)

[c1−s100s1c10000100001]⋅[c2−s20L1s2c20000100001] \begin{bmatrix} c_1 & -s_1 & 0 & 0 \\ s_1 & c_1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} c_2 & -s_2 & 0 & L_1 \\ s_2 & c_2 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} c1s100s1c10000100001 c2s200s2c2000010L1001

利用三角恒等式 (c1c2−s1s2=c1+2c_1c_2 - s_1s_2 = c_{1+2}c1c2s1s2=c1+2),结果为:
20T=[c12−s120L1c1s12c120L1s100100001] {}^{0}_{2}T = \begin{bmatrix} c_{12} & -s_{12} & 0 & L_1 c_1 \\ s_{12} & c_{12} & 0 & L_1 s_1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 20T= c12s1200s12c12000010L1c1L1s101
物理意义:坐标系 {2} 相对于基座旋转了 θ1+θ2\theta_1+\theta_2θ1+θ2,平移了 (L1c1,L1s1)(L_1 c_1, L_1 s_1)(L1c1,L1s1)

2. 再乘第三节 (30T=20T⋅32T{}^{0}_{3}T = {}^{0}_{2}T \cdot {}^{2}_{3}T30T=20T32T)

[c12−s120L1c1s12c120L1s100100001]⋅[c3−s30L2s3c30000100001] \begin{bmatrix} c_{12} & -s_{12} & 0 & L_1 c_1 \\ s_{12} & c_{12} & 0 & L_1 s_1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} c_3 & -s_3 & 0 & L_2 \\ s_3 & c_3 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} c12s1200s12c12000010L1c1L1s101 c3s300s3c3000010L2001

运算结果:
30T=[c123−s1230L1c1+L2c12s123c1230L1s1+L2s1200100001] {}^{0}_{3}T = \begin{bmatrix} c_{123} & -s_{123} & 0 & L_1 c_1 + L_2 c_{12} \\ s_{123} & c_{123} & 0 & L_1 s_1 + L_2 s_{12} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 30T= c123s12300s123c123000010L1c1+L2c12L1s1+L2s1201
物理意义:关节 3 (肘部) 的绝对位置是 (L1c1+L2c12,L1s1+L2s12)(L_1 c_1 + L_2 c_{12}, L_1 s_1 + L_2 s_{12})(L1c1+L2c12,L1s1+L2s12)

第五步:计算末端点 P

最后,不要忘了图中的末端点 PPP
在坐标系 {3}\{3\}{3} 中,点 PPP 的坐标是固定的:3P=[L3,0,0,1]T{}^{3}P = [L_3, 0, 0, 1]^T3P=[L3,0,0,1]T

将它转换到世界坐标系:
0P=30T⋅3P {}^{0}P = {}^{0}_{3}T \cdot {}^{3}P 0P=30T3P

[xpypzp1]=[c123−s1230L1c1+L2c12s123c1230L1s1+L2s1200100001]⋅[L3001] \begin{bmatrix} x_p \\ y_p \\ z_p \\ 1 \end{bmatrix} = \begin{bmatrix} c_{123} & -s_{123} & 0 & L_1 c_1 + L_2 c_{12} \\ s_{123} & c_{123} & 0 & L_1 s_1 + L_2 s_{12} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} L_3 \\ 0 \\ 0 \\ 1 \end{bmatrix} xpypzp1 = c123s12300s123c123000010L1c1+L2c12L1s1+L2s1201 L3001

🎉 最终公式:
xp=L1cos⁡(θ1)+L2cos⁡(θ1+θ2)+L3cos⁡(θ1+θ2+θ3)yp=L1sin⁡(θ1)+L2sin⁡(θ1+θ2)+L3sin⁡(θ1+θ2+θ3)zp=0 \begin{align*} x_p &= L_1 \cos(\theta_1) + L_2 \cos(\theta_1 + \theta_2) + L_3 \cos(\theta_1 + \theta_2 + \theta_3) \\ y_p &= L_1 \sin(\theta_1) + L_2 \sin(\theta_1 + \theta_2) + L_3 \sin(\theta_1 + \theta_2 + \theta_3) \\ z_p &= 0 \end{align*} xpypzp=L1cos(θ1)+L2cos(θ1+θ2)+L3cos(θ1+θ2+θ3)=L1sin(θ1)+L2sin(θ1+θ2)+L3sin(θ1+θ2+θ3)=0


📘 机器人逆运动学 (Inverse Kinematics)

核心内容:IK 概念、解析法几何推导、数值法公式底层来源 (泰勒展开与梯度下降)


1. 逆运动学 (IK) 核心定义

1.1 什么是 IK?

逆运动学是寻找 “为了达到目标位置,关节需要怎么动” 的过程。

  • 正运动学 (FK):映射 f:关节空间→笛卡尔空间f: \text{关节空间} \rightarrow \text{笛卡尔空间}f:关节空间笛卡尔空间
    • 公式:x=f(q)x = f(\mathbf{q})x=f(q)
    • 性质:唯一解 (One-to-One)
  • 逆运动学 (IK):映射 f−1:笛卡尔空间→关节空间f^{-1}: \text{笛卡尔空间} \rightarrow \text{关节空间}f1:笛卡尔空间关节空间
    • 公式:q=f−1(x)\mathbf{q} = f^{-1}(x)q=f1(x)
    • 性质:多解 (One-to-Many)、可能无解、非线性。

1.2 三大挑战

  1. 多解性 (Redundancy):同一个末端位置可能对应多种关节姿态(如“肘部朝上”或“肘部朝下”)。
  2. 奇异性 (Singularity):当雅可比矩阵行列式为 0 时(如手臂伸直),运动失去自由度,数值解法会发散。
  3. 非线性 (Non-linearity):方程包含大量的 sin⁡,cos⁡\sin, \cossin,cos,无法用简单的线性代数直接求解。

2. 方法一:解析法 (Analytical Method)

核心思想:利用几何关系(三角形余弦定理)和代数消元,推导出一个精确的闭合公式
适用场景:结构简单的标准机械臂(如 3自由度平面臂、符合 Pieper 准则的 6轴工业臂)。

🎓 3自由度平面臂 (3-DOF Planar)

已知:末端位姿 (x,y,ϕ)(x, y, \phi)(x,y,ϕ),杆长 L1,L2,L3L_1, L_2, L_3L1,L2,L3
求解:关节角 θ1,θ2,θ3\theta_1, \theta_2, \theta_3θ1,θ2,θ3

步骤 1:去尾 (Wrist Decoupling)

由于末端姿态 ϕ\phiϕ 已知,且 L3L_3L3 长度固定,我们可以算出 手腕关节中心 (Wx,Wy)(W_x, W_y)(Wx,Wy)。这相当于把 3自由度降维成 2自由度。

{Wx=x−L3cos⁡(ϕ)Wy=y−L3sin⁡(ϕ) \begin{cases} W_x = x - L_3 \cos(\phi) \\ W_y = y - L_3 \sin(\phi) \end{cases} {Wx=xL3cos(ϕ)Wy=yL3sin(ϕ)

步骤 2:解三角形 (求解 θ2\theta_2θ2)

构建由 L1,L2L_1, L_2L1,L2 和原点到手腕距离 rrr 组成的三角形。

  • 辅助变量:r2=Wx2+Wy2r^2 = W_x^2 + W_y^2r2=Wx2+Wy2

  • 余弦定理应用
    r2=L12+L22−2L1L2cos⁡(π−θ2)r^2 = L_1^2 + L_2^2 - 2 L_1 L_2 \cos(\pi - \theta_2)r2=L12+L222L1L2cos(πθ2)
    注意:三角形内角是 (180∘−θ2)(180^\circ - \theta_2)(180θ2)
    利用 cos⁡(π−θ)=−cos⁡(θ)\cos(\pi - \theta) = -\cos(\theta)cos(πθ)=cos(θ),得:
    r2=L12+L22+2L1L2cos⁡(θ2)r^2 = L_1^2 + L_2^2 + 2 L_1 L_2 \cos(\theta_2)r2=L12+L22+2L1L2cos(θ2)

  • 推导 θ2\theta_2θ2
    D=cos⁡(θ2)=r2−L12−L222L1L2D = \cos(\theta_2) = \frac{r^2 - L_1^2 - L_2^2}{2 L_1 L_2}D=cos(θ2)=2L1L2r2L12L22
    θ2=atan2(±1−D2,D)\theta_2 = \text{atan2}(\pm\sqrt{1-D^2}, D)θ2=atan2(±1D2 ,D)
    正负号分别对应肘部下/上两个解。

步骤 3:几何差角 (求解 θ1\theta_1θ1)

θ1\theta_1θ1 是手腕的几何极角 α\alphaα 减去三角形内角 β\betaβ

  • 总角 α\alphaαα=atan2(Wy,Wx)\alpha = \text{atan2}(W_y, W_x)α=atan2(Wy,Wx)
  • 内角 β\betaβ (利用几何投影):
    β=atan2(L2sin⁡(θ2),L1+L2cos⁡(θ2))\beta = \text{atan2}(L_2 \sin(\theta_2), L_1 + L_2 \cos(\theta_2))β=atan2(L2sin(θ2),L1+L2cos(θ2))
  • 结果
    θ1=α−β\theta_1 = \alpha - \betaθ1=αβ
步骤 4:姿态补全 (求解 θ3\theta_3θ3)

平面内角度直接相加:
ϕ=θ1+θ2+θ3⇒θ3=ϕ−(θ1+θ2)\phi = \theta_1 + \theta_2 + \theta_3 \quad \Rightarrow \quad \theta_3 = \phi - (\theta_1 + \theta_2)ϕ=θ1+θ2+θ3θ3=ϕ(θ1+θ2)


3. 方法二:数值迭代法 (Numerical Iterative Method)

核心思想:从一个初始猜测出发,利用导数(雅可比矩阵)不断修正,逼近真实解。
适用场景:任意构型的机器人、冗余机械臂、无法推导解析解的情况。

3.1 核心工具:雅可比矩阵 (Jacobian Matrix)

J=∂x∂q J = \frac{\partial \mathbf{x}}{\partial \mathbf{q}} J=qx
它描述了关节微小变化 Δq\Delta \mathbf{q}Δq 如何引起 末端微小位移 Δx\Delta \mathbf{x}Δx


3.2 算法 A:牛顿-拉夫逊法 (Newton-Raphson)

这是最常用的 IK 算法,利用一阶泰勒展开进行线性化求解。

📐 公式推导 (为什么是 J−1J^{-1}J1 ?)
  1. 问题定义
    设正运动学函数为 f(q)f(\mathbf{q})f(q),我们的目标是找到 q\mathbf{q}q 使得 f(q)=xtargetf(\mathbf{q}) = \mathbf{x}_{target}f(q)=xtarget

  2. 泰勒级数展开 (Linearization)
    在当前角度 qcurr\mathbf{q}_{curr}qcurr 附近,我们将非线性函数 fff 展开为一阶近似(把曲线看作切线):
    f(qcurr+Δq)≈f(qcurr)+f′(qcurr)⏟J⋅Δqf(\mathbf{q}_{curr} + \Delta \mathbf{q}) \approx f(\mathbf{q}_{curr}) + \underbrace{f'(\mathbf{q}_{curr})}_{J} \cdot \Delta \mathbf{q}f(qcurr+Δq)f(qcurr)+J f(qcurr)Δq

  3. 设定目标
    我们要让下一步的位置等于目标位置:
    xtarget≈xcurr+J⋅Δq\mathbf{x}_{target} \approx \mathbf{x}_{curr} + J \cdot \Delta \mathbf{q}xtargetxcurr+JΔq

  4. 构建误差方程
    xtarget−xcurr⏟e (误差)=J⋅Δq\underbrace{\mathbf{x}_{target} - \mathbf{x}_{curr}}_{\mathbf{e} \text{ (误差)}} = J \cdot \Delta \mathbf{q}e (误差) xtargetxcurr=JΔq
    即:
    e=J⋅Δq\mathbf{e} = J \cdot \Delta \mathbf{q}e=JΔq

  5. 求解增量
    两边左乘 JJJ 的逆矩阵:
    Δq=J−1⋅e\Delta \mathbf{q} = J^{-1} \cdot \mathbf{e}Δq=J1e

⚙️ 工程实现细节
  • 迭代公式qk+1=qk+J−1(qk)⋅e\mathbf{q}_{k+1} = \mathbf{q}_k + J^{-1}(\mathbf{q}_k) \cdot \mathbf{e}qk+1=qk+J1(qk)e
  • 伪逆 (Pseudo-Inverse):当 JJJ 不可逆(如非方阵或奇异)时,使用 J†=JT(JJT)−1J^{\dagger} = J^T(JJ^T)^{-1}J=JT(JJT)1
  • 阻尼最小二乘 (DLS):为了防止奇异点导致 J−1J^{-1}J1 爆炸,公式修正为:
    Δq=JT(JJT+λ2I)−1e\Delta \mathbf{q} = J^T (J J^T + \lambda^2 I)^{-1} \mathbf{e}Δq=JT(JJT+λ2I)1e

3.3 算法 B:梯度下降法 (Gradient Descent)

这是基于最优化理论的方法,利用损失函数的梯度来寻找极小值。

📐 公式推导 (为什么是 JTJ^TJT ?)
  1. 定义损失函数 (Loss Function)
    我们要最小化当前位置与目标位置的距离平方:
    L(q)=12∥xtarget−f(q)∥2=12eTeL(\mathbf{q}) = \frac{1}{2} \| \mathbf{x}_{target} - f(\mathbf{q}) \|^2 = \frac{1}{2} \mathbf{e}^T \mathbf{e}L(q)=21xtargetf(q)2=21eTe

  2. 计算梯度 (Gradient)
    我们需要求 LLL 对关节 q\mathbf{q}q 的导数 ∇L\nabla LL。根据链式法则:
    ∇L=∂L∂q=∂L∂e⋅∂e∂q\nabla L = \frac{\partial L}{\partial \mathbf{q}} = \frac{\partial L}{\partial \mathbf{e}} \cdot \frac{\partial \mathbf{e}}{\partial \mathbf{q}}L=qL=eLqe

    • 第一部分:∂(12eTe)∂e=eT\frac{\partial (\frac{1}{2}\mathbf{e}^T\mathbf{e})}{\partial \mathbf{e}} = \mathbf{e}^Te(21eTe)=eT(视为行向量)。
    • 第二部分:e=xtarget−f(q)\mathbf{e} = \mathbf{x}_{target} - f(\mathbf{q})e=xtargetf(q),所以 ∂e∂q=−∂f∂q=−J\frac{\partial \mathbf{e}}{\partial \mathbf{q}} = - \frac{\partial f}{\partial \mathbf{q}} = -Jqe=qf=J

    组合得到:
    ∇L=eT⋅(−J)=−(eTJ)\nabla L = \mathbf{e}^T \cdot (-J) = - (\mathbf{e}^T J)L=eT(J)=(eTJ)
    转置为列向量形式(梯度方向):
    ∇L=−JTe\nabla L = - J^T \mathbf{e}L=JTe

  3. 梯度下降更新规则
    为了最小化损失,必须沿着梯度的反方向移动关节角:
    Δq=−α⋅∇L\Delta \mathbf{q} = - \alpha \cdot \nabla LΔq=αL
    其中 α\alphaα 是学习率(步长)。

  4. 代入梯度
    Δq=−α⋅(−JTe)\Delta \mathbf{q} = - \alpha \cdot (- J^T \mathbf{e})Δq=α(JTe)
    Δq=α⋅JT⋅e\Delta \mathbf{q} = \alpha \cdot J^T \cdot \mathbf{e}Δq=αJTe

⚙️ 工程实现细节
  • 特点:不需要求逆矩阵,计算量小,永不崩溃(即使在奇异点)。
  • 缺点:收敛速度慢(线性收敛),容易在目标附近震荡。

4. 总结对比表

维度 解析法 (Analytical) 牛顿-拉夫逊法 (Newton-Raphson) 梯度下降法 (Gradient Descent)
核心数学 几何、三角变换 泰勒展开、矩阵求逆 链式法则、最优化
公式特征 θ=atan2(...)\theta = \text{atan2}(...)θ=atan2(...) Δθ=J−1e\Delta \theta = J^{-1} eΔθ=J1e Δθ=αJTe\Delta \theta = \alpha J^T eΔθ=αJTe
物理直觉 解三角形 沿切线一步到位 沿坡度慢慢下滑
速度 🚀 极快 (无迭代) 🚄 快 (二次收敛) 🚶 慢 (线性收敛)
稳定性 ✅ 完美 ⚠️ 奇异点会崩溃 (需DLS) ✅ 非常稳健
通用性 ❌ 仅限特定构型 ✅ 任意机器人 ✅ 任意机器人

5. 附录:通用数值法伪代码

def solve_ik(target_pose, initial_guess):
    q = initial_guess
    for i in range(max_iter):
        # 1. 正运动学
        current_pose = forward_kinematics(q)
        
        # 2. 计算误差
        error = target_pose - current_pose
        if norm(error) < tolerance:
            return q # 成功
            
        # 3. 计算雅可比 (有限差分法)
        J = compute_jacobian(q)
        
        # 4. 选择算法计算增量
        # 算法 A: 牛顿法 (DLS优化版)
        dq = J.T * inv(J*J.T + lambda*I) * error
        
        # 算法 B: 梯度下降法 (备选)
        # dq = alpha * J.T * error
        
        # 5. 更新
        q = q + dq
        
    return Fail

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐