☰
Autoware激光-相机联合标定:从原理到避坑的完整实战指南
2026/10/5 4:38:43 网站建设 项目流程

搞自动驾驶传感器融合的,迟早会撞上“激光-相机联合标定”这面墙。Autoware这套开源的自动驾驶软件栈里自带相机和激光雷达联合标定工具,我在Ubuntu 18.04上从装环境到跑通标定,前前后后折腾了不少时间,踩过的坑能写满一页A4纸。这篇就把autoware激光-相机联合标定的完整流程讲清楚,从原理、环境准备、数据采集到常见问题排查,适合刚接触传感器标定的同学,也适合已经会标但想进一步提高精度的人参考。

1. 为什么非做这项标定不可:理解激光-相机联合标定在Autoware里的位置

1.1 没有准确外参,传感器融合就是空中楼阁

激光雷达和相机是自动驾驶感知里最互补的两个传感器。相机提供丰富的纹理、颜色和语义信息,但在深度估计、恶劣光照下表现不稳定;激光雷达直接输出精确的3D点坐标,不受光照影响,但没有颜色信息、点云也稀疏。把两者数据融合起来,才是目前主流感知方案的基础。比如目标检测里的“点云聚类结果映射到图像上画框”、多传感器融合跟踪中的“同一目标在不同传感器下关联”,都依赖一个前提:知道激光雷达坐标系里的点,对应到图像像素坐标系的哪个位置。

这个对应关系就是由外参决定的。所谓“联合标定”,核心就是求解激光雷达坐标系到相机坐标系之间的旋转矩阵R和平移向量t。这两个传感器在车上是刚性安装的,一旦装好,R和t理论上就是固定的。但因为安装位置、角度没有绝对精准的物理参考,必须靠标定来算。Autoware里很多模块,比如感知融合、SLAM建图、目标跟踪,都默认传感器外参已经准确配置好了。外参不对,后面的算法再厉害也白搭。

我见过不少入门的朋友,装好Autoware后直接从官方示例包跑demo,一切正常;一旦换成自己的传感器,点云和图像完全对不上,第一反应是代码出问题了,查了半天才发现是标定没做。这就是没把外参当回事的典型后果。

1.2 外参到底是什么:一个矩阵和它背后的坐标系变换

先给没接触过这块的朋友补一下基础。激光雷达坐标系通常定义在雷达本身的几何中心,x轴朝前,y轴朝左,z轴朝上;相机坐标系定义在相机光心,z轴朝前(沿光轴),x轴朝右,y轴朝下。两个坐标系原点不重合,朝向也不同。激光雷达坐标系里的一个3D点 P_l,要变换到相机坐标系下的点 P_c,表达式是:

P_c = R * P_l + t

这里R是3x3旋转矩阵,t是3x1平移向量。写齐次形式就是一个4x4变换矩阵:

T = [R t; 0 1]

Autoware标定工具最后输出的就是这个4x4矩阵,通常用一个9元素数组或16元素数组存放在yaml文件里。

有了外参还不够,相机本身还有内参。像素坐标 p 和 P_c 的关系是:

p = K * P_c / Z_c

其中K是相机内参矩阵,包含焦距fx、fy和主点cx、cy。内参通常在相机出厂时就标定好了,OpenCV的calibrateCamera可以自己做。Autoware联合标定工具默认你已经有准确的内参,它只负责算外参。这也是很多标定结果不准的隐藏原因之一,内参不准,外参怎么算都救不回来。

1.3 为什么Autoware的标定方法适合大多数场景

Autoware自带的标定工具,属于“离线交互式标定”:你采集一段包含标定板的数据,工具会通过图形界面让你在点云和图像里手动选择对应的角点,然后基于这些对应关系优化求解外参。它不需要额外的标定物传感器,不需要做复杂的自动特征匹配,只需要一块棋盘格和一点耐心。

这种方案的优点很明显:第一,工具开源、免费,随Autoware一起发布,不需要额外装商业标定软件;第二,人工交互保证了对应关系准确,不容易因为自动检测失败产生离谱的错误;第三,适用性广,不管什么型号的相机和雷达,只要能同时看到标定板,就能用。缺点也有一点点:手动选点比较费时间,而且要操作者理解基本的坐标系概念。不过对比动辄收费几千上万的商业标定方案,这个工具还是很值得一用的。

2. 环境准备:Ubuntu 18.04上把Autoware和标定工具链跑起来

