相机与激光雷达联合标定(二)

2023-11-06

前言

LiDAR Camera Calibration (LCC)系列,主要介绍激光雷达相机外参标定相关内容。本文主要介绍相关的开源代码和软件,主要包括target-based和targetless两类方法,每个方法对应标题后说明了方法的提出年份和开源代码的语言(c : c++, p: python, m: matlab)。

Github同步更新:

GitHub - Deephome/Awesome-LiDAR-Camera-Calibration: A Collection of LiDAR-Camera-Calibration Papers, Toolboxes and Notes​github.com/Deephome/Awesome-LiDAR-Camera-Calibration正在上传…重新上传取消

1. target-based方法

一般就是使用标定板,可以是一块普通的矩形板,可以添加视觉效果(比如棋盘格,ArUco),可以在矩形板上镂空出特定形状。

1.0 CamLaserCalibraTool (2004c)

主要参考了华盛顿大学2004年的论文,旷视提供了开源实现和博客解读。 2D激光雷达和相机标定。主要利用点到平面和边缘的约束。详情见旷视的博客和开源:

1.1 LCCT (2005m)

来自CMU Robotics Institute, 已知最早3D Laser与相机标定的工作(2005年),基于matlab的图形用户界面,进行激光雷达相机外参标定。

target-based方法,使用标定板,采集多个点云图像对,在点云对应的深度图(range image)上框选标定板平面区域,即可求解外参(两阶段)。

第一阶段,分别最小化两个坐标系中相机中心到平面距离和平面法向量的差异,依次线性求解平移和旋转;第二阶段,最小化point-to-plane距离,迭代求解。

1.2 cam_lidar_calib (2010c)

来自密歇根大学,ROS / C++实现。

使用checkerboard,最少需要3个视图。自动提取特征,图像中提取checkerboard在相机坐标系中的法向量和距相机原点的距离,点云中提取checkerboard的平面点。

1.3 lidar_camera_calibration (2017c)

来自印度IIIT Robotics Research Lab,ROS package (C++)实现, 介绍了两种方法。 第一种方法是基于2D-3D correspondence,采用中空矩形纸板作为目标,在图像上手动标记角点2D像素,在点云中手动框选线段,利用直线相交求解3D角点,然后利用PnP+ransac求解外参。缺点是手动标记像素点,误差较大。

第二种方法是基于3D-3D correspondence,与方法一主要区别是图像中特征的提取。通过采用ArUco二维码,可直接计算出角点在相机坐标系的3D坐标,然后利用ICP求解外参。

1.4 ILCC (2017p)

来自日本名古屋大学Nagoya University,python实现。完整流程如下:

该方法的3D角点提取方式比较独特。基于点云反射强度和chessboard颜色模式的相关性,利用一个chessboard model来拟合(匹配)分割的点云,从而利用chessboard model的角点位置表示chessboard点云中角点位置。

1.5 plycal (2018c)

来自HKUST,C++实现。

采用要给矩形板作为target。首先对激光雷达和相机时间同步,图像纠正。全自动地在图像中提取矩形板角点和边缘,在点云中提取矩形板的边缘和平面点。矩形特征2D-3D匹配。采用point-to-linepoint-inside-polygon约束进行优化。

1.6 Matlab Lidar Toolbox (2018m)

target-based方法,使用了chessboard, 理论上采集一个pose就可以求解。 特征提取分别自动提取chessboard在相机和激光雷达坐标系的平面和边缘信息,利用line correspondence (direction constraint + point to line constraint)和plane correspondence (normal constraint + point to plane constraint)进行标定。

只能使用matlab的lidar toolbox,看不到源代码
该方法与plycal(2018c)的标定板点云特征提取方法类似。

1.7 extrinsic_lidar_camera_calibration (2020m)

来自 Robotics Institute, University of Michigan。matlab实现。

主要创新点是标定板点云的角点估计方法。假设在lidar原点有一个大小已知的参考标定板(reference target),希望标定板点云通过H变换后,与这个参考标定板尽量重合。优化求解H,将参考标定板角点反变换,即可得到点云中的角点位置。

之前方法采用先拟合边缘再直线相交的思路,只利用了边缘点,受点云深度测量误差影响,最后提取的四个角点可能与target真实几何不兼容。该方法的角点估计考虑了所有点,估计的四个角点也是与真实target形状兼容。
该方法与ILCC(2017p)方法类似,都是通过与一个参考的标定板拟合,从而对标定板点云参数化建模,求得角点。只是ILCC利用了点云反射强度,本方法只利用点云几何信息。

github开源https://github.com/UMich-BipedLab/extrinsic_lidar_camera_calibration

