kalibr源码阅读参考

2023-05-16

Kalibr简介:

Kalibr是一个用于标定多相机系统和IMU(惯性测量单元)的开源工具包,旨在提供一套完整的、易于使用的标定工具。它是ETH Zurich自主飞行系统实验室的一个项目,该实验室致力于研究和开发各种机器人技术。

Kalibr可以用于相机的内部参数标定,外部参数标定和时间同步标定,也可以用于IMU的标定,以及相机和IMU之间的外部标定。它支持多种相机模型(包括针孔模型、鱼眼模型和全景模型)和IMU模型,可以处理多达数十个相机和多个IMU的标定。Kalibr还提供了一个图形用户界面和命令行接口,使用户可以灵活地选择和执行不同的标定任务。

除了标定功能,Kalibr还提供了一些其他的功能,如轨迹估计和轨迹优化,这些功能可以在多相机系统和IMU的SLAM(同时定位和地图构建)中发挥重要作用。

总的来说,Kalibr是一个功能强大、灵活性高的标定工具包,适用于需要进行多相机系统和IMU标定的各种研究和应用场景。

Kalibr 多目相机标定流程

1 概述

Kalibr中实现了多目标定的功能,其原理可以分为以下几个步骤:

  1. 选取标定板:在标定之前,需要选取一个合适的标定板。Kalibr支持使用不同类型的标定板,如棋盘格、圆形格、椭圆格等。标定板应该被放置在多个相机可以看到的位置,并在每个相机中采集足够数量的图像,以便进行标定。
  2. 提取特征点:使用每个相机采集的标定板图像,从中提取特征点。Kalibr中支持使用不同的特征点提取算法,如FAST、ORB、SIFT等。
  3. 匹配特征点:对于每个标定板图像对,需要将它们之间的特征点进行匹配。Kalibr中提供了多种特征点匹配算法,如基于描述子的匹配、基于光流的匹配等。
  4. 求解相机内参:根据匹配好的特征点和标定板的几何信息,可以通过最小二乘法求解每个相机的内参矩阵。Kalibr中使用了基于投影误差的优化算法来求解内参矩阵。
  5. 求解相机外参:在求解相机外参之前,需要选择一个基准相机,将其坐标系作为全局坐标系。对于其他相机,可以通过与基准相机之间的特征点匹配来求解它们之间的相对姿态(外参)。Kalibr中使用了基于四元数的优化算法来求解相机之间的相对姿态。
  6. 优化:最后,对于所有相机的内参和外参,需要进行联合优化,以进一步提高标定结果的精度。Kalibr中使用了基于最小二乘法的优化算法来实现联合优化。

2 代码解读

2.1 标定板获取

在kalibr_calibrate_cameras中,可以通过:

targetConfig =kc.CalibrationTargetParameters(parsed.targetYaml)

的方式来创建 CalibrationTargetParameters 类的实例,并读取标定板参数配置文件中的内容,以便在后续的相机标定过程中使用。

具体可以实现查看aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/CameraCalibrator.py的CalibrationTargetParameters类。

这段代码定义了一个名为 CalibrationTargetParameters 的类,它继承自 ParametersBase 类。CalibrationTargetParameters 类用于读取和解析标定板参数配置文件中的内容,以便在标定相机时使用。

  1. 构造函数 __init__(self, yamlFile, createYaml=False) 接收两个参数:yamlFile 是标定板参数配置文件的路径,createYaml 是一个布尔值,表示是否创建一个新的配置文件。

类中定义了一系列函数,用于检查和获取标定板的参数,例如:

  1. checkTargetType(self, target_type):检查标定板类型是否合法。
  2. getTargetType(self):获取标定板的类型。

getTargetParams(self):获取标定板的具体参数,例如标定板格子的行列数,行列之间的距离等。根据不同的标定板类型,需要读取不同的参数。

该类还有一些辅助函数用于检查标定板参数配置文件的内容是否合法,如果不合法则抛出异常。

2.2 角点提取

角点提取的核心是使用cv库中的棋盘格角点自动提取方法。

2.2.1 extractCornersFromDataset

角点提取和extractCornersFromDataset方法有关,具体实现查看:aslam_offline_calibration/kalibr/python/kalibr_common/TargetExtractor.py

