2. 坐标系与位姿表示:世界坐标系、工具坐标系、基坐标系、欧拉角与四元数
各位同学,咱们今天聊点硬核的——坐标系和位姿表示。说实话,我见过太多工程师在调轨迹时被坐标系搞晕,明明算法写得挺漂亮,一跑起来机器人就乱窜。其实说白了,坐标系就是机器人的“世界观”,你告诉它往哪走,它得先知道自己在哪。
2.1 三大坐标系:机器人的“世界观”
我个人习惯把机器人运动学里的坐标系分成三类:世界坐标系、基坐标系、工具坐标系。这三者构成了轨迹规划的底层框架。
核心观点:所有轨迹点最终都要统一到同一个坐标系下计算,否则就是鸡同鸭讲。
2.1.1 世界坐标系(World Frame)
世界坐标系是绝对参考系,通常固定在机器人工作空间的某个角落。你可以把它想象成整个车间的“大地基准点”。我在做多机器人协同项目时,两台机器人必须共享同一个世界坐标系,否则它们各自规划的路径根本对不上。
- 特点:固定不动,通常由激光跟踪仪或视觉标定确定。
- 用途:全局路径规划、多机协同、外部传感器数据对齐。
- 避坑:我曾经遇到过现场工程师把世界坐标系原点设在机器人底座正下方,结果一换产线,整个标定全废了。建议原点选在工装夹具的固定基准上。
2.1.2 基坐标系(Base Frame)
基坐标系固定在机器人底座上,原点一般在底座安装面的中心。这是机器人自身的“原生坐标系”,所有关节角度计算都基于它。
- 特点:随机器人本体移动(如果机器人被移动了),但相对于机器人自身是固定的。
- 用途:正逆运动学计算、关节空间轨迹规划。
- 注意:基坐标系和世界坐标系之间有一个固定的变换关系,这个关系一旦标定好,就不要轻易动。
2.1.3 工具坐标系(Tool Frame)
工具坐标系定义在机器人末端执行器上,比如焊枪尖、夹爪中心、相机光心。这是轨迹规划的“终点”——你真正关心的是工具中心点(TCP)的轨迹,而不是机器人法兰盘。
- 特点:随机器人末端运动而运动,是动态坐标系。
- 用途:精确控制工具姿态、离线编程、力控应用。
- 避坑:我见过有人把工具坐标系设错了,结果机器人走直线时工具尖画了个弧。记住:TCP标定一定要用四点法或六点法,别偷懒。
| 坐标系 | 固定方式 | 典型应用 | 标定难度 |
|---|---|---|---|
| 世界坐标系 | 绝对固定 | 多机协同、视觉引导 | 高(需外部测量) |
| 基坐标系 | 相对固定 | 运动学计算 | 低(出厂已定) |
| 工具坐标系 | 动态 | 轨迹精度控制 | 中(需手动标定) |
2.2 位姿表示:欧拉角与四元数
坐标系定好了,接下来就是怎么描述一个点在空间里的位置和朝向。位置好办,三个坐标(x, y, z)搞定。但朝向(姿态)就有点讲究了。嗯,这里有两个主流方案:欧拉角和四元数。
2.2.1 欧拉角:直观但容易翻车
欧拉角用三个角度(绕X、Y、Z轴的旋转)来描述姿态。最常见的顺序是ZYX(先绕Z转,再绕Y,最后绕X)。
- 优点:直观,容易理解。你想想看,让机器人“先转个航向角,再俯仰一下,最后滚转一下”,多符合直觉。
- 致命缺陷:万向锁(Gimbal Lock)。当第二个旋转角达到±90°时,第一个和第三个旋转轴会重合,丢失一个自由度。我在做六轴机器人喷涂轨迹时,就因为这个原因导致喷枪姿态突然跳变,工件表面出现不均匀涂层。
- 建议:欧拉角适合人机交互界面显示,不适合内部插值计算。
警告:千万不要在轨迹插值过程中直接对欧拉角做线性插值!两个姿态之间的最短路径不是欧拉角的线性变化。我曾经见过有人这么干,结果机器人末端在两点之间画了个大弧,差点撞到夹具。
2.2.2 四元数:数学优雅,工程实用
四元数用四个数(w, x, y, z)表示旋转,其中w是实部,(x, y, z)是虚部。它没有万向锁问题,而且插值平滑。
- 数学形式:q = w + xi + yj + zk,且满足 w² + x² + y² + z² = 1(单位四元数)。
- 优点:无奇点、可平滑插值(球面线性插值SLERP)、计算效率高。
- 缺点:不直观,你很难直接看出四元数对应的姿态是什么样子。
个人经验:我习惯在轨迹规划内部全部用四元数计算,只在最后输出给示教器显示时转成欧拉角。这样既保证了计算稳定性,又方便操作人员理解。
2.3 坐标系变换与位姿插值
有了坐标系和位姿表示,接下来就是怎么在它们之间来回切换。说白了,就是矩阵乘法。
2.3.1 齐次变换矩阵
一个4×4的矩阵,同时包含旋转(3×3)和平移(3×1)。形式如下:
| R11 R12 R13 Tx |
| R21 R22 R23 Ty |
| R31 R32 R33 Tz |
| 0 0 0 1 |
其中R是旋转矩阵,T是平移向量。从世界坐标系到基坐标系,再到工具坐标系,就是一连串的矩阵乘法。
2.3.2 姿态插值:SLERP
当我们需要让机器人从姿态A平滑过渡到姿态B时,直接用四元数做球面线性插值:
q(t) = (sin((1-t)θ) / sinθ) * q1 + (sin(tθ) / sinθ) * q2
其中θ是q1和q2之间的夹角,t从0到1。这样插出来的姿态路径最短、最平滑。
关键点:SLERP保证了旋转轴和旋转角度的均匀变化,不会出现欧拉角插值时的“抖动”现象。我在做高精度装配轨迹时,SLERP是标配。
2.4 知识体系总览
下面这张图把本章的核心逻辑串起来了。你想想看,从坐标系定义到位姿表示,再到变换和插值,每一步都是环环相扣的。
2.5 实战中的坐标系管理技巧
最后分享几个我在项目中积累的小技巧,希望能帮你少走弯路。
- 坐标系命名规范:我习惯用前缀区分坐标系,比如
world_origin、base_robot1、tool_welder。别小看命名,项目大了之后,混乱的命名会让你想砸电脑。 - 变换链可视化:每次标定完坐标系,我都会用软件把变换链画出来。如果发现某个变换矩阵的行列式不为1(旋转部分),那肯定标错了。
- 四元数归一化检查:在轨迹计算过程中,每隔几步检查一下四元数的模长是否接近1。累积误差会导致姿态漂移,我吃过这个亏。
- 欧拉角转四元数的边界处理:当欧拉角的俯仰角接近±90°时,转换算法要特殊处理,否则会出现数值不稳定。
避坑指南:我曾经在一个焊接项目中,因为工具坐标系Z轴方向标反了,导致机器人焊枪直接怼到工件上。从那以后,我每次标定完TCP都会先让机器人走一个简单的测试轨迹,确认工具尖点位置正确再开始正式编程。