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/
ROS1DISTRO/setup.bashcatkininitcatkinconfig−−extend/opt/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 6x6
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的基础上再手动调整,使得外参数据可以正常使用(这个过程也很折磨人的)