该方法实现了从一个数据集中提取校准板角点的功能。函数的输入是数据集、检测器和一些参数,输出是一系列角点的位置和其他信息。该函数支持单进程和多进程两种方式。如果启用了多进程,函数会将数据集中的每张图片交给不同的进程处理,最终将结果合并。如果没有启用多进程,则使用单进程处理每张图片。

在函数内部,首先通过 dataset.numImages() 获取数据集中的图片数量,并创建了一个 sm.Progress2() 对象,用于显示处理进度。

然后,如果启用了多进程,代码会创建一个 multiprocessing.Manager() 对象,以便在多个进程之间共享数据。接着,函数遍历数据集中的每张图片,将其数据打包放入 taskq 队列中。同时,复制一份传入的检测器 detector,在 plist 列表中存储 numProcesses 个新的进程,并将每个进程分配到一个核心上。每个进程从 taskq 队列中获取一张图片,使用检测器 detector_copy 进行角点检测,并将检测结果放入 resultq 队列中。检测完成后,等待所有进程完成并退出。

在多进程处理结束后,主进程将从 resultq 队列中读取所有检测结果,并将其按时间戳排序。最终,该函数返回一个包含所有角点的列表 targetObservations。

如果没有启用多进程,则使用单进程的方式遍历数据集,并对每张图片进行角点检测。对于每张图片,先检测是否启用了估计变换 noTransformation。如果没有启用,则使用 detector.findTarget() 方法进行角点检测和估计变换。如果启用了,则使用 detector.findTargetNoTransformation() 方法进行角点检测,但不估计变换。在检测完成后,将结果存入 targetObservations 列表中。

最后,如果未检测到任何角点,则输出错误信息。如果检测到角点,则显示处理结果。

2.2.2 角点提取核心步骤

文件:

\kalibr\master\aslam_cv\aslam_cameras\src\GridCalibrationTargetCheckerboard.cpp

使用 cv::findChessboardCorners 函数从输入图像中提取棋盘格的角点。 当 _options.doSubpixelRefinement 为真且角点检测成功时,对检测到的角点进行亚像素级别的精度优化。

角点的输出格式是一个Eigen MatrixXd对象,该对象的每一行代表一个角点在图像坐标系下的位置,每行包含两个元素,即x和y坐标值。因此,输出格式是一个矩阵,其行数等于检测到的角点数,每行包含两个元素表示角点的坐标。

2.3内参求解

以小孔成像相机为例:

首先进行相机内参的初始化,再使用BA算法进行优化,求解方法为L-M方法。

2.3.1 相机内参初始化

文件:Line 710

kalibrmaster\aslam_cv\aslam_cameras\include\aslam\cameras\implementation\PinholeProjection.hpp

对于每组标定板的观测数据,通过检测每个格点所在的圆圈来计算焦距的初值。具体来说,首先将棋盘格的每一行都拟合一个圆,然后计算任意两行之间所有圆心的连线长度,根据这些连线的长度,计算出所有可能的焦距初值(这些焦距初值都是通过两个圆心连线的长度计算得到的,具体计算方法参考了论文 "Equidistant Fish-Eye Calibration and Rectification by Vanishing Point Extraction, PAMI 2010")

2.3.2 相机内参优化

文件:

aslam_offline_calibration\kalibr\python\kalibr_camera_calibration\CameraIntializers.py

方法名:

calibrateIntrinsics()

该函数的输入参数包括一个相机模型和一组观测数据,输出标定是否成功。主要步骤如下:

1.将所有的设计变量添加到OptimizationProblem()类中。

2.添加角点的误差项到优化问题中。

3.优化相机的内参和畸变系数。

4.输出标定是否成功。

具体来说:

第1步中,函数首先将相机内参的设计变量、畸变系数的设计变量和快门时间的设计变量添加到问题中。

第2步中,函数使用已知的标定板,得到标定板上各个角点的3D坐标和2D坐标(通过函数estimateTransformation()获得齐次变换矩阵)。在每个观测数据中,依次计算角点的重投影误差(通过调用reprojectionError()计算)并将其加入优化问题。

第3步中,函数使用Levenberg-Marquardt算法优化相机内参和畸变系数,使得重投影误差最小。

第4步中,输出标定是否成功。

