相机&激光雷达&IMU内参及外参标定

  • Post author:
  • Post category:其他


1、使用工具:https://github.com/ethz-asl/kalibr.git

2、特点支持多个相机的内参外参标定,即使视域没有重叠;支持相机&IMU之间标定;支持IMU与IMU的标定

3、部署环境:ubuntu-20.04 ros1-noetic

4、准备:工作空间-kalibr_ws/src

5、下载:在kalibr_ws/src/ 执行 git clone https://github.com/ethz-asl/kalibr.git

6、配置:在kalibr_ws/ 执行

export ROS1_DISTRO=noetic # kinetic=16.04, melodic=18.04, noetic=20.04

source /opt/ros/



R

O

S

1

D

I

S

T

R

O

/

s

e

t

u

p

.

b

a

s

h

c

a

t

k

i

n

i

n

i

t

c

a

t

k

i

n

c

o

n

f

i

g

e

x

t

e

n

d

/

o

p

t

/

r

o

s

/

ROS1_DISTRO/setup.bash catkin init catkin config –extend /opt/ros/






ROS



1










D


















I


STRO


/


se


t


u


p


.


ba


s


h


c


a


t


kinini


t


c


a


t


kin


co


n


f


i


g
















e


x


t


e


n


d


/


o


pt


/


ros


/





ROS1_DISTRO

catkin config –merge-devel # Necessary for catkin_tools >= 0.4.

catkin config –cmake-args -DCMAKE_BUILD_TYPE=Release

7、编译:在kalibr_ws/ 执行 catkin build -DCMAKE_BUILD_TYPE=Release -j4

8、过程:

问题1

fatal error: libv4l2.h: 没有那个文件或目录


解决 sudo apt install libv4l-dev

问题2

Failed to find SuiteSparse – Did not find AMD header (required SuiteSparse component).


解决 *

安装ceres git clone https://github.com/ceres-solver/ceres-solver.git

安装依赖 sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

mkdir build

cd build

cmake …

make

sudo make install

*

9、完成编译

10、制作标定板 a=8.8 b=2.65 b/a= 0.3011 A0纸 april 6×6

11、下载官网提供的yaml格式文件,需要按照设定的尺寸进行修改

12、找一个适合的能拍到棋盘格的距离,启动相机。

13、以4hz的频率录制数据包 rosrun topic_tools throttle messages /hikrobot_camera1/rgb 4.0 /cam1

14、内参标定,标定(标定方法-kalibr):在calibration_ws/ 运行 rosrun kalibr kalibr_calibrate_cameras –bag /home/nuc/calibration_ws/src/kalibr/cam1.bag –topics /cam1 –models pinhole-equi –target /home/nuc/calibration_ws/src/kalibr/april_6x6_80x80cm.yaml

rosrun kalibr kalibr_calibrate_cameras –bag /home/wrc/WRC/CODE/kalibr_ws/src/kalibr/cam1.bag –topics /cam1 –models pinhole-equi –target /home/wrc/WRC/CODE/kalibr_ws/src/kalibr/april_6x6_80x80cm.yaml

15、相机与激光雷达的外参标定–览沃激光雷达使用livox_camera_calibration:先将bag中的点云累积成pcd图,将图像保存为png,再运行标定算法将pcd图与一个png进行匹配,机械式激光雷达使用lidar_camera_calibration

16、lidar_camera_calibration 安装过程需要rosdep init等,可以先使用鱼香ros的rosdep 再进行rosdepc update(不能挂梯子,否则需要关闭梯子,重启电脑)。

17、制作完相机内参标定版A3 大方块0.03m。

18、动作慢,标定动作1:下中上中右中左中,右侧,中,左侧,中,靠近远离,比没有顺序的动作效果好点。2 :下中上中右中左中,右侧,中,左侧,中,上侧,中,下侧,中,靠近再循环一次。3:下中上中右中左中,右侧,中,左侧,中,上侧,中,下侧,中,顺时针,逆时针,动作大一点,循环一次。明显改善。但横轴误差较大。4:下中上中右中左中,右侧,中,左侧,中,上侧,中,下侧,中,顺时针,逆时针,动作大一点,但过程要慢一点,循环一次。横轴误差还是很大。

