2d Laser 和 camera 外参标定

转自原文:https://blog.csdn.net/heyijia0327/article/details/85000943 

1、论文

Extrinsic Calibration of a Camera and Laser Range Finder (improves camera calibration)

2、代码

https://github.com/cjn0608/CamLaserCalibraTool

3、标定原理

准备材料:标定板一个(平板上贴有棋盘格或者二维码,我使用的为 apriltag),已经标定好内参数的相机一个。

标定原理如下图所示,相机通过二维码估计标定板平面在相机坐标系下的平面方程,由于激光点云落在平面上,将点云通过激光坐标系到相机坐标系的外参数 Tcl 转换到相机坐标系,构建点到平面的距离作为误差,使用非线性最小二乘进行求解。


在这里插入图片描述

改进

实际上标定时会采集很多时刻的数据,激光点云数据量加起来可能会很多,直接丢给 ceres 求解速度慢。对于某一时刻,由于点云噪声通常在几厘米跳动,所以我们可以先对该时刻的激光数据进行直线拟合,然后只利用直线上的两个点来构建约束,这样就能减少 ceres 的计算量。

4、标定过程

1) 数据的采集

准备一个如图所示的标定板,A4 纸打印一个 Apriltag, 贴在一个平板上。然后将标定板至于相机和激光前方,激光线要能落在标定板上。不断调整标定板姿态,每换一个姿态(绕Roll, Pitch, Yaw旋转,移动位置),请保持静止 2 秒以上,采集 10 个姿态左右的数据(当然越多越好)。用 rosbag 记录所有的图像和激光数据, 标定工具会自动检测你保持静止时刻的数据,并用来标定。

2) 获取 Marker 在相机里的姿态

需要修改的配置文件

config_and_tool/calibrat_config.yaml

运行工具箱的如下代码

roslaunch apriltags_ros example.launch
rosbag play your_bag.bag

这个代码会把所有的 apriltag 的姿态保存到一个 txt 里,后续标定代码会读取这个txt,并自动检测静止时间段。

3) 运行标定工具

运行标定工具代码如下:

roslaunch lClibra example.launch

标定工具自动读取 rosbag, 不需要使用 rosbag play。运行代码后,工具会自动检测每一个静止时刻,一旦检测到,就会把这个时刻的激光数据绘制成图像,你从图像里用方框选取那些恰好落在标定板上的激光,大致选一下就行,只是别选不是平面上的点。然后按任意键继续,如下图所示:

4) 标定结果的评估

在文件夹 config_and_tool 中准备了一个 python 可视化工具,会将每个静止时刻的点云数据和平面依次绘制出来,你可以查看激光数据是否恰好落在平面上来评估结果的好坏,另外也可以用 report 的残差大小作为评估依据。下图为某一个时刻的激光点云以及标定板平面示意图。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HERO_CJN/article/details/87644816
今日推荐