【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记
0. 内容

1. 时间戳同步问题及意义
时间戳同步的原因:如果不同步,由于IMU频率高,可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据,且时间不同步会导致我们首尾camera和IMU数据时间不同,会使估计存在误差,使我们的系统精度下降甚至出现错误的预测。如果以IMU时间为准确的,同步之后,我们可以用时间戳偏移对系统估计的 T w b T_{wb} Twb进行补偿(思路1),或者能够得到与首尾IMU时间相同的时间对应的两帧camera的观测(思路2),提升系统精度。
时间戳同步有两种方式:硬同步和软同步。

- 硬同步即硬件同步:即IMU(或其他传感器)产生数据的同时给一个信号,可用于出发MCU中断,然后触发camera曝光,使camera输出图像的时间戳本身就和IMU同步,从而实现硬件同步。
- 软同步即软件同步:在软件上对收到的IMU和camera数据进行运算,解算出时间戳。具体来说,camera和IMU从产生到到达MCU是需要时间的,这段时间分别叫 t d c a m t_d^{cam} tdcam和 t d i m u t_d^{imu} tdimu,产生时间分别加上这个时延就的到了MCU采样的时间戳,二者相减就是真正的时间戳,这里我们只需要这个时间戳的相对量,所以我们可以假设IMU是准确的, t d i m u − t d c a m t_d^{imu}-t_d^{cam} tdimu−tdcam就是我们MCU所知的时间戳偏移 t d t_d td。

1.1 思路1:补偿camera pose的估计(轨迹匀速模型)
位姿补偿公式思路:假设相机在两帧间是匀速运动。VIO输出的是系统在world系下的pose,即 T w b T_{wb} Twb,我们需要补偿的是 T w c T_{wc} Twc,于是就结合VIO输出的角速度,速度反向推到cam时刻(补偿了 t d t_d td之后的时刻),然后再用外参 T b c T_{bc} Tbc转到cam系下即可:

在VIO残差中进行补偿:


- 同样,我们VIO输出的是 T w b T_{wb} Twb所以我们要先将landmark转换到body,再转换到camera系:
- 这里实际上是在归一化平面,并没在像素平面(重投影误差的uv实际上是归一化平面的坐标,通过特征提取或者光流匹配而得),忽略了相机内参。
将式(3)带入可的式(8)
重投影误差对时间戳延时 t d t_d td的Javobian:

式(9)推导,只看中间最复杂的部分, e x p ( ω b i t d + ω b i δ t d ) exp(\omega_{b_i}t_d+\omega_{b_i}\delta t_d) exp(ωbitd+ωbiδtd),这里好理解点的话实际上角速度 ω t \omega t ωt可以写成 ( ω t ) ∧ (\omega t)^{\wedge} (ωt)∧,因为 ω t \omega t ωt可以代表一个三维的旋转矩阵,按照旋转的表达方式是轴角表示,即 旋转角度*旋转轴,可以看之前的一篇知乎

所以上述部分可以表示成 e x p [ ( ω b i t d + ω b i δ t d ) ∧ ] exp[(\omega_{b_i}t_d+\omega_{b_i}\delta t_d)^\wedge] exp[(ωbitd+ωbiδtd)∧],这只是便于理解,正常还是按照 ω t \omega t ωt表示,不加反对称符号。
所以,用到两个公式:
- 按照BCH公式的SO3版本:

- 还有 e x e^x ex的无穷级数展开(跟太了展开差个无穷小), e x = 1 + x + x 2 2 ! + x 3 3 ! + … e^x=1+x+\frac{x_2}{2!}+\frac{x_3}{3!}+\ldots ex=1+x+2!x2+3!x3+…,下面因为 ω b i δ t d \omega_{b_i}\delta t_d ωbiδtd较小,所以二阶以上直接忽略
所以
e x p ( ω b i t d + ω b i δ t d ) = e x p ( ω b i t d ) ∗ e x p { [ J r ( ω b i t d ) ω b i δ t d ] ∧ } = e x p ( ω b i t d ) ∗ { I + [ J r ( ω t d ) ω δ t d ] ∧ } \begin{align*}\ exp(\omega_{b_i}t_d+\omega_{b_i}\delta t_d) &=exp(\omega_{b_i}t_d) * exp\{[J_r(\omega_{b_i}t_d)\omega_{b_i}\delta t_d]^\wedge\}\\ &=exp(\omega_{b_i}t_d) * \{I + [J_r(\omega t_d)\omega \delta t_d]^\wedge \}\\ \end{align*} exp(ωbitd+ωbiδtd)=exp(ωbitd)∗exp{[Jr(ωbitd)ωbiδtd]∧}=exp(ωbitd)∗{I+[Jr(ωtd)ωδtd]∧}
将上式带入式(9)就得BCH近似后的结果,因为是求关于时间戳 t d t_d td的Jacobian,所以将与 δ t d \delta t_d δtd有关的都拎出来,剩下的直接扔掉,就得到完整的式(9)。
由于补偿camera pose的估计改变了姿态,所以Jacobian的求取有些复杂,QinTong(2018,在待读文献2中)有一个想法是直接补偿我们特征点的测量值,计算出补偿值,应用于真实观测值上得到一个虚拟的观测值。
1.2 思路2:补偿观测值坐标(特征匀速模型)

具体思路是:根据特征匹配可以知道特征点uv的变化量,假设特征点是匀速运动,可以算出特征点的速度,知道了时间戳偏移 t d t_d td之后即可求出补偿后的虚拟的观测值坐标。

补偿观测值坐标由于只改变了观测的坐标,所以求Jacobian较简单,看(13)中与 t d t_d td有关的只有 − u , − v -u,-v −u,−v,所以求导就是 − V -V −V
QinTong的paper论文实验结果和结论:
- 时间戳补偿算法有用;
- 时间戳延迟越大,系统精度下降越多。

1.3 两种方法对比
- 特征匀速模型的假设更强,是假设特征是匀速运动的,而实际上是非线性运动,并非匀速,且补偿方法也是线性的。
- 而轨迹匀速模型的假设更接近实际,假设两帧间camera是匀速运动,补偿方法也是非线性的,所以精度比前者高。

实际中对时间戳偏差估计的收敛速度,轨迹匀速法更快。
2. 疑惑
这个是先采集一段数据先标定出来IMU和Camera的时间戳,然后按照上面的任意一种方法补偿到系统中,还是说边估计边补偿?
看了些论文的标题,应该是先标定出来的,后面看了论文再来填这个坑。
3. 时间戳同步算法扩展

前面有系统初始化完成之后来估计 t d t_d td的,当系统初始化没有完成时 t d t_d td如何估计呢?
可以通过VO/SFM求出KF pose,利用 T b c T_{bc} Tbc外参转到body系下,求出i,j时刻的相对位姿,跟IMU预计分量对比构建误差,多时刻观测量可进行BA,优化出时间戳(也可优化出gyro bias,速度等,但是优化的量多了之后,优化精度可能会下降)

4. 总结
本章主要讨论了在VIO系统中对camera和IMU时间戳进行对齐的问题,着重讨论了将Camera对齐IMU的两种方法:轨迹匀速模型和特征匀速模型。并对其他的VI时间戳同步算法进行了扩展。
- 针对轨迹匀速模型和特征匀速模型:
- 前者假设两个KF间的camera之间是匀速运动,估计出时间戳延时 t d t_d td之后,将其补偿在估计的camera位姿上,该方法对VIO数据的pose进行了改动,对于系统Jacobian的改动较大,但假设相对后者较弱,精度比后者高。
- 后者假设两帧KF间的特征点是匀速运动,估计出 t d t_d td后,将其补偿在特征点的观测上,计算出补偿之后的观测,该方法对Jacobian改动较小,而且为线性改动,但缺点也较为明显,因为该方法假设较强(特征较难满足匀速运动),所以精度比前者低,时间戳收敛速度比前者慢,但代码改动小,计算速度简单。
- 另外对时间戳同步算法进行了扩展:
- 待读4改为对IMU进行时间戳补偿,精度更高;
- 待读5用camera的pose计算出traj,进而得出 ω , a \omega, a ω,a,与IMU的进行align得出 t d t_d td(这个不清楚,需要读原文)
- 待读6(提出Kalibr,行业标杆)使用标定板出一段camera pose,再使用B样条(B Spline)进行拟合,一阶,二阶导可以得出 ω , a \omega, a ω,a,和IMU数据进行align,优化出时间戳,不过使用的是autodiff 数值Jacobian。
- 待读7推导出6的解析李群Jacobian。
5. 作业