2.4 位姿求解

2.4.1 初始相对外参矩阵

文件:

aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/MulticamGraph.py(Line118)

解读:

检查所有的相机是否都通过公共目标点观测连接(形成连通图),如果没有则报错退出程序;

  1. 使用Dijkstra算法查找具有最大公共观测目标点的相机对;
  2. 对于选定的相机对,使用基础矩阵恢复初始的相对位姿变换,得到从低编号相机到高编号相机的初始变换矩阵;
  3. 将得到的初始变换矩阵进行拼接,得到整个相机系统的初始位姿。
  4. 在具体实现中,该函数首先使用图论算法判断相机是否能够形成连通图,若不能则直接退出程序。然后,该函数使用Dijkstra算法查找具有最大公共观测目标点的相机对,选定相机对后使用基础矩阵进行相机位姿的恢复。最后,将所有的相机对恢复的位姿进行拼接,得到整个相机系统的初始位姿。
  5. 由于视觉SLAM中的相机位姿是不断优化更新的,因此这个初始位姿的正确性对整个SLAM系统的性能具有很大影响。

2.4.2 初始化全局外参矩阵

  1. 首先,从观测数据库中获取所有看到目标角点的相机ID和每个相机看到的角点数。
  2. 找到角点数最多的相机,使用该相机的外参进行PNP求解,得到相机到目标的位姿变换 T_{t, c_n}。
  3. 然后,根据baseline_guesses(相对外参)和外参变换T_{t, c_n},得到相机c_n到相机c_0的位姿变换T_{c_n, c_0}。
  4. 最后,将T_{t, c_n}和T_{c_n, c_0}相乘,得到目标在相机c_0坐标系下的位姿变换T_{t, c_0}。

Q&A:

1. baseline_guesses和T_{t, c_n}的区别。

baseline_guesses是两个相机的相对外参,T_{t, c_n}是在以角点最多的相机为参考坐标系下的全局位姿。我这样理解对吗

2. baseline_guesses如何转移到T_{t, c_n}。

假设已知某相机C_N到目标t的变换T_{t_,c_N},以及相机C_N到相机C_0中存在N个已知baseline,现要将相机C_N转换到相机c_0坐标下,得到T_{t_,c_0},则该过程符合连乘原则:

T_{c_n,c_0} = \prod_{i=0}^{n-1} b_i

T_{t,c_0} = T_{t,c_n} T_{c_n,c_0}

2.5 外参和畸变参数等优化:

其核心思想是利用BA算法进行参数优化,使用的求解方法为L-M方法。

其中设计变量为:

  1. T_tc_guess
  2. baselines DVs(即上面提到的baseline_guesses)
  3. 角点位置
  4. distortionDesignVariable
  5. projectionDesignVariable()
  6. shutterDesignVariable()

其中,添加待求解问题的设计变量操作在,具体查看文件。

文件:

\kalibrmaster\aslam_offline_calibration\kalibr\python\kalibr_camera_calibration\CameraCalibrator.py

类名:CalibrationTargetOptimizationProblem

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

