机器人运动学基础:正运动学与逆运动学,DH参数法,坐标变换与齐次矩阵

各位同学,欢迎来到第二章。这一章是机器人学的硬核基础,也是后续关节标定和任务执行的数学根基。说实话,很多做强化学习的同学一开始会忽略运动学,觉得“反正有神经网络去学”。但我在实际项目中吃过亏——模型学了半天,结果机械臂末端位置算错了,整个策略全废。所以,这一章我们得把底子打牢。

2.1 坐标变换与齐次矩阵:机器人的“语言”

机器人运动学,说白了就是描述各个关节和末端执行器之间的位置和姿态关系。你想想看,一个六轴机械臂,每个关节都在动,你怎么知道末端到底在哪儿?答案就是坐标变换。

我习惯把坐标变换比作“问路”。你在A点,想知道B点怎么走,就需要知道从A到B的位移和方向。在机器人里,我们用齐次矩阵(Homogeneous Transformation Matrix)来干这件事。

齐次矩阵的核心形式:

| R   t |
| 0   1 |

其中 R 是 3x3 的旋转矩阵,描述姿态;t 是 3x1 的平移向量,描述位置。最后一行是 [0 0 0 1],保持矩阵的齐次性。

为什么非得用4x4矩阵?因为这样可以把旋转和平移统一成一次矩阵乘法。否则你得先旋转再平移,写代码麻烦,还容易出错。我记得第一次手写运动学代码时,忘了加齐次坐标,结果算出来的位置全是错的,排查了半天……嗯,从那以后我再也不敢省这一步了。

2.2 DH参数法:标准化你的机器人模型

有了齐次矩阵,我们怎么描述相邻两个关节之间的关系?Denavit-Hartenberg参数法,也就是DH参数,就是干这个的标准化工具。

DH参数用四个值来描述一个连杆和关节:

参数 符号 含义
连杆长度 ai-1 沿Xi-1轴,从Zi-1到Zi的距离
连杆扭角 αi-1 绕Xi-1轴,从Zi-1到Zi的旋转角
连杆偏距 di 沿Zi轴,从Xi-1到Xi的距离
关节角 θi 绕Zi轴,从Xi-1到Xi的旋转角

这里有个坑,我必须要提醒你:DH参数有两种主流约定——标准DH和改进DH。标准DH把坐标系建在连杆末端,改进DH建在连杆起始端。我在项目中遇到过,团队里两个人用了不同约定,结果仿真和实机对不上,折腾了两天。所以,一开始就要统一约定,并在代码里写清楚。

我的个人习惯:在强化学习仿真中,我倾向于使用改进DH(Modified DH)。因为它的坐标系定义更直观,尤其在处理树形结构或闭链机构时,不容易出错。

2.3 正运动学:从关节空间到任务空间

正运动学,就是已知每个关节的角度(或位移),求末端执行器的位姿。说白了,你给机器人一组关节角度,它告诉你手在哪儿、朝哪个方向。

计算过程很简单:把每个相邻关节的齐次矩阵连乘起来。

# Python伪代码:正运动学计算
def forward_kinematics(joint_angles, dh_params):
    # dh_params: 每行 [a, alpha, d, theta_offset]
    T = np.eye(4)  # 初始为单位矩阵
    for i in range(len(joint_angles)):
        a, alpha, d, theta_offset = dh_params[i]
        theta = joint_angles[i] + theta_offset
        
        # 构建当前关节的齐次矩阵
        Ti = np.array([
            [np.cos(theta), -np.sin(theta)*np.cos(alpha),  np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
            [np.sin(theta),  np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
            [0,             np.sin(alpha),                 np.cos(alpha),               d],
            [0,             0,                             0,                            1]
        ])
        T = T @ Ti  # 矩阵连乘
    return T  # 末端位姿

正运动学是唯一的、确定的。你给一组关节角,末端位姿只有一个答案。这在强化学习中非常有用——你可以精确地知道当前状态对应的末端位置,从而设计更准确的奖励函数。

2.4 逆运动学:从任务空间回到关节空间

逆运动学就麻烦多了。已知末端位姿,求关节角度。这玩意儿在数学上是个多解问题,甚至可能无解。

为什么会这样?你想想看,一个六轴机械臂,末端在空间里只有6个自由度(3个位置+3个姿态),但关节可能有6个甚至7个。多出来的自由度就是冗余,导致同一个末端位姿对应无数种关节构型。

我常用的逆运动学解法有几种:

  • 解析法:针对特定构型(如PUMA 560)推导封闭解。速度快,但通用性差。
  • 数值法(如牛顿-拉夫森):迭代求解,通用性强,但可能陷入局部最优。
  • 优化法:把IK当成一个优化问题,用梯度下降或进化算法求解。

避坑指南:我曾经在强化学习训练中直接调用数值IK求解器,结果因为求解不稳定,导致训练过程中奖励信号剧烈抖动,模型根本学不收敛。后来我改用解析IK(针对我的机器人构型专门推导),训练稳定多了。所以,能用解析IK就别用数值IK,除非你的机器人构型太特殊。

2.5 知识体系总览

为了让你更直观地理解这一章的知识结构,我画了一张图。它把坐标变换、DH参数、正运动学和逆运动学串在了一起。

机器人运动学知识体系 机器人运动学知识体系 坐标变换与齐次矩阵 DH参数法 正运动学 逆运动学 关节标定 任务执行 💡 学习路径建议: 先掌握坐标变换和齐次矩阵 → 理解DH参数建模 → 实现正运动学 → 再攻克逆运动学。 正运动学是基础,逆运动学是难点。在强化学习中,正运动学用得更多(计算状态),但逆运动学在任务规划时必不可少。

2.6 实战中的几个关键点

最后,我分享几个在强化学习项目中用运动学的实战经验:

  • 坐标系统一:所有传感器、执行器、仿真环境的坐标系必须对齐。我见过最离谱的bug,是相机坐标系和机器人基坐标系差了90度,模型学了三天都没发现。
  • 奇异性处理:当机械臂处于奇异位形时,逆运动学的雅可比矩阵会降秩,导致求解失败。在训练中,我通常会在奖励函数里加一个“远离奇异位形”的惩罚项。
  • 精度与速度的权衡:正运动学计算很快,但逆运动学如果迭代求解,可能会拖慢训练速度。我的做法是:在仿真中预计算IK查找表,训练时直接查表,省时省力。

一个小技巧:如果你用的是URDF格式的机器人模型,可以用pinocchio或pybullet自带的运动学函数。但别完全依赖它们——我建议你至少手写一遍正运动学,这样才能真正理解背后的数学原理。出了问题也知道怎么排查。