机器人学-正逆运动学及MDH建模
正运动学回答的是**“已知关节角,求末端位姿”**的问题。通过在每一个连杆上建立一个坐标系,利用齐次变换矩阵将它们串联起来: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)n0
📘 机器人学笔记:正运动学 (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)⋅⋯⋅nn−1T(θn)
2. 建模标准:MDH (Modified DH) 参数法
工业界常用 Craig 提出的 MDH 方法。其核心特征是将坐标系 {i}\{i\}{i} 固连在连杆 iii 的首端(即关节 iii 处)。
2.1 四个“魔法参数”
描述从坐标系 {i−1}\{i-1\}{i−1} 到 {i}\{i\}{i} 的变换,只需 4 个参数:
| 参数 | 符号 | 定义 (参照基准) | 记忆口诀 |
|---|---|---|---|
| 连杆扭转角 | αi−1\alpha_{i-1}αi−1 | 轴 Zi−1Z_{i-1}Zi−1 到 ZiZ_iZi 的夹角 (绕 Xi−1X_{i-1}Xi−1) | 上根轴歪没歪? |
| 连杆长度 | ai−1a_{i-1}ai−1 | 轴 Zi−1Z_{i-1}Zi−1 到 ZiZ_iZi 的距离 (沿 Xi−1X_{i-1}Xi−1) | 上根杆有多长? |
| 关节角 | θi\theta_iθi | 轴 Xi−1X_{i-1}Xi−1 到 XiX_iXi 的夹角 (绕 ZiZ_iZi) | 电机转了多少? |
| 连杆偏距 | did_idi | 轴 Xi−1X_{i-1}Xi−1 到 XiX_iXi 的距离 (沿 ZiZ_iZi) | 关节有没有凸出? |
关键点:MDH 的参数下标 i−1i-1i−1 表示它是上一根连杆的固有属性,而 iii 表示它是当前关节的变量或属性。
3. 通用齐次变换矩阵 ii−1T{}^{i-1}_{i}Tii−1T
根据 MDH 定义,从坐标系 {i}\{i\}{i} 到 {i−1}\{i-1\}{i−1} 的变换矩阵公式如下(严格对应您提供的图片公式):
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} ii−1T= cθisθicαi−1sθisαi−10−sθicθicαi−1cθisαi−100−sαi−1cαi−10ai−1−sαi−1dicαi−1di1
注: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)
- Z 轴:所有关节都是旋转关节,且在同一平面运动 →\rightarrow→ 所有 ZZZ 轴 (Z1,Z2,Z3Z_1, Z_2, Z_3Z1,Z2,Z3) 垂直纸面向外,相互平行。
- X 轴:
- X0X_0X0:任意设定(通常水平向右)。
- X1X_1X1:沿着 Link 1 指向下一个关节。
- X2X_2X2:沿着 Link 2 指向下一个关节。
- X3X_3X3:沿着 Link 3 指向末端。
- 原点:坐标系 {i}\{i\}{i} 的原点建在关节 iii 的中心。
第二步:提取 MDH 参数表
我们需要逐行填写表格。
| 变换层级 (ii−1T{}^{i-1}_{i}Tii−1T) | αi−1\alpha_{i-1}αi−1 | ai−1a_{i-1}ai−1 | did_idi | θi\theta_iθi | 解析 (为什么这样填?) |
|---|---|---|---|---|---|
| 10T{}^{0}_{1}T10T (基座→\to→J1) | 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→\to→J2) | 000 | L1L_1L1 | 000 | θ2\theta_2θ2 | 沿 X1X_1X1 走了 L1L_1L1 到 J2,Z轴平行 |
| 32T{}^{2}_{3}T32T (J2→\to→J3) | 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=
c1s100−s1c10000100001
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=
c2s200−s2c2000010L1001
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=
c3s300−s3c3000010L2001
第四步:链式乘法 (Chain Multiplication)
我们需要计算总变换矩阵 30T=10T⋅21T⋅32T{}^{0}_{3}T = {}^{0}_{1}T \cdot {}^{1}_{2}T \cdot {}^{2}_{3}T30T=10T⋅21T⋅32T。为了演示清楚,我们分两步乘。
1. 先算前两节 (20T=10T⋅21T{}^{0}_{2}T = {}^{0}_{1}T \cdot {}^{1}_{2}T20T=10T⋅21T)
[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} c1s100−s1c10000100001 ⋅ c2s200−s2c2000010L1001
利用三角恒等式 (c1c2−s1s2=c1+2c_1c_2 - s_1s_2 = c_{1+2}c1c2−s1s2=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=
c12s1200−s12c12000010L1c1L1s101
物理意义:坐标系 {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=20T⋅32T)
[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} c12s1200−s12c12000010L1c1L1s101 ⋅ c3s300−s3c3000010L2001
运算结果:
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=
c123s12300−s123c123000010L1c1+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=30T⋅3P
[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 = c123s12300−s123c123000010L1c1+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{关节空间}f−1:笛卡尔空间→关节空间
- 公式:q=f−1(x)\mathbf{q} = f^{-1}(x)q=f−1(x)
- 性质:多解 (One-to-Many)、可能无解、非线性。
1.2 三大挑战
- 多解性 (Redundancy):同一个末端位置可能对应多种关节姿态(如“肘部朝上”或“肘部朝下”)。
- 奇异性 (Singularity):当雅可比矩阵行列式为 0 时(如手臂伸直),运动失去自由度,数值解法会发散。
- 非线性 (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=x−L3cos(ϕ)Wy=y−L3sin(ϕ)
步骤 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+L22−2L1L2cos(π−θ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)=2L1L2r2−L12−L22
θ2=atan2(±1−D2,D)\theta_2 = \text{atan2}(\pm\sqrt{1-D^2}, D)θ2=atan2(±1−D2,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=∂q∂x
它描述了关节微小变化 Δq\Delta \mathbf{q}Δq 如何引起 末端微小位移 Δx\Delta \mathbf{x}Δx。
3.2 算法 A:牛顿-拉夫逊法 (Newton-Raphson)
这是最常用的 IK 算法,利用一阶泰勒展开进行线性化求解。
📐 公式推导 (为什么是 J−1J^{-1}J−1 ?)
-
问题定义:
设正运动学函数为 f(q)f(\mathbf{q})f(q),我们的目标是找到 q\mathbf{q}q 使得 f(q)=xtargetf(\mathbf{q}) = \mathbf{x}_{target}f(q)=xtarget。 -
泰勒级数展开 (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 -
设定目标:
我们要让下一步的位置等于目标位置:
xtarget≈xcurr+J⋅Δq\mathbf{x}_{target} \approx \mathbf{x}_{curr} + J \cdot \Delta \mathbf{q}xtarget≈xcurr+J⋅Δq -
构建误差方程:
xtarget−xcurr⏟e (误差)=J⋅Δq\underbrace{\mathbf{x}_{target} - \mathbf{x}_{curr}}_{\mathbf{e} \text{ (误差)}} = J \cdot \Delta \mathbf{q}e (误差) xtarget−xcurr=J⋅Δq
即:
e=J⋅Δq\mathbf{e} = J \cdot \Delta \mathbf{q}e=J⋅Δq -
求解增量:
两边左乘 JJJ 的逆矩阵:
Δq=J−1⋅e\Delta \mathbf{q} = J^{-1} \cdot \mathbf{e}Δq=J−1⋅e
⚙️ 工程实现细节
- 迭代公式: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+J−1(qk)⋅e
- 伪逆 (Pseudo-Inverse):当 JJJ 不可逆(如非方阵或奇异)时,使用 J†=JT(JJT)−1J^{\dagger} = J^T(JJ^T)^{-1}J†=JT(JJT)−1。
- 阻尼最小二乘 (DLS):为了防止奇异点导致 J−1J^{-1}J−1 爆炸,公式修正为:
Δ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 ?)
-
定义损失函数 (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)=21∥xtarget−f(q)∥2=21eTe -
计算梯度 (Gradient):
我们需要求 LLL 对关节 q\mathbf{q}q 的导数 ∇L\nabla L∇L。根据链式法则:
∇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=∂q∂L=∂e∂L⋅∂q∂e- 第一部分:∂(12eTe)∂e=eT\frac{\partial (\frac{1}{2}\mathbf{e}^T\mathbf{e})}{\partial \mathbf{e}} = \mathbf{e}^T∂e∂(21eTe)=eT(视为行向量)。
- 第二部分:e=xtarget−f(q)\mathbf{e} = \mathbf{x}_{target} - f(\mathbf{q})e=xtarget−f(q),所以 ∂e∂q=−∂f∂q=−J\frac{\partial \mathbf{e}}{\partial \mathbf{q}} = - \frac{\partial f}{\partial \mathbf{q}} = -J∂q∂e=−∂q∂f=−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 -
梯度下降更新规则:
为了最小化损失,必须沿着梯度的反方向移动关节角:
Δq=−α⋅∇L\Delta \mathbf{q} = - \alpha \cdot \nabla LΔq=−α⋅∇L
其中 α\alphaα 是学习率(步长)。 -
代入梯度:
Δ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=α⋅JT⋅e
⚙️ 工程实现细节
- 特点:不需要求逆矩阵,计算量小,永不崩溃(即使在奇异点)。
- 缺点:收敛速度慢(线性收敛),容易在目标附近震荡。
4. 总结对比表
| 维度 | 解析法 (Analytical) | 牛顿-拉夫逊法 (Newton-Raphson) | 梯度下降法 (Gradient Descent) |
|---|---|---|---|
| 核心数学 | 几何、三角变换 | 泰勒展开、矩阵求逆 | 链式法则、最优化 |
| 公式特征 | θ=atan2(...)\theta = \text{atan2}(...)θ=atan2(...) | Δθ=J−1e\Delta \theta = J^{-1} eΔθ=J−1e | Δθ=α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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)