2.1 环境清单与版本选型

先说我的环境组合,也是Autoware这个阶段最稳妥的组合:

  • Ubuntu 18.04
  • ROS Melodic
  • Autoware 1.14/1.15(AI版本,源码编译)
  • 标定工具:autoware_camera_lidar_calibrator

这个组合的好处是资料最多、踩坑的人最多,网上能找到的解决方案也最多。如果你用Ubuntu 20.04加ROS Noetic,装Autoware会更折腾一点,因为很多依赖包需要手动处理。建议入门阶段严格按这套来,别上来就追新。

传感器方面,相机只要支持ROS驱动、能发布图像话题就行;激光雷达同理,能发布点云话题即可。我自己用的是普通USB工业相机加一台16线激光雷达,完全没有问题。如果没有实车环境,用官方数据包或者自己录制的rosbag也可以,标定工具支持离线回放数据。

2.2 Autoware安装要点与标定工具确认

Autoware的安装,建议源码编译。官方也提供Docker镜像,但我个人更推荐源码装。理由很简单:Docker里跑标定工具涉及到GUI显示、USB设备/网络设备映射,新手很容易被权限问题卡住;源码编译虽然第一次耗时久,但一劳永逸,后面调试也方便。

源码安装分几步:

sudo apt update sudo apt install -y python3-pip python3-catkin-tools python3-rosinstall-generator git clone https://github.com/Autoware-AI/autoware.ai cd autoware.ai ./install_depends.sh

install_depends.sh会安装所有依赖,这一步比较久,遇到网络波动多跑几次也能接着下。依赖装完后,创建工作空间并编译:

mkdir -p ~/autoware.ai/src cd ~/autoware.ai catkin init catkin build

如果只是想尽快跑标定工具,可以只编译标定相关的包:

catkin build calibration_camera_lidar catkin build autoware_build_flags

这样能省下大量时间。编译完成后,需要source一下工作空间:

source ~/autoware.ai/devel/setup.bash

然后确认工具能启动:

roslaunch autoware_camera_lidar_calibrator camera_lidar_calibrator.launch

如果报找不到launch文件,多半是环境变量没source对,或者编译时漏掉了这个包。检查一下~/autoware.ai/devel目录下有没有对应的可执行文件。这个launch文件会启动标定工具的RViz界面,界面上同时显示图像窗口和点云窗口。

提示:安装依赖时如果遇到rosdep失败,检查~/rosdep和/etc/ros/rosdep/sources.list.d/配置是否正确。国内网络有时候需要配置镜像源,具体可以根据自己的网络情况处理。

2.3 标定板准备:棋盘格选择与制作

标定板是联合标定里最重要的物理道具。Autoware标定工具使用棋盘格作为标定目标,棋盘格角点提取精度高,几何约束强。选棋盘格看两个参数:格子数量和格子边长。

我常用的规格是7x6(内部角点6x5),格子边长100mm到200mm之间。边长太小,远距离时激光雷达在标定板上点太少,角点定位不准;边长太大,近距离时棋盘格超出相机视野,也不方便。传感器安装位置低、近距离使用为主,用100mm;安装位置高、工作距离远,用150mm或200mm。我实测下来,100mm边长在3到5米距离内表现很好,雷达点云里标定板上的点数足够支撑角点选取。

制作方面,最省事的办法是去打印店用哑光相纸打印,然后贴在硬质平板上。注意几个禁忌:

  • 不要直接用普通A4纸打印,容易弯折起皱,角点位置会变形。
  • 不要用高光相纸,反光会造成图像过曝,棋盘格角点检测失败。
  • 底板要平整,KT板、亚克力板都可以,千万别用软板。
  • 打印出的实际尺寸和设计尺寸可能有偏差,用游标卡尺量一下格子边长,标定时输入准确数值。这点很多人忽略,一旦边长偏差超过几毫米,标定出来的平移分量就会有明显误差。

如果你买现成的标定板,注意看材质。我当时贪便宜买了一块布质的折叠标定板,展开后表面有褶皱,标定出来的结果反复横跳,换了硬板之后一次就稳了。

3. 实操全流程:Autoware标定工具从数据采集到参数验证

3.1 数据采集的讲究:质量比数量重要

很多人以为标定就是把标定板往车前一放,点几下鼠标就算完事。实际上数据采集的质量直接决定最终外参精度。这块我总结了几个原则。