kalibr源码阅读参考 的相关文章

  • Kalibr联合标定相机—IMU总结(转载)

    转载自 xff1a https zhuanlan zhihu com p 47750214 Kalibr联合标定相机 IMU总结 李阳阳 公众号 码出名企路 xff0c 交流批评进步 Kalibr官网 ethz asl kalibr git
  • 使用Kalibr标定相机和IMU(ZED+px4)外参

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 使用Kalibr标定相机和IMU xff08 ZED 43 px4 xff09 外参 前言一 Kalibr介绍二 CAM IMU外参标定1
  • kalibr使用笔记

    官网 GitHub ethz asl kalibr The Kalibr visual inertial calibration toolbox The Kalibr visual inertial calibration toolbox
  • 乌班图安装 Kalibr

    安装ROS Melodic 1 Installation 1 1 Configure your Ubuntu repositories http www 360doc com content 18 0417 15 54525756 7463
  • Ubuntu安装kalibr

    Ubuntu安装kalibr错误集锦 一 安装过程 ros参考 xff1a https blog csdn net Mua111 article details 107513509 kalibr安装参考 xff1a https blog c
  • kalibr标定IMU

    kalibr标定IMU 必须明确的是 1 如何标定 2 标定的结果 3 如何验证标定结果的正确性 如何标定 标定所需文件 XX bag 包含有图片信息和IMU数据的ROS包 camchain yaml 包含相机的内参和畸变参数的文件 IMU
  • 传感器标定系列——Kalibr工具

    文章目录 Kalibr介绍安装资源 Kalibr介绍 Kalibr is a toolbox that solves the following calibration problems 多相机标定 Multi Camera Calibra
  • Kalibr标定Intel D435i相机

    Kalibr标定Intel D435i相机 文章目录 Kalibr标定Intel D435i相机1 相机标定2 IMU标定3 相机 43 IMU联合标定4 标定结果评价 系统环境 xff1a ubuntu16 04 43 roskineti
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • kalibr源码阅读参考

    Kalibr简介 xff1a Kalibr是一个用于标定多相机系统和IMU xff08 惯性测量单元 xff09 的开源工具包 xff0c 旨在提供一套完整的 易于使用的标定工具 它是ETH Zurich自主飞行系统实验室的一个项目 xff
  • Camera-IMU标定工具Kalibr的编译

    关于catkin make过程中下载suitesparse过久甚至失败的问题 xff1a 在安装kalibr时的suitesprse库时 xff0c 对应的cmakelists中会通过wget 下载压缩包 xff0c 若无法下载则整个kal
  • 学习Kalibr工具--Camera与IMU联合标定过程

    上一节介绍了 xff0c 用kalibr工具对camera进行标定的操作流程 xff0c 在camera标定之好之后 xff0c 进行camera与IMU进行联合标定的操作的学习 xff0c 即求取相机和IMU 之间的转换关系 坐标系之间的
  • Kalibr标定时卡在Extracting calibration target corners的问题

    问题 使用Kalibr标定单目相机与单目imu联合标定 xff0c 都出现卡在Extracting calibration target corners的问题 xff0c 因此做一个记录 运行标定命令后一直卡在下面 Initializing
  • Kalibr标定工具箱使用详细过程

    KaliZr由ETHZ视觉组开源 xff0c 链接如下 xff1a https github com ethz asl kalibr Kalibr可以解决以下校准问题 xff1a 1 多摄像机校准 xff1a 具有非全局共享的重叠视场的摄像
  • 安装kalibr踩坑1:Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)

    Could NOT find GTest missing GTEST LIBRARY GTEST MAIN LIBRARY 因为GTest虽然安装过 xff0c 但是好像找不到头文件 sudo apt get install libgtes
  • 学习Kalibr工具--Camera标定过程

    这里介绍用kalibr工具对相机进行单目和双目的标定 xff1b 在kalibr中不仅提供了IMU与camera的联合标定工具 xff0c 也包含了camera的标定工具箱 xff1b 准备 安装好kalibr之后 xff0c 开始准备标定
  • bmi055 标定_Kalibr tutorials

    Kalibr installation tutorial I was confused about installing Kalibr but there is no even one hint in README md I just pu
  • Kalibr源码学习(一): 重投影误差

    Kalibr源码学习 一 重投影误差 给自己挖一个大坑 从标定结果来学习Kalibr的标定源码 这里基本以KB模型为例 也就是标定时 kalibr的模型设定为 model pinhole equi 这里以重投影误差开始 希望能坚持 重投影误
  • 标定工具Kalibr安装、使用及标定结果评估方法

    单目相机标定 安装和配置 cd kalibr workspace source devel setup bash 如果使用april tag标定板 xff0c 设置aprilgrid yaml配置文件 标定数据bag采集 采集单目标定数据时
  • 使用Kalibr工具线对相机+IMU离线标定

    传感器标定的准确后面做算法才会更准确 所以对Kalibr进行学习 一 Kalibr编译 1 下载kalibr包 GitHub下载地址 2 解压后放到 catkin ws src文件夹下 重新命令文件夹为kalibr 3 安装依赖库 sudo

