当前开源相机与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库,安装教程参考

Ubuntu20.04安装Ceres库-CSDN博客

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,参考这个文章【ROS | OpenCV】在ROS中实现多版本OpenCV、cv_bridge共存:安装与配置指南_opencv cvbridge-CSDN博客

可以不用删除当前版本,实现多版本兼容。值得注意的是,当下载安装完成,所有需要使用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

标题是文章名,源码链接:

GitCode - 全球开发者的开源社区,开源代码托管平台

前边的编译和标定环节就按照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))

问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值