目录

  • 一、VIO文献阅读
  • 二、四元数和李代数更新
  • 三、其他导数
  • 参考

一、VIO文献阅读

阅读VIO 相关综述文献,回答以下问题:

1、视觉与IMU进行融合之后有何优势?
IMU:(Inertial Measurement Unit),惯性测量单元

典型6轴 IMU 以较高频率(≥100Hz\ge 100Hz≥100Hz)返回被测量物体的角速度与加速度
短时间内,IMU的精度很高
受自身温度、零偏、振动等因素干扰,积分得到的平移和旋转容易漂移

视觉:(Visual Odometry)

以图像形式记录数据,频率较低(15−60Hz15-60Hz15−60Hz 居多)
通过图像特征点或像素推断相机运动
如果遇到白墙,或者纯色的一些特殊场景,基本上无法提取特征

二者优势互补

可以借助IMU较高的采样频率,进而提高系统的输出频率。
可以提高视觉的鲁棒性,如视觉SLAM因为某些运动或场景出现的错误结果。
可以有效的消除IMU的积分漂移。
能够校正IMU的Bias。
单目与IMU的融合可以有效解决单目尺度不可观测的问题。
可以应对快速的运动变化,相机在快速运动过程中会出现运动模糊。

2、有哪些常见的视觉+IMU 融合方案?有没有工业界应用的例子?

常见的融合方案:

VINS (单目+IMU、双目+IMU)
OKVIS (单目+IMU、双目+IMU)
ROVIO (单目+IMU)
RKSLAM(单目+IMU)
ORB-SLAM3(双目+IMU)

工业界应用

AR/VR,自动驾驶,无人机,手机、无人机拍照防抖;
比如可以使用手机进行AR换鞋(京东淘宝上有些店铺是支持AR试鞋的)。
以硬件为主打的XR头盔设备,目前在工业领域都一些落地的场景,如西门子的AR头盔的工业展示,飞机驾驶员的培训。

3、在学术界,VIO 研究有哪些新进展?有没有将学习方法用到VIO中的例子?

​ 目前VIO和其他传感器的融合也是一个比较受欢迎的研究热点,比如VIO和激光雷达的融合,和GPS的融合。

2019, RAL, Visual-Inertial Localization with Prior LiDAR Map Constraints --视觉 VIO 和激光地图。
2018, arxiv, A General Optimization-based Framework for Global Pose Estimation with Multiple Sensors --VINS-Mono 的扩展版,能融合 GPS、单目、双目等信息。
2017, ICRA, Vins on wheels --系统分析了 VIO + 轮速计系统的可观性。
2019, ICRA, Visual-Odometric Localization and Mapping for Ground Vehicles Using SE(2)-XYZ Constraints --SE2-XYZ 的模型来对地 面轮速机器人进行参数化。

VIO+深度学习

VINet : Visual-inertial odometry as a sequence-to-sequence learning problem.就整体而言,VINet是首次使用DL的框架来解决VIO问题,目前所披露的实验表现出了一定的实用价值。
Unsupervised Deep Visual-Inertial Odometry with Online Error Correction for RGB-D Imagery.此方法可以在没有Camera-IMU外参的情况下基于学习进行VIO网络学习整合IMU测量并生成估计轨迹,然后根据相对于像素坐标的空间网格的缩放图像投影误差的雅可比行列式在线校正。

参考知乎:一些基于深度学习的视觉里程计/SLAM开源代码
深度学习SLAM :最新的基于深度学习的deepvo,VINet,大家怎样评价?

二、四元数和李代数更新

课件提到了可以使用四元数或旋转矩阵存储旋转变量。当我们用计算出来的ω\omegaω对某旋转更新时,有两种不同方式:
R⟵Rexp(ω∧)R \longleftarrow Rexp(\omega^\wedge)R⟵Rexp(ω∧)
或q⟵q[1,12ω∧]q \longleftarrow q[1, \frac{1}{2}\omega^{\wedge}]q⟵q[1,21​ω∧]

请编程验证对于小量ω=[0.01,0.02,0.03]T\omega = [0.01, 0.02, 0.03]^Tω=[0.01,0.02,0.03]T,两种方法得到的结果非常接近,实践当中可视为等同。因此,在后文提到旋转时,我们并不刻意区分旋转本身是q 还是R,也不区分其更新方式为上式的哪一种。

参照《VSLAM14讲》p48和p87页代码中对于eigen库和sophus库的使用。

以(1,2,3)为转轴, 角度45度

