目的

本文介绍采用Mocap采集VIO数据集的流程以及相关标定处理过程。
参考论文:The TUM VI Benchmark for Evaluating Visual-Inertial Odometry
参考代码:https://gitlab.com/VladyslavUsenko/basalt

简介

VIO数据集包含轨迹真值,可以通过轨迹对齐的方式,求解绝对误差ATE,相对误差APE来评估VIO系统的误差。

轨迹对齐有两种方式:相似变换,手眼标定。

相似变换

通常公开数据集里面的真值已经做了坐标系转换,VIO数据集中的真值轨迹,已经是IMU坐标系的轨迹真值。因此,可以直接采用相似变换进行轨迹对齐。
刚体变换(scale = 1的相似变换)估计的是真值轨迹和VIO轨迹的两个世界坐标系之间的相对位姿Tw2w1=[R,t]T_{w_2}^{w_1} = [R, t]Tw2​w1​​=[R,t], 如下图:
相似变换求解原理(通过两条轨迹的3D位移点来对齐):
palign=s∗R∗p+tp_{align} = s * R * p + t palign​=s∗R∗p+t
其中, palignp_{align}palign​ 与 ppp 分别为两条轨迹的匹配3D点( 匹配关系通过找对应时刻的3D点)。

轨迹对齐之后,可以计算两条轨迹的绝对误差ATE和相对误差APE.

手眼标定

Mocap 采集红外小球构成的刚体(Marker)轨迹,直接和VIO轨迹对齐时,涉及到两个世界坐标系之间的变换Tw2w1T_{w_2}^{w_1}Tw2​w1​​以及Marker与IMU之间的外参TmarkerimuT_{marker}^{imu}Tmarkerimu​。手眼标定通过轨迹的相对姿态,可以求解得到: TimumarkerT^{marker}_{imu}Timumarker​.
如下图所示,可以构建求解等式:
AX=XBAX = XBAX=XB
其中, X 为待求解变量 TimumarkerT^{marker}_{imu}Timumarker​ , A 为VIO轨迹两个点之间的相对pose Ti2i1T_{i_2}^{i_1}Ti2​i1​​, B 为真值轨迹两个点之间的相对pose Tm1m2T_{m_1}^{m_2}Tm1​m2​​.

求解得到TimumarkerT^{marker}_{imu}Timumarker​之后,可以将真值轨迹从Marker坐标系转到IMU坐标系下,即:
Timuw2=Tmarkerw2∗TimumarkerT_{imu}^{w_2} = T_{marker}^{w_2} * T_{imu}^{marker}Timuw2​​=Tmarkerw2​​∗Timumarker​

然后,得到的真值轨迹,再通过刚体变换,可以实现轨迹对齐,从而评估VIO轨迹。

注意

  • 这里两个轨迹已经认为做过时间同步,相应的匹配关系,通过搜索最近时间点来获取。
  • 由于计算TimumarkerT_{imu}^{marker}Timumarker​时,用到了VIO的轨迹,如果VIO轨迹有偏差,则估计的TimumarkerT_{imu}^{marker}Timumarker​就不准确,从而会把这个误差引入到对齐误差中。因此,通常情况下,当我们采集到Marker的真值轨迹时,会通过额外提前标定好TimumarkerT_{imu}^{marker}Timumarker​来处理轨迹,得到IMU的真值轨迹。后续,直接采用轨迹对齐,即可实现轨迹评估。

标定

论文 The TUM VI Benchmark for Evaluating Visual-Inertial Odometry 介绍了采集VIO数据集时,涉及到的相关标定。包含cam-IMU之间的外参、timeshift, 以及Mocap-IMU之间外参、timeshift, 以及IMU内参标定等。 basalt 提供了相应的标定代码。

下面介绍采集Mocap数据集的主要流程:

  • 双目静态标定内参以及双目外参
  • Allan方差标定IMU噪声
  • AprilgTag采集动态轨迹,标定cam-IMU之间的外参、timeshift, 以及Mocap-IMU之间外参、timeshift,以及IMU的轴偏和尺度因子。
  • 采集Mocap轨迹和cam-imu数据
  • 处理Mocap轨迹到IMU坐标系。
  • 时间同步Mocap轨迹到IMU时间系统。

Mocap-IMU-cam标定

basalt代码的 basalt_calibrate_imu 模块可以标定 cam-IMU 之间的外参、timeshift, 以及 Mocap-IMU 之间外参、timeshift,以及IMU的轴偏和尺度因子。

cam-imu标定

cam-imu的标定原理可以参考kailbr.
相机对着AprilTag板子,采集动态数据,包含cam图像和IMU数据。
标定变量:cam-imu的外参,timeshift,IMU的轴偏和尺度因子。

标定原理简述:

构建 TiwT^w_iTiw​ 位姿样条,通过三个残差优化样条系数和待求解变量。

  • e=[u,v]T−π(Tiw∗Tci∗p)e = [u,v]^T - \pi(T^w_i * T^i_c * p)e=[u,v]T−π(Tiw​∗Tci​∗p) , 其中ppp 为AprilTag点。TiwT_i^wTiw​由样条获得。TciT_c^iTci​ 为待求解的cam-imu的外参。
  • e=w−(wm−bg)e = w - (w_m - b_g)e=w−(wm​−bg​), 旋转样条微分得到角速度www,与IMU测量角速度wmw_mwm​构建残差,优化样条系数和bgb_gbg​。
  • e=R−1(a+g)−(am−ba)e = R^{-1} (a+g) - (a_m - b_a)e=R−1(a+g)−(am​−ba​), 位移样条两次微分得到加速度aaa,与IMU的加速度测量ama_mam​构建残差,优化样条系数,重力加速度 ggg, 和 bab_aba​。

Mocap-IMU-cam标定

basalt标定模块可以同时标定cam-imu和Mocap-imu的相关参数。

仅需要增加Mocap测量的一个残差:e=log(Tmocapmarker∗(Twmocap∗Tiw∗Tmarkeri))e = log(T^{marker}_{mocap}*(T_{w}^{mocap}*T_i^w*T_{marker}^{i}))e=log(Tmocapmarker​∗(Twmocap​∗Tiw​∗Tmarkeri​)) ,优化TwmocapT_{w}^{mocap}Twmocap​ 和 TmarkeriT_{marker}^{i}Tmarkeri​ 以及样条系数. TmocapmarkerT^{marker}_{mocap}Tmocapmarker​为Mocap系统的测量值。

优化时,需要提供一个timeshift和TmarkerimuT_{marker}^{imu}Tmarkerimu​的优化初始值。

初始化timeshift

TmarkerimuT_{marker}^{imu}Tmarkerimu​ 可以人为给出一个大致初值,我们在贴小球时,可以尽量使得Marker坐标系与IMU坐标系的某个轴对齐,因此可以大致估计RimumarkerR^{marker}_{imu}Rimumarker​ , timumarkert^{marker}_{imu}timumarker​也可以通过大致测量小球质心和IMU坐标系中心来给出。

根据提供的初值TmarkerimuT_{marker}^{imu}Tmarkerimu​ , 可以将TmocapmarkerT^{marker}_{mocap}Tmocapmarker​ 的计算的旋转角速度经过RimumarkerR^{marker}_{imu}Rimumarker​ 可以转换为IMU的旋转角速度,从而能够得到角速度曲线。与IMU原始测量的角速度曲线进行相关性计算,即可以得到timeshift的初值。如下图,左图为不同timeshift对应的相关性误差,其最小误差就对应timeshift的大致初值,basalt的time_alignment代码中还增加了抛物线拟合,来细化timeshift, 标定过程中可以不进行细化过程。最右图为角速度曲线。

初始化 TmarkerimuT_{marker}^{imu}Tmarkerimu​

得到了timeshift的初始值,就可以得到同一时间下的两个角速度,一个是根据TmocapmarkerT^{marker}_{mocap}Tmocapmarker​测量值, 经过RimumarkerR^{marker}_{imu}Rimumarker​ 转换得到的角速度,一个是IMU陀螺仪测量的角速度。且两个角速度有如下等式:
wimu=wmarker∗Rimumarkerw_{imu} = w_{marker} * R_{imu}^{marker}wimu​=wmarker​∗Rimumarker​
多个测量值构建的多个等式,联合求解,即可以得到RimumarkerR_{imu}^{marker}Rimumarker​.

timumarkert_{imu}^{marker}timumarker​ 人为给出,或者直接设置为0.

数据后处理

设备贴好小球且标定完成之后,可以进行数据采集。Mocap系统给出Marker的轨迹真值,设备自己记录cam图像和IMU数据。

采集完原始数据之后,需要进行后处理:

  • 应用TimumarkerT_{imu}^{marker}Timumarker​,将Marker真值轨迹转为IMU系的真值轨迹。
  • 时间同步

时间同步

通常MoCap和VIO数据采集设备的时间系统不一致,Opti-Track系统每次记录轨迹时,其时间从0开始计数。因此,标定过程中得到的timeshift不能应用在这种情况。这种情况下,每次采集完一个数据时,需要对齐Marker和IMU的时间。

对齐方式和上文中《初始化timeshift》的原理一致,由于已经标定出TimumarkerT_{imu}^{marker}Timumarker​, 可以直接得到IMU的轨迹真值,从而可以估计出MoCap和IMU时间系统的 timeshift。注意,在标定过程中计算timeshift的初始值时,可以不进行细化,但是这里,需要抛物线拟合来细化timeshift, 从而提高timeshift的精度。

