第二章:坐标系与变换基础
说实话,坐标系这个东西,刚入行时我觉得太简单了。不就是x、y、z三个轴嘛?直到我第一次在项目里把全局坐标和局部坐标搞混,机器人直接撞上了工件……嗯,那次教训挺深刻的。
今天咱们就把坐标系和变换这件事彻底聊透。你想想看,轨迹规划的本质是什么?说白了就是让机器人知道「我在哪」、「要去哪」、「怎么去」。这三个问题,全都绕不开坐标系。
2.1 全局坐标系与局部坐标系
先说说最基础的概念。全局坐标系,也叫世界坐标系,是固定不动的参考系。比如车间里那个激光跟踪仪建立起来的坐标系统,所有设备都基于它来定位。
局部坐标系就不一样了。它附着在运动物体上,比如机械臂的末端、AGV的车体、或者你手里的工具。我习惯把局部坐标系想象成「我自己的视角」——我往左转,我的左边就是新的x方向。
关键区别:
- 全局坐标系:固定、唯一、所有物体共享
- 局部坐标系:随物体运动、每个物体有自己的
举个实际例子。我在做焊接轨迹规划时,焊缝的路径是在工件局部坐标系下定义的。但机器人要执行,必须把这些点转换到全局坐标系下。这就引出了下一个话题——怎么转换?
2.2 齐次变换矩阵
齐次变换矩阵,我愿称之为「轨迹规划的第一工具」。它用一个4x4的矩阵,同时搞定旋转和平移。
为什么是4x4?因为3x3只能做旋转,平移得单独加。齐次坐标把维度升了一维,用四个数(x,y,z,w)表示三维点,这样旋转和平移就能统一成矩阵乘法了。
// 齐次变换矩阵的标准形式
T = [R t]
[0^T 1]
// 其中 R 是 3x3 旋转矩阵
// t 是 3x1 平移向量
// 0^T 是 1x3 零向量
我曾经犯过一个低级错误——把旋转矩阵和平移向量拼反了位置。结果机器人走出来的轨迹完全不对,排查了整整半天。后来我养成了一个习惯:每次写完变换矩阵,先验证一下单位矩阵的情况。
我的小技巧:
写代码时先定义一个函数,专门打印变换矩阵的旋转部分和平移部分。调试时一眼就能看出问题。
2.3 欧拉角与四元数
说到旋转表示,这里有个经典问题:欧拉角还是四元数?
欧拉角直观,三个角度(滚转、俯仰、偏航)一看就懂。但有个致命问题——万向锁。当俯仰角接近±90°时,滚转和偏航会耦合,丢失一个自由度。
我记得有一次做六轴机械臂的奇异点规避,就是因为欧拉角在某个姿态下突然跳变,导致轨迹不连续。后来全部换成四元数,问题迎刃而解。
四元数用四个数表示旋转,没有万向锁问题,插值也平滑。缺点是不直观,你很难直接看出它代表什么姿态。
| 特性 | 欧拉角 | 四元数 |
|---|---|---|
| 直观性 | 高 | 低 |
| 万向锁 | 有 | 无 |
| 插值平滑性 | 差 | 好 |
| 存储空间 | 3个浮点数 | 4个浮点数 |
避坑指南:
我曾经在ROS里直接用欧拉角做轨迹插值,结果在奇异点附近机器人剧烈抖动。后来改用四元数球面线性插值(SLERP),轨迹才变得平滑。所以,如果你的轨迹涉及大范围姿态变化,优先用四元数。
2.4 坐标变换在轨迹规划中的应用
好了,理论说完了,咱们看看实际怎么用。坐标变换在轨迹规划中主要有三个场景:
- 工具坐标系标定:把工具末端点转换到机器人法兰盘坐标系下
- 工件坐标系对齐:把CAD模型里的路径点转换到实际工件位置
- 多机器人协同:不同机器人的局部坐标系统一到全局坐标系
我做个项目时遇到过这样一个情况:视觉系统检测到工件位置,返回的是像素坐标。需要先转成相机坐标系,再转成机器人基坐标系,最后转成工具坐标系。这一串变换链,每一步都要用齐次变换矩阵。
// 坐标变换链示例
T_base_to_tool = T_base_to_camera * T_camera_to_workpiece * T_workpiece_to_tool
// 其中每个T都是4x4齐次变换矩阵
// 注意乘法顺序:从右到左依次变换
这里有个容易搞混的地方——矩阵乘法的顺序。我刚开始总记不住是左乘还是右乘。后来想通了:从右往左读,就是变换的顺序。先经过工件到相机的变换,再经过相机到基座的变换,最后得到工具在基座下的坐标。
核心公式:
点P在全局坐标系下的坐标 = T_全局到局部 × 点P在局部坐标系下的坐标
记住:矩阵乘在左边,坐标点在右边。
知识体系总览
下面这张图是我自己整理的坐标系与变换知识框架,你可以对照着梳理思路:
这张图把本章的核心内容串起来了。你从上往下看:先搞清楚坐标系是什么,再学会怎么表示变换,最后落到实际应用。每一步都离不开齐次变换矩阵这个核心工具。
好了,坐标系与变换基础就聊到这儿。记住我的一句话:轨迹规划的本质,就是在一堆坐标系之间来回倒腾。把这个想通了,后面学路径生成、速度规划都会轻松很多。
公众号:蓝海资料掘金营,微信deep3321