//
// Created by daybeha on 2022/2/11.
//#include <iostream>
#include <Eigen/Core>
#include "sophus/se3.hpp"using namespace std;
using namespace Eigen;int main(){// 注意第二个参数是转轴,需要归一化Matrix3d R = AngleAxisd(M_PI/4, Vector3d(1, 2, 3).normalized()).toRotationMatrix();Quaterniond q(R);
//    Sophus::SO3d SO3_R(R);      两种构造方式Sophus::SO3d SO3_R(R);cout << "\nmatrix from SO(3):\n" << SO3_R.matrix()<< endl;cout << "matrix from Quaternion:\n" << q.matrix() << endl;/// 增量扰动模型的更新// SO3更新Vector3d w(0.01, 0.02, 0.03);Sophus::SO3d SO3_updated = SO3_R * Sophus::SO3d::exp(w);cout << "\nSO3 updated = \n" << SO3_updated.matrix() <<endl;// 四元数更新Quaterniond q_updated = q * Quaterniond(1, w[0]/2, w[1]/2, w[2]/2).normalized();cout << "q updated = \n" << q_updated.matrix() << endl;// 衡量两种方法之间的差距cout<<"disparity = "<< endl <<SO3_updated.matrix().inverse()*q_updated.toRotationMatrix()<<endl;return 0;
}

运行结果

可以看到,两种不同方式得到的更新结果差别很小,但不是没有……

三、其他导数

使用右乘so(3)\mathfrak{so}(3)so(3),推导以下导数:
dR−1pdR\frac{dR^{-1}p}{dR}dRdR−1p​
答:

设扰动△R\bigtriangleup R△R对应的李代数为φ\varphiφ, 则有右扰动:
∂R−1p∂R=∂(Rexp(φ∧))−1p−R−1p∂φ=∂(exp(φ∧)−1R−1p−R−1p∂φ=∂(exp(−φ∧)R−1p−R−1p∂φ(泰勒展开)≈lim⁡φ→0(I−φ∧)R−1p−R−1pφ=lim⁡φ→0−φ∧R−1pφ=lim⁡φ→0(R−1p)∧φφ=−(R−1p)∧\begin{aligned} \frac{\partial R^{-1}p}{\partial R} & = \frac{\partial (Rexp(\varphi ^\wedge ))^{-1}p - R^{-1}p}{\partial \varphi } \\ & = \frac{\partial (exp(\varphi ^\wedge )^{-1}R^{-1}p - R^{-1}p}{\partial \varphi } \\ & = \frac{\partial (exp(-\varphi ^\wedge )R^{-1}p - R^{-1}p}{\partial \varphi } \\ (泰勒展开)& \approx \lim_{\varphi \to 0}\frac{(I - \varphi ^\wedge )R^{-1}p - R^{-1}p}{\varphi } \\ & = \lim_{\varphi \to 0}\frac{ -\varphi ^\wedge R^{-1}p}{\varphi }\\ & = \lim_{\varphi \to 0}\frac{(R^{-1}p)^\wedge \varphi }{\varphi } \\ & = -(R^{-1}p)^\wedge \end{aligned} ∂R∂R−1p​(泰勒展开)​=∂φ∂(Rexp(φ∧))−1p−R−1p​=∂φ∂(exp(φ∧)−1R−1p−R−1p​=∂φ∂(exp(−φ∧)R−1p−R−1p​≈φ→0lim​φ(I−φ∧)R−1p−R−1p​=φ→0lim​φ−φ∧R−1p​=φ→0lim​φ(R−1p)∧φ​=−(R−1p)∧​

dln(R1R2−1)dR2\frac{dln(R_1 R_2^{-1})}{dR_2}dR2​dln(R1​R2−1​)​
答:

由BCH的线性表达
ln(exp(ϕ1∧)exp(ϕ2∧))∨≈{Jl(ϕ2)−1ϕ1+ϕ2,当ϕ1为小量Jr(ϕ1)−1ϕ2+ϕ1,当ϕ2为小量\begin{aligned} ln(exp(\phi_1^{\wedge}) exp(\phi_2^{\wedge}))^\vee \approx \begin{cases} J_l(\phi_2)^{-1} \phi_1 + \phi_2, 当\phi_1为小量\\ J_r(\phi_1)^{-1} \phi_2 + \phi_1, 当\phi_2为小量 \end{cases} \end{aligned} ln(exp(ϕ1∧​)exp(ϕ2∧​))∨≈{Jl​(ϕ2​)−1ϕ1​+ϕ2​,当ϕ1​为小量Jr​(ϕ1​)−1ϕ2​+ϕ1​,当ϕ2​为小量​​

其中

ϕ=θa,a为单位向量\phi = \theta a, a为单位向量ϕ=θa,a为单位向量
Jl=JVSLAMP80=sinθθI+(1−sinθθ)aaT+1−cosθθa∧J_l = J_{VSLAM_P80} = \frac{sin\theta }{\theta }I + (1 - \frac{sin\theta }{\theta }) aa^T + \frac{1-cos\theta }{\theta }a^\wedgeJl​=JVSLAMP​80​=θsinθ​I+(1−θsinθ​)aaT+θ1−cosθ​a∧
Jl−1=θ2cotθ2I+(1−θ2cotθ2)aaT−θ2a∧J_l^{-1} = \frac{\theta }{2}cot\frac{\theta }{2}I + (1- \frac{\theta }{2}cot\frac{\theta }{2})aa^T - \frac{\theta }{2}a^\wedgeJl−1​=2θ​cot2θ​I+(1−2θ​cot2θ​)aaT−2θ​a∧
Jr(ϕ)=Jl(−ϕ)J_r(\phi ) = J_l(- \phi)Jr​(ϕ)=Jl​(−ϕ)
Jr(ϕ)−1=Jl(−ϕ)−1=θ2cotθ2I+(1−θ2cotθ2)aaT+θ2a∧J_r(\phi )^{-1} = J_l(- \phi)^{-1}=\frac{\theta }{2}cot\frac{\theta }{2}I + (1- \frac{\theta }{2}cot\frac{\theta }{2})aa^T + \frac{\theta }{2}a^\wedgeJr​(ϕ)−1=Jl​(−ϕ)−1=2θ​cot2θ​I+(1−2θ​cot2θ​)aaT+2θ​a∧

另外还用到so(3)so(3)so(3)的伴随性质:

Rexp(p∧)RT=exp((Rp)∧)(1)Rexp(p^\wedge)R^T = exp((Rp)^\wedge) \tag{1}Rexp(p∧)RT=exp((Rp)∧)(1)


同样设扰动△R1\bigtriangleup R1△R1对应的李代数为φ\varphiφ, 则有右扰动
∂ln(R1R2−1)∨∂R2=lim⁡φ→0ln(R1(R2exp(φ∧))−1)∨−ln(R1R2−1)∨φ=lim⁡φ→0ln(R1exp(φ∧)−1R2−1)∨−ln(R1R2−1)∨φ=lim⁡φ→0ln(R1R2−1R2exp(φ∧)−1R2−1)∨−ln(R1R2−1)∨φ=lim⁡φ→0ln(R1R2−1R2exp(−φ∧)R2T)∨−ln(R1R2−1)∨φ公式(1)=lim⁡φ→0ln(R1R2−1exp((−R2φ)∧))∨−ln(R1R2−1)∨φ(BCH)≈lim⁡φ→0Jr(ln(R1R2−1)∨)−1(−R2φ)+ln(R1R2−1)∨−ln(R1R2−1)∨φ=lim⁡φ→0−Jr(ln(R1R2−1)∨)−1R2φφ=−Jr(ln(R1R2−1)∨)−1R2\begin{aligned} \frac{\partial ln(R_1 R_2^{-1})^\vee }{\partial R_2} & = \lim_{\varphi \to 0}\frac{ ln(R_1 (R_2exp(\varphi ^\wedge ))^{-1})^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ & = \lim_{\varphi \to 0}\frac{ ln(R_1 exp(\varphi ^\wedge)^{-1}R_2^{-1})^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ & = \lim_{\varphi \to 0}\frac{ ln(R_1 R_2^{-1}R_2exp(\varphi ^\wedge)^{-1}R_2^{-1})^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ & = \lim_{\varphi \to 0}\frac{ ln(R_1 R_2^{-1}R_2exp(-\varphi ^\wedge)R_2^{T})^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ 公式(1)& = \lim_{\varphi \to 0}\frac{ ln(R_1 R_2^{-1}exp((-R_2 \varphi)^\wedge))^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ (BCH) & \approx \lim_{\varphi \to 0}\frac{J_r(ln(R_1 R_2^{-1})^ \vee)^{-1}(-R_2 \varphi) + ln(R_1 R_2^{-1})^ \vee - ln(R_1 R_2^{-1})^ \vee }{\varphi } \\ & = \lim_{\varphi \to 0}\frac{-J_r(ln(R_1 R_2^{-1})^ \vee)^{-1}R_2\varphi}{\varphi } \\ & = -J_r(ln(R_1 R_2^{-1})^ \vee)^{-1} R_2 \end{aligned} ∂R2​∂ln(R1​R2−1​)∨​公式(1)(BCH)​=φ→0lim​φln(R1​(R2​exp(φ∧))−1)∨−ln(R1​R2−1​)∨​=φ→0lim​φln(R1​exp(φ∧)−1R2−1​)∨−ln(R1​R2−1​)∨​=φ→0lim​φln(R1​R2−1​R2​exp(φ∧)−1R2−1​)∨−ln(R1​R2−1​)∨​=φ→0lim​φln(R1​R2−1​R2​exp(−φ∧)R2T​)∨−ln(R1​R2−1​)∨​=φ→0lim​φln(R1​R2−1​exp((−R2​φ)∧))∨−ln(R1​R2−1​)∨​≈φ→0lim​φJr​(ln(R1​R2−1​)∨)−1(−R2​φ)+ln(R1​R2−1​)∨−ln(R1​R2−1​)∨​=φ→0lim​φ−Jr​(ln(R1​R2−1​)∨)−1R2​φ​=−Jr​(ln(R1​R2−1​)∨)−1R2​​

笔记 - 关于为什么要用右乘:

过程中很多内容需要在世界坐标系下讨论,因此需要使用TWIT_{WI}TWI​表示IMU位姿;而要使用TWIT_{WI}TWI​,再计算世界坐标时就需要右乘。

参考

深蓝学院-手写VIO作业-第一章
深蓝学院《从零开始手写VIO》作业1
深蓝学院《从零开始手写VIO》作业一
从零手写VIO——(一)Introduction
https://gitee.com/ximing689/vio-learning.git

手写VIO --学习笔记 - Part1相关推荐

  1. 手写VIO --学习笔记 - Part8

    目录 1.基础 2.提升 Estimating Time Offsets using Basis Functions An Example: Camera/IMU Calibration 1.Quan ...

  2. 手写VIO学习总结(二)

    文章目录 1. 作业1 1.1 方法1 2. 作业2 系列笔记: 手写VIO学习总结(一) 1. 作业1 1.1 方法1 1 利用vio_data_simulation-ros_version生成im ...

  3. 页面如何手写文字html,html手写代码学习笔记

    01-01.什么是HTML 整个网页加载时最先执行的代码head,在英文里面是头部的意思. 在英文里面body是身体的意思.整个网页的主体内容. 01-02.什么是属性 举个例子,什么是属性.一辆汽车 ...

  4. 游戏黑客圣经GHB1学习笔记 part1(1-5)

    游戏黑客圣经(Game Hacking Bible1) 我在这里记录我所有课程的学习笔记,包括一些小技巧以及源码,俗话说好记性不如烂笔头,写在这里,用于温故而知新. 前言 学习游戏黑客的必备条件 智力 ...

  5. VIO学习笔记(二)—— IMU 传感器

    学习资料是深蓝学院的<从零开始手写VIO>课程,对课程做一些记录,方便自己以后查询,如有错误还请斧正.由于习惯性心算公式,所以为了加深理解,文章公式采用手写的形式. VIO学习笔记(一)- ...

  6. 深蓝学院《从零开始手写VIO》作业一

    深蓝学院<从零开始手写VIO>作业一 深蓝学院<从零开始手写VIO>作业一 1. VIO文献阅读 1.1 视觉与IMU进行融合之后有何优势? 1.2 有哪些常见的视觉+IMU融 ...

  7. 从零开始手写VIO 第二章 IMU传感器

    第二章 IMU传感器 课程代码: https://github.com/kahowang/Visual_Internal_Odometry/tree/main/%E7%AC%AC%E4%BA%8C%E ...

  8. Qt之手写识别开发笔记:Zinnia介绍、编译、使用以及Demo

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  9. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

最新文章

  1. 服务器市场步步为营:Intel发布新款至强Xeon E5-4600v4四路处理器
  2. python一次性读取整个文件-python – 如何一次读取和附加到文本文件?
  3. 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc
  4. a b*c的C语言表达式为,在C语言的if语句中,用作判断的表达式为 ______
  5. SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...
  6. SAP Spartacus TypeScript和编译后的JavaScript命名规范
  7. Elasticsearch单机安装
  8. easyexcel 工具类_问了个在阿里的同学,他们常用的15款开发者工具!
  9. mysql left join 右表数据不唯一的情况解决方法
  10. 微信小程序选择市,区县
  11. 高数 | 利用定积分定义求极限
  12. Android之利用NanoHttpd搭建服务器
  13. Unity游戏开发背景知识
  14. 制作精美失落美女胶片效果
  15. 之前用Delphi随手写的软键盘SoftKeyBoard
  16. 计算机写给未来自己的一段话,写给未来的自己一句话致未来自己的句子简短励志...
  17. redhat linux rsh设置
  18. 计算机网络教程实验二——静态路由配置实验心得
  19. Eclipse的下载、安装与汉化
  20. 完全背包问题完全背包求具体方案

热门文章

  1. Error running ‘类名’: Command line is too long. Shorten command line for 类名 or also for Application...
  2. 怎么运用网络营销获得精准的客户?
  3. 计算机实现加减乘除 ----- 二进制
  4. Java运行时报错,the selection cannot be launched,and there are no recent launches
  5. Matlab系列之信号调制
  6. struct ifreq storage size of ‘ifr’ isn’t known记录
  7. 开放式耳机哪个品牌音质好?四款音质好的开放式耳机推荐
  8. mtcnn人脸检测python_pytorch实现mtcnn人脸检测算法
  9. PCRT:自动化检测修复损坏PNG文件取证工具
  10. error: commands commence before first target