该开源代码也实现了Matlab Lidar Toolbox (2018m)参考论文中点云边缘提取的方法:1)先ransac拟合平面,2),找到每条scanline的端点(边缘点),3)将标定板点云投影到拟合平面,4)拟合每条scan line, 5)将边缘点投影到拟合的scan line, 6)用ransac拟合边缘,去除边缘点粗差
参考论文:2020_IEEE access_Improvements to Target-Based 3D LiDAR to Camera Calibration

1.8 livox_camera_lidar_calibration(2020c)

Livox官方提供的Lidar-Camera标定代码,图像和点云都是手动标点。 github开源https://github.com/Livox-SDK/livox_camera_lidar_calibration

1.9 ACSC (2020p)

来自北航,python实现,针对固态激光雷达Livox.

提出多帧点云集成精化算法(temporal-spatial-based geometric feature refinement)和基于反射强度分布的角点估计方法(reflectance intensity distribution-based 3D corner estimation )。自动提取2D和3D角点,然后用基于Ransac的PnP求解。

1.10 velo2cam_calibration (2021c)

来自 Intelligent Systems Lab (LSI), Universidad Carlos III de Madrid, Leganes, ROS + C++实现。可以将激光雷达、单目相机、立体相机进行任意成对标定。需要比较特殊的标定板:

  • github开源https://github.com/beltransen/velo2cam_calibration
  • 参考论文: Beltrán, J., Guindel, C., and García, F. (2021). Automatic Extrinsic Calibration Method for LiDAR and Camera Sensor Setups. arXiv:2101.04431 [cs.RO]. Submitted to IEEE Transactions on Intelligent Transportation Systems.

1.11 autoware

最新版只有autoware_camera_lidar_calibrator, 直接手动选点的方法,在下文介绍。

使用标定板结果更准确一些,但是操作不方便。1)需要手动grab多个关键帧,2)使用glviewer显示点云,不好调整视角,3)需要手动选择平面点云

1.12 LIBCBDETECT (2012 m)

棋盘格角点的亚像素级检测,matlab实现。可用于针孔相机,鱼眼相机,全景相机。来自论文:

Automatic Camera and Range Sensor Calibration using a single Shot​www.cvlibs.net/publications/Geiger2012ICRA.pdf

1.13 multiple-cameras-and-3D-LiDARs-extrinsic-calibration

2 targetless方法

2.1 apollo

是基于自然场景的targetless方法,不需要手动标记,但是需要较准确初值

(一个比较好的标定场景,包含路灯,树木,道路等物体)

注意:核心代码没有开源

2.2 autoware

没有target,但是需要手动标记图像和点云中的对应点,至少选择9对。

2.3 ExtrinsicCalib (2012c)

先将图像进行灰度化和直方图均衡化,得到灰度图像,然后根据点云的反射强度和法向量特征将点云投影为图像,使用标准化互信息衡量灰度图像和点云生成图像之间相关性。使用粒子群优化算法不断改变外参,直到粒子收敛,达到标准化互信息的最大值。

论文:2012_Automatic Targetless Extrinsic Calibration of a 3D Lidar and Camera by Maximizing Mutual Information

局限性:对于图像,光照会影响像素亮度,且存在阴影问题;点云强度则不同,由于激光是主动式。因此,利用多视图数据,可以尽量避免光照、阴影造成的噪声,使误差函数相对平滑,便于优化。

2.3 CamVox (2020c)

来自南方科技大学。图像先灰度化再提取边缘,点云先分别得到反射强度图和深度图,再提取边缘。通过ICP优化,求解最佳外参。

2.4 livox camera calib (2020c)

来自香港大学。分别提取点云和图像中的边缘特征,然后匹配特征,最后优化求解最佳外参来更好地对齐点云边缘和图像边缘。

论文详细解读请参考:

场景选择: 避免圆柱物体,避免纹理过多(树木,花草等),边缘均匀分布,多个方向的边缘 Issue with finding depth-continuous regions (github)

2.5 mlcc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机与激光雷达联合标定(二) 的相关文章

