1. 传感器标定概述:为什么需要标定?核心概念与流程

大家好,我是老张。在自动驾驶、机器人或者工业检测领域摸爬滚打了十几年,今天咱们来聊聊传感器标定这件事。

很多人觉得标定就是个「配参数」的活儿,没什么技术含量。说实话,我刚开始入行时也这么想。直到有一次,我们团队花了两周时间调试一个多传感器融合系统,数据怎么都对不齐——激光雷达点云和相机图像总是差那么几十厘米。排查到最后才发现,是标定参数里一个旋转矩阵的符号搞反了。嗯,从那以后,我再也不敢小看标定了。

1.1 为什么需要标定?

说白了,传感器标定就是给传感器「配眼镜」。每个传感器出厂时都有个体差异,安装到设备上又有位置偏差,时间上还有不同步的问题。不标定,数据就是乱的。

我总结了一下,标定要解决三个核心问题:

  • 个体差异:同一型号的两个摄像头,焦距可能差0.1mm。这0.1mm在100米外就是半米误差。
  • 安装偏差:你想想看,把传感器装到车上的时候,谁能保证角度精确?哪怕偏了0.5度,远距离目标就偏到姥姥家了。
  • 时间不同步:激光雷达10Hz,相机30Hz,IMU 100Hz。它们各自采集数据的时间戳对不上,融合时就会出现「鬼影」。

核心观点:标定的本质是建立「传感器内部测量值」到「真实物理量」之间的映射关系。没有标定,多传感器融合就是空中楼阁。

1.2 标定的核心概念

这里我给大家梳理几个必须搞懂的概念。我在面试工程师时,这几个概念基本是必问的。

概念 英文 一句话解释 我的经验
内参 Intrinsics 传感器自身的固有属性 比如相机的焦距、畸变系数;IMU的零偏、尺度因子
外参 Extrinsics 传感器之间的相对位姿 旋转矩阵R + 平移向量t,共6个自由度
时间戳对齐 Timestamp Sync 统一各传感器的时间基准 硬件同步线比软件同步靠谱得多
标定板 Calibration Target 已知尺寸的参考物 棋盘格、AprilTag、圆点阵都行
重投影误差 Reprojection Error 标定质量的评价指标 一般要求小于0.5像素

小提示:内参标定通常一次搞定,外参标定每次拆装后都得重做。我个人习惯把外参标定做成自动化流程,省得每次手动调。

1.3 标定的完整流程

标定不是一锤子买卖。我把它分成五个步骤,每一步都有坑。

  1. 数据采集:拿着标定板在不同位置、不同角度采集数据。注意要覆盖整个视场角,别只拍中间。
  2. 特征提取:从传感器数据中提取标定板的特征点。比如相机图像里的角点,激光雷达点云里的平面。
  3. 初始值估计:用闭式解或者PnP算法算一个粗略的初值。这一步很关键,初值不好后面优化容易掉进局部最优。
  4. 非线性优化:用Levenberg-Marquardt或者高斯-牛顿法,最小化重投影误差。迭代几十次就收敛了。
  5. 精度验证:用没参与标定的数据做验证。如果误差在阈值内,就算标定完成。

避坑指南:我曾经在数据采集阶段偷懒,只拍了10组数据。结果标定出来的参数在边缘区域误差很大。后来我学乖了,至少拍30组,覆盖各个象限和距离。

1.4 标定的知识体系

下面这张图是我自己画的标定知识体系框架。你看一眼就能明白标定在整个传感器融合中的位置。

传感器标定知识体系框架 传感器标定知识体系 标定目标:建立测量值与真实值的映射 内参标定 外参标定 时间同步 焦距、畸变、主点 零偏、尺度因子 相机/IMU/雷达各自标定 旋转矩阵R + 平移向量t 相机-激光雷达联合标定 多相机-IMU标定 硬件同步线(PPS/GPS) 软件时间戳对齐 插值与外推 输出:标定参数文件(YAML/JSON) 验证:重投影误差 < 阈值

1.5 标定工具与数据格式

工欲善其事,必先利其器。这里我列几个常用的标定工具和它们的特点。

工具 适用场景 优点 缺点
MATLAB Calibration Toolbox 单目/双目相机 交互好,文档全 需要MATLAB license
OpenCV cv::calibrateCamera 相机内参/外参 开源,C++/Python都支持 需要自己写数据加载
Kalibr (ETH Zurich) 多相机-IMU联合标定 支持多种传感器,精度高 配置复杂,依赖ROS
lidar_camera_calibration 激光雷达-相机 有自动标定功能 对初始值敏感

标定参数通常存成YAML格式。我给大家看一个典型的相机内参文件长什么样:

# camera_intrinsics.yaml
image_width: 1920
image_height: 1080
camera_matrix:
  rows: 3
  cols: 3
  data: [718.856, 0.0, 607.1928,
         0.0, 718.856, 185.2157,
         0.0, 0.0, 1.0]
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.0172, 0.0006, 0.0003, -0.0001, 0.0]

个人习惯:我每次标定完都会把原始数据、标定参数、验证结果打包成一个文件夹,按日期命名。这样出了问题能回溯,省得重新采集数据。

1.6 标定中的常见误区

最后,我给大家总结几个新手容易踩的坑。这些都是我用真金白银换来的教训。

  • 误区一:标定一次管永久——传感器会老化,安装会松动。建议每3个月或者每次拆装后重新标定。
  • 误区二:数据越多越好——不是的。关键是数据质量。模糊的图像、遮挡严重的点云,再多也没用。
  • 误区三:只看重投影误差——重投影误差低不代表标定一定准。还要看泛化能力,用没见过的数据验证。
  • 误区四:忽略时间同步——外参标得再准,时间对不上也是白搭。我见过一个项目,标定参数完美,但融合结果就是抖动,最后发现是时间戳差了50ms。

特别提醒:标定不是终点,而是起点。标定参数的质量直接决定了后续融合、感知、定位的上限。花在标定上的时间,后面十倍百倍地省回来。