第三章:传感器标定——内参标定、外参标定与联合标定
说实话,传感器标定这件事,在很多人眼里就是个「苦活」。我刚入行那会儿也觉得,不就是调几个参数嘛,能有多难?直到有一次,我们车在路上跑得好好的,突然对着一根电线杆猛打方向——后来查出来,是LiDAR和Camera的外参偏了0.1度。嗯,0.1度,在50米外就是将近10厘米的偏差。从那以后,我再也不敢小看标定了。
今天咱们就把传感器标定这件事彻底聊透。我会从内参标定开始,讲到外参标定,再到联合标定流程,最后聊聊Apollo和ROS里那些好用的工具。
3.1 内参标定:先把传感器自己的「眼睛」调准
内参标定,说白了就是搞清楚传感器自己内部的参数。对于相机来说,就是焦距、主点、畸变系数这些。对于LiDAR,主要是激光发射器的角度偏差。
相机内参标定,我习惯用棋盘格法。你想想看,一个棋盘格,角点位置是已知的,相机拍下来之后,通过检测角点,就能反推出相机的内参矩阵和畸变系数。
核心公式(简化版):
像素坐标 = 内参矩阵 × 外参矩阵 × 世界坐标
内参矩阵 K = [fx, 0, cx; 0, fy, cy; 0, 0, 1]
我在项目中遇到过一个问题:棋盘格打印出来,贴在墙上,结果因为墙面不平整,标定出来的畸变系数总是飘。后来我改用了一块亚克力板,背面贴棋盘格,正面朝相机,效果就好多了。
小技巧:标定的时候,尽量让棋盘格出现在图像的各个角落,尤其是边缘。因为畸变在边缘最明显,你如果只拍中间,畸变系数根本算不准。
LiDAR内参标定,相对简单一些。主要是标定每个激光发射器的水平角和垂直角偏差。我记得Apollo里有个工具,叫lidar_calibration,它通过采集平面点云,拟合出每个激光束的偏差值。
3.2 外参标定:让传感器之间「对齐」
外参标定,就是确定两个传感器之间的相对位置和姿态。说白了,就是知道「相机在LiDAR的什么位置,朝哪个方向看」。
3.2.1 Camera-LiDAR 外参标定
这是最常用,也是最容易出问题的一对标定。为什么?因为相机看到的是RGB图像,LiDAR看到的是3D点云,两个数据模态完全不同。
常用的方法有两种:
- 目标法:放一个标定板(比如棋盘格或圆形靶标),同时被相机和LiDAR看到。相机提取角点,LiDAR提取板上的点云,然后通过PnP求解外参。
- 自然场景法:利用场景中的边缘、角点等特征,自动匹配。这个方法鲁棒性差一些,我一般只在无法放置标定板时才用。
注意:LiDAR点云在标定板边缘会有「混合像素」现象——就是激光打到板子和背景的交界处,返回的距离是平均值。这会导致提取的板子边缘不准。我曾经因为这个,标定出来的外参总是差2-3个像素,后来改用圆形靶标才解决。
3.2.2 Camera-Camera 外参标定
多目相机的外参标定,相对简单一些。因为大家都是图像,特征好匹配。常用的流程是:
- 同时拍摄棋盘格
- 分别提取角点
- 通过立体视觉的极线约束,求解两个相机之间的旋转和平移
我个人的习惯是,先用单目标定把每个相机的内参定准,再做双目标定。这样误差不会互相耦合,调试起来也方便。
3.3 联合标定流程:一个完整的实战案例
好了,理论说完了,咱们来走一遍完整的联合标定流程。假设你手头有一个前向主相机、一个前向LiDAR,还有一个左后视镜相机。
第一步:准备标定场地
找一个空旷的地方,地面平整,光线均匀。放上标定板(我推荐用AprilTag,比棋盘格好检测)。
第二步:采集数据
让车停在标定板前,分别采集相机图像和LiDAR点云。注意,要保证标定板在相机的视野中央,同时LiDAR能扫到板子的大部分区域。
第三步:内参标定
先标定每个相机的内参,再标定LiDAR的内参。这一步不能省,否则外参标定会一塌糊涂。
第四步:外参标定
先标定Camera-LiDAR外参,再标定Camera-Camera外参。顺序很重要——因为Camera-LiDAR的误差会传递到Camera-Camera里。
第五步:联合优化
把所有传感器放在一起,做一个全局的BA(Bundle Adjustment)优化。这一步能消除累积误差。
我曾经踩过的坑:有一次,我标定完Camera-LiDAR外参后,直接用了,没做联合优化。结果在高速上,车道线投影到点云上总是偏了半个车道。后来做了全局BA,问题就解决了。所以,联合优化这一步,千万别省。
3.4 标定工具:Apollo vs ROS
说到工具,我主要用过两套:Apollo的标定工具和ROS的标定工具。各有千秋,我简单对比一下。
| 特性 | Apollo 标定工具 | ROS 标定工具 |
|---|---|---|
| 易用性 | 封装好,一键启动 | 需要自己写launch文件 |
| 精度 | 高,有全局优化 | 中等,依赖算法选择 |
| 灵活性 | 固定流程,改起来麻烦 | 高度可定制 |
| 文档 | 中文文档,比较详细 | 英文为主,社区活跃 |
我个人建议:如果你是做量产项目,用Apollo的标定工具,省心。如果你是做研究或者算法验证,用ROS,灵活。
Apollo里有个工具叫sensor_calibration,它支持Camera-LiDAR、Camera-Camera、LiDAR-LiDAR等多种标定。用法很简单:
# 启动标定工具
bash scripts/run_calibration.sh
# 选择标定类型
# 1. Camera-LiDAR
# 2. Camera-Camera
# 3. LiDAR-LiDAR
ROS里,我常用的是camera_calibration包和lidar_camera_calibration包。前者标定相机内参,后者标定Camera-LiDAR外参。不过要注意,ROS的标定工具需要你手动采集数据,不像Apollo那样自动化程度高。
避坑指南:不管用哪个工具,标定前一定要检查传感器的时间同步。如果时间戳对不上,标定出来的外参就是错的。我曾经因为GPS时间不同步,折腾了整整两天才发现问题。
3.5 知识体系总览
为了让你更直观地理解整个标定体系,我画了一张图。这张图展示了从内参到外参,再到联合标定的完整链路。
这张图你看懂了吗?从传感器原始数据开始,先做内参标定,再做外参标定,最后联合优化。每一步都依赖上一步的结果,所以顺序不能乱。
好了,传感器标定这部分就讲到这里。标定这件事,说白了就是「差之毫厘,谬以千里」。你花在标定上的时间,最终都会在感知精度上回报给你。
公众号:蓝海资料掘金营,微信deep3321