概述:
livox mid70采用了非重复扫描方式,因此产生的点云和传统的重复扫描得到的点云性质有区别,所以在相机雷达联合标定的技巧上也存在差异。网上的大部分教程,包括matlab官方教程里都没有使用类似的雷达来举例子。因此本文将浅显地讲解一下自己在标定过程中遇到的问题以及解决方案来提供一些标定方面地灵感和思路。
备注:
推荐阅读本文前先自行了解相机模型和相机内参标定的原理并且基本了解雷达和标定的常见术语。
由于本人也仍在学习中所以不能保证本文具有100%的正确性,如果发现问题欢迎进行指正。
转载请备注出处。
1 非重复式扫描雷达和重复式扫描雷达的区别
1.1 视场覆盖率的区别
定义:被激光扫描到的区域 / 总的激光雷达的FOV(视野)
计算方法:
非重复扫描方式与重复扫描方式在视场覆盖率上的区别:
为了便于打比方,首先展示一下两者在扫描时的激光主视图(a是非重复,b是重复)
现在想象假如点云一直积累,那么a的点云会逐渐填满整个FOV,而b的点云就像许多有厚度的平板平行放置在FOV内。这是一个不太恰当的比喻,因为实际上的要考虑情况会更加复杂,不过这个比喻有助于大体上的理解。
以下是livox的官方数据,可以直观的感受一下时间和视场覆盖率的关系(虚线是重复式,实线是非重复式)
1.2 点的分布的区别
在点云积累的时间较短时,点云的分布情况存在。
在刚刚打的比方中,我们只讨论了点云长时间积累的情况,现在想象假如点云积累时间很短(以上图的0.05s为例),那么点云是什么样子的?
主视图可参考:
实际上拍摄出来的点云:
非重复式:
重复式:
必须说明的是,实际上由于这两组点云的拍摄设备不同,且拍摄环境不同,其横向的点云密度对比不是很有意义。这里的图片主要是为了直观地理解两种不同扫描方式产生的点云在3D空间的分布情况。
可以看出,非重复式的扫描,点主要集中在某一个中心,呈放射性分布;而重复式的扫描则在空间内均匀线性分布。
为了便于说明,这里先放一张常规雷达坐标系的图片:
现在假设这两个激光雷达在这0.05s时间内进行扫描,得到的点总数相同,且扫描得到的点云的视场覆盖率相同。过一个确定的(x,0,0)做一个平行于Y-O-Z的平面。
在这个平面内,距离(x,0,0)较小的范围内,非重复式扫描激光雷达的产生的点的数目和密度远高于重复式扫描激光雷达,反之,距离较大的时候重复式扫描激光雷达产生的点的数目和密度是高于非重复式扫描激光雷达的。实际上这个较小范围非常小,以mid70为例,大概只有50x50(cm^2)的大小。
2 相机-激光雷达联合标定的目的和原理
2.1 标定的目的
相机-激光雷达联合标定的目的是求外参,最终的是为了得到上图中的转化矩阵T,即相机坐标系和激光雷达坐标系的转化关系。
实际上目前有很多方法来进行标定,没有最优,只有更优,但本文只讨论基于matlab来进行联合标定的方法。推荐可以先根据自己的实际需求去了解一下各种方法。选择matlab是因为图形化界面交互方便,并且基本不需要配环境。但需要注意,精度并不是非常高。
2.2 基本原理(流程)
关键是找到同一目标点分别在两传感器坐标系下的观测坐标,且目标点的数目足够多。
1.通过进行相机标定获得相机内参,从而得到图像坐标系到相机坐标系的关系
2.拍摄匹配的的 图片-点云
3.提取图像中棋盘格的角点
4.选取点云中的点并拟合出棋盘格平面
5.根据拟合得到的棋盘格平面的四个三维顶点和标定板的行列数解算出在激光雷达坐标系下的所有特征点坐标
6.重复上述操作,得到充足的数据
7.设定目标函数,将外参求解转化为最小二乘问题,利用LM算法(特别通俗地说是一种同时使用梯度下降法和牛顿法的算法),迭代求解得到最优外参。
3 使用MATLAB进行标定
3.1 下载matlab并安装Lidar Camera Calibartor
不要在Ubuntu上安装,使用Ubuntu安装可能会出现安装界面无法使用鼠标或者无法键入的情况,并且在matlab官网上也说明了Linux设备上matlab运行缓慢。在Windows上的下载的流程请自行搜索,要注意安装版本需要是2021b以上的版本,一般建议安装最新版本前的一个版本。安装时可以先不安装matlab上的所有插件(全下的话非常大),后续可以补下。如果你是学生可以先用你们学校的教育邮箱注册mathwork账号,这样可以免费使用正版(有能力请支持正版)
备注:拍摄技巧会在后面提到,这里先默认已经拍好了图片,可以自行安装Camera Calibrator来提高内参的准确性,从而提高联合标定的准确性。
1.双击打开matlab
2.点击获取更多App(安装时全装了可以跳过)
3.在弹出来的搜索框搜索Lidar Camera Calibartor然后安装(安装时全装了可以跳过)
3.2 进行联合标定
1,【可选】打开Camera Calibrator 利用拍摄的数据进行内参标定(具体步骤请自行搜索),导出数据到Workspace
可以在命令行输入workspace来看看有没有导出成功
2.打开Lidar Camera Calibartor并指定导入数据路径
点击import来指定点云数据和图片数据的路径,只用到图片文件或者点云文件所在的文件夹就行了,不需要选图片或者点云(实际上点开是空的也选不了),路径里可以有中文,但是点云文件的格式必须是.pcd,图片格式只要是matlab支持的就行了,不过建议是png这种无损的压缩格式。要注意点云的命名和图片要对应,如1.png对应1.pcd.
3.填写标定板信息
三个数据分别对应单位、每个小方块的边长、除了棋盘格之外的填充部分长度(p1p2p3p4)
4.指定相机内参的获取方式
如果你刚刚做了内参标定,那么可以选择load from workspace,这里我为了演示基本流程所以选择compute intrinsics,选择之后会有警告(大意就是推荐自己做内参标定,用这个app自动做的不是很准,确实如此)直接点击ok就行了。接着就是等待导入数据了(如果数据很大需要的时间比较多)
5.之后大概率会出现这个报错,这是因为matlab自动检测标定板的能力非常有限,所以自动检测不到是非常正常的,点击确定继续就行了。
6.点击edit roi,这个按键是用来缩小自动检索范围的
7.会进入这个界面,里面的几个简单的按键功能自行试一下,这里不再赘述了。拖动黄色框来选取roi,最好的效果是截了之后只剩下标定板的点云(不必强求,后面还有更精准的选取点),截好之后点击左上角的绿色的accept。
然后可以点击snap to roi 按键来看一下截的怎么样,不满意的话重新截一下
8.点击select plane来选取点云,这个需要仔细一些,主要是因为选取的时候会选取你选的方框后的所有空间上的点。所以我一般喜欢拖到侧面来选点。(这个操作要对每张图片做)
选完这张之后不要着急点accept,点左侧的其他一张图片继续,这样会自动切换到同一个视角,不用再重新找视角了。把每张图片都选好,再点accept。
9.此时detect按键应该已经亮起,点击detect即可(如果没有亮起,检查一下前面的步骤有没有漏掉)
10.此时应该出现了被接受的数据,如果没有或者小于10张,把圈起来第二个阈值拉高到0.2,再次点击detect(千万别忘了)如果还是没有再拉高,如果还是没有被接受的数据,请直接看后面的标定注意事项(无论是否成功都请务必看看)。(这两个阈值第一个与聚类相关,第二个是与能容忍的边缘整齐度有关,第一个一般不需要调整,第二个越小越好)
11.然后改小上面圈起来的第二个阈值,直到被接受的数据在10-20张
12.此时点击标定按钮(绿色播放按键calibrate)即可,标定完毕后出现如下的界面
三个柱状图分别对应平移向量误差,旋转矩阵误差和重投影误差。
13.拖动红线,然后在左侧右击被选中的图片,点击这个步骤可以重复做,但注意要始终保持有10-20张被接受的图片来进行联合标定。
14.点击右上角的export按键,选择第一个导出到工作区,然后点击ok(建议勾上第二个导出相机内参,这样有助于后续核对)
15.在命令行区域输入workspace,右侧的tform就是对应的数据。点开tform,A对应的4x4的矩阵就是转化矩阵。
建议多试几次,看看每次导出的参数差距大不大。可以去下面这个网站,把旋转矩阵输入进去,选择用角度显示,更加直观的看每次测出来的欧拉角的区别。3D Rotation Converterhttps://www.andre-gaschler.com/rotationconverter/
4 标定注意事项
4.1 标定注意事项(matlab官方)
以下是matlab的官方建议(建议自己去读英文原版的,仔细看术语):
1.同时从两个传感器捕获数据,避免运动模糊效应。运动模糊会降低标定的准确性。如果您正在处理视频录制,请仔细捕获与各个图像帧对应的点云。
2.棋盘格应朝向相机(z轴)和激光雷达(x轴)的前轴。(雷达坐标系有的是把x轴对着前面的,这个不重要,主要是朝向尽量一致)
3.尽量将棋盘格目标举在双臂完全伸展的位置,而不是靠近身体。否则,您的身体部分可能会与目标平行,这可能导致棋盘格检测不准确。
4.对于稀疏激光雷达传感器,请从棋盘格的后方持有目标,而不是从边缘,因为 detectRectangularPlanePoints 函数会在输入点云的每个簇中搜索棋盘格平面。为了进一步减少误检测,可以使用 ROI 名值参数指定大致的棋盘格位置。(无论是什么雷达都不建议从侧面持握)
5.注意激光雷达传感器的视角或视场。不要将棋盘格放置在传感器的盲区内。
6.注意传感器与棋盘格之间的距离。低分辨率的激光雷达传感器,如 Velodyne® VLP-16,可能难以准确检测到远处的棋盘格。(livox推荐的非官方开源里建议是3m)
7.从棋盘格平面移除其他物体,避免将它们与棋盘格数据聚集在一起。(这一步非常重要,因为本质上就是在找角点和平面)
8.对于高分辨率的激光雷达传感器,如 HDL-64 和 Ouster OS1-64,在捕获数据时,您可以水平或垂直持有棋盘格。然而,为了获得最佳效果,建议在捕获数据时将棋盘格倾斜至 45 度角。(建议无论什么雷达都拍45度角,我上面不能拍主要是受限于设备)
此图展示了在捕获数据时如何持有棋盘格的不同方式。捕获至少 10 帧(实际上这个是不准确的的说法)以进行准确标定。
4.2 标定注意事项(实践得出)
matlab的官方教程和建议均是基于国外的设备给出的,并且通常是针对重复式扫描雷达给出的,并没有考虑到非重复式扫描雷达,这就是为什么实际上在做联合标定的时候,如果使用非重复式扫描的激光雷达并且严格按照教程来反而很容易找不到棋盘格。
以下是实践得出的结论:
1.使用非重复式扫描的激光雷达,不要积累10帧点云,(以mid70为例子,积累1-3帧就足够了)。因为国外的设备普遍是16-32线的,所以要积累10帧,而像mid70可以等效到100线左右,10帧会积累过多的点云。反而让环境变得复杂,matlab处理时间变长,并且很容易使自动检测失效(哪怕已经用select plane选定了也一样)
2.拍摄的时候把雷达中心(或者说z轴)对准标定板的中间。因为如果使用1-3帧累积的点云,中心的点云密度是足够的,但是远离中心之后反而变得非常稀疏,所以只有中心的数据有效,用远离中心的数据是无法聚类的。
3.尽量使用像matlab官方里那样的边缘没有多余白边的标定板,因为有的话会导致要手动填写多余白边的大小,会引入更多的测量误差(并且matlab在标定中对这个白边的优化很差,经常框出错误的标定板边缘)。
4.不要用手拿着侧边,因为从原理上来说,拿着侧边相当于把手引入到了标定板平面。而标定所需的最重要的参数就是4个角点以及点云里面的标定板平面。用手拿着侧边会极大的增加误差。总之,清理掉一切和标定板在同一平面的物体。
5.拍摄时最好用支架,滚动角45度左右,并且要拍摄有一定偏航角变化的图片。前一个是因为可能出现动态模糊,后一个是因为matlab有时候处理的结果会出现偏航角跳变的情况,可能是优化里并没有做的很好,所以最好多一些角度变化。
6.相机内参要预先标定,如果自制标定板需要是奇数格乘以偶数格,标定板支架不要拍进去了。
matlab这个联合标定程序并没有很好的处理相机内参标定的问题,因此最好预先处理好。标定板奇偶是因为要保证标定板的四个角上的格子是两黑两白色,支架是因为要防止聚类是把支架聚类进去了。
5 写在最后
笔者目前刚刚接触这个领域,知识难免会出现纰漏,如果发现错误,非常欢迎指出。
以下是参考资料来源,可以自行阅读来研究细节。
如需有侵权请联系我删除
如需转载请表明出处
Mid-70 激光雷达 - Livoxhttps://www.livoxtech.com/cn/mid-702. Livox的扫描特性简介 — Livox wiki 0.1 文档
https://livox-wiki-cn.readthedocs.io/zh-cn/latest/introduction/livox_scanning_pattern.htmlMatlab激光雷达相机联合标定经验分享_matlab lidar camera calibrator-优快云博客
https://blog.youkuaiyun.com/qq_30460905/article/details/127408124matlab Lidar Camara Calibrator使用方法及雷达点云对相机的标定_matlab lidar camera calibrator-优快云博客
https://blog.youkuaiyun.com/ruredfive/article/details/127651702Lidar and Camera Calibration
https://ww2.mathworks.cn/help/lidar/ug/lidar-and-camera-calibration.htmlWhat Is Lidar-Camera Calibration?
https://ww2.mathworks.cn/help/lidar/ug/lidar-camera-calibration.htmlLidar Camera Calibration with MATLAB - 帮助中心视频 - MATLAB & Simulink
https://ww2.mathworks.cn/support/search.html/videos/lidar-camera-calibration-with-matlab-1599735711875.html?fq%5B%5D=asset_type_name:video&fq%5B%5D=category:lidar/index&page=1Calibration Guidelines
https://ww2.mathworks.cn/help/lidar/ug/lidar-camera-calibration-guidelines.html基于单目相机和多线激光雷达的联合标定方法研究-【维普期刊官网】- 中文期刊服务平台
https://qikan.cqvip.com/Qikan/Article/Detail?id=7111876998livox_camera_lidar_calibration/doc_resources/README_cn.md at master · Livox-SDK/livox_camera_lidar_calibration
https://github.com/Livox-SDK/livox_camera_lidar_calibration/blob/master/doc_resources/README_cn.md激光雷达和相机的标定_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1xG41127M2/?spm_id_from=333.999.0.0&vd_source=868067222459831d0a2745205930c57d