一、坐标变换基础:为什么机器人需要坐标变换?
做机器人规划调试这些年,我经常被问到同一个问题:「机器人明明能走能跑,为什么非得搞什么坐标变换?」
嗯,这个问题问得好。说白了,机器人自己并不知道自己在哪里。
你想想看,激光雷达扫到的障碍物,是在雷达自己的坐标系里。里程计算出来的位置,是在车轮坐标系里。而你要让机械臂去抓一个杯子,杯子的位置是在相机坐标系里。这些坐标系之间如果不打通,机器人就是个「睁眼瞎」。
1.1 一个真实的教训
我记得刚入行那会儿,调试一台AGV小车。激光雷达明明扫到前方有障碍物,小车却直直撞了上去。查了半天,发现是雷达坐标系和车体坐标系的旋转角度差了0.5度。
0.5度,听起来很小对吧?但小车跑出去10米,偏差就接近9厘米了。这9厘米,足够让一个货架卡住。
从那以后,我养成了一个习惯:每次调试前,先检查坐标变换对不对。
1.2 世界坐标系 vs 机器人坐标系
我们先说清楚两个最基础的概念。
| 坐标系 | 含义 | 谁在用 |
|---|---|---|
| 世界坐标系 | 固定在地面上的全局参考系 | 地图、路径规划、全局定位 |
| 机器人坐标系 | 固定在机器人本体上的局部参考系 | 传感器数据、运动控制、局部避障 |
世界坐标系,你可以理解为「绝对位置」。比如地图上的经纬度,或者厂房里的某个固定墙角作为原点。这个坐标系不会动,所有东西都相对于它来定位。
机器人坐标系,则是「我自己的视角」。原点在机器人中心,x轴朝前,y轴朝左(或者朝右,看你的定义)。激光雷达扫到的障碍物,天然就在这个坐标系里。
核心映射关系:
世界坐标系 → 机器人坐标系 = 平移 + 旋转
说白了就是:机器人在地图上的位置(x, y, θ)
1.3 为什么必须做坐标变换?
我总结了三层原因,每一层都是血的教训换来的。
- 传感器数据统一
激光雷达、摄像头、IMU、轮式里程计——每个传感器都有自己的坐标系。不统一,数据就是乱的。 - 运动控制需要
你给机器人下指令「往前走1米」,这个「前」是机器人坐标系里的前。但地图上的路径是世界坐标系里的。不转换,机器人会走歪。 - 多机器人协作
两台机器人要交换位置信息,必须用同一个世界坐标系。否则A说「我在(5,3)」,B以为那是自己的(5,3),直接撞上。
1.4 坐标变换的数学本质
其实没那么复杂。一个点从世界坐标系变换到机器人坐标系,就是两步:
- 平移:减去机器人在世界坐标系中的位置
- 旋转:乘以旋转矩阵(或者用四元数,看你的习惯)
用公式写出来就是:
P_robot = R * (P_world - T)
其中:
P_world是点在世界坐标系下的坐标T是机器人位置(平移向量)R是旋转矩阵(由机器人朝向决定)P_robot是点在机器人坐标系下的坐标
我的小技巧:调试时先用一个已知点做验证。比如机器人正前方1米处放个标记物,看变换后的坐标是不是(1, 0, 0)。不是的话,旋转矩阵肯定有问题。
1.5 避坑指南:我踩过的三个坑
坑一:旋转方向搞反
我曾经把顺时针和逆时针搞混了。结果机器人原地转圈,地图上的点却往反方向跑。查了整整一下午。
坑二:单位不统一
激光雷达给的是毫米,里程计给的是米。坐标变换时没做单位转换,机器人以为障碍物在1000米外——嗯,直接撞上去了。
坑三:忘记更新
机器人移动后,坐标变换矩阵必须实时更新。我见过有人写死了一个变换矩阵,机器人一动,所有数据全错。
重要提醒:坐标变换不是「配齐了就行」,而是「每次用之前都要确认是对的」。我建议在代码里加一个校验函数,每隔一段时间自动检查变换的一致性。
1.6 本章知识体系
下面这张图,是我自己画的知识结构。你看一眼,心里就有谱了。
这张图把本章的核心逻辑串起来了。你从世界坐标系出发,经过平移旋转,到达机器人坐标系。然后应用到三个场景里。最后记住三个坑——嗯,基本就入门了。
1.7 小结
坐标变换不是什么高深的东西。它就是让机器人知道:「我在哪,周围的东西在哪,我怎么过去。」
我个人习惯在代码里把变换矩阵单独封装成一个模块,每次调试先跑一遍自检。省得后面出问题再回头查,浪费时间。
下一章,我们会深入聊旋转矩阵和四元数的具体用法。到时候我会拿一个实际项目里的例子,手把手带你走一遍。
可可精品资料库