第二章:运动学基础——坐标系与变换、齐次坐标、正运动学与逆运动学
各位工程师朋友,大家好。我是你们的老朋友,一个在运动控制领域摸爬滚打了十几年的老兵。今天咱们来聊聊运动学基础,这部分内容,说白了就是多轴协调控制的“地基”。地基不牢,楼盖得再高也得塌。我个人习惯,在开始任何复杂的轨迹规划或同步控制之前,都会先把坐标系和变换关系理得清清楚楚。
2.1 坐标系与空间变换:给机器人一个“世界观”
想象一下,你让一个六轴机器人去抓一个杯子。你告诉它:“去抓那个杯子。” 机器人怎么知道“那个杯子”在哪?它需要一套自己的“世界观”,也就是坐标系。
世界坐标系:这是最基础的坐标系,通常固定在机器人的基座上。它定义了机器人工作的整个空间。你可以把它想象成工厂车间的“大地图”。
工具坐标系:这个坐标系固定在机器人的末端执行器上,比如焊枪的尖端、夹爪的中心。我当年调试一个焊接机器人时,就遇到过工具坐标系标定不准的问题,结果焊出来的焊缝歪歪扭扭,像蚯蚓爬一样。后来发现是工具中心点(TCP)的坐标算错了几个毫米。
工件坐标系:这个坐标系固定在你要加工的工件上。比如,你要在汽车门板上打孔,工件坐标系就定义在门板上。这样,即使门板的位置有偏差,机器人也能根据工件坐标系自动调整轨迹。
这些坐标系之间怎么转换?靠的就是平移和旋转。
- 平移:就是沿着X、Y、Z轴移动一段距离。比如,从世界坐标系原点走到工具坐标系原点,走了多远?这就是平移向量。
- 旋转:就是绕着某个轴转一个角度。比如,工具坐标系相对于世界坐标系,是正着放的还是歪着放的?这就是旋转矩阵。
一个完整的空间变换,就是平移加旋转。我们用齐次变换矩阵来统一描述这个变换。它长这样:
| R T |
| 0 1 |
其中,R是3x3的旋转矩阵,T是3x1的平移向量。最后一行是[0 0 0 1],这是齐次坐标的固定格式。
核心要点:齐次变换矩阵是连接不同坐标系的“桥梁”。你只要掌握了它,就能在任意两个坐标系之间自由穿梭。
2.2 齐次坐标:为什么非要加个“1”?
很多初学者会问:“为什么平移和旋转不能分开算?非要搞个4x4的矩阵?” 嗯,这个问题问得好。
你想想看,如果只用3x3的旋转矩阵,你只能描述旋转,描述不了平移。如果分开算,先旋转再平移,公式会变得很啰嗦。而齐次坐标的精妙之处在于,它把平移也“伪装”成了线性变换。
具体来说,一个三维空间中的点 (x, y, z),我们用齐次坐标表示为 (x, y, z, 1)。多出来的这个“1”,就是用来承载平移信息的。当你用一个4x4的齐次变换矩阵去乘这个点的时候,旋转和平移就一次性完成了。
我举个例子,假设有一个点P在世界坐标系中的坐标是 (1, 2, 3)。现在,我们想把它变换到工具坐标系中。如果工具坐标系相对于世界坐标系,先绕Z轴转了30度,再沿X轴平移了5个单位。用齐次变换矩阵,一步就能算出结果。
// 伪代码示例:齐次变换
// 定义旋转矩阵R(绕Z轴30度)
R = [[cos30, -sin30, 0],
[sin30, cos30, 0],
[0, 0, 1]]
// 定义平移向量T
T = [5, 0, 0]
// 构建齐次变换矩阵H
H = [[R[0][0], R[0][1], R[0][2], T[0]],
[R[1][0], R[1][1], R[1][2], T[1]],
[R[2][0], R[2][1], R[2][2], T[2]],
[0, 0, 0, 1 ]]
// 点P的齐次坐标
P_homo = [1, 2, 3, 1]
// 变换后的点P'
P'_homo = H * P_homo // 矩阵乘法
// 结果P'的坐标就是 (P'_homo[0], P'_homo[1], P'_homo[2])
我的小技巧:在实际项目中,我习惯用四元数来代替旋转矩阵。四元数没有万向锁问题,插值也更平滑。但理解齐次变换矩阵是基础,这个不能跳过去。
2.3 正运动学:给关节角度,求末端位姿
正运动学,说白了就是“已知关节怎么动,求手在哪里”。
比如,你有一个六轴机器人,你告诉它:“关节1转到30度,关节2转到-45度,关节3转到60度……” 然后,正运动学模型就会告诉你:末端执行器(手)在空间中的位置和姿态是什么。
怎么算?就是不断地做坐标系变换。从基座开始,经过关节1的变换,到关节2的变换……一直传到末端。每个关节的变换,都可以用一个齐次变换矩阵来表示。把这些矩阵乘起来,就得到了末端相对于基座的位姿。
公式很简单:
T_0_n = T_0_1 * T_1_2 * T_2_3 * ... * T_(n-1)_n
其中,T_0_n 就是末端相对于基座的变换矩阵。
我记得有一次,我在调试一个SCARA机器人,正运动学算出来的位置和实际位置总是差一点。查了半天,发现是某个关节的DH参数(一种描述连杆和关节的模型)写错了。所以,正运动学虽然计算简单,但参数一定要准。
避坑指南:我曾经因为忽略了关节的零点偏移,导致正运动学算出的位置偏差了十几毫米。所以,在跑正运动学之前,一定要先确认每个关节的零点位置是否准确。
2.4 逆运动学:给末端位姿,求关节角度
逆运动学就更有意思了。它是正运动学的逆过程:已知末端执行器想走到哪里(位置和姿态),反算出每个关节应该转多少度。
这在实际应用中太重要了。比如,你让机器人去抓一个工件,你只知道工件的位置,但不知道机器人的关节角度。这时候,就需要逆运动学来求解。
逆运动学比正运动学复杂得多。为什么?因为解不唯一。同一个末端位姿,可能对应着多组关节角度。比如,一个六轴机器人,同一个点,可以有“肘部朝上”和“肘部朝下”两种姿态。
求解逆运动学,常用的方法有两种:
- 解析法:通过数学公式直接求解。速度快,但只适用于特定结构的机器人(比如,有相邻三个关节轴交于一点)。
- 数值法:通过迭代逼近求解。通用性强,但速度慢,而且可能陷入局部最优解。
在实际项目中,我通常优先用解析法。如果解析法解不出来,或者有多组解需要选择,再用数值法。
举个例子,一个简单的2自由度平面机器人,逆运动学可以这样算:
// 已知:末端位置 (x, y),连杆长度 L1, L2
// 求:关节角度 theta1, theta2
// 先求 theta2(余弦定理)
cos_theta2 = (x^2 + y^2 - L1^2 - L2^2) / (2 * L1 * L2)
theta2 = acos(cos_theta2) // 注意:这里有两个解,正负号
// 再求 theta1
k1 = L1 + L2 * cos(theta2)
k2 = L2 * sin(theta2)
theta1 = atan2(y, x) - atan2(k2, k1)
关键点:逆运动学求解时,一定要考虑关节的物理限位。算出来的角度如果超出了关节的运动范围,那就是无效解。我见过有人直接拿数值法算出来的角度去驱动电机,结果关节撞到了机械限位,把减速机打坏了。
2.5 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图。它把坐标系、齐次变换、正逆运动学的关系串在了一起。
这张图清晰地展示了我们本章的脉络。从坐标系出发,通过齐次变换矩阵这个工具,最终到达正运动学和逆运动学这两个核心应用。你掌握了这个逻辑,后面学轨迹规划、速度控制就会轻松很多。
好了,关于运动学基础,我就先讲这么多。这部分内容,说白了就是“磨刀不误砍柴工”。你花时间把坐标系和变换搞明白了,后面写代码、调参数都会顺风顺水。如果有什么疑问,欢迎随时交流。