一、坐标变换基础:为什么机器人需要坐标变换?

做机器人规划调试这些年,我经常被问到同一个问题:「机器人明明能走能跑,为什么非得搞什么坐标变换?」

嗯,这个问题问得好。说白了,机器人自己并不知道自己在哪里。

你想想看,激光雷达扫到的障碍物,是在雷达自己的坐标系里。里程计算出来的位置,是在车轮坐标系里。而你要让机械臂去抓一个杯子,杯子的位置是在相机坐标系里。这些坐标系之间如果不打通,机器人就是个「睁眼瞎」。

1.1 一个真实的教训

我记得刚入行那会儿,调试一台AGV小车。激光雷达明明扫到前方有障碍物,小车却直直撞了上去。查了半天,发现是雷达坐标系和车体坐标系的旋转角度差了0.5度。

0.5度,听起来很小对吧?但小车跑出去10米,偏差就接近9厘米了。这9厘米,足够让一个货架卡住。

从那以后,我养成了一个习惯:每次调试前,先检查坐标变换对不对。

1.2 世界坐标系 vs 机器人坐标系

我们先说清楚两个最基础的概念。

坐标系 含义 谁在用
世界坐标系 固定在地面上的全局参考系 地图、路径规划、全局定位
机器人坐标系 固定在机器人本体上的局部参考系 传感器数据、运动控制、局部避障

世界坐标系,你可以理解为「绝对位置」。比如地图上的经纬度,或者厂房里的某个固定墙角作为原点。这个坐标系不会动,所有东西都相对于它来定位。

机器人坐标系,则是「我自己的视角」。原点在机器人中心,x轴朝前,y轴朝左(或者朝右,看你的定义)。激光雷达扫到的障碍物,天然就在这个坐标系里。

核心映射关系:

世界坐标系 → 机器人坐标系 = 平移 + 旋转

说白了就是:机器人在地图上的位置(x, y, θ)

1.3 为什么必须做坐标变换?

我总结了三层原因,每一层都是血的教训换来的。

  1. 传感器数据统一
    激光雷达、摄像头、IMU、轮式里程计——每个传感器都有自己的坐标系。不统一,数据就是乱的。
  2. 运动控制需要
    你给机器人下指令「往前走1米」,这个「前」是机器人坐标系里的前。但地图上的路径是世界坐标系里的。不转换,机器人会走歪。
  3. 多机器人协作
    两台机器人要交换位置信息,必须用同一个世界坐标系。否则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 小结

坐标变换不是什么高深的东西。它就是让机器人知道:「我在哪,周围的东西在哪,我怎么过去。」

我个人习惯在代码里把变换矩阵单独封装成一个模块,每次调试先跑一遍自检。省得后面出问题再回头查,浪费时间。

下一章,我们会深入聊旋转矩阵和四元数的具体用法。到时候我会拿一个实际项目里的例子,手把手带你走一遍。


可可精品资料库