3. 运动学基础(下):DH参数法建模、正运动学求解、逆运动学求解思路

好,咱们接着聊。上一节我们把旋转矩阵、齐次变换这些数学工具都捋了一遍,说白了就是给机器人运动学搭好了“脚手架”。这一节,咱们要真刀真枪地干——用DH参数法给六轴机器人建模,然后搞定正解和逆解。

我个人习惯,每次讲运动学前,都会先问自己一个问题:“我到底想让机器人末端走到哪?” 正运动学回答的是“给定关节角度,末端在哪”;逆运动学回答的是“给定末端位姿,关节角度是多少”。这两个问题,贯穿了机器人编程的始终。

3.1 DH参数法:给机器人关节“上户口”

DH参数法,说白了就是一套标准化的“户口登记”流程。每个关节、每个连杆,都用四个参数来描述。你想想看,六轴机器人有六个关节,六个连杆,要是没个统一标准,光坐标系定义就能把人绕晕。

我在项目中遇到过,有些同事自己定义坐标系,结果换个人来接手,根本看不懂。所以,DH参数法最大的价值,就是让沟通成本降到最低

四个参数分别是:

  • θ (关节角):绕Z轴旋转的角度。对于旋转关节,这是变量。
  • d (连杆偏距):沿Z轴平移的距离。
  • a (连杆长度):沿X轴平移的距离,也就是两个Z轴之间的公垂线长度。
  • α (连杆扭角):绕X轴旋转的角度,也就是两个Z轴之间的夹角。

嗯,这里要注意:DH参数有两种约定——标准DH和改进DH。我个人习惯用改进DH(也叫Craig版本),因为它的坐标系定义更直观,尤其在处理树形结构或闭链时优势明显。六轴机器人是开链,两种都能用,但一旦选定了,就别中途换,否则坐标系全乱套。

小技巧: 记参数时,可以按“Z→X→Z”的顺序来记:先绕Z转θ,沿Z移d,再沿X移a,最后绕X转α。这样不容易漏。

3.2 六轴机器人DH参数表:实战案例

咱们拿一个典型的六轴工业机器人(比如KUKA、ABB那种)来举例。我一般会先画出它的简化结构图,然后逐关节填写参数表。

假设我们定义好坐标系后,得到如下DH参数表(改进DH):

关节 i θ_i (度) d_i (mm) a_i (mm) α_i (度)
1 θ1 d1 (基座高度) a1 (0) -90
2 θ2 0 a2 (大臂长度) 0
3 θ3 0 a3 (小臂长度) 0
4 θ4 d4 (腕部偏距) 0 -90
5 θ5 0 0 90
6 θ6 d6 (腕部到法兰盘) 0 0

这张表,就是机器人的“身份证”。有了它,任何两个相邻关节之间的变换矩阵,都能直接写出来。

核心公式: 相邻连杆变换矩阵 T_{i-1}^{i} = Rot(z, θ_i) * Trans(z, d_i) * Trans(x, a_i) * Rot(x, α_i)

3.3 正运动学求解:从关节空间到笛卡尔空间

正运动学,说白了就是“连连看”。把六个变换矩阵连乘起来,就得到了末端坐标系相对于基坐标系的位姿。

公式长这样:

T_0^6 = T_0^1 * T_1^2 * T_2^3 * T_3^4 * T_4^5 * T_5^6

结果是一个4x4的齐次变换矩阵,里面包含了位置(px, py, pz)和姿态(用旋转矩阵R表示)。

我曾经在调试一个焊接机器人时,发现末端位置总是偏几毫米。查了半天,最后发现是DH参数表里d4的值写错了。所以,正运动学虽然计算简单,但参数必须精确。你想想看,一个参数差1毫米,六个关节累积下来,末端误差可能就超过5毫米了。

代码实现也很直接,用Python举个例:

import numpy as np

def dh_transform(theta, d, a, alpha):
    """计算单个DH变换矩阵"""
    ct = np.cos(theta)
    st = np.sin(theta)
    ca = np.cos(alpha)
    sa = np.sin(alpha)
    return np.array([
        [ct, -st*ca,  st*sa, a*ct],
        [st,  ct*ca, -ct*sa, a*st],
        [0,   sa,     ca,    d],
        [0,   0,      0,     1]
    ])

# 假设六个关节角度已知
joint_angles = [0.1, 0.2, -0.3, 0.0, 0.5, 0.0]  # 弧度
# 从DH参数表取值
d_vals = [0.3, 0, 0, 0.1, 0, 0.05]
a_vals = [0, 0.4, 0.35, 0, 0, 0]
alpha_vals = [-np.pi/2, 0, 0, -np.pi/2, np.pi/2, 0]

T = np.eye(4)
for i in range(6):
    T_i = dh_transform(joint_angles[i], d_vals[i], a_vals[i], alpha_vals[i])
    T = T @ T_i

print("末端位姿矩阵:\n", T)
print("位置:", T[:3, 3])

运行这段代码,你就能看到末端在空间中的精确位置和姿态。正运动学,就是这么简单直接。

3.4 逆运动学求解思路:从笛卡尔空间回到关节空间

逆运动学就麻烦多了。给定末端位姿,求六个关节角。这玩意儿没有通用解析解,而且解不唯一——同一个末端位姿,可能对应好几组关节角度(比如“肘部朝上”和“肘部朝下”)。

我刚开始做机器人时,觉得逆解就是解方程组。后来发现,六轴机器人的逆解,核心在于“腕部解耦”。什么意思?就是利用大多数工业机器人的结构特点——最后三个关节的轴线交于一点(称为腕点)。这样,位置和姿态就可以分开求解。

具体思路分三步:

  1. 求腕点位置:根据末端位姿和腕部结构,反算出腕点(关节4、5、6的交点)在基坐标系下的位置。
  2. 求前三个关节角:腕点位置只与前三个关节有关。通过几何法(比如投影、余弦定理)求出θ1、θ2、θ3。这一步通常有2-4组解。
  3. 求后三个关节角:已知前三个关节角,可以算出关节3到腕点的变换矩阵。再结合末端姿态,反解出θ4、θ5、θ6。这一步通常也有2组解(腕部翻转)。

所以,六轴机器人最多有8组逆解。实际应用中,我们会根据关节限位、避障、运动平滑性等条件,选一组最合适的。

避坑指南: 我曾经在调试一个码垛程序时,逆解选错了组,导致机器人走到奇异点附近,关节速度瞬间爆表,差点撞到安全围栏。所以,逆解选组时,一定要检查关节限位和奇异点。别光看位置对,就往上怼。

3.5 知识体系总览

为了让你更直观地理解这一节的内容,我画了张图,把DH参数、正解、逆解的关系串起来:

运动学基础(下)知识体系 DH参数法建模 正运动学求解 逆运动学求解 关节角度 → 末端位姿 矩阵连乘,唯一解 末端位姿 → 关节角度 多解,需选组 核心:腕部解耦,位置/姿态分开求

这张图把逻辑关系理得很清楚:DH参数是基础,正解是“正向推导”,逆解是“反向求解”。实际项目中,正解用于仿真验证,逆解用于实时控制。两者缺一不可。

好了,运动学基础就讲到这里。记住,DH参数表是机器人的“身份证”,正解是“照镜子”,逆解是“猜拳”。多动手算几遍,自然就熟了。


公众号:蓝海资料掘金营,微信deep3321