第2章:机器人运动学基础
各位工程师朋友,大家好。今天我们来聊聊机器人运动学。说实话,这是整个运动控制加速器课程里最“数学”的一章,但也是后续所有内容的地基。我个人习惯是,先把坐标系搞明白,再去碰那些复杂的控制算法。你想想看,连机器人的手在哪儿都不知道,怎么让它干活?
2.1 坐标变换:让机器人“认识”空间
机器人运动学,说白了就是研究机器人怎么动,而不关心它为什么动。我们只关注位置、姿态、速度这些几何关系。
首先,你得有个坐标系。我刚开始做项目时,犯过一个低级错误:把基坐标系和工具坐标系搞反了。结果机器人一启动,直接往反方向冲过去……嗯,从那以后,我每次上电前都会先检查坐标系定义。
核心概念:坐标变换就是将一个点从一个坐标系“翻译”到另一个坐标系。比如,你拿着一个螺丝刀,螺丝刀尖在工具坐标系下的坐标是(0,0,100),但机器人基座想知道这个点相对于自己的位置,就需要做变换。
常见的变换有两种:
- 平移变换:坐标系原点移动了,但方向没变。比如你把桌子往右推了1米。
- 旋转变换:坐标系方向变了,但原点没动。比如你把手机转了个角度。
实际应用中,往往是平移和旋转混在一起。我建议你直接用齐次矩阵来处理,省心省力。
2.2 齐次矩阵:一个矩阵搞定所有
为什么要用齐次矩阵?因为用普通矩阵处理旋转还行,但加上平移就麻烦了。齐次矩阵把旋转和平移塞进一个4x4的矩阵里,一次乘法搞定。
// 齐次矩阵的通用形式
// [ R t ]
// [ 0 1 ]
// 其中R是3x3旋转矩阵,t是3x1平移向量
// 示例:绕Z轴旋转45度,再沿X轴平移10个单位
double T[4][4] = {
{cos(45°), -sin(45°), 0, 10},
{sin(45°), cos(45°), 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
};
我在项目中遇到过一个问题:连续做多次变换时,矩阵乘法的顺序特别容易搞错。记住一个原则:左乘是相对于固定坐标系,右乘是相对于当前坐标系。这个坑我踩过两次,后来干脆在代码里加注释,每次乘之前都写清楚是左乘还是右乘。
小技巧:调试时,可以把齐次矩阵打印出来,检查最后一列是不是平移量,左上角3x3是不是单位正交矩阵。如果发现数值不对,八成是旋转矩阵没归一化。
2.3 正运动学:已知关节角度,求末端位置
正运动学,就是给你每个关节的角度,让你算出机器人手在哪儿。这其实是个“正向”问题,相对简单。
标准做法是:从基座开始,依次乘上每个关节的齐次矩阵。比如一个六轴机器人,就是T0 * T1 * T2 * T3 * T4 * T5,最后得到末端位姿。
// 正运动学伪代码
Matrix4x4 forwardKinematics(double q1, q2, q3, q4, q5, q6) {
Matrix4x4 T = identity(); // 从基座开始
T = T * dhTransform(q1, 0, a1, alpha1); // 关节1
T = T * dhTransform(q2, 0, a2, alpha2); // 关节2
// ... 依次类推
T = T * dhTransform(q6, 0, a6, alpha6); // 关节6
return T;
}
这里有个关键点:DH参数。每个关节有四个参数:θ(关节角)、d(连杆偏距)、a(连杆长度)、α(连杆扭转)。我建议你把这些参数定义成一个结构体,方便复用。
注意:DH参数有两种标准——标准DH和改进DH。它们的坐标系定义不同,千万别混用。我曾经在项目里混用了两种,结果仿真和实际机器人对不上,排查了整整两天。
2.4 逆运动学:已知末端位置,求关节角度
逆运动学就难多了。给你一个目标位置,让你算出每个关节该转多少度。这玩意儿没有通用解法,得看机器人构型。
常见的解法有:
- 解析法:适合有特殊构型的机器人,比如腕部三个关节轴线交于一点(PIpper准则)。我一般优先用解析法,速度快、精度高。
- 数值法:比如牛顿-拉夫森迭代。适合通用构型,但可能收敛慢,或者陷入局部最优。
- 几何法:针对特定构型,比如SCARA机器人,直接用几何关系算。
// 逆运动学(数值法)伪代码
bool inverseKinematics(Matrix4x4 target, double* q) {
for (int i = 0; i < MAX_ITER; i++) {
Matrix4x4 current = forwardKinematics(q);
Matrix4x4 error = target - current;
if (norm(error) < EPSILON) return true;
// 计算雅可比矩阵
Matrix J = computeJacobian(q);
// 用伪逆法更新关节角
q = q + pinv(J) * error;
}
return false; // 没收敛
}
我个人习惯是,先试试解析法,不行再上数值法。而且数值法一定要设最大迭代次数,不然遇到奇异位形就死循环了。
避坑指南:逆运动学可能有多个解(比如肘部向上或向下),你得根据实际工况选一个。我曾经遇到过机器人突然“翻肘”的情况,就是因为没限制关节范围。后来我在代码里加了关节限位检查,每次求解后都验证一下。
2.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图。你可以看到,坐标变换是基础,齐次矩阵是工具,正运动学和逆运动学是应用。三者环环相扣。
好了,这一章的内容就这些。记住,运动学是机器人控制的“眼睛”,你看不见关节怎么动,就谈不上控制。下一章我们会深入动力学,到时候你会感谢今天打下的基础。
公众号:蓝海资料掘金营,微信deep3321