本次推送给大家带来的是一种激光雷达和相机的外参标定方法,主要利用了ROS中 dynamic_reconfigure 功能包提供的动态配置参数功能(代码在最后)。
手动配置外参标定原理
使用过ROS的朋友们应该都有用过ROS的参数服务器,可以很方便地读取配置参数,但这种参数配置方法存在这一个问题:无法知晓参数服务器中参数是否被更新。如果我们需要动态更新参数,这时可以使用ROS中的dynamic_reconfigure功能包。
设点云在激光雷达定义的坐标系下的空间位置为
,点云在相机坐标系下空间位置为
;K 是相机内参,
;
是点云投影在图像上的投影点。
将点云由激光雷达坐标系变换到相机坐标系:
再由相机坐标系变换到归一化平面坐标系,并投影到像素平面上:
根据图像大小判断投影点
是否在图像上,保留投影在图像上的投影点并在图像上标出,建立二维投影点和三维点云的对应关系。
利用ROS的动态参数配置功能可以不断调整外参R,t的值,滤除距离远处的点云,找到点云投影点和图像像素的真实对应关系。通过调整R,t,使点云投影点和图像像素尽可能重合。
dynamic_reconfigure功能包的可视化界面
ROS的dynamic_reconfigure功能包提供了动态配置参数功能,借助此功能可以实现对外参的动态配置。
rqt_reconfigure可视化界面
上图为参数动态配置的可视化界面,动态配置参数有十个,分别为“roll”、“pitch”、“yaw”、“x”、“y”、“z”、“dis_filter”、“next”、“get_point”、“reject_distance”。接下来对这十个参数进行介绍:
roll:外参中旋转矩阵对应的滚转角,默认为0;
pitch:外参中旋转矩阵对应的俯仰角,默认为0;
yaw:外参中旋转矩阵对应的偏航角,默认为0;
x:外参中平移向量对应的x分量,默认为0;
y:外参中平移向量对应的y分量,默认为0;
z:外参中平移向量对应的z分量,默认为0;
dis_filter:勾选后表示按照给定距离对点云进行过滤,只保留一定距离内的点云;
next:默认不勾选,表示只对当前图像与点云进行处理;勾选后表示对最新的图像进行处理;
get_point:默认不勾选,勾选后可以用鼠标在图像上进行取点;
reject_distance:默认为8,当dis_filter勾选后才生效,表示对点云进行过滤的距离。
标定流程
以KITTI数据集为例(转为bag包的形式),先启动标定程序,再播放bag后,通过 dynamic_reconfigure 功能包提供的动态参数配置功能,可以动态地将激光雷达点云投影到相机图像。由于外参参数默认为0,所以最初在图像上一般是看不到点云的投影点的。于是就需要手动调整“roll”、“pitch”、“yaw”、“x”、“y”、“z” 这六个参数,将点云的投影点向图像上调整:
点云投影图像
可以看到,点云在投影后失去了深度信息,因此无法在图像上区分不同深度的点云投影点。为了能够找到点云投影点和图像像素点的对应关系,需要对点云按照深度进行过滤,即勾选“dis_filter”并调整“reject_distance”的值:
点云投影图像(过滤后)
过滤后局部放大图
通过调整外参参数,将右侧广告牌的投影点和对应图像像素重合:
投影点和像素点重合
实际情况下,可以多放置些参照物,这样更容易看出标定效果。当在一副图片上标定完成后,可以勾选“Next”,此时会按照调整后的外参参数将点云向图像上投影,并显示投影后的图像,如果点云和图像能在不同视角下都能很好的对应,说明标定成功。
PnP标定外参
当手动调整好参数后,点云和像素点就会有一个比较好的对应关系,此时点击“get point”,就可以用鼠标在图像上进行选点,选取足够多点后会通过PnP算法计算出外参,重新投影点云并将最终结果输出在终端(注意此时并不会修改可视化界面的参数,如果此时改动了可视化界面的参数,外参又会被重新改写)。
通过自己的多次尝试,PnP实测效果感人,建议还是慢慢手搓吧~
标定原理比较简单,感兴趣的小伙伴可以戳戳↓↓↓↓↓
github: https://github.com/LeisureLei/lidar_cam_calibration.git
本文仅做学术分享,如有侵权,请联系删文。