Windows 10(64bits) + VMware 16 Pro + Ubuntu 20.04 + Noetic
激光雷达:速腾聚创32线激光雷达 RS-LIDAR-32
单目相机:acA1920-40gc(GigE接口)


一、资源链接

代码:https://github.com/acfr/cam_lidar_calibration
论文:Optimising the selection of samples for robust lidar camera calibration
教程视频: youtube视频

二、代码测试

2.1安装依赖

sudo apt update && sudo apt-get install -y ros-noetic-pcl-conversions ros-noetic-pcl-ros ros-noetic-tf2-sensor-msgs
sudo apt install python3-pip   
pip3 install pandas scipy
sudo apt install ros-noetic-tf-conversions //如果缺少tf
sudo pip3 install -U catkin_tools  //如果报错“catkin:未找到命令”

2.2代码下载和修改

基本都是一些头文件问题,与opencv版本有关,对源码进行以下修改:

2.2.1 optimiser.h文件

修改
#include <opencv/cv.hpp> ————>  #include <opencv2/imgproc.hpp>
新增:
#include <opencv2/calib3d.hpp> 
#include <opencv2/core/core_c.h> 

2.2.2 feature_extractor.h文件

#include <opencv2/imgcodecs.hpp> 

2.3编译代码

注意:

  • 有博客教程用catkin_make编译,但是我有时会报以下错误:
  • 建议用catkin build编译
fatal error: cam_lidar_calibration/RunOptimiseAction.h: 没有那个文件或目录
   14 | #include <cam_lidar_calibration/RunOptimiseAction.h>

解决方法:

  • 删除build、devel文件夹,重新使用catkin build编译
mkdir -p cam_lidar_calibration_ws/src
cd cam_lidar_calibration_ws/src
git clone https://github.com/acfr/cam_lidar_calibration.git
cd ..
catkin build
source devel/setup.bash

2.4测试数据集

2.4.1迭代计算

测试作者提出的数据集,输入以下命令开始迭代计算

roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=true

输出标定结果csv文件到路径:/cam_lidar_calibration_ws/src/cam_lidar_calibration-master/data/vlp,内容如下:
cam_lidar_calibration标定速腾激光雷达和单目相机外参-LMLPHP
images文件夹里是进行标定的图片,pcd文件夹里是点云

2.4.2查看校准结果

点云投影到图像上

roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/vlp/calibration_quickstart.csv" visualise:=true

cam_lidar_calibration标定速腾激光雷达和单目相机外参-LMLPHP

三、标定自己激光雷达和相机

3.1修改代码

3.1.1camera_info.yaml配置文件

这个文件是相机内参,设置是否为鱼眼相机、像素宽和高、内参矩阵和失真系数。相机内参标定方法推荐采用ROS官方程序,camera_calibration
这里有个疑问:接收了camera_info话题,已经包含了相机内参,为什么还要有个文件设置内参?

distortion_model: "non-fisheye"
width: 1920
height: 1208
D: [-0.094019, 0.09411, -0.001433, 0.000995]
K: [1407.08388, 0.0, 959.1316, 0.0, 1406.07625, 599.30022, 0.0, 0.0, 1.0]

3.1.2params.yaml配置文件

这个文件配置标定程序接收的话题名称、点云选取初始范围和棋盘格参数
我采用了A2规格的标定板,生成棋盘格的matlab代码图片
生成camera_info话题的方式

# Topics
camera_topic: "/camera_raw"      	#格式为:sensor_msgs/Image
camera_info: "/camera_info"			#格式为:sensor_msgs/CameraInfo
lidar_topic: "/rslidar_points"		#格式为:sensor_msgs/PointCloud2

# Dynamic rqt_reconfigure default bounds,点云的选取的初始范围
feature_extraction:
  x_min: -10.0
  x_max: 10.0
  y_min: -8.0
  y_max: 8.0
  z_min: -5.0
  z_max: 5.0
  
# Properties of chessboard calibration target,棋盘格参数
chessboard:
  pattern_size:		#棋盘的内部顶点7*5
    height: 10
    width: 7  
  square_length: 50
  board_dimension:		# 底板规格
    width: 430
    height: 580
  translation_error:
    x: 2
    y: 0

3.1.3cam_lidar_calibration.rviz配置文件

在rviz里手动修改比较麻烦,可以之间改rviz文件

62   Image Topic: /camera_raw
156  Fixed Frame: rslidar

3.2录制数据集

数据集录制建议:

  • 按照不同的位姿分别录制,这个程序支持后台换rosbag
  • 要求点云和图像的时间戳接近,程序的执行是通过ROS时间同步机制进入回调函数的
  • /rslidar_points符合点云格式要求,可以进入回调函数
  • 论文里录制的位姿数量为:50

3.3正式标定

3.3.1开启程序

运行命令:

source devel/setup.bash
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=false

会出现RVIZ和rqt_reconfigure窗口

3.3.2播放数据集bag

推荐使用循环播放的方式,采集很短的原始数据就可以,避免下一步分割标定板点云时,还没分割好就播放完了,同时,可以避免采集长时间数据导致bag文件过大。

rosbag play -l filename.bag

3.3.3分割标定板点云

分别调整rqt_reconfigure /feature_extraction的xyz坐标最大值最小值,使区域内仅有棋盘格点云,然后点击窗口左下角的capture sample,如果分割效果或点云扫描效果不佳,会影响RANSAC拟合平面,而在终端里报错,如下两种,都是因为RANSAC拟合不好:
报错1:

[pcl::SampleConsensusModel::getSamples] Can not select 0 unique points out of 1!
[pcl::RandomSampleConsensus::computeModel] No samples could be selected!
[pcl::RandomSampleConsensus::computeModel] RANSAC found no model.
[pcl::SACSegmentation::segment] Error segmenting the model! No solution found.
[ERROR] [1683812483.061709716]: RANSAC unsuccessful, discarding sample - Need more lidar points on board

报错2:

[ERROR] [1683812611.096828779]: Plane fitting error, LiDAR board dimensions incorrect; discarding sample - try capturing again

cam_lidar_calibration标定速腾激光雷达和单目相机外参-LMLPHP

位姿数量足够多时,再点击rviz中的optimise进行优化求解,最终结果保存到“cam_lidar_calibration/data/日期时间” 路径下,包括采集的图像、点云pcd、位姿。计算完成后,rviz里还是显示optimising,而且三个图标是灰色,看终端里显示了“end”就表示计算完成了,可以放心关闭程序,查看结果了。
我采集了50组数据,但是只有20组数据能提取出绿色框(标定板)和蓝色箭头(平面法向量)。
cam_lidar_calibration标定速腾激光雷达和单目相机外参-LMLPHP

3.3.4评估参数和重投影误差

输入以下指令进行重投影,弹出点云投影到图像的效果,终端里显示误差

roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/2023-05-13_08-59-09/calibration_2023-05-13_10-13-18.csv" visualise:=true

cam_lidar_calibration标定速腾激光雷达和单目相机外参-LMLPHP

参考资料

官方教程
激光雷达和相机联合标定之cam_lidar_calibration
【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)
cam_lidar_calibration相机与激光雷达标定在ros noetic 中编译
相机雷达联合标定cam_lidar_calibration

05-13 16:40