随机推荐

  • 前端moment库时间戳转标准时间不准确的问题解决

    做前端项目的时候 根据后台返回的一个时间戳 将时间戳需要转换成标准时间 因为项目中有moment这个时间处理包 而且moment对于时间的转换比较强大 可以根据特定的格式进行转换 最终将时间戳转换成 年 月 日 时 分 秒 这种形式 但是转
  • SpringQueryMap -SpringCloud feign get method 接受自定义对象参数

    feign中和controller中不一样的地方 controller中可以get方法使用对象参数无需任何注解 可默认绑定到对象 示例代码如下 GetMapping value ClueClient LIST OPERATIONS publ
  • J2EE基础集合框架之Set

    前言 上次与大家介绍了集合框架的LIst集合 List集合的特点的是元素有序且可重复 今天与大家分享的是也是一种集合 叫做Set集合 他和List集合是相反的 今天我们就一起去探究Set集合 首先跟思维导图来了解我今天要分享的内容吧 说明
  • 卷积神经网络&目标检测

    卷积神经网络 目标检测 一 Inception网络 1 Inception网络基本思想 2 采用1 1卷积降低计算量 3 Inception模块和Inception网络 二 迁移学习 三 数据扩充方法 四 目标检测 1 特征点检测 2 通过
  • postman的json脚本转jmeter的jmx脚本

    一般研发同学会用postman做接口自测 但是我们做性能测试的时候 又不能用postman 对鉴权不了解的接口 自己调试脚本又很麻烦 这个时候 我们就可以用这个方法把json脚本转换成jmeter用的jmx脚本 环境准备 这几个工具需要提前
  • join python

    Python join 方法用于将序列中的元素以指定的字符连接生成一个新的字符串 1 join是针对字符串进行操作的 2 join里面的参数只能是一个 可以是字典 列表 元组 然后以前面的分隔 形成一个新的字符串 但是里面的东西必须是字符串
  • 百度智能云x蓝色光标共绘AI营销新篇章

    9月12日 百度集团副总裁袁佛玉参加蓝色光标Blue AI行业模型发布会 参与启动仪式并带来了主题演讲 大模型重塑数智世界 此次蓝色光标推出的行业模型 得益于百度智能云千帆大模型平台 以下简称千帆平台 的强大支持 标志着双方合作的深度与广度
  • element中Notification组件(this.$notify)自定义样式

    1 自定义样式效果 2 vue代码 this notifications this notify title dangerouslyUseHTMLString true duration obj remindMethod 3 0 4500
  • 风火编程-- 装饰器,reduce, 片函数,闭包概念

    python核心编程 读书笔记 六 第十一章 11 3 6装饰器 在不改变函数体的前提下 对函数添加前置或后置功能 def 装饰器函数 func def wrapper args kwargs before func func after
  • LeetCode刷题入门

    Letcode刷题入门篇 开始准备刷Letcode的题目 入门基础题 从简单的题目开始做 先考虑用python解题 一 两数之和 使用最简单的暴力解法 复杂度为O n 2 时间复杂度更低的解法 借用List 的相关函数求解 或使用hash求
  • java实现----猜数:随机生成一个数,判断大小,对错。

    需要用到Random 随机生成一个数 if语句 while语句 import java util Scanner 导包 import java util Random 随机生成一个数 public class 猜数 public stati
  • 3.2 创建Maven聚合工程

    3 2 1 构建父工程fmmall 创建一个maven工程 packing设置为 pom 父工程继承继承spring boot starter parent
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • 发布的qt程序出现libQt5Core.so.5 版本问题

    原因 发布版本跟别的机器qt环境不一样导致 解决方法 把 1 在客户机 去掉 bashrc 关于qt的环境变量 2 同样的方式去掉 etc profile的环境变量 或者吧qt的环境变量修改正确 因为你发布的软件首先回去系统路径中链接相关库
  • 28 openEuler管理网络-配置主机名

    文章目录 28 openEuler管理网络 配置主机名 28 1 简介 28 2 使用hostnamectl配置主机名 28 2 1 查看所有主机名 28 2 2 设定所有主机名 28 2 3 设定特定主机名 28 2 4 清除特定主机名
  • 【得物技术】自动化生成代码几种方案的演变

    今天我们聊一聊自动化生成代码的问题 试想一下 假如有一天机器替代你编写代码 你是应该感到开心还是难过 方案 目前代码生成技术主要有以下几类 1 基于模版编排生成代码 首先说下基于模版生成代码的方式 这种属于最原始最简单也是目前应用最广泛的一
  • egg.js和nest.js的对比

    egg js和nest js的对比 前几天突然看到一个群在说现在用egg的人已经很少了 说用nest的人比较多 然后我就做了一个简单的调查和对比 egg和nest都是比较优秀的框架 但是两个框架有比较大的区别 我主要分为六个方面来分析egg
  • web socket

    package com web import java io IOException import java util concurrent CopyOnWriteArraySet import javax websocket import
  • Mysql增加传输数据量或连接时间,防止mysql server has gone away报错

    首先登录进mysql mysql u root p 这个需要修改数据库配置的权限 修改数据传输量 默认是1M的数据量 数据量过大时会不够用 因此增加阈值 如下代码为100M show variables like max allowed p
  • 相机与激光雷达联合标定(二)

    前言 LiDAR Camera Calibration LCC 系列 主要介绍激光雷达相机外参标定相关内容 本文主要介绍相关的开源代码和软件 主要包括target based和targetless两类方法 每个方法对应标题后说明了方法的提出