当前位置: 首页 > news >正文

Matlab激光雷达相机联合标定经验分享

一. 背景介绍

        联合标定是做多传感器融合的基础工作,也是一个没有最好只有更好的研究方向,相关论文也是层出不穷,网上也有许多开源的工作,包括Autoware的工具箱我也试过,感觉标定效果不是特别好,标定效果不稳定,有时候好,有时候不好(也可能当时经验有限,好多点没注意),后来Matlab2020b推出了激光雷达和相机的联合标定教程,简单试了一下,效果不错,2020b中有个bug, 2021a中已经修复了,并且把demo做成了像相机标定一样的工具箱,后来多次标定也总结了一些标定过程中的经验,简单分享一下.

当然如果你有标定间,就不要看了,没标定间的标定精度高的...

二. 标定教程

所有的博客资料都有时效性,官方文档是一直在更新的,参考官方教程,仔细看一遍,可避免一些低级问题.

官方链接:Lidar and Camera Calibration- MATLAB & Simulink- MathWorks 中国

What Is Lidar-Camera Calibration?- MATLAB & Simulink- MathWorks 中国

标定操作视频:帮助中心 - MATLAB & Simulink

标定原理可参考论文:

[1] Zhou, Lipu, Zimo Li, and Michael Kaess. “Automatic Extrinsic Calibration of a Camera and a 3D LiDAR Using Line and Plane Correspondences.” In 2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 5562–69. Madrid: IEEE, 2018. https://doi.org/10.1109/IROS.2018.8593660.

三. 标定流程:

1. 使用Matlab Camera Calibrator标定相机内参

注意事项:

(1)首先标定板一定要平整,不能轻易因为外力发生弯曲或者随时间发生形变,棋盘格表面选用哑光材料覆盖,确保边缘清晰。

(2)标定板一定要覆盖全整个相机视野,可以将相机视野范围划分为九宫格,确保标定板主体出现在每个格子中,每个位置前后左右倾斜采图。

(3)倾斜标定板幅度不要过大,标定板和相机平面尽量保持在45度以内。

(4)在标定后可以观察重投影误差,可以删除误差大的图片重新标定,删除图片时需要保证样本的均衡性,图像视场的每个区域保留数目应差不多,不能标定板位于图像边缘或角落的全部删除, 最好mean error 在0.25下。

(5)多采图片,标定板一定要出现在图像边缘和四个角,能更好的估计畸变系数。

(6)参考Evaluating the Accuracy of Single Camera Calibration文中所提到一些提高精度的tips:主要针对宽视场的相机,可以计算3个径向畸变系数,切向畸变和skew参数。

How to Improve Calibration Accuracy

Whether or not a particular reprojection or estimation error is acceptable depends on the precision requirements of your particular application. However, if you have determined that your calibration accuracy is unacceptable, there are several ways to improve it:

  • Modify calibration settings. Try using 3 radial distortion coefficients, estimating tangential distortion, or the skew.

  • Take more calibration images. The pattern in the images must be in different 3D orientations, and it should be positioned such that you have keypoints in all parts of the field of view. In particular, it is very important to have keypoints close to the edges and the corners of the image in order to get a better estimate of the distortion coefficients.

  • Exclude images that have high reprojection errors and re-calibrate.

(7)相机内参的标定最好在装车之前完成,这样可以保证采图均匀有效,标定内参效果更好。

(8)如果相机装在车内玻璃下面,应尽可能靠近玻璃,四周用外壳挡住,避免玻璃反光影响图像。内参建议隔着玻璃重新标定。

2. 采集联合标定数据

注意事项:

(1)采集数据前确保传感器刚性连接,不会被随意移动位置,或者震动导致姿态变化.

(2)没有特殊要求,激光雷达和相机原点越近越好,视差小,有利于后期融合算法的开发.

(3)最好做完硬件时间同步再采数据,尽可能保证后期点云和图像是为同一时刻, 这里可以采用市场上一些成熟的时间同步盒,图像采集卡,或者一些成熟的域控制器产品,在保证相机和激光雷达时钟源一致情况下,最好可以读取相机拍摄触发时刻.或者激光雷达触发相机拍照,配置激光雷达相位锁定(旋转式机械雷达)位于相机朝向中心.

(4)传感器驱动:激光雷达点云和图像数据借助ROS发布出来,注意驱动中时间戳获取形式。

(5)离线程序订阅话题根据时间戳,将激光雷达和相机同步数据保存成0001.pcd和0001.jpg文件,名称一致。

(6)标定板最好无白边,黑白格为8*9奇数和偶数,不要完全对称,表面哑光材料覆盖.

