当前开源相机与Lidar联合标定程序实现
当前开源相机与Lidar联合标定程序实现
前言
做得课题是关于激光与Lidar联合标定算法研究,现在做对比试验,需要与当前开源标定程序的性能进行对比。这个领域的文章不少,但是开源的就相对来说比较少。针对这些开源程序的说明就几乎没有了。因此我就接着做实验的契机,对我所实现的开源程序进行记录和汇总。希望对相关领域研究的同学有帮助。
1.cam_lidar_calib (2010c)
Github开源:https://link.zhihu.com/?target=https%3A//github.com/SubMishMar/cam_lidar_calib
参考论文: http://robots.engin.umich.edu/publications/gpandey-2010a.pdf
在编译这个功能包之前需要下载相关依赖库,相对来说比较难安装的是Ceres库,安装教程参考
1.1 编译并使用功能包
安装完依赖库后就可以编译功能包了,首先是对其中的launch文件进行解读,以其中的cam_lidar_calib_basler_os.launch
//部分代码,我之列举出需要更改的地方
<param name = "dx" type="double" value="0.0615"/> //dx,dy是标定版格子的边长,单位是m
<param name = "dy" type="double" value="0.0615"/>
<param name = "checkerboard_rows" type = "int" value = "9" />//棋盘格行数-1
<param name = "checkerboard_cols" type = "int" value = "6" />//棋盘格列数-1
<param name = "result_file" type="string" value="$(find calibration)/debug_data/draw/C_T_L_basler_os_GP.txt"/> //这个是用于存放外参矩阵的文件地址,根据自己情况创建一个空白 //文档即可
<param name = "result_rpy_file" type="string" value="$(find calibration)/debug_data/draw/rpy_txyz_basler.txt"/>//这个是记录rpy,xyz的,也是创建一个空白文档
<param name = "min_points_on_plane" type="int" value="700"/> //在平面点数阈值
<param name = "num_views" type="int" value="14"/>//用于求外参的最小值
<param name = "camera_in_topic" type="string" value="/pylon_camera_node/image_raw"/>//改成自己相机的话题
<param name = "lidar_in_topic" type="string" value="/os1_cloud_node/points/rotated"/>//改成自己雷达的话题
<param name="x_min" value="0.75"/>//点云的直流滤波
<param name="x_max" value="6"/>
<param name="y_min" value="-2"/>
<param name="y_max" value="2"/>
<param name="z_min" value="-1"/>
<param name="z_max" value="3"/>
<param name="ransac_threshold" value="0.01"/>
<param name = "cam_config_file_path" type="string" value="$(find cam_lidar_calib)/config/basler.yaml" />//这个文件是存放相机内参的文件,根据自己相机内参修改文件中的内容
</node>
</launch>
程序正常编译之后,在运行部分出现问题:
解决:
博主用的是Ubuntu20.04,对应的ROS系统是noetic,ros自带的OpenCV版本是4.2.0,与功能包不是很兼容。解决办法就是安装低版本的OpenCV,参考这个文章
可以不用删除当前版本,实现多版本兼容。 值得注意的是,当下载安装完成,所有需要使用OpenCV3版本的功能包,都需要在对应的CMakeLists.txt中加入 :
# 在 project(xxx) 后面添加以下两行
set(cv_bridge_DIR /usr/local/cv_bridge_melodic/usr/local/share/cv_bridge/cmake)
set(OpenCV_DIR /usr/local/opencv3.4.14/share/OpenCV)
然后在编译以下:catkin_make.
成功!
1.2 使用心得
1/ 控制传感器之间帧率
程序设计是两个传感器(相机和激光雷达)数据到达之后同步触发回调函数。这就要求你控制传感器帧率或者通过这两行代码进行调节。最简单的方法是将两者帧率直接变成一样。
sync = new message_filters::Synchronizer<SyncPolicy>(SyncPolicy(10), *cloud_sub, *image_sub);
sync->registerCallback(boost::bind(&camLidarCalib::callback, this, _1, _2));
2/ 考虑数据量的问题
这个根据每个人的电脑配置,我最开始用的是相机和hdl64进行标定,程序跑不动。很久才处理一帧,有时候还会卡死。但当我更换为hdl32进行标定时,问题就改善许多。
3/ 标定板旋转角度要大
标定版旋转角度大一点更能被程序验证识别为有效帧。
2. Optimising the selection of samples for robust lidar camera calibration
标题是文章名,源码链接:
前边的编译和标定环节就按照README的指导,一步一步做。我是在结果可视化这一部出现问题
setting an array element with a sequence. The requested array would exceed the maximum number of dimension of 1.
报错内容:
看报错日志,问题出现在./scripts/visualise_results.py中的visualize_results函数上,源代码86行是
ax[r,c].set_ylim(0, max(y)+float(max(y))/5)
问题出现的原因是,这个函数接受的数据类型应该是int类型,我是这么改的
Max_y=max(y)
ax[r,c].set_ylim(0, int(Max_y*1.2))
问题解决