2、坐标系与运动学基础
说实话,做运动控制这些年,我最大的体会就是——坐标系搞不明白,后面全白搭。不管是写代码还是调参数,坐标系就是你的「世界观」。今天咱们就把这块地基打牢。
2.1 笛卡尔坐标系:我们最熟悉的「世界」
笛卡尔坐标系,说白了就是三维空间里的XYZ轴。我习惯把右手伸出来比划一下:拇指是X,食指是Y,中指是Z。嗯,这就是右手定则。
在实际项目中,我遇到过不少新手把坐标系搞反。比如机器人底座坐标系和工具坐标系混用,结果一运动就撞限位。所以我的建议是:先定好世界坐标系,再谈其他。
核心要点:
- 笛卡尔坐标系用 (x, y, z) 表示位置
- 用 (Rx, Ry, Rz) 表示姿态(旋转角度)
- 位置+姿态 = 6自由度位姿
2.2 关节坐标系:机器人的「母语」
你想想看,机器人关节电机转多少度,它才不管什么XYZ。关节坐标系就是每个轴的角度值。比如六轴机器人,关节坐标就是 (J1, J2, J3, J4, J5, J6)。
我记得刚入行时,总喜欢在笛卡尔空间里规划路径。后来发现,关节空间才是机器人最舒服的语言。为什么?因为关节运动不会出现奇异点,也不会因为逆解算不出来而报错。
我的经验:调试阶段先用关节坐标手动走一遍,确认每个轴都能动。再用笛卡尔坐标做轨迹规划。这个顺序能省不少排查时间。
2.3 正运动学:从关节到笛卡尔
正运动学,就是已知每个关节的角度,求末端的位置和姿态。说白了,就是「我知道每个关节怎么转,告诉我手在哪」。
公式长这样:
T = f(θ1, θ2, θ3, θ4, θ5, θ6)
其中 T 是4x4的齐次变换矩阵,θ 是关节角度。这个 f 函数,其实就是一堆三角函数和矩阵乘法。
我做过一个SCARA机器人的正解,代码大概这样:
def forward_kinematics(theta1, theta2, d3, theta4):
# 简化版SCARA正解
L1 = 0.3 # 大臂长度
L2 = 0.2 # 小臂长度
x = L1*cos(theta1) + L2*cos(theta1+theta2)
y = L1*sin(theta1) + L2*sin(theta1+theta2)
z = d3
rz = theta1 + theta2 + theta4
return [x, y, z, rz]
注意:正运动学的结果是唯一的。给定一组关节角,末端位姿是确定的。这一点和逆运动学完全不同。
2.4 逆运动学:从笛卡尔到关节
逆运动学就反过来了——我知道手要放到哪,求每个关节该转多少度。这是运动控制里最头疼的部分。
为什么头疼?因为:
- 解不唯一:同一个位置,可能有多种关节姿态
- 可能无解:目标点超出了工作空间
- 奇异点:某些位置会导致关节速度无穷大
我曾经在调试六轴机器人时,遇到一个诡异的问题:路径规划明明没问题,但一到某个点就剧烈抖动。排查了两天,最后发现是逆解选错了构型。嗯,从那以后我写逆解代码都会加上构型选择参数。
避坑指南:
- 逆解前先判断目标点是否在工作空间内
- 多解时优先选择关节变化最小的解
- 靠近奇异点时切换到关节空间运动
2.5 齐次变换矩阵:运动学的「瑞士军刀」
齐次变换矩阵,说白了就是一个4x4的矩阵,同时包含了旋转和位移信息。结构如下:
| R11 R12 R13 Tx |
| R21 R22 R23 Ty |
| R31 R32 R33 Tz |
| 0 0 0 1 |
左上角3x3是旋转矩阵,右上角3x1是位移向量。最后一行固定是 [0 0 0 1]。
为什么用4x4?因为这样可以把旋转和平移统一成矩阵乘法。你想想看,如果分开算,又要加又要乘,多麻烦。用齐次矩阵,一连串变换就是一连串矩阵相乘:
T_总 = T_1 * T_2 * T_3 * ...
我习惯把每个关节的变换矩阵写成一个函数,然后链式乘起来。这样代码结构清晰,调试也方便。
小技巧:写代码时把齐次矩阵的乘法封装成一个函数,比如 multiply(T1, T2)。这样正运动学就是一连串的乘法调用,可读性极好。
2.6 知识体系总览
下面这张图是我自己总结的运动学知识结构,你可以把它当作学习地图:
2.7 小结
这一章的内容,说白了就是三件事:
- 坐标系:笛卡尔和关节,两种看问题的角度
- 运动学:正解和逆解,来回转换
- 齐次矩阵:统一描述旋转和平移的数学工具
我个人觉得,运动学这东西,光看书不行,得动手算。找个简单的两连杆机器人,手写一遍正解和逆解,比看十遍书都管用。下一章咱们就上代码,把今天讲的这些变成能跑的程序。