(7)标定场地最好水平空旷,标定板附近不要太多杂物,更有利于点云平面的拟合.

(8)标定板参考教程中,要45度摆放,可以更准确拟合角点,不要随意转动.

(9)最好标定板固定采集同步数据,如果人拿着标定板,每个位置保持一秒,不要快速移动.

(10)采集联合数据参考相机标定,标定板要完整覆盖图像视野,可前后移动3-5米采集两组数据.

3. 联合标定

参考官方教程,将输入改为自己生成的点云和图像即可.

注意事项:

(1)拟合点云的ROI不要设置太大,可借助rviz网格找到有标定板在点云中最大最小的边界.

(2)在脚本中detectRectangularPlanePoints函数,可适当调大一下阈值,不然可能无法拟合出平面,得不到有效数据.

(3)对于筛选出来的点云和图像数据对,可先用CameraCalibrator检测一下,检查标定板角点能否正确检出,删除背景和边缘误检的数据对.

(4)在运行过程中观察图像标定板四个边的颜色顺序是否保持一直,如果发生切换,可能导致标定失败,找到对应数据,删除重新标定.

4. 重投影验证效果

将标定得到的tform矩阵保存即可.将点投影到图像观察效果,检查墙体和杆子的边缘拟合程度.

(1)图1 是车辆在50km/h速度下软同步投影效果,可见150m左右车辆点匹配良好.

图1

(2)图2是也在50km/h左右,软同步,未作点云运动畸变补偿,可见图像右侧匹配良好,左侧未能完全匹配,运动补偿可提升匹配效果.

关于运动补偿请参考另外两篇博客

apollo7.0------浅谈激光雷达运动补偿(一)_龙性的腾飞的博客-CSDN博客_apollo运动补偿

apollo7.0------浅谈激光雷达运动补偿(二)--计算解析_龙性的腾飞的博客-CSDN博客_apollo 运动补偿

图2

 以上为个人经验总结,认识有限,错误难免,欢迎交流指正。

感觉标定还比较好用,就是matlab太大了,要是能将matlab工具箱用C++写一个单独的工具就好了,有时间得尝试一下,还有自标定的方法还可以研究研究。

相关文章:

  • JVM<二>JVM调优(你想要的调优都在这里了)
  • Flowable监听器动态调用Springcloud接口
  • 数字电路和模拟电路-3二极管与三极管、基本逻辑运算
  • 机器学习——BP神经网络详细介绍及案例Python代码实现
  • 了解如何通过 UltraEdit丨UEStudio 中的窗口停靠系统显示、控制和配置文件选项卡
  • Flutter SDK 自带的 10 个最有用的 Widget
  • 计算机网络-应用层篇-HTTP协议
  • Kafka 认证二:ScramLoginModule 认证及 Java 连接测试
  • 1024程序员节主题征文 | 程序员节节日祝福语大全
  • 【DETR 论文解读】End-to-End Object Detection with Transformer
  • 分类和回归-决策树算法(ID3、C4.5和CART)
  • JSP综合测评管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
  • 【微服务】如何实现微服务集群的高可靠?
  • 万字带你入门Go语言(建议收藏)
  • I2C知识大全系列一 —— I2C相关概念
  • 【5+】跨webview多页面 触发事件(二)
  • isset在php5.6-和php7.0+的一些差异
  • JAVA多线程机制解析-volatilesynchronized
  • Java-详解HashMap
  • jquery cookie
  • VUE es6技巧写法(持续更新中~~~)
  • vue-cli在webpack的配置文件探究
  • 搭建gitbook 和 访问权限认证
  • 目录与文件属性:编写ls
  • 手写一个CommonJS打包工具(一)
  • zabbix3.2监控linux磁盘IO
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (四)鸿鹄云架构一服务注册中心
  • (转)创业家杂志:UCWEB天使第一步
  • .NET CORE Aws S3 使用
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET基础篇——反射的奥妙
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @Builder用法
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [1127]图形打印 sdutOJ
  • [20150321]索引空块的问题.txt
  • [20171113]修改表结构删除列相关问题4.txt
  • [AutoSar NVM] 存储架构
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C语言]编译和链接
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [Java安全入门]三.CC1链
  • [Latex] \bibitem{} | .bbl 格式参考文献转换与获得
  • [LOJ161] 仙人掌计数
  • [Machine Learning] 领域适应和迁移学习
  • [one_demo_11]二分查找法
  • [saiku] olap数据源管理
  • [SQL调优] Maclean讲SQL调优精要
  • [VulnHub靶机渗透] Nullbyte
  • [代码]--c#实现屏幕取词源码下载