第一,保证标定板在相机图像和雷达点云中都清晰可见。图像里棋盘格要占画面一定面积,格子不能糊成一团;点云里标定板上至少要有一二十个点,否则点击角点的时候根本选不准。判断方法很简单:在RViz里同时打开图像和点云,确认两个传感器都能稳定看到标定板。

第二,标定板的位置要覆盖足够多的角度和距离。不要只在正前方摆几个位置就完事。我一般会让标定板分别出现在视野的左侧、中间、右侧,距离从近到远铺开,标定板平面还要有一定的倾斜角度,让点云在板面上的分布不是单纯的一个平面。理想情况下,外参的6个自由度(3个旋转、3个平移)都能被不同位置的观测约束住。

第三,采集过程中车辆和标定板都要静止。标定板固定在三脚架或者助手扶稳,不要让它在画面里晃动。如果用rosbag离线采集,回放的时候注意控制播放速度。

第四,数据量控制在合理范围。我一般采集15到20组有效数据,也就是15到20个不同的标定板摆放位置。太少,外参约束不充分;太多,手动选点耗时间,边际收益也不高。每一组数据在图像和点云中的角点选取都要准确,不能为了凑数而马虎。

3.2 在RViz上完成2D-3D点对选取

数据采集到位后,进入关键环节:在标定工具界面上选取对应点。整个操作流程是这样的。

先启动数据源。如果用实时传感器,直接让驱动节点运行;如果用rosbag,先回放:

rosbag play -r 0.5 your_data.bag

播放速度调到0.5左右,给自己留出选点的操作时间。

然后启动标定工具:

roslaunch autoware_camera_lidar_calibrator camera_lidar_calibrator.launch

启动后界面分成两块,左边是图像显示区,右边是点云显示区。顶部有一个Calibration操作面板。在面板里,先点击图像选择模式,然后在图像窗口点击棋盘格的一个角点。工具会以点击位置为中心,自动检测周围的棋盘格角点,这样得到的2D角点坐标比手动点击精确得多。

接着切换到底下点云选择模式,在点云窗口找到同一个物理角点,点击选取。这里有讲究:点云是三维的,鼠标点击只能确定一个大致范围,工具会以点击点为中心搜附近点云。所以点在点云中的位置不能太偏,最好点在你认为的角点位置上。为了提高选取精度,我会先把RViz的视角调整到俯视或侧视,放大到能看清标定板上的点云分布,再慢慢点。这个过程是最费耐心的,但也是整个标定里最关键的一步。

一组数据至少要选取几个非共面的角点,才能构成有效的空间约束。棋盘格的4个外角点组合是最常用的,它们在空间中不共面,能很好地约束外参。选定一组角点后,在面板上把该组数据加入样本集,然后移动标定板到下一个位置,重复上述操作。

所有数据采集完毕,点击标定按钮,工具会基于所有样本自动优化求解外参。计算通常在几秒内完成,结果会打印在终端里,同时RViz中的点云会按照新外参投影到图像上,你可以立刻看到对齐效果。

3.3 标定结果解读与参数落地

标定工具输出的结果是一个4x4齐次变换矩阵,表示激光雷达坐标系到相机坐标系的变换。类似这样:

0.999 -0.012 0.004 0.530 0.012 0.999 -0.002 0.120 -0.004 0.002 0.999 1.420 0 0 0 1

前三行前三列是旋转矩阵,最后一列前三行是平移向量。旋转矩阵的数值应该尽量接近单位矩阵(如果雷达和相机朝向差异不大,旋转项就很小),平移向量的数值应该大致反映两个传感器在三个方向上的物理距离。如果你标出的平移值明显离谱,比如两个传感器只隔了半米,结果算出2米,那基本可以判断标定失败了。

拿到矩阵之后,把它填进Autoware的标定参数文件里。Autoware在运行传感器融合模块时,需要读取一个calibration.yaml文件,里面包含了外参矩阵的数值。

矩阵数值怎么填取决于你的Autoware版本和模块要求。有的是按行写入一维数组,有的是直接给4x4矩阵。不管哪种形式,原则是:只填数值,不要改动字段名和顺序。填完后重新运行相关模块,点云投影到图像上应该是贴合目标的。

参数落地之后,强烈建议再做一轮验证。怎么验证?最简单的方法是在RViz中把点云按照新外参投影到图像上,同时显示图像和点云,找一个有明显轮廓的静态物体(比如路边的车、柱子、行人),看点云轮廓和图像轮廓是否吻合。点云边缘正好压在物体边缘上,说明外参很准;如果整体偏移几个像素,可以先试着再采集几组数据重新标定。有时候问题不是外参,而是传感器有松动,拧紧螺栓之后重新标定一次。

