VIO外参标定方法总结

一、前言

VIO外参标定是指相机和IMU之间的转移矩阵的确定,包括3×3的旋转矩阵和3维平移向量。整体上分为离线标定和在线标定两类方法,这篇文章做一个总结,主要是经典的方法,记录其思想。

二、博文链接

1、离线标定方法

最基本的当然就是人工手动标定了,但这样不仅费力,并且误差大不够准确,作为初始猜测还可以。

VIO最知名的离线标定工具就是Kalibr了。

GitHub - ethz-asl/kalibr: The Kalibr visual-inertial calibration toolboxThe Kalibr visual-inertial calibration toolbox. Contribute to ethz-asl/kalibr development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/ethz-asl/kalibrKalibr标定的基本原理

https://www.cnblogs.com/mybrave/p/9675936.htmlicon-default.png?t=N7T8https://www.cnblogs.com/mybrave/p/9675936.html

camera-imu内外参标定 - 知乎在vio系统中,camera-imu间内外参精确与否对整个定位精度起着重要的作用。所以良好的标定结果是定位系统的前提工作。 目前标定算法主要分为离线和在线标定,离线标定以kalibr为代表,能够标定camera内参、camera-i…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/68863677Camera-IMU联合标定原理 | AI技术聚合Camera-IMU联合标定原理一.相机投影模型二.IMU 模型三.Camera-IMU标定模型(一) 相机-IMU旋转(二) 相机-IMU平移(三) 视觉惯性代价函数四. camera-imu联合标定(一) 粗略估计camera与imu之间时间延时(二) 获取imu-camera之间初始旋转,还有一些必要的初始值:重…icon-default.png?t=N7T8https://aitechtogether.com/python/142928.html手眼标定

机器人视觉标定(二)手眼标定 - 知乎在(一)中已经介绍了线结构光标定,通过线结构光可以得到物体被照射激光部分的相机三维坐标。当机械手臂安装了线结构光传感器后,相当于被安装了眼睛,得到相机三维坐标相当于眼睛看到了物体的位置,这时就需要眼睛…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/78855930

2、在线标定方法

VINS-mono外参标定原理
https://zhuanlan.zhihu.com/p/413096765icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/413096765解放双手|教你进行相机与IMU外参的在线标定 - 计算机视觉life的文章 - 知乎
https://zhuanlan.zhihu.com/p/70760958icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/70760958

三、VIO在线外参标定典型方法详解

1、自动标定:

单目相机通过对极几何和随机采样一致性确定两帧图像之间的相对旋转,IMU可以得到自己坐标系下的前后两帧图像之间相对旋转,根据手眼标定方法,结合多帧数据,可以得到关于旋转的超定方程,利用优化方法则可以得到相机和IMU之间的旋转外参。

2、在线估计:

求外参残差关于位移和旋转的雅可比

四、VINS-mono的外参标定

VINS-mono上使用的外参自动标定与在线标定算法,来自Monocular_VisualInertial_State_Estimation_With_Online_Initialization_and_CameraIMU_Extrinsic_Calibration这篇论文。整体的流程方法如下:

手眼标定原理:

结合上图, 相邻Camera关键帧对应pose可以由两种方式(为后面构建方程铺垫):

a.八点法算法(solveRelativeR)

b.Imu预积分并与结合

标定转换

红色线蓝色线得到的变换值理论上应该相同,则可通过假设从Camera坐标系到Imu坐标系相对旋转量为即q和R ,进一步可构建方程并求解(vins-mono使用SVD求解方法)

根据手眼标定原理与上述原理,得到(4),转换成四元数格式,经过整理得到形如Ax=0的(7)式。

在求解过程中,因为上面在求解帧间的R、T变换时是用对极约束算法,该方法避免不了有错误的匹配等(outlier),因此对Ax=0中A矩阵加权计算从而增加在线标定结果鲁棒性,加权的计算方式(近似the Huber norm计算方式)参考作者引用的标定论文中的式8、9,如下

为什么奇异值大于0.25才认为标定成功?

