1. 坐标变换基础:为什么需要坐标变换?刚体运动与坐标系概念
大家好,我是你们的自动驾驶系统工程师。今天咱们聊聊坐标变换。
说实话,我刚入行那会儿,觉得坐标变换就是个数学工具,没啥大不了的。直到有一次,我在实车测试时,激光雷达检测到的障碍物位置和摄像头看到的完全对不上——车都快撞上了,算法还觉得前方三米没东西。排查了一整天,最后发现是坐标变换参数写反了。嗯,从那以后,我再也不敢小看这个基础概念了。
1.1 为什么需要坐标变换?
你想想看,一辆自动驾驶车上,传感器少说也有七八个:激光雷达、摄像头、毫米波雷达、GPS、IMU……每个传感器都有自己的“视角”。
- 激光雷达:以自身为中心,告诉你“前方2米有个障碍物”
- 摄像头:以镜头为中心,告诉你“图像右下角有个行人”
- GPS:以地球为中心,告诉你“车辆当前在经纬度(116.4, 39.9)”
问题来了——这些信息用的坐标系都不一样,怎么融合?
核心结论:坐标变换就是让所有传感器“说同一种语言”。把不同坐标系下的数据,统一到同一个参考系下,才能做后续的感知、规划、控制。
我在项目中遇到过最典型的场景:融合毫米波雷达和激光雷达数据时,如果坐标变换矩阵算错一个符号,融合结果就会产生“鬼影”——明明前方没车,系统却认为有车,然后一脚急刹。乘客体验极差,还容易追尾。
1.2 刚体运动:车是怎么动的?
自动驾驶里,我们把车辆和传感器都当作刚体来处理。什么叫刚体?说白了就是:物体在运动过程中,形状和大小不变,只是位置和朝向变了。
刚体运动包含两部分:
- 平移:物体从一个位置挪到另一个位置,不转圈
- 旋转:物体绕着某个轴转个角度,不挪窝
实际运动嘛,基本都是平移+旋转的组合。比如你的车从车位开出来,既往前走了几米(平移),又打了方向盘(旋转)。
个人习惯:我一般把刚体运动拆成“先旋转、后平移”来处理。这样数学上更干净,也方便用齐次坐标统一表达。你后面写代码时会发现,这个顺序特别重要——搞反了,结果就全错了。
1.3 坐标系:给空间一个“地址”
坐标系就是给空间中的每个点一个唯一的“门牌号”。自动驾驶里常见的坐标系有:
| 坐标系 | 原点位置 | 典型用途 |
|---|---|---|
| 世界坐标系 | 地球上的固定点 | 全局路径规划、地图构建 |
| 车体坐标系 | 车辆后轴中心 | 控制指令、局部规划 |
| 传感器坐标系 | 传感器自身 | 原始数据采集 |
| 图像坐标系 | 图像左上角 | 视觉感知 |
举个例子:激光雷达检测到障碍物在“前方2米”,这个“前方”是相对于激光雷达自己的坐标系说的。但车辆控制需要知道障碍物相对于车体的位置,才能决定往左打还是往右打。这就得做坐标变换。
我曾经踩过的坑:在Autoware里配置传感器外参时,把激光雷达的安装位置写成了相对于车体坐标系。但实际标定数据给的是相对于IMU坐标系。结果就是——车在直道上跑,感知模块却认为障碍物在右侧偏移了30厘米。排查了两天才发现是坐标系搞混了。所以,一定要搞清楚每个坐标系的定义和参考基准。
1.4 知识体系总览
下面这张图,是我自己梳理的坐标变换知识框架。你跟着这个脉络学,不会迷路。
1.5 小结:你只需要记住三件事
这一章的内容,说白了就三个要点:
- 为什么需要:不同传感器用不同坐标系说话,必须统一翻译
- 刚体运动:车和传感器都是刚体,运动就是平移+旋转
- 坐标系:每个坐标系都有原点、轴方向和单位,搞混了就会出大问题
我个人习惯是,每接到一个新项目,第一件事就是画一张坐标系关系图。把每个传感器的安装位置、朝向、相对于车体的偏移量都标清楚。这张图,比任何代码都重要。
一句话总结:坐标变换不是数学题,是自动驾驶系统的“通用语言”。语言不通,车就没法开。
下一章,咱们会深入旋转矩阵和四元数——这两个东西,是坐标变换的“灵魂”。到时候我会分享一个我调试了三天才搞明白的旋转顺序问题,保证让你少走弯路。