目录

  • 一、资源链接
  • 二、代码测试
    • 2.1安装依赖
    • 2.2代码下载和修改
      • 2.2.1 optimiser.h文件
      • 2.2.2 feature_extractor.h文件
    • 2.3编译代码
    • 2.4测试数据集
      • 2.4.1迭代计算
      • 2.4.2查看校准结果
  • 三、标定自己激光雷达和相机
    • 3.1修改代码
      • 3.1.1camera_info.yaml配置文件
      • 3.1.2params.yaml配置文件
      • 3.1.3cam_lidar_calibration.rviz配置文件
    • 3.2录制数据集
    • 3.3正式标定
      • 3.3.1开启程序
      • 3.3.2播放数据集bag
      • 3.3.3分割标定板点云
      • 3.3.4评估参数和重投影误差
  • 参考资料

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话题,已经包含了相机内参,为什么还要有个文件设置内参?
答:再次检查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.0x_max: 10.0y_min: -8.0y_max: 8.0z_min: -5.0z_max: 5.0# Properties of chessboard calibration target,棋盘格参数
chessboard:pattern_size:        #棋盘的内部顶点7*5height: 10width: 7  square_length: 50board_dimension:        # 底板规格width: 430height: 580translation_error:x: 2y: 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

cam_lidar_calibration标定速腾激光雷达和单目相机外参相关推荐

  1. 单目相机外参标定及标定结果验证

    运行前需要获得point3s.point2s对应的数值,明确坐标系(这里,前X右Y) import cv2 import numpy as np import math ############### ...

  2. Halcon 4点单标相机外参

    1. 单标外参使用背景 如果摄像机系统没有变化,只是测量面发生了移动或旋转,此时重标相机外参可以解决问题,这种方法可以解决斜测的问题. 2. 主要函数: vector_to_pose( : : Wor ...

  3. mlcc激光雷达与相机外参标定初体验

    论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...

  4. 【学习总结】激光雷达与相机外参标定:原理与代码1

    2023年2月重要补充 这个代码我个人觉得不好用且坑太多,所以后来换了一个.推荐大家用新的代码. 详见更新的一篇博客总结:[学习总结]激光雷达与相机外参标定:代码(cam_lidar_calibrat ...

  5. 摄像机标定技术及其应用——单目摄像机

    摄像机标定技术及其应用--单目摄像机 一.为什么要进行摄像机标定 随着机器视觉的迅猛发展,我们已经不满足于使用摄像机进行监控.抓拍这种较为简单的功能.更多的用户青睐于它在非接触三维尺寸测量上的应用.我 ...

  6. 相机标定的意义,单目相机和双目相机标定注意事项

    本博客解释了相机标定的意义,单目相机和双目相机标定注意事项.对单目相机标定时物体距离相机位置不同,需要在不同位置进行标定做了解释. 坐标转换 像素坐标.相机坐标.世界物理坐标之间的坐标转换条件 相机标 ...

  7. 基于先验时间一致性车道线的IPM相机外参标定

    文章:Online Extrinsic Camera Calibration for Temporally Consistent IPM Using Lane Boundary Observation ...

  8. 【自动驾驶】31.【相机外参标定】、【相机障碍物后处理】【地面的2D点反投影到3D】的过程对比

    相机的平移向量一般标定到imu坐标系或者车身坐标系,欧拉角 yaw.pitch.roll\color{red}yaw.pitch.rollyaw.pitch.roll是相对于前向相机坐标系的位姿: 前 ...

  9. 小觅相机的相机标定全家桶(相机IMU,相机内参,相机外参)

    性感帅哥博主在线标定小觅双目相机!!!(亲测有效系列!) 刚刚入手新小觅相机,结果飘出天际,很让人头疼!所以- 话不多说,开始骚操作! mkdir mynt_ws #创建文件夹 cd ~/mynt_w ...

最新文章

  1. 南宁师范大学计算机与信息工程学院研究生,南宁师范大学计算机与信息工程学院(专业学位)职业技术教育保研...
  2. SAP CRM呼叫中心里的Java stack
  3. C/C++ _wcslwr_s 函数 – unicode 字符串大写转小写 - C语言零基础入门教程
  4. MKNetworkKit 使用
  5. Zabbix实战-简易教程--订阅类
  6. android如何让gps服务停止,android – 启动/停止GPS(或位置服务)时接收通知(通过BroadcastReceiver)...
  7. java工具链 有什么_Iodine:一个优秀的Java语言工具链
  8. StringUtils 方法介绍(转载)
  9. 获得select下拉框的值
  10. HTML5+JS调用摄像头
  11. jsp项目实战--项目介绍
  12. 软件测试 atp,ATP使用方法详细-内部资料-软件测试文档类资源
  13. WordPress漏洞扫描器wpscan
  14. js对象写入键值对_js对象添加键值对
  15. c语言 gets getc,6.16 C语言,getchar gets getc有什么区别 分别是表示什么的
  16. UDIMM、RDIMM和LRDIMM
  17. 一些关于SLG手游的想法
  18. fw150rm刷openwrt固件_今晚把本版几乎所有固件刷了个遍。发现Padavan固件速度吊打OpenWrt,有人知道原因吗?...
  19. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)
  20. oracle hana 字段长度,学习SAP HANA 数据类型(SAP HANA DATA TYPES)--像学Oracle一样学习SAP HANA...

热门文章

  1. 【转】领域驱动设计之领域模型
  2. flutter加载不同分辨率本地图片
  3. 【c/c++问题总结】error C2039、 C2001、 C2146、C2297、 C2601、C2065、 C2660、 C2440
  4. 优化 | 线性规划的历史、模型及案例
  5. python基本工资的调整方案_Python薪资又涨了!这可咋办!
  6. 通过getpid()函数,获取进程标识符pid
  7. 软考-信息技术发展(二)
  8. VRTK3.3官方44个案例简要介绍(结合 SteamVR)
  9. hdu_2570_配置解药_存疑
  10. Java Logger使用