19、录制相机&激光雷达标定数据包,根据之前获得相机内参修改config_file.txt。其中激光雷达相当与相机的初始位姿为1.57 -1.57 0。

激光雷达坐标系:

在这里插入图片描述

相机坐标系:

在这里插入图片描述

20、应该先学习标定算法的视频指导 确定自己步骤无误。

最近这段时间一直在尝试不同的激光雷达相机标定算法,发现很多标定方法要么是针对某一款雷达,要么有场景或道具要求,很心累。目前尝试过的手动标定https://github.com/PJLab-ADG/SensorsCalibration/tree/master/lidar2camera还算好用,但是一定要把相机内参标准并且正确地填到文件里,别像我这么S笔,因为格式填错了耽误好久;相机标定方法kalibr和matlab的标定工具都挺好用的。matlab的激光雷达标定工具箱,我用的时候总是出现ptcloud 应为pointcloud 但其类型为double 的问题,奇怪的是我去搜索的时候竟然没有相关的问题,难点就没有人遇到过这个问题吗?以后再用开源工具箱,先明确他的数据需要什么类型,对数据的属性有什么要求,数据采集的场景有什么要求,我这个反面例子大家要记住。

下面是正经的激光和相机标定过程:

一、两种方法对比

1、第一种方法:初始外参的手动标定(相机内参使用kalibr或者matlab自带工具箱,两者使用不同的标定板类型)

激光雷达的安装位置:

在这里插入图片描述

初始外参设置为: 0.0, -1.0, -0.0,0.00

0.0,0.0,-1.0, 0.00

1.0, 0.0, 0.0,-0.00

0, 0, 0, 1

标定前:

在这里插入图片描述

手动标定后:

在这里插入图片描述

标定结果:[0.0417787,-0.999123,0.00284818,-0.0725336],[0.0680153,0,-0.997684,-0.0204046],[0.996809,0.0418757,0.0679556,-0.299043],[0,0,0,1] 是否可以再优化?

第二种方法:matlab激光雷达标定工具箱

如果相机内参是使用matlab相机工具箱标定的,会有一个内参.mat文件,外参标定时可以导入

使用棋盘格:最好大一点的

场景布置:至少10张不同位置的图

在这里插入图片描述

数据采集:录制rosbag,并将bag数据转png和pcd matlab有自带的ros工具箱,应该也可以转

开始标定:点开matlab的激光雷达标定工具箱:导入图片和pcd并输入棋盘格单格大小 mm

在这里插入图片描述

在这里插入图片描述

使用已标定好的坐标(之前用matlab标定工具箱标定相机内参时会得到想要的.mat文件)

在这里插入图片描述

使用ROI和标定板选择器对点云进行操作,将标定板点云标记出来,最好标的精确一点

在这里插入图片描述

在这里插入图片描述

阈值及误差容忍选择(注意:16线雷达默认0.01,80线需要将容忍误差提高否则无法提取出特征点-是个坑,一直报错,实测80线雷达精度确实不能按默认的来,改成0.1)

在这里插入图片描述

开始检测特征点

在这里插入图片描述

图像特征点已红圈标记(四个角),雷达特征点以白点标记

在这里插入图片描述

在这里插入图片描述

需要至少10对能够检测到特征点的图像和pcd才能进行可靠的标定,比如我,采了12对数据,但是特征点能检测到的只有两对,其中一对还不准。所以我花了很久的时间进行标定板的点云标记,最后以极限精度0.06的误差检测到所有对。刷成这个样子

在这里插入图片描述

在这里插入图片描述

标定结果如下:画圈的代表精度很低,可以适当移除后再进行标定,比如我,虽然都能检测到特征点,但是仍然会有误差很大的匹配对

在这里插入图片描述

通过剔除一些误差较高匹配对,精度得到了提升

matlab结果:

在这里插入图片描述

手动标定结果:

在这里插入图片描述

为何用matlab标定的结果作为手动的初始值,却无法正常投影matlab标定用的数据级?

应该是图像的问题。经过微信传输后参数变了。

在matlab的基础上再手动调整,使得外参数据可以正常使用(这个过程也很折磨人的)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



版权声明:本文为CCChester原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。