3、坐标系与运动学建模:全局坐标系与局部坐标系、刚体运动学与齐次变换矩阵、逆运动学求解与奇异性分析
各位同仁,欢迎来到《晶圆平台多轴协同控制进阶指南》的第三讲。今天我们要啃的这块骨头,是运动控制的“地基”——坐标系与运动学建模。
说实话,我见过不少工程师,PID调得飞起,但一碰到多轴联动就抓瞎。为什么?因为脑子里没有建立起清晰的坐标系概念。你想想看,晶圆在机械手上移动,它到底是在“世界”里动,还是在“自己”的坐标系里动?搞不清楚这个,协同控制就是空中楼阁。
3.1 全局坐标系与局部坐标系:谁在“看”这个世界?
先问个问题:晶圆台上的一个点,它的位置是绝对的还是相对的?
答案是:看谁在看它。
- 全局坐标系(World Frame):固定在设备基座上的坐标系。它是整个系统的“绝对参考”。晶圆从A点传到B点,这个A和B的坐标,通常就是全局坐标。
- 局部坐标系(Local Frame):附着在运动部件上的坐标系。比如机械手末端、晶圆载台、甚至晶圆本身。每个部件都有自己的“小世界”。
我在项目中遇到过一个问题:一个六轴机械手抓取晶圆,示教时位置很准,但一换批次就偏。查了半天,发现是晶圆在载台上的定位基准变了,导致局部坐标系偏移。说白了,就是全局坐标没变,但局部坐标“跑”了。
核心原则:所有运动控制,本质上都是在做“坐标系变换”。你控制的是电机,但电机转动的是局部坐标,而工艺要求的是全局坐标。中间的桥梁,就是运动学。
这里我习惯用一个比喻:全局坐标系是“地图”,局部坐标系是“你手机上的定位点”。地图上的天安门广场是固定的,但你手机上的那个蓝点,会随着你移动而改变它在“地图”上的坐标。
3.2 刚体运动学与齐次变换矩阵:数学才是硬道理
好,概念有了,怎么算?
晶圆平台上的每个部件,我们都可以看作一个刚体。刚体在空间中的运动,可以分解为平移和旋转。
平移好理解,就是沿着X、Y、Z轴移动。旋转呢?绕X轴叫Roll,绕Y轴叫Pitch,绕Z轴叫Yaw。六个自由度,三个平移,三个旋转。
怎么用一个统一的数学工具来描述这六种运动?答案就是齐次变换矩阵。
说白了,齐次变换矩阵就是一个4x4的矩阵,它把旋转和平移打包在一起。你想想看,如果没有它,你要先算旋转矩阵,再单独加平移向量,多麻烦。齐次变换矩阵一次搞定。
// 齐次变换矩阵的标准形式
// [R T]
// [0 1]
// 其中 R 是 3x3 旋转矩阵,T 是 3x1 平移向量
// 示例:绕Z轴旋转θ角度,并沿X轴平移dx
T = | cosθ -sinθ 0 dx |
| sinθ cosθ 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
这个矩阵有什么用?假设你有一个点P,它在局部坐标系下的坐标是P_local。你想知道它在全局坐标系下的坐标P_global。很简单:
P_global = T * P_local
这里的T,就是局部坐标系相对于全局坐标系的齐次变换矩阵。
我的小技巧:在调试时,我习惯把每个关节的齐次变换矩阵打印出来,手动乘一遍验证。虽然现在仿真软件很强大,但亲手算一次,你对“坐标系在动”的感觉会完全不一样。
3.3 逆运动学求解与奇异性分析:从“想去哪”到“怎么去”
正运动学很简单:给你每个关节的角度,算出末端执行器的位置。但实际控制中,我们往往需要的是逆运动学:告诉末端“我要去这里”,然后让计算机算出每个关节该转多少度。
这才是难点。
为什么难?因为逆运动学通常没有唯一解。同一个末端位置,可能对应多组关节角度。比如一个SCARA机器人,要到达同一个点,大臂和小臂可以有不同的“姿势”。
更头疼的是奇异性。
什么是奇异性?我举个例子。你伸直手臂去够一个东西,当你的手臂完全伸直时,你会发现,你的手肘没法再“弯曲”了——这就是奇异位形。在奇异点附近,关节速度会变得极大,甚至趋于无穷。电机根本跟不上的。
我曾经在调试一个五轴晶圆搬运平台时,就踩过这个坑。程序跑得好好的,突然某个轴速度飙升,差点撞到限位。后来一查,就是路径规划时经过了奇异点。
避坑指南:我曾经因为没做奇异性分析,导致晶圆在高速搬运时飞出。从那以后,我的代码里一定会加一个“奇异点检测”模块。具体做法是计算雅可比矩阵的行列式,当行列式的绝对值接近零时,就说明进入奇异区域了。
逆运动学的求解方法,我总结了几种:
- 解析法:对于结构简单的机器人(如2R、3R),可以直接推导出封闭解。速度快,但通用性差。
- 数值法:比如牛顿-拉夫森迭代法。通用性强,但计算量大,且需要好的初值。
- 几何法:利用几何关系求解。我比较喜欢这种方法,因为它直观,调试时容易发现问题。
下面是一个简单的2R机械臂逆运动学求解的伪代码示例:
// 2R机械臂逆运动学求解(解析法)
// 已知:末端位置 (x, y),连杆长度 L1, L2
// 求解:关节角度 θ1, θ2
function inverseKinematics2R(x, y, L1, L2) {
// 计算肘部角度 θ2
cosθ2 = (x^2 + y^2 - L1^2 - L2^2) / (2 * L1 * L2)
// 检查是否可达
if (abs(cosθ2) > 1) {
return "目标点不可达"
}
// 有两种解:肘部向上和肘部向下
θ2 = atan2(sqrt(1 - cosθ2^2), cosθ2) // 肘部向上解
// 计算肩部角度 θ1
k1 = L1 + L2 * cosθ2
k2 = L2 * sinθ2
θ1 = atan2(y, x) - atan2(k2, k1)
return (θ1, θ2)
}
你看,代码里有一个关键判断:abs(cosθ2) > 1。这就是在检查目标点是否在机械臂的工作空间内。如果不在,直接返回不可达,避免电机瞎转。
3.4 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图。你可以把它当作一个“地图”,方便你随时回顾。
嗯,这张图把本章的核心逻辑串起来了。从坐标系出发,到运动学建模,再到求解与分析,每一步都环环相扣。
最后,我想说一句。运动学建模这东西,光看书是学不会的。我建议你找个实际的晶圆平台,哪怕是个小型的桌面机械臂,亲手算一遍正解和逆解。遇到奇异点,别怕,那是你真正理解运动学的开始。
公众号:蓝海资料掘金营,微信deep3321