前言
ROS功能包:livox_camera_lidar_calibration提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
在前一篇中链接:相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理
最终得到了两个标定数据的文件 :
- corner_lidar.txt
- corner_photo.txt
这个两个数据的每行对应着同一个角点.
有了这么多组的同名点像素和三维坐标位置,下面就可以通过优化的思想,去求解两个传感器的外参了.
本篇博客主要介绍外参的标定计算,与结果验证
外参计算
外参计算节点会读取之前得到的data/corner_photo.txt和data/corner_lidar.txt中的标定数据来计算外参,数据需要保存成特定的格式才能被外参计算节点正确读取。
程序读取数据的时候,设置是这样的:
每行数据只有超过10个字母程序才会将其读取为计算的参数,所以上面的数据中用来编号的1 2 3 4 和标题,test0 test1 是不会被读的.
程序读到空行就会停止读取参数开始计算,所以保存时不要空行。
计算前在getExt1.launch文件中配置好外参初值(程序中的默认初值是根据Livox激光雷达自身坐标系,雷达和相机的相对位置设置的,要根据情况进行修改。如果初值差的很大可能会导致不好的优化结果。)
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<rosparam param="init_value"> [0.0, -1.0, 0.0, 0.2,
0.0, 0.0, -1.0, 0.0,
1.0, 0.0, 0.0, 0.0] </rosparam> <!-- init value of roatation matrix(3*3 on the left) and the translation(3*1 vector on the right) -->
<param name="intrinsic_path" value="$(find camera_lidar_calibration)/data/parameters/intrinsic.txt" /> <!-- intrinsic file -->
<param name="extrinsic_path" value="$(find camera_lidar_calibration)/data/parameters/extrinsic.txt" /> <!-- extrinsic file -->
<param name="input_lidar_path" value="$(find camera_lidar_calibration)/data/corner_lidar.txt" /> <!-- get the lidar corner data -->
<param name="input_photo_path" value="$(find camera_lidar_calibration)/data/corner_photo.txt" /> <!-- get the photo corner data -->
<param name="error_threshold" type="int" value="12" /> <!-- the threshold of the reprojection error -->
<node pkg="camera_lidar_calibration" name="getExt1" type="getExt1" output="screen"></node>
</launch>
输入指令开始计算外参
roslaunch camera_lidar_calibration getExt1.launch
终端会打印出ceres的迭代过程
可以从终端看到
初始的cost 是 3.496e4,优化后为5.749e1
同时优化相机内参和外参
getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。输入指令程序会得到一个新的内参和外参,并用新的参数来进行重投影验证。
roslaunch camera_lidar_calibration getExt2.launch
一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。使用的前提需要保证标定数据量较大,并且要充分验证结果。
如果经过验证getExt2计算的结果确实更好,那么把新的内参更新在data/parameters/intrinsic.txt中。
结果验证
获得外参后我们可以用两个常见的应用看一下融合的效果。第一个是将点云投影到照片上,第二个是点云的着色
在相机和livox雷达前方放一个大的物体,看下最后的效果
我是在前面放了一个房子,照片如下图:
点云如下图:
投影点云到照片
优化前的图片:
优化后的图片:
右上角可以看出优化效果
点云着色
下面是点云着色优化前后的对比
优化前的点云:
优化后的点云:
看房顶的左边,效果是很明显的.