相机与激光雷达外参标定

什么是相机与激光雷达外参标定?
就是相机坐标系和激光雷达坐标系的TF变化。位置x,y,z 欧拉角 roll,pitch,yaw,6个变量构成一个4*4的旋转变换矩阵
标定的就是这个4维的旋转矩阵。

标定的方法有:

  • 基于特征
  • 基于运动观测
  • 基于最大化互信息
  • 基于深度学习

基于特征 的方法是根据对应特征点求解PnP问题,需要标定板来获取特征
基于运动观测可以看作手眼标定问题,精度决定于相机和雷达的运动估计
基于最大化互信息认为图像灰度于反射强度具有相关性
基于深度学习需要长时间的训练并且泛化能力不高

定方法有两个指标

  • 精度
  • 自动化程度

精度也就是标定的外参有多么精确,一般可以通过投影来定性的来看出来,自动化程度指的是这种方法在标定时需要进行什么操作(比如特定的数据录制要求),以及需要满足什么前提条件(比如特定的标定板)等等。

livox_camera_lidar_calibration 就是基于特征的标定方法
基于特征的方法原理也比较简单,实际上就是构建并求解一个PnP问题。

需要找到n对3d-2d点对,也就是要分别要在点云和图像中提取特征,并确定特征间的对应关系,一般选择的特征是标定板上一些特殊的位置点,比如角点。

功能包介绍

功能包名称:livox_camera_lidar_calibration
功能包使用环境: Ubuntu 64-bit 16.04

功能包功能简介:
本方案提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。

环境配置及功能包安装

首先需要安装Ubuntu 16.04的 系统

然后安装 Livox SDK 和 livox_ros_driver
指令如下:

# 安装Livox_SDK
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
sudo ./third_party/apr/apr_build.sh
cd build && cmake ..
make
sudo make install

# 安装livox_ros_driver
git clone https://github.com/Livox-SDK/livox_ros_driver.git ws_livox/src
cd ws_livox
catkin_make

然后安装相关库的依赖,有PCL,Eigen,Ceres-solver
这三个都是常用的了,安装了可以跳过此步骤
安装方式的链接如下:
PCL 安装
Eigen安装
Ceres-solver安装

最后下载功能包

git clone https://github.com/Livox-SDK/livox_camera_lidar_calibration.git

在这里插入图片描述

放到自己的ROS工作空间下面
编译

catkin_make

在这里插入图片描述
这里在编译完后有个警告:

warning: XXX is deprecated [-Wdeprecated-declarations]

这是一句警告,简单来说就是在你代码中使用的XXX已经被弃用了。具体发生原因暂时不清楚,可能新链接的某个库对XXX,名字进行了替换

但是warning不影响make也不影响结果

有强迫症的话忍不了warning,可以打开CMakeLists.txt

把这个

set(CMAKE_CXX_FLAGS)

换成

 set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")

功能包节点

功能包的功能较多,包含7个节点,每个节点有对应的launch文件,所有可以看launch的文件夹
在这里插入图片描述
下面简单介绍下各节点的功能:

  • cameraCalib - 标定相机内参
  • pcdTransfer - 将雷达点云rosbag转换成PCD文件
  • cornerPhoto - 获得照片角点
  • getExt1 - 计算外参节点1,只优化外参
  • getExt2 - 计算外参节点2,同时优化内参和外参
  • projectCloud - 把雷达点云投影到照片上
  • colorLidar - 雷达点云着色

准备内容

1 livox雷达

2 基于针孔原理的相机

然后需要选择相机的镜头,因为livox的雷达的视场角是不会改变的,例如livox 的avia 的视场角是 70.4° * 77.2° ,那么相机就要选一个镜头,视场角尽量和它保持一致

两者安装好之后位置关系就不要再动了,因外求的就是两者的位置关系嘛

3 黑白棋盘格

在这里插入图片描述
标定相机内参用的

4 标定板

一个矩形的,大点的(比如1m*1.5m)的标定板。
在这里插入图片描述
该功能包使用标定板的四个角点来作为目标物。

5 标定相机内参

相机内参标定的方法有很多
可以基于MATLAB标定
需要安装MATLAB来计算结果
准备20张以上的照片数据,各个角度和位置都要覆盖,拍摄的时候不要距离太近(3米左右)
然后使用
使用MATLAB中的cameraCalibrator工具,经过计算后可以得到如下结果,我们需要第1,2和11个数据
在这里插入图片描述
在功能包中也有一个相机标定的节点可以使用
配置cameraCalib.launch中对应的路径和参数,默认是把照片数据放在data/camera/photos下,然后在data/camera/in.txt中写入所有需要使用的照片名称
输入指令开始标定

roslaunch camera_lidar_calibration cameraCalib.launch

标定结果中会保存在data/camera/result.txt中,包括重投影误差,内参矩阵和畸变纠正参数。