4. 常见问题与排查技巧实录

4.1 标定结果发散或误差大,先查这五件事

我标定过程中遇到过几次标定结果明显不对的情况,后来总结出五个最需要排查的点。

第一,角点对应关系选错了。2D角点和3D角点必须对应同一个物理角点,选错一组,整个优化就会被带偏。选角点的时候不要急,图像窗口和点云窗口反复对照,确认无误再添加样本。

第二,标定板太远或点云太稀。激光雷达在远距离下点云稀疏,角点在点云中的位置不确定度大,标出来的平移量就会有偏差。解决办法是把标定板往近处放一点,保证板面上的点云足够密集。

第三,标定板的位姿覆盖太单一。如果你把标定板一直正面朝向传感器,只改变距离,外参的某些自由度约束不足,结果就可能在某些方向上有漂移。让标定板倾斜、旋转,覆盖更多角度,能显著提高标定稳定性。

第四,相机内参不准确。外参和内参会相互影响,内参不准则外参必然不准。我碰到过一次因为相机换了镜头但没有重新标定内参,导致怎么算外参都对不上,后来重新标定内参,问题立刻解决。

第五,时间同步差。标定工具按时间戳匹配点云和图像,如果两个传感器的时间戳偏差超过几十毫秒,标定板在图像和点云中的位置就对不上。处理办法是回放rosbag时加上--sync参数,或者尽量在采集时处理好多传感器时间同步问题。

4.2 点云投影对不上的常见原因

标定完成后,点云投影到图像上仍然对不上,这可能是最让人头疼的。先从现象上判断问题方向。

如果点云整体向一个方向偏移,偏移量基本恒定,那通常是标定结果里存在系统性的平移误差。解决思路是检查标定板在点云中的坐标是否被系统性地点偏,也就是每个角点都偏向同一个方向。很多人在点云窗口点击角点时习惯性地偏向标定板中心,导致所有3D点都集中在内侧,外参自然就偏了。

如果近距离对得上、远距离对不上,往往是旋转分量有点问题,或者相机内参的畸变参数标定不够好。这种情况下重新标定相机内参,再跑一次联合标定,通常能改善。

如果投影结果存在明显的旋转错位,比如点云相对图像顺时针偏了一点,优先检查旋转矩阵是否填错。Autoware里外参矩阵存的是“从雷达坐标系到相机坐标系”的变换,别在参数文件里把矩阵转置了,这是特别常见的低级错误。

4.3 验证标定效果的三个土办法

专业工具固然好,但在没有标准验证环境的情况下,我有几个土办法可以快速检验标定结果,几个都实测有效。

第一个办法:直接看彩色点云。把外参填入后,用Autoware或者写一个简单的ROS节点,将图像颜色映射到点云上。如果彩色点云里物体的颜色和它的实际外观一致,比如路面是灰色、白车是白色、绿树是绿色,那就说明外参基本准确。这一步比人工对比图像和点云快得多,一眼就能看出有没有错位。

第二个办法:找一条竖直的杆或柱子,看点在图像上的投影是否贴合柱子的中心线。激光雷达打在柱子上的点是空间中的圆弧,投影到图像上应该正好覆盖柱子的表面。如果投影点窜到柱子左边或右边,说明横摆角(yaw)有偏差。

第三个办法:反复标定,比较多次结果的离散程度。同一个场景下,标定三次,如果三次外参矩阵之间的差距很小(平移不超过几厘米,旋转不超过0.5度),说明标定过程稳定可靠。如果三次结果差别很大,说明数据采集环节有问题,别急着用某一次的结果,先排查数据质量。

这几个方法都不需要额外工具,只凭RViz和一点耐性就能完成。我每次标定完,都会组一个简单的实验场景走一遍验证,确认没问题之后才敢把标定参数放进正式的系统里。

最后再分享一个小技巧。标定的时候,我习惯先在点云窗口里找到标定板的整体位置,确认点云分布比较均匀之后再逐个点选角点,不要在点云极稀疏的情况下硬选,那样选的角点主观性很强,标出来的外参很容易翻车。另外,标定板背后的背景最好简单一点,别让雷达打到复杂的物体上产生一堆杂点干扰判断。把环境收拾干净,比什么都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询