第二章:机器人运动学基础——坐标变换、齐次矩阵、正运动学(DH参数)、逆运动学求解
各位同学,欢迎来到第二章。说实话,运动学是机器人控制的“地基”。你想想看,如果连机器人手在哪儿、怎么动都不知道,那力控拖动示教根本无从谈起。我当年刚入行时,就吃过这个亏——以为跳过基础直接调力控算法就行,结果调试现场机器人乱窜,差点把夹具撞坏。从那以后,我老老实实回来啃运动学。
这一章,我们就把地基打牢。我会带着你,从坐标变换一路走到逆运动学求解。别怕,咱们一步步来。
2.1 坐标变换:让机器人“知道”自己在哪儿
机器人运动学,说白了就是研究“位置”和“姿态”的关系。一个刚体在空间中有6个自由度:3个位置(x, y, z),3个姿态(绕x、y、z轴的旋转)。
我习惯把坐标变换分成两类:
- 平移变换:两个坐标系原点不同,但方向一致。比如,你的手肘坐标系相对于肩膀坐标系,就是平移。
- 旋转变换:两个坐标系原点重合,但方向不同。比如,你扭头看左边,你的眼睛坐标系相对于头坐标系,就是旋转。
实际项目中,平移和旋转往往是同时发生的。比如,机器人末端执行器相对于基座,既有平移又有旋转。这时候,我们就需要齐次矩阵了。
2.2 齐次矩阵:把平移和旋转“打包”在一起
齐次矩阵,说白了就是一个4x4的矩阵,把旋转(3x3)和平移(3x1)塞进一个框里。为什么是4x4?因为要统一乘法和求逆的运算规则。
它的标准形式长这样:
| R t |
| 0 1 |
其中,R是3x3旋转矩阵,t是3x1平移向量。最后一行是[0 0 0 1],这是齐次坐标的“固定尾巴”。
举个例子,假设你想把坐标系A中的点p_A,变换到坐标系B中。你只需要知道A相对于B的齐次矩阵T_B_A,然后做一次矩阵乘法:
p_B = T_B_A * p_A
就这么简单。但要注意,矩阵乘法不满足交换律。先旋转再平移,和先平移再旋转,结果完全不同。我在项目中见过有人搞反顺序,结果机器人末端位置差了十几厘米,还好仿真阶段发现了。
2.3 正运动学(DH参数):从关节角度到末端位姿
正运动学,就是已知每个关节的角度,求末端执行器在空间中的位置和姿态。最经典的方法就是DH参数法(Denavit-Hartenberg)。
DH参数有4个:
- a:连杆长度(沿x轴方向)
- α:连杆扭转角(绕x轴旋转)
- d:连杆偏距(沿z轴方向)
- θ:关节角(绕z轴旋转)
每个关节对应一个DH参数表。比如一个六轴机器人,就有6行4列的参数。然后,每个关节的齐次矩阵可以写成:
T_i = Rot(z, θ_i) * Trans(z, d_i) * Trans(x, a_i) * Rot(x, α_i)
把所有关节的矩阵连乘起来,就得到末端相对于基座的位姿:
T_0_n = T_1 * T_2 * ... * T_n
我个人的习惯是,在写代码前,先在纸上把DH参数表列出来,然后手动算一遍前两个关节的矩阵乘法。这样能快速发现参数错误。
下面是我用SVG画的一张DH参数建模流程图,帮你理清思路:
2.4 逆运动学求解:从末端位姿到关节角度
逆运动学,就是已知末端位姿,反求每个关节的角度。这比正运动学难得多,因为:
- 解可能不唯一(多解)
- 解可能不存在(超出工作空间)
- 解可能不连续(奇异点)
常用的求解方法有:
- 解析法:通过几何关系直接推导出角度公式。速度快,但只适用于特定构型(如6轴机器人有封闭解的条件)。
- 数值法:用迭代优化逼近解。通用性强,但速度慢,且可能陷入局部最优。
我个人在实际项目中,90%的情况用解析法。为什么呢?因为力控拖动示教要求实时性,数值法动不动几十毫秒,根本扛不住。但解析法需要满足一个条件:机器人的后三个关节轴交于一点(即腕部)。大部分工业机器人都满足这个条件。
下面是一个简单的逆运动学求解伪代码示例(以6轴机器人为例):
// 输入:末端位姿矩阵 T_target
// 输出:关节角度数组 q[6]
function inverse_kinematics(T_target):
// 1. 从T_target中提取位置p和姿态R
p = T_target[0:3, 3]
R = T_target[0:3, 0:3]
// 2. 根据几何关系求解前三个关节
// 这里以常见的球形腕部为例
q[0] = atan2(p.y, p.x)
// ... 省略中间推导过程
q[2] = acos((p.x^2 + p.y^2 + p.z^2 - a2^2 - a3^2) / (2*a2*a3))
// 3. 根据前三个关节和姿态R,求解后三个关节
// 注意:这里需要处理多解情况
// 我一般选择“最短路径”解,即离当前关节角度最近的解
q[3] = atan2(...)
q[4] = acos(...)
q[5] = atan2(...)
// 4. 检查解是否在关节限位内
for i in 0..5:
if q[i] < q_min[i] or q[i] > q_max[i]:
return None // 无有效解
return q
2.5 本章小结
这一章我们讲了:
- 坐标变换:平移和旋转,以及它们的组合
- 齐次矩阵:用4x4矩阵统一表示位姿变换
- 正运动学(DH参数):从关节角度到末端位姿
- 逆运动学求解:从末端位姿到关节角度
这些内容,是后续力控拖动示教的基础。你想想看,如果连机器人的运动学模型都建不准,那力控算法再牛也是白搭。我建议你,学完这一章后,找个开源机器人模型(比如UR5的DH参数),自己动手写一遍正逆解代码。只有亲手写过,才能真正理解。
好了,这一章就到这里。下一章,我们会进入力控的核心——如何让机器人“感觉”到外力,并做出响应。