代码中ric_cov(1) > 0.25,为倒数第二小的奇异值。最小的奇异值接近0(奇异值大于0,且通常前面几个大的奇异值总和能占所有奇异值总和的一大部分),这里给了个阈值,看其是否足够大,每个奇异值大小可以理解为分方向的力度大小。这边用0.25来限定倒数第二小的奇异值,是判断不为0的奇异解中,最终求解的奇异值是否是只有一个接近于0,最优解只有一个,如果有多个接近0,都很小的话,那么该最小奇异解很可能不是最优,从而间接可以判断在标定过程中是否有充足的旋转等。

速度,姿态,特征深度和相机- IMU平移的线性初始化:一旦相机- IMU旋转固定,我们可以估计相机- IMU的平移,同时初始化速度,姿态和特征深度,以及IMU相对于初始参考帧的姿态。线性初始化通过最小化滑动窗口内IMU和单目相机所有测量误差的马氏范数之和进行最大似然估计。

值得注意的是,在这个线性初始化阶段,我们重用了用于相机- IMU旋转标定的传感器测量值,但

固定为常数。我们还直接使用陀螺仪测量值短期积分得到的增量和相对旋转。由于这种线性初始化通常只能在几秒内完成,直接使用IMU旋转不会造成明显的漂移。

进一步细化:

VINS-Mono在获得旋转变换之后,在进行VIO的过程中,将相机与IMU外参作为优化参数在整个算法运行过程中进行矫正,从而保证外参的准确性。

在状态初始化和获得相机- IMU标定后,进行了滑动窗口非线性估计器,以进行高精度的状态估计和标定优化。这是文献[ 7 ]和文献[ 8 ]的扩展,将相机- IMU标定纳入非线性优化中。由于非线性优化中的大量参数与线性初始化中的参数具有相同的物理意义,这里我们通过重用符号来表示状态向量( X )、雅克比矩阵( H、F、G)、协方差矩阵( P , Q)和信息矩阵( A ),从而引入了符号的轻微滥用。

全状态的定义类似于线性情况,除了全6 - DOF相机- IMU变换包含在状态向量中。同样将重力矢量替换为四元数,对IMU平动和转动(转置再次被忽略)进行联合优化,我们最小化所有测量残差的马氏范数之和以获得最大后验估计。

我们使用误差状态表示法[ 6 ]将非线性系统( 23 )线性化,并使用具有Huber范数的Gauss - Newton算法[ 30 ]求解,以实现鲁棒的异常值剔除。位置、速度和特征深度等线性分量的残差可以很容易地定义为最新状态估计的补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音小店想要快速出单,必须做好这两点,这也是做店的两大核心。

大家好,我是电商糖果 很多刚开店的新手商家,都会发现店铺运营并没有网上说的这么简单。 店铺开好之后,是不会自己爆单的。 但是会有很多人说,为什么别人的店铺就可以很快的出单,然后爆单呢? 那些开电商…

安装svn网络有问题怎么办?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

2024最新Nessus 免费安装 附详细安装教程

免责声明 请勿利用文章内的相关技术从事非法测试。由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,请遵守网络安全法律。本次仅用于测试,请完成测试后24小时之…

Reactjs常用组件

1 react 1.1 useState 让函数组件具有维持状态的能力 const[count, setCount]useState(0); 1.2 useEffect 执行副作用,useEffect 的第二个参数告诉 React 用到了哪些外部变量 类似于Vue watch的作用 useEffect(fn, deps); 1.每次 render 后执行:不…

从零入门区块链和比特币(第二期)

欢迎来到我的区块链与比特币入门指南!如果你对区块链和比特币感兴趣,但不知道从何开始,那么你来对地方了。本博客将为你提供一个简明扼要的介绍,帮助你了解这个领域的基础知识,并引导你进一步探索这个激动人心的领域。…

4.25 作业

#1、创建g1组,要求创建一个属于redhat用户g1组的文件redhat.txt [rootlocalhost ~]# groupadd g1 [rootlocalhost ~]# touch /root/redhat.txt [rootlocalhost ~]# ll /root/redhat.txt -rw-r--r--. 1 root root 0 4月 26 20:19 /root/redhat.txt [rootlocalhost ~…