6. 待读文献
1. 北大的,提出轨迹匀速模型
Weibo Huang, Hong Liu, and Weiwei Wan. “Online initialization and extrinsic spatial-temporal calibration for monocular visual-inertial odometry”. In: arXiv preprint arXiv:2004.05534 (2020).
2. QinTong提出特征匀速模型
Tong Qin and Shaojie Shen. “Online temporal calibration for monocular visual-inertial systems”. In: RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE. 2018, pp. 3662–3669.
3. PTAM的特征匀速模型思路
Georg Klein and David Murray. “Parallel tracking and mapping on a camera phone”. In: 2009 8th IEEE International Symposium on Mixed and Augmented Reality. IEEE. 2009, pp. 83–86.
这篇是2009年的PTAM,里面的思想上面QinTong这篇一样。
4. 认为camera是准的,补偿IMU时间戳
Yonggen Ling et al. “Modeling varying camera-imu time offset in optimization-based visual-inertial odometry”. In: Proceedings of the European Conference on Computer Vision (ECCV). 2018, pp. 484–500.
这篇相对于第1节的算法,假设更弱,虽然轨迹匀速是假设camera见是匀速运动,但是如果是Slinding Window中的KF相隔时间久,可能存在较大时间差,匀速假设不易成立。
这篇改为补偿IMU,由于IMU频率高,数据之间的匀速假设更接近真实值,所以精度会更高,但是每次估计出新的时间戳都需要重新进行IMU预先积分,导致计算量增大。(没看过原文,IMU预积分不能找出来和时间戳的关系吗,这样就不用每次重新计算了)。
5. 用camera估出来的 ω , a \omega,a ω,a和IMU测量值进行align,得到时间戳偏移
Janne Mustaniemi et al. “Inertial-based scale estimation for structure from motion on mobile devices”. In: 2017 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE. 2017, pp. 4394–4401.
6. ETH大组,Kalibr论文(行业标杆,必读)
Paul Furgale, Joern Rehder, and Roland Siegwart. “Unified temporal and spatial calibration for multi-sensor systems”. In: 2013 IEEE/RSJ International Conference on Intelligent Robots and Systems. IEEE. 2013, pp. 1280–1286.
Roland Siegwart好象是组的负责人。
使用标定板出一段camera pose,再使用B样条(B Spline)进行拟合,一阶,二阶导可以得出 ω , a \omega, a ω,a,和IMU数据进行align,优化出时间戳。但是解析解太复杂,这篇论文使用的autodiff数值Jacobian
7. 推导出解析Jacobian(DSO那个组,公式较多)
Christiane Sommer et al. “Efficient derivative computation for cumulative B-splines on Lie groups”. In: Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020, pp. 11148–11156.
丹尼尔 crimse这个组
相关文章:
【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记
0. 内容 1. 时间戳同步问题及意义 时间戳同步的原因:如果不同步,由于IMU频率高,可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据,且时间不同步会导致我们首尾camera和IMU数据时间不同,…...
【Java集合类面试二十一】、请介绍TreeMap的底层原理
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:请介绍TreeMap的底层原理…...
Go语言Channel
在本教程中,我们将讨论Channel以及 Goroutines 如何使用Channel进行通信。 什么是Channel Channel可以被认为是 Goroutine 用来进行通信的管道。与水在管道中从一端流向另一端的方式类似,可以使用Channel从一端发送数据并从另一端接收数据。 声明Chan…...
java 编译 引用 jar 包进行编译和执行编译后的class文件
编译java文件 javac -encoding UTF-8 -Djava.ext.dirs./ -d . ./FtpTest.java 执行编译class文件 java -Djava.ext.dirs./ com.util.FtpTest com.util为包路径...
Linux系统之部署Tale个人博客系统
Linux系统之部署Tale个人博客系统 一、Tale介绍1.1 Tale简介1.2 Tale特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、部署Tale个人博客系统4.1 下载Tale源码4.2 查看Tale源码目录4.3 查看安装脚本内…...
【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
算法通关村|黄金挑战|K个一组进行反转
K个一组进行反转 1.头插法 public ListNode reverseKGroup(ListNode head, int k) {ListNode dummyNode new ListNode(0);dummyNode.next head;ListNode cur head;// 计算链表长度int len 0;while (cur ! null) {len;cur cur.next;}// 计算有几组int n len / k;ListNod…...
【Android Studio】工程中文件Annotate with Git Blame 不能点击
问题描述 工程文件中想要查看代码提交信息但是相关按钮不可点击 解决方法 Android Studio -> Preferences -> Version Control-> 在Unregistered roots里找到你想要的工程文件 点击左上角➕号 然后右下角Apply即可...
Ant Design Vue
2222222222222...
ATA-P2010压电叠堆功率放大器-直流偏置对压电叠堆测试的重要性
随着科技的发展和应用领域的扩展,压电技术在许多领域中得到了广泛的应用。在压电器件的研究和开发过程中,压电叠堆测试是非常重要的一环。本文通过对功率放大器的直流偏置功能在压电叠堆测试中的应用进行了深入研究,探讨了功率放大器直流偏置…...
短视频矩阵系统搭建/源头----源码
一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统,目前是全国源头独立开发),开发功能大拆解分享,功能大拆解: 7大模型剪辑法(数学阶乘ÿ…...
基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用
零、参考资料 1、https://github.com/cefsharp/CefSharp/wiki/Quick-Start-For-MS-.Net-5.0-or-greater 2、https://github.com/cefsharp/CefSharp/wiki/Quick-Start 3、https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration 一、安装 Nuget 包…...
qt中怎么在鼠标停留的位置上显示该点的坐标位置
需要重写控件的mouseMoveEvent方法。 1、自定义一个QLabel控件,然后重写QLabel的mouseMoveEvent customlabel.h#include <QWidget> #include <QHBoxLayout> #include <QLabel>class CustomLabel : public QLabel {Q_OBJECT public:explicit Cus…...
两个list中实体某个属性值相同的实体和不同的实体
说明 有两个list,分别是newList 和 oldList,快速取出两个 newList 中某个属性值相同的实体和不同的实体 代码 import lombok.Data; import lombok.ToString;import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.str…...
Linux下利用Docker快速部署Kafka
1.摘要 在本文中,介绍了利用Docker安装Kafka的基础环境要求; 利用Docker安装zookeeper过程; 利用Docker安装Kafka过程;进入容器配置生产者和消费者过程; 演示生产者和消费者通讯; 故障排查方法。 2.基础环境准备 提前准备一台安装Linux系统的主机或虚拟机,我这里安装的是Ubu…...
竞赛 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类
文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...
jvm摘要
第 2 章 Java 内存区域与内存溢出异常 2.2 运行时数据区域 程序计数器-线程私有:是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 程序计数器是唯一一个没有规定任何OutOfMemoryError 情况的区域。 Java 虚拟机栈-线程私有:用于执行Java …...
GZ035 5G组网与运维赛题第1套
2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第1套 赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子任务2:5G室内与室外站点建设(20分) 竞赛模块2--5G公共网络运维与优化(3…...
MySQL数据xtrabackup物理备份方法
目录 一、物理备份的方式二、xtrabackup物理备份1.安装xtrabackup2.完整备份/恢复流程3.增量备份流程4.差异备份流程5.物理备份总结 一、物理备份的方式 1.完整备份 每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的…...
vue3 使用 elementUi: ./lib/theme-chalk/index.css is not exported from package
目录 1. 在 vue3 中使用 element-ui2. 如果启动报错:Module not found: Error: Package path ./lib/theme-chalk/index.css is not exported from package 1. 在 vue3 中使用 element-ui 在 vue3 中使用 element-ui,我们的流程一般是这样的:…...
2024 0xGame Web安全挑战:从SQLite注入到RCE实战解析
1. SQLite注入基础与实战技巧 SQLite作为轻量级数据库,在CTF题目中经常出现。与MySQL注入相比,SQLite少了information_schema等常用表,但核心注入逻辑相通。以2024 0xGame的ez_sql题为例,我们来看具体操作: 闭合方式差…...
Win11Debloat系统优化工具:从问题诊断到长效维护的完整实践指南
Win11Debloat系统优化工具:从问题诊断到长效维护的完整实践指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改…...
毕业设计模板:新手入门级全栈项目结构与避坑指南
很多同学在做毕业设计时,常常会遇到这样的场景:项目初期雄心勃勃,但写着写着就发现代码越来越乱,前后端耦合在一起,想加个新功能都无从下手,最后只能硬着头皮交一个“能跑就行”的“缝合怪”项目。今天&…...
pyNastran:破解工程仿真困境的Python技术革新者
pyNastran:破解工程仿真困境的Python技术革新者 【免费下载链接】pyNastran A Python-based interface tool for Nastrans file formats 项目地址: https://gitcode.com/gh_mirrors/py/pyNastran 揭示行业痛点:有限元分析的三大核心挑战 现代工程…...
深入解析WIFI中EAP-TLS认证流程与安全机制
1. EAP-TLS认证:WIFI安全连接的基石 每次我们用手机连接公司或学校的WIFI时,系统总会弹出一个证书确认的窗口,这就是EAP-TLS在发挥作用。作为目前最安全的WIFI认证协议之一,它就像网络世界的"护照查验系统",…...
如何安全备份QQ空间历史说说?GetQzonehistory工具全攻略
如何安全备份QQ空间历史说说?GetQzonehistory工具全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心过QQ空间里那些承载着青春记忆的说说有一天会突然消失&…...
第10章 RTOS 感知调试(OpenOCD)
第10章 RTOS 感知调试 导读:在嵌入式开发中,RTOS(实时操作系统)的使用非常普遍。然而当多个线程并发执行时,传统的单线程调试方式无法感知任务切换和线程上下文,给问题定位带来极大困难。OpenOCD 内置了对十余种主流 RTOS 的线程感知调试支持,能够在暂停目标时自动识别所…...
基于ATP的10kV并联电容暂态过程仿真
基于ATP的10kV并联电容暂态过程仿真在电力系统中,10kV并联电容装置起着至关重要的作用,比如提高功率因数、改善电压质量等。然而,其暂态过程却较为复杂,需要深入研究。ATP(Alternative Transients Program)…...
Win10下Office16宏编辑器崩溃?3种修复VBE6EXT.OLB加载失败的实战方法
Win10下Office16宏编辑器崩溃?3种修复VBE6EXT.OLB加载失败的实战方法 每次打开VB编辑器就遭遇内存溢出弹窗,这种体验就像被卡在无限循环的代码里——明明只是想在Excel里跑个简单宏,却要面对满屏的"VBE6EXT.OLB加载失败"警告。作为…...
从‘它好慢’到‘真香’:Vite + Vue 3项目实战中那些让你开发效率翻倍的配置技巧
从‘它好慢’到‘真香’:Vite Vue 3项目实战中那些让你开发效率翻倍的配置技巧 如果你正在使用Vite和Vue 3进行开发,却总觉得构建速度不够快、开发体验不够流畅,或者在某些特定功能配置上卡壳,那么这篇文章就是为你准备的。我们将…...
