做过实车感知的人都懂一个画面:激光雷达的障碍物框和相机画面里的目标差着半米,明明前面的车就在正中间,点云投影到图像上却偏到车道线外面去了。这时候唯一的解释就是传感器外参不对。我在实际项目中第一次遇到这个问题时,折腾了整整两天,最后发现只是雷达安装支架受力变形导致的角度偏差,而标定工具又给了个离谱的初始值,直接让优化掉进了局部最优。所以说,激光雷达标定这件事,看起来是个“一键脚本”的活,真要落地比想象中复杂得多。
这篇学习笔记主要梳理激光雷达标定的完整知识体系:为什么标定、标定哪些参数、主流工具链怎么选、实际踩过哪些坑。适合刚接触自动驾驶感知、机器人多传感器融合,或者被联合标定折磨过但一直没系统搞明白的朋友。内容不追求把每个公式推到底,但会讲清楚底层逻辑和实操路径,让你看完至少知道下一步该干什么。
1. 为什么激光雷达必须标定:从测量原理到坐标系
1.1 激光雷达是怎么“看”世界的
激光雷达的核心测距原理很简单,TOF方案就是发射激光脉冲,等它打到物体表面反射回来,利用时间差乘以光速除以2得到距离。公式就是 d = c * t / 2。这个原理听起来干净利落,但真正用起来会发现一个问题:雷达输出的不是单个距离值,而是一整个点云,每个点都包含距离、角度(水平角和垂直角),还有反射强度。
以常见的旋转式机械激光雷达为例,激光发射器绕竖直轴旋转,每转一圈扫描一个平面,多组激光源叠加在一起就形成多线束的3D点云。Velodyne的16线雷达有16个激光对,每个激光对有一个固定的垂直角,旋转时改变水平角。这样每个点都可以用球坐标(距离、水平角、垂直角)表示,再转换到直角坐标系下。整套计算依赖的是出厂时的内参:每个激光束的垂直偏转角、水平偏转角、距离修正值等。
问题就出在这里。雷达在出厂前经历了严格的台架标定,但装到车上之后,你关心的是点云在“车体坐标系”下的位置,而不是在“雷达自身坐标系”下的位置。支架安装角度稍微偏了一点、雷达外壳受力变形、螺丝松动,都会让点云整体发生旋转和平移偏差。出厂内参解决不了这个问题,必须做外参标定。
1.2 内参和外参:标定的两类核心任务
很多人一听到标定就头大,其实只要分清内参和外参就成功了一半。
内参解决的是“传感器自身坐标系的点是否准确”的问题。激光雷达的内参包括各激光束的角度偏移、测距偏移、强度修正;相机的内参包括焦距fx、fy、主点cx、cy以及畸变系数k1、k2、p1、p2等。内参在生产时已经标定,但镜头受过冲击或长时间老化后可能需要重新标定,尤其是相机。
外参解决的是“不同传感器坐标系之间怎么变换”的问题。激光雷达和相机之间、激光雷达和IMU之间、激光雷达和车体之间,都需要一个刚体变换关系,也就是旋转矩阵R和平移向量t。我们常说的联合标定,绝大多数情况下指的就是外参标定。
外参标定的数学本质不复杂。以雷达到相机的外参为例,假设雷达坐标系下的某个3D点P_lidar,通过一个刚体变换T_camera_lidar映射到相机坐标系,再通过相机内参投影到图像像素坐标。如果外参准确,雷达点云投影到图像上应该和实际物体位置严丝合缝;如果外参偏了,投影点就会偏移甚至错位。标定过程本质上就是采样多组“雷达3D点 与 图像2D点”的对应关系,反解出这个刚体变换T。
1.3 容易混淆的几个“标定”概念
在学习过程中经常会看到一堆名字类似的标定词,比如canape标定、canoe数据标定、w=cv+w0这类公式,很容易被绕晕。
canape和canoe其实是Vector公司旗下的两款工具,主要用于汽车电子开发中的ECU参数标定和CAN/LIN总线数据采集分析。这类“标定”针对的是控制器内部的算法参数、MAP表、传感器输出特性,核心是让ECU的控制参数匹配实际工况,和几何层面的传感器外参标定完全是两码事。
至于w=cv+w0这个公式,它描述的是传感器输出电压w与被测物理量v之间的线性关系,其中c是解耦标定矩阵,w0是零漂。这种线性标定模型常见于应变片、压力传感器、电流传感器等模拟量输出通道的校准。激光雷达的TOF测距虽然也存在零漂和刻度系数误差,但外参标定处理的是刚体变换,不涉及这种线性响应标定。
知道这些区别很重要,因为面试和实际方案讨论中,如果概念混在一起说,很容易让团队误判工作量。
2. 标定方案选型:先搞清楚你要解决哪一层的问题
2.1 目标标定还是自标定
外参标定按是否需要外部参照物分为两大类:目标标定法和自标定法。
目标标定法依赖特定的标定靶,常见的有棋盘格、实心圆靶、标定板配合反光特征等。采集传感器数据后,算法提取目标在各自传感器中的特征,建立特征对应关系,再求解外参。这种方法的优点是精度高、稳定性好、收敛范围大,缺点是必须有标定场地和目标物,无法在线完成。大多数量产和测试环节用的都是这类方法。
自标定法则不需要特定的标定板,而是利用环境中已有的自然特征,比如建筑物立面、地面、电线杆等,通过匹配不同传感器提取到的特征来求解外参。也可以利用传感器自身运动产生的几何约束来估计外参,例如雷达点云连续帧配准得到的相对运动,与IMU积分得到的相对运动保持一致。自标定的优点是灵活,可以随车在线运行,但通常需要良好的初始化,且精度容易受场景退化影响。
我个人的建议是,项目调试阶段用目标标定法把外参做准,量产或者长期运行阶段再考虑加入自标定模块做漂移监测和修正,两条腿走路才踏实。
2.2 相机与激光雷达联合标定的主流工具链
相机和激光雷达的联合标定是感知系统中最常用也最关键的标定任务。目前主流工具链大致有三条路线。
第一条是Autoware全家桶中的calibration_camera_lidar工具。它在ROS框架下运行,通过RViz交互选中标定板在点云中的位置,自动提取棋盘格角点,然后做非线性优化。老版本支持Ubuntu 18.04加ROS Melodic,安装相对成熟,网上的教程也最多。这条路线适合快速上手。
第二条是Livox团队开源的livox_camera_calib。它对Livox系列雷达做了深度优化,支持批量处理多帧点云,标定过程无需交互,自动提取标定板平面,精度和鲁棒性都很高。如果用的是非重复扫描的固态雷达,这个工具几乎是首选。
第三条是近年比较火的direct_visual_lidar_calibration。它把标定问题定义成一个像素级对齐问题,利用雷达强度或深度信息渲染虚拟图像,再和真实图像做对齐优化,不需要专门的标定板,对场景要求低,鲁棒性很强。代价是计算量大,且需要较好的初始外参。
选型时要结合自己的雷达类型、相机型号和现场条件。如果是16线机械雷达加普通USB相机,Autoware工具就够用;如果是固态雷达,优先考虑Livox工具;如果现场不方便摆标定板,可以试direct_visual_lidar_calibration。
2.3 IMU与激光雷达外参标定
IMU与雷达的外参标定往往容易被忽略,但SLAM和融合定位场景中必不可少。IMU输出的是角速度和加速度,雷达输出的是点云,两个传感器之间同样存在一个固定的刚体变换,需要标定。
常用开源工具是香港科技大学开源团队的lidar_imu_calib,以及Apollo的LiDAR-IMU标定模块。核心思路是让设备在环境中做充分的旋转和加减速运动,同时采集雷达点云和IMU数据。雷达数据用帧间配准得到连续的运动估计,IMU数据通过积分得到运动轨迹,两者之间的偏差就包含了外参信息。构建非线性最小二乘问题,联合优化外参和轨迹,最终得到精确的变换矩阵。
IMU自身的误差模型也值得关注,这就涉及热词里提到的十二点标定。加速度计标定通常采用六位置法加反向位置,组成十二个静态位置,分别记录三轴加速度计输出,求解零偏、比例因子和安装误差。陀螺仪标定则通常用速率法或Allan方差分析。如果IMU自身都没标定好,雷达和IMU之间的外参标定精度也会大打折扣。
2.4 手眼标定的应用场景
手眼标定这个词来自机器人领域,最近在大传感器标定中也经常被提起。它要解决的问题是:已知机械臂末端位姿和传感器坐标系下的观测,求解传感器与机械臂末端之间的固定变换。
经典的数学形式是AX=XB。其中A是传感器在两次观测之间的相对运动,B是机械臂末端在相同时刻之间的相对运动,X就是待求的手眼矩阵。如果传感器装在机械臂末端,属于eye-in-hand;如果传感器固定在外,属于eye-to-hand,方程形式略有不同。
激光雷达和手眼标定结合的场景主要有两类:一类是移动机器人机械臂上搭载雷达做环境感知,另一类是利用高精度机械臂替代人工移动标定板,实现自动化标定。如果只是固定安装的雷达和相机联合标定,不涉及机械臂,手眼标定这个知识可以作为扩展了解,但用不太上。
3. 实操:相机-激光雷达联合标定全流程
3.1 准备工作:标定板、传感器布置与时间同步
动手标定之前,准备工作决定了结果的上下限。
第一是标定板。棋盘格尺寸的选择很重要,格子太小导致远距离角点检测不到,格子太大导致近距离标定板超出相机视野。一般室外场景建议用A2以上尺寸的标定板,单个棋盘格边长在60毫米到120毫米之间。标定板要贴平,不能有明显的弯曲和褶皱,否则角点位置会有系统性误差。
第二是传感器布置。标定过程中雷达和相机必须保持固定,任何微小的震动都会引入误差。建议用刚性支架把两个传感器锁在一个安装板上,标定期间不要触碰。摆放距离方面,标定板出现在相机画面中央区域,同时能被雷达的激光束充分覆盖。特别要注意雷达的最低线束能否打到标定板下半部分,否则提取的平面不完整。
第三是时间同步。联合标定需要的是同一时刻的雷达帧和相机图像,如果时间戳对不上,标定板在运动过程中产生的位移会被误判为外参误差。ROS环境下可以用message_filters的ApproximateTimeSynchronizer做近似时间同步,如果传感器支持硬件同步触发更好。我试过在时间没有对齐的情况下跑标定,结果外参的平移分量直接偏了十几厘米。
3.2 相机内参标定:张正友法的实际操作
在联合标定之前,必须先确保相机内参是准的,否则外参标定的误差会和内参误差混在一起。
张正友标定法是目前最经典的内参标定方法。它的巧妙之处在于利用平面棋盘格的多张不同姿态图像,构建单应矩阵约束,线性求解内参初值,再做非线性优化。实际操作中,OpenCV的findChessboardCorners和calibrateCamera基本把过程封装好了。
我的经验是采集图像时要注意三点。第一,棋盘格在画面中的姿态要足够丰富,除了正对着拍,还要有绕相机光轴的旋转、倾斜、远近变化,至少要拍15到25张。第二,棋盘格不要只出现在画面中心,要占满整个视场,尤其要让格子出现在画面边缘,这样才能把畸变系数约束出来。第三,采集过程中标定板固定不动,移动的是标定板本身而不是相机,同时环境光照不要变化太大,避免反光和阴影干扰角点检测。
内参标定完成后,要检查重投影误差,一般要求小于0.3像素才算合格。如果误差偏大,优先检查角点提取是否正确,剔除不合格的帧后重新标定。
3.3 使用Autoware标定工具完成联合标定
Autoware的相机雷达联合标定工具是目前被验证最多的方案之一,Ubuntu 18.04加ROS Melodic环境下的安装流程也相对成熟。这里多说一句,网上很多教程喜欢让你从源码编译整个Autoware,其实如果只是为了联合标定,编译标定相关的几个包就够了,没必要把整个Autoware都拉下来。
核心操作流程大致如下。第一步,把相机和雷达的数据录制下来,ROS中常用rosbag记录。采集数据时让标定板在共同视野中变换多个位姿,大约10到15个位置就够。第二步,运行标定工具,在RViz中加载点云和图像。第三步,在每个采集帧中手动框选标定板在点云中的大致区域,工具会自动拟合平面并提取图像中的棋盘格角点。第四步,设置棋盘格尺寸,包括格子数量和边长。第五步,点击标定,工具会构建多个3D到2D对应点对,用非线性最小二乘求解外参。最后保存标定结果。
实际使用中我发现一个小技巧:框选点云中的标定板时,尽量框得小一点,只包含标定板区域,不要把背景墙面和支撑架框进去,否则平面拟合会被外部点干扰,导致角点位置偏移。另外每帧数据采集时让标定板保持静止,移动后等一两秒再采集,避免雷达扫描的点和图像不同时刻的板位置不一致。
3.4 Ubuntu 18.04环境常见配置问题
Ubuntu 18.04配Autoware标定工具,最容易翻车的点倒不在代码本身,而在依赖环境。
一个是ROS版本必须对应Melodic,如果你Ubuntu装的是20.04,对应的是ROS Noetic,旧版的Autoware工具链可能编译不过。另一个是OpenCV版本的坑,Autoware老版本代码基于OpenCV 3.x编写,而Ubuntu 18.04默认源里的OpenCV已经是3.2,基本兼容,但如果你之前手动装过OpenCV 4.x,很容易出现头文件和库版本混乱的编译错误。建议在干净的ROS Melodic环境上单独编译标定工具,不要和OpenCV 4混用。
还有一个小坑是Qt版本问题,RViz插件如果编译失败,大多是Qt5版本不匹配,重新用系统包管理器装一下qtbase5-dev就行。遇到编译问题,强烈建议先去Autoware的GitHub issues里搜错误日志,大部分坑都有人填过。
4. 常见问题与排查技巧实录
4.1 点云中的标定板提取失败
这个问题在实际标定中出现频率最高。表现是工具在点云中拟合平面时拟合到了背景墙上,或者提取出来的标定板边缘明显变形,导致角点位置偏差很大。
原因通常有三个。第一,激光线束太少,16线雷达打到标定板上的点可能只有十几到几十个,平面拟合受离群点影响很大。应对办法是让标定板离雷达近一些,保证板面上的点足够密集。第二,标定板颜色太深,反射强度低,点云中板面和背景难以区分。建议选择白色或浅灰色的标定板,必要时利用反射强度信息过滤。第三,标定板和地面平行或夹角太小,导致激光打上去几乎是掠射,点都集中在一起形成不了平面。摆放时尽量让标定板接近垂直于雷达的主光束方向。
如果手动框选仍失败,可以退一步:先用点云分割算法把标定板区域点云先提取出来再送进标定工具,或者换成反射率更高的漫反射标定板。
4.2 时间同步不齐导致标定发散
时间不同步的问题在4.1节提过,这里补充一个排查技巧。跑完标定后,如果旋转矩阵结果看起来合理,但平移向量长得离谱,大概率就是时间同步出了问题。
可以在标定前先做一次简单的可视化验证:把雷达点云按照粗略初始外参投影到图像上,播放一段包含运动物体的数据,看看投影结果是否在时间上滞后于图像。如果雷达投影的目标位置和图像里的目标始终存在固定的横向偏移,而且偏移量随目标速度增加而增大,基本可以确定是时间戳偏移问题。
解决方向两个:软件层面做时间同步或插值补偿,硬件层面用支持PPS或IEEE 1588的网卡给雷达做精确授时。务实的做法是标定过程中保持标定板静止,从根源上消除时间不同步带来的影响。
4.3 初始外参给得太差
大部分标定工具在优化前都需要输入一个初值。如果初值特别差,优化算法很容易掉进局部最优,最终结果看起来收敛了,实际上投影误差依然很高。
一个好的初值可以从安装设计图或CAD数模中直接量取,平移分量误差控制在10厘米以内,旋转分量误差控制在5度以内,联合标定基本都能收敛到满意的结果。如果没有数模,也可以手动估计:先量出雷达和相机在车体上的大概安装位置,再用粗略角度试几次,观察投影误差的变化趋势。投影误差随着初值调整在变好,说明优化方向是对的,可以继续微调初值后重新跑。
另外很多人忽略的一点是,外参标定后还要做独立的验证。用一组没用参与标定的数据,把雷达3D框中心投影到图像上,肉眼确认误差可接受,或者计算投影点到图像目标中心的重投影误差,低于几个像素才说明标定成功。
4.4 九点标定与标定板标定的选择困惑
九点标定和标定板标定这两个概念经常被放在一起比较,但实际上它们解决的是不同层面的问题。
九点标定常用在2D视觉引导中,建立的是图像像素坐标和机械手平面坐标之间的映射关系。方法是在机械手的工作平面内移动目标到九个已知位置,记录对应的图像坐标,用仿射或透视变换拟合出两者之间的变换关系。它本质上是一种端到端的标定,绕开了相机内参外参的分离过程,所以操作简单、实现快速,但只适用于平面场景。
标定板标定则是先标定相机内参,再结合雷达或机械手做三维空间中的几何标定,它给出的是完整的刚体变换关系,能够处理带深度信息的三维情况。激光雷达联合标定必须用后者,因为点云天然是三维的,用平面的九点映射无法表达深度方向的空间关系。如果项目里只是二维视觉引导机械手抓取,九点标定够了;如果涉及三维感知融合,老老实实走标定板的路子。
4.5 特殊场景扩展:双目、D435i与沙姆镜头
学习激光雷达标定的过程中,顺带看到很多相关的标定需求,也在这里简单提一下。
双目相机标定是在单目内参基础上增加了两个相机之间的相对外参标定,输出双目结构参数用于立体匹配和深度估计。D435i这类消费级深度相机集成了RGB、深度和IMU,标定内容包括相机内参、深度与RGB对齐、IMU与相机外参,流程比普通相机复杂一些,但原理一致。沙姆镜头用于激光三角测量等大景深工业场景,成像模型不再是针孔模型,标定方法需要针对倾斜像平面做专门处理,属于小众需求。
如果能把单目加雷达的标定原理吃透,这些场景本质上都是同一套几何变换思维的延伸,只是传感器类型和目标特征不同而已。
5. 写在最后的一点体会
在多次实车标定和故障排查之后,我最深的感受是:标定的精度上限不是由算法决定的,而是由数据质量决定的。再厉害的非线性优化,面对没有时间同步、角点提取错、初始值乱给的脏数据,也只能给你一个看似收敛的假结果。所以做标定不要急着跑算法,先花时间把硬件固定、时间同步和标定板质量这些基础工作做扎实,后面的效率会高很多。
另外建议团队在建图、感知、定位模块正式开发前,就把一套标准化的标定流程固化下来,写成脚本和文档,包括传感器安装规范、标定场地要求、数据采集模板、验收标准。这样每次换车、换传感器或者重新安装之后,都能按流程标准化完成标定,而不是靠某个工程师的个人经验临场发挥。标定这件事看着不起眼,但它决定了整个感知系统数据质量的底座,值得多花心思。