30 分钟跑通激光雷达-相机外参标定:SensorsCalibration 实战笔记
【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址: https://gitcode.com/gh_mirrors/se/SensorsCalibration
外参差一个度,激光雷达点云投影到相机画面上就会整体偏出车道线,感知融合结果跟着漂移,这类问题在落地阶段并不罕见。SensorsCalibration(OpenCalib)提供激光雷达、相机、IMU、毫米波雷达的内参与外参自动/手动标定,覆盖从出厂工位到上路在线监测的完整环节。下面以最常见的激光雷达-相机标定为主线,把环境、数据、手动初值、自动优化和结果验证完整走一遍。
能力全景:先确认你要标定的是哪一对
这个仓库按"传感器对"组织模块,每个模块自带示例数据和独立编译,常用能力如下(模块路径为仓库内相对路径):
| 能力 | 适用场景 | 模块路径 |
|---|---|---|
| 相机内参自动标定 | 棋盘格图像序列求焦距、主点、畸变 | camera_intrinsic/intrinsic_calib/ |
| IMU 安装角标定 | 直行采集 GPS 与 IMU,解算车头偏航角 | imu_heading/auto_calib/ |
| 激光雷达-IMU 外参 | 手动点云拼接面板 + 道路场景自动标定 | lidar2imu/ |
| 激光雷达-相机外参 | 手动面板 + 直线特征自动标定(CRLF)及 SAM 版 v2.0 | lidar2camera/ |
| 激光雷达-激光雷达外参 | ICP 配准求双雷达相对位姿 | lidar2lidar/ |
| 环视相机拼接标定 | 四路环视相机外参,拼接图无错位 | surround-camera/ |
| 传感器-车身在线标定 | 道路场景下相机/雷达/位姿传感器到车身 | SensorX2car/ |
| 工厂标定 | 六种标定板检测,自研识别代码不依赖 OpenCV | factory_calib/ |
雷达-相机、雷达-激光雷达只有手动标定;雷达-车身在SensorX2car/radar2car/。
面板左侧是参数控制区,右侧是实时点云投影,下面流程中会反复用到。
完整流程:从一帧点云到可信外参
确认模块归属后,接下来按"装环境 → 备数据 → 手动初值 → 自动优化 → 验证"推进。
环境准备:用 Docker 跳过依赖坑
各 C++ 模块依赖 OpenCV、PCL、Eigen、Pangolin,版本搭配是常见踩坑点。仓库提供了预打包镜像:
git clone https://gitcode.com/gh_mirrors/se/SensorsCalibration sudo docker pull scllovewkf/opencalib:v1 sudo ./run_docker.sh镜像拉取后挂载代码目录启动即可,也可以手动docker run -it -v <代码根目录>:/share scllovewkf/opencalib:v1 /bin/bash。
标定数据怎么采才够用
激光雷达-相机自动标定最吃数据质量:需要时间同步的一帧图像加一帧点云,图像里要有足够的直线结构——车道线、路缘、灯杆,这些都是后续直线特征的来源;点云建议保留强度通道,手动验证时切换强度显示能明显辅助判断车道线是否对齐。激光雷达-IMU 的数据要求写得很具体:场地平整、周围墙体和杆件特征充足、以约 10 km/h 沿指定轨迹绕场三圈、尽量避开动态目标。采集时不满足这些,后面优化再好也救不回来。
初始估计:手动标定面板对齐到"肉眼看不出偏差"
自动优化对初值敏感,第一步先用手动面板拿到粗外参:
cd lidar2camera/manual_calib ./bin/run_lidar2camera data/0.png data/0.pcd \ data/center_camera-intrinsic.json \ data/top_center_lidar-to-center_camera-extrinsic.json面板支持键盘微调 6 个自由度:旋转用 q/w/e 与其反向键,平移用 r/t/y 与其反向键,步长和点大小可在面板上切换,还能切换强度显示模式观察地面车道线是否重合。目标是把点云边缘调到与图像边缘重合、肉眼看不出偏差后保存,输出的外参 JSON 直接喂给下一步。常见坑是只调 yaw 不查 roll/pitch——俯仰角的偏差在远距离杆件上表现为投影系统性上下偏移,建议每个轴都过一遍。
自动优化:直线特征对齐
拿到初值后跑 CRLF 自动标定(lidar2camera/auto_calib/)。它的思路是从图像和点云各自提取直线特征——车道线、路灯杆、电线杆——再优化外参使两组特征对齐。v1 的输入不是原图,而是预训练分割模型生成的特征 mask:
conda env create -f tool/lidar2camera.yaml python tool/merge_mask.py calib.png mask.png ./bin/run_lidar2camera data/mask.jpg data/calib.pcd \ data/center_camera-intrinsic.json \ data/top_center_lidar-to-center_camera-extrinsic.jsonlidar2camera/auto_calib_v2.0/是同思路的升级版,把 mask 来源换成 Segment Anything 的输出,命令变成传一个数据目录,目录内含图像、带强度的点云、内参加粗外参文件、以及 SAM 生成的 mask,输出精化前后的投影对比图和新的外参文件。
结果验证
跑完后不要直接相信输出的数字。最直观的是对比初始投影、注入误差后的投影、精化后投影三张图:精化图里点云特征应贴合图像直线边缘;同时打开输出的外参文件,与手动阶段保存的值对比,变化量应在可解释的范围内,突然跳变大偏移通常意味着特征匹配出了问题。
几个值得注意的设计取舍
随机搜索的"粗搜 + 细搜"替代梯度法。外参优化的搜索空间是非凸的:不同初始值可能收敛到完全不同的局部极小,梯度类方法对初值又过于敏感。CRLF 的实现因此先用大扰动步长做大量迭代,把参数推进正确的解的邻域,再切换小步长迭代把解收紧。代价是耗时高于梯度法,好处是不需要解析雅可比,对特征噪声的容忍度更高,实现上也更短。
工厂标定板检测去掉 OpenCV 依赖。factory_calib/内置棋盘格、圆点板、竖直板、AprilTag、ArUco、圆孔板六类检测,边缘提取到角点精化全部自研,好处是行为与 OpenCV 版本无关,部署到产线时不会出现"换个编译环境识别结果就变"的问题,其中 AprilTag 部分移植自开源 kalibr 项目。圆孔板同时出现在相机图像和点云里,是唯一支持相机-激光雷达联合工厂标定的板型。
特征提取与优化逻辑解耦。自动标定工具接收 mask 而不接收原图,特征质量的问题(分割模型、SAM 参数)被隔离在 Python 侧,C++ 侧只做几何优化。这意味着换一代特征模型时,优化器一行不用改——v1 的 DeepLabv3 mask 路线和 v2.0 的 SAM 路线就是这么并存的。
怎么判断结果可信
验证建议按三层来做,从便宜到贵依次执行:
| 验证手段 | 操作 | 参考阈值 |
|---|---|---|
| 投影对齐 | 精化图里检查车道线、杆件、路缘的重投影是否贴合图像边缘 | 单帧偏移 < 10 px,多帧无系统性单向偏移 |
| 多帧一致性 | 换 3~5 个不同场景重复跑,对比输出外参的方差 | roll/pitch/yaw 标准差 < 0.5°,平移标准差 < 3 cm |
| 初值恢复能力 | 用 v2.0 的data/initial_error.txt给参考外参注入已知偏差(格式为 roll pitch yaw 角度 + 平移米),看能否收敛回参考值 | 1° / 5 cm 量级注入误差应能收敛回去 |
单帧对齐好但多帧方差大,多半是采集轨迹单一或同步有问题,先回数据层面查,而不是加大迭代次数。
这套流程最适合有直线结构的开放道路场景和出厂标定工位;夜间低照度、长隧道这类直线特征稀缺的环境,自动标定会明显变差,需要退回手动面板或依赖在线监测模块兜底。
【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址: https://gitcode.com/gh_mirrors/se/SensorsCalibration
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考