抛物线拟合细化: 取GridSearch得到的大致timeshift前后的相关性误差数据,进行抛物线拟合(f=ax2+bx+cf = ax^2 + bx +cf=ax2+bx+c),根据拟合得到的抛物线参数,计算抛物线最小值(−b2a\frac{-b}{2a}2a−b​)。

basalt 的 basalt_time_alignment 模块提供了时间同步的代码。

实操 ----Mocap采集VIO数据集相关推荐

  1. win10系统pp-yolov2实操训练自己的数据集

    Windows10系统PPYOLOv2实操 因为之前一直是用pytorch框架,所以这次从paddle环境搭建,到用pp-yolov2训练自己的数据集记录下全过程.我的电脑是win10 64位系统. ...

  2. 手把手实操系列|贷中逾期风险预测模型开发流程(上)

    序言: 随着新客的获客成本越来越高,贷中客户的管理越来越受到放贷机构的重视,其中包括用户流失预测,营销响应预测,逾期风险预测,额度利率管理等. B卡,又称为行为评为卡,它的作用对象是老客,根据其在账户 ...

  3. 不容错过|额度管理与应用-银行信用卡行为评分篇(实操见)

    在日常生活消费中,我们大多数童鞋可能会采用信用卡来进行支付,毕竟在很多时候显得非常方便,而且随着信用消费和按时还款的良好表现,我们的信用卡额度从最开始的几千逐渐会变成几万,这种变化自然是我们个人较好资 ...

  4. yolov3训练自己的数据集——第一次实操完整记录

    参考: yolov3 darknet yolo源码解析 bacth参数对性能影响 backpropogation算法 yolo中7*7个grid和rpn中的9个anchors darknet源码学习 ...

  5. 大数据项目之电商数仓、日志采集Flume配置概述、日志采集Flume配置实操

    文章目录 4. 用户行为数据采集模块 4.3 日志采集Flume 4.3.2 日志采集Flume配置概述 4.3.2.1 TailDirSource 4.3.2.2 KafkaChannel 4.3. ...

  6. I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集

    I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集 一实验要求 二.12C总线通信协议 1.12C介绍 2.I2C物理层 3.I2C协议层 4.软件IIC和硬件IIC 三.STM ...

  7. redis 集群 实操 (史上最全、5w字长文)

    文章很长,建议收藏起来慢慢读! 总目录 博客园版 为大家准备了更多的好文章!!!! 推荐:尼恩Java面试宝典(持续更新 + 史上最全 + 面试必备)具体详情,请点击此链接 尼恩Java面试宝典,34 ...

  8. 教科书范本级:银行容错容灾体系建设与实操性演练设计

    本文根据姜岩老师在[deeplus直播第253期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的方式,不要错过) 姜岩 某城商银行 数据中心总经理 拥有27年银行应用系统开发.运维管 ...

  9. 手把手实操系列|贷后迁徙率模型开发(上篇)

    序言: 很多关注番茄风控的老铁们都知道,番茄风控的开篇就是从系统性的贷后评分卡开始的,关于贷后相关的内容,番茄不敢说是元老级别的公众号,但再怎么说也是先行者,之前的文章比如这些经典内容,您是否都看过了 ...

最新文章

  1. 特征工程(五)length
  2. OPENCV已知内参求外参
  3. swift 用协议实现代理传值功能
  4. tldr一个精简的man手册替代品
  5. 怎么把空字符串去掉_Python知识点字符串转整数需注意
  6. 回归分析检验_回归分析
  7. 2018年编程语言排行榜_这是2018年学习的最佳编程语言
  8. vhdl和c语言,VHDL语言中的信号、变量与常量异同比较(转)
  9. Python中的枚举类型
  10. 第五章 MNIST数字识别问题(二)
  11. 数据恢复工具 winhex使用教程
  12. 计算机类核心期刊投稿的一些资料汇总
  13. 凉爽的天气,蓝蓝的天
  14. Appium+网易mumu模拟器+python 使用笔记
  15. Python代码编辑器jupyter的使用
  16. webbrowser点击网页内部链接阻止从IE打开
  17. 一篇关于批处理文件的经典文章
  18. 360手机怎样更新系统版本android,360手机N5迎来安卓7.0稳定版升级
  19. 数组的降维与升维方法
  20. 【MM小贴士】特殊采购类型40

热门文章

  1. UVa145 Gondwanaland Telecom
  2. 大数据系列教程003-hadoop伪分布式环境搭建步骤03-安装虚拟机CentOS7
  3. 大学生求职 一些靠谱的求职网站
  4. python中notebook左侧in中_关于python:jupyter笔记本中的折叠单元格
  5. 图像处理 | 灰度线性变换与非线性变化
  6. java blender,如何在Java中使用Blender模型?
  7. python基于PHP+MySQL的美食网站的设计与实现
  8. 统计不同省份的商品点击排行(两种实现方式)
  9. MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务
  10. mysql建库授权_MySQL建库授权shell工具