随机推荐

  • 【项目复盘】springboot项目中使用mybatis-plus进行分页

    springboot项目中使用mybatis plus进行分页 文章目录 springboot项目中使用mybatis plus进行分页引入依赖配置类实体类持久层业务层 引入依赖 span class token generics span
  • 【项目复盘】javax.validation的简单使用

    javax validation的简单使用 javax validation需要与hibernate validator配合使用 validation bean 是基于JSR 303标准开发出来的 xff0c 使用注解方式实现 xff0c
  • 【项目复盘】springboot中使用swagger生成接口文档并配置bootstrap主题

    springboot中使用swagger生成接口文档并配置bootstrap主题 引入依赖 span class token generics span class token punctuation lt span dependency
  • 【项目复盘】微服务网关GateWay过滤

    微服务网管过滤 新建一个过滤类 span class token annotation punctuation 64 Component span span class token comment 过滤器的执行优先级 返回值越小 执行优先级
  • 【项目实战】Winodws下使用ELK搭建日志分析框架

    项目实战 Winodws下使用ELK搭建日志分析框架 ELK是什么 xff1a 引用官网的一句话 xff1a 核心产品包括 Elasticsearch Kibana Beats 和 Logstash xff08 也称为 ELK Stack
  • java_网络编程知识

    day11 网络编程 主要内容 软件架构CS xff0f BS网络通信三要素TCP通信Socket套接字ServerSocket 学习目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传
  • AvFrame和AvPacket

    在FFmpeg中 未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存 针对视频编码器 其流程为从数据源获取图像格式的输入数据 保存为AVFrame对象并传入编码器 从编码器输出AVPacket结构 1 AVFr
  • 基于FreeRTOS的stm32程序初始化底层搭建(hal库)

    采用嵌入式实时操作系统 RTOS 可以更合理 更有效地利用CPU的资源 xff0c 简化应用软件的设计 xff0c 缩短系统开发时间 xff0c 更好地保证系统的实时性和可靠性 FreeRTOS是一个迷你的实时操作系统内核 作为一个轻量级的
  • ceres小结 -- vins为例

    从 typora 复制的 排版有问题 见谅 在estimator cpp文件里 这个函数 void Estimator optimization 1 声明problem ceres Problem problem 2 引入核函数loss f
  • JavaScript操作表格及CSS样式

    概述 在前端开发中 xff0c 表格主要用于存储结构化的数据 xff0c CSS主要用于修饰DOM元素 xff0c 如何通过DOM来操作表格及CSS呢 xff1f 本文主要通过一些简单的小例子 xff0c 简述DOM对表格和CSS的常见操作
  • 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 span c
  • Linux/c++服务器开发方向的重点

    作者 xff1a NULL 链接 xff1a https www zhihu com question 37247264 answer 2352680534 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • Prometheus之Dockerfile编写、镜像构建、容器启动

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 目录 从官方镜
  • Java的接口调用

    最近在观看一个Android开发中 xff0c 有一个问题百思不得其解 xff0c 就是从Fragment传数据回Activity和Activity传数据到Fragment中 xff0c bundle其实刚开始还是理解的 xff0c 但是当
  • X86实模式与保护模式简介

    0 引言 从80386开始 xff0c CPU有三种工作方式 xff1a 实模式 xff0c 保护模式和虚拟8086模式 v86模式 只有在刚刚启动的时候是real mode xff0c 等到操作系统运行起来以后就切换到protected
  • (1)VisDrone无人机目标检测数据集介绍

    数据集介绍 官网 xff1a http aiskyeye com VisDrone数据集 xff0c 包含了10个类 xff08 即行人 人 汽车 面包车 公共汽车 卡车 汽车 自行车 遮阳三轮车和三轮车 xff09 无人机计算机视觉相关检
  • 简单的shell编程的语法

    shell 1 span class token punctuation span 脚本以 span class token comment bin bash 开头 span span class token comment 脚本的常用执行
  • 使用c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用
  • kalibr 进行相机单目、双目标定全流程

    一 部署kalibr环境 docker 步骤 xff1a 参考链接 xff1a Installation ethz asl kalibr Wiki GitHub Docker操作知识 xff1a Docker攻略 xff1a 从安装到入门到
  • kalibr源码阅读参考

    Kalibr简介 xff1a Kalibr是一个用于标定多相机系统和IMU xff08 惯性测量单元 xff09 的开源工具包 xff0c 旨在提供一套完整的 易于使用的标定工具 它是ETH Zurich自主飞行系统实验室的一个项目 xff