目录
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,内容如下:
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
三、标定自己激光雷达和相机
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
位姿数量足够多时,再点击rviz中的optimise进行优化求解,最终结果保存到“cam_lidar_calibration/data/日期时间” 路径下,包括采集的图像、点云pcd、位姿。计算完成后,rviz里还是显示optimising,而且三个图标是灰色,看终端里显示了“end”就表示计算完成了,可以放心关闭程序,查看结果了。
我采集了50组数据,但是只有20组数据能提取出绿色框(标定板)和蓝色箭头(平面法向量)。
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
【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)
cam_lidar_calibration相机与激光雷达标定在ros noetic 中编译
相机雷达联合标定cam_lidar_calibration