不对称催化(三)- 动态动力学拆分动态动力学不对称转化

一、动力学拆分的基本概念: 动力学拆分的最大理论产率为50%,通过的差异可以将两个对映异构体转化为不同构型的产物,通常情况下使用两个不同反应路径来实现。但是化学家们提供了一个更加实用的方法,通过底物的构型变化实现高于50%的…

3.1设计模式——Chain of Responsibility 责任链模式(行为型)

意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象练成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 实现 其中 Handle定义一个处理请求的接口:(可选…

【Linux】如何进行用户之间的切换——指令su

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

上网行为管理软件有哪些(5大好用的上网行为监控软件盘点)

企业对于员工工作效率和网络安全的关注度不断提升,上网行为管理软件成为了许多企业的必备工具。这些软件能够实时监控员工的网络活动,帮助企业提高生产力、防止数据泄露,并维护良好的网络环境。 本文将介绍五款大受欢迎的上网行为监控软件&am…

LabVIEW轴承表面缺陷检测系统

LabVIEW轴承表面缺陷检测系统 为了解决轴承生产中人工检测效率低下、误检率高的问题,实现了一套基于LabVIEW的轴承表面缺陷自动检测系统。该系统利用工业相机采集轴承图像,通过图像处理技术对轴承表面的划痕缺陷和倒角缺陷进行自动识别和分析&#xff0…

Pytorch重点概念笔记:都是本人学习中真实遇到的(一)

1.torch.squeeze的原理参数和使用方法 torch.squeeze 是PyTorch中的一个函数,用于减少张量的维数,具体来说,它会移除所有维数为1的维度。这个操作通常用于处理那些在特定操作(如卷积或池化)后可能产生不必要的单维度张量。 原理: 在某些情况下,张量操作会生成形状中包…

CPP语法(六)——函数模板

CPP语法 六—函数模板 一、 模板1.1 函数模板1.2 重载函数模板1.3 类模板1.3.1 简单类模板1.3.2 默认模板参数1.3.3 为具体类型的参数提供默认值1.3.4 有界数组模板 1.4 模板的使用1.4.1 定制模板类1.4.2 定制类模板成员函数 一、 模板 模板是c的高级特性,分为函数…

【详细实现】v1.0 随机点名应用

1.引言 前面对这个应用的功能做了详细的分析(长什么样、能干什么),以先这样对一个项目最开始的分析成为需求分析,需求分析之后就是设计阶段。 那么一般的项目,在设计阶段都需要干什么呢?在需求分析阶段确定…

Spring Cloud Eureka面试题

Spring Cloud Eureka面试题 1. Eureka基础概念1.1 什么是Eureka?1.2 Eureka的组件和架构有哪些元素组成?1.3 Eureka Server和Eureka Client有什么区别?1.4 如何描述Eureka的自我保护机制? 2. 服务注册与发现2.1 如何将服务注册到E…

[C++][算法基础]数字三角形(动态规划)

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 73 88 1 02 7 4 4 4 5 2 6 …

c++ 智能指针 交换函数实验

1.概要 c 智能指针 交换函数实验 交换后&#xff0c;两个指针管理的目标对象会发生交换 sh_ptr1.swap(sh_ptr2); 2.代码 #include <iostream> using namespace std;int main() {shared_ptr<int> sh_ptr1 std::make_shared<int>(5);shared_ptr<int>…

【c++基础】求细胞数量

说明 一矩形阵列由数字 0 到 9 组成&#xff0c;数字 1 到 99 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞&#xff0c;求给定矩形阵列的细胞个数。 输入数据 第一行两个整数代表矩阵大小 n 和 m。 接下来 n 行&#xff0c;每行一个长度…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时&#xff0c;这两个资源都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&…

华为 obs相关

obd配置 hw-obs:endpoint: ak: sk: bucketname:获取桶列表 public class HwObsController {Value("${hw-obs.ak}")private String hwObsAk;Value("${hw-obs.sk}")private String hwObsSk;Value("${hw-obs.endPoint}")private String hwObsEndp…