前言

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雷达前方放一个大的物体,看下最后的效果
我是在前面放了一个房子,照片如下图:
在这里插入图片描述
点云如下图:
在这里插入图片描述

投影点云到照片

优化前的图片:
在这里插入图片描述
优化后的图片:
在这里插入图片描述
右上角可以看出优化效果

点云着色

下面是点云着色优化前后的对比

优化前的点云:
在这里插入图片描述

优化后的点云:
在这里插入图片描述
看房顶的左边,效果是很明显的.