实操 ----Mocap采集VIO数据集
目的
本文介绍采用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]Tw2w1=[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}Tw2w1以及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}Ti2i1, B 为真值轨迹两个点之间的相对pose Tm1m2T_{m_1}^{m_2}Tm1m2.
求解得到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数据集相关推荐
- win10系统pp-yolov2实操训练自己的数据集
Windows10系统PPYOLOv2实操 因为之前一直是用pytorch框架,所以这次从paddle环境搭建,到用pp-yolov2训练自己的数据集记录下全过程.我的电脑是win10 64位系统. ...
- 手把手实操系列|贷中逾期风险预测模型开发流程(上)
序言: 随着新客的获客成本越来越高,贷中客户的管理越来越受到放贷机构的重视,其中包括用户流失预测,营销响应预测,逾期风险预测,额度利率管理等. B卡,又称为行为评为卡,它的作用对象是老客,根据其在账户 ...
- 不容错过|额度管理与应用-银行信用卡行为评分篇(实操见)
在日常生活消费中,我们大多数童鞋可能会采用信用卡来进行支付,毕竟在很多时候显得非常方便,而且随着信用消费和按时还款的良好表现,我们的信用卡额度从最开始的几千逐渐会变成几万,这种变化自然是我们个人较好资 ...
- yolov3训练自己的数据集——第一次实操完整记录
参考: yolov3 darknet yolo源码解析 bacth参数对性能影响 backpropogation算法 yolo中7*7个grid和rpn中的9个anchors darknet源码学习 ...
- 大数据项目之电商数仓、日志采集Flume配置概述、日志采集Flume配置实操
文章目录 4. 用户行为数据采集模块 4.3 日志采集Flume 4.3.2 日志采集Flume配置概述 4.3.2.1 TailDirSource 4.3.2.2 KafkaChannel 4.3. ...
- I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集
I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集 一实验要求 二.12C总线通信协议 1.12C介绍 2.I2C物理层 3.I2C协议层 4.软件IIC和硬件IIC 三.STM ...
- redis 集群 实操 (史上最全、5w字长文)
文章很长,建议收藏起来慢慢读! 总目录 博客园版 为大家准备了更多的好文章!!!! 推荐:尼恩Java面试宝典(持续更新 + 史上最全 + 面试必备)具体详情,请点击此链接 尼恩Java面试宝典,34 ...
- 教科书范本级:银行容错容灾体系建设与实操性演练设计
本文根据姜岩老师在[deeplus直播第253期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的方式,不要错过) 姜岩 某城商银行 数据中心总经理 拥有27年银行应用系统开发.运维管 ...
- 手把手实操系列|贷后迁徙率模型开发(上篇)
序言: 很多关注番茄风控的老铁们都知道,番茄风控的开篇就是从系统性的贷后评分卡开始的,关于贷后相关的内容,番茄不敢说是元老级别的公众号,但再怎么说也是先行者,之前的文章比如这些经典内容,您是否都看过了 ...
最新文章
- 特征工程(五)length
- OPENCV已知内参求外参
- swift 用协议实现代理传值功能
- tldr一个精简的man手册替代品
- 怎么把空字符串去掉_Python知识点字符串转整数需注意
- 回归分析检验_回归分析
- 2018年编程语言排行榜_这是2018年学习的最佳编程语言
- vhdl和c语言,VHDL语言中的信号、变量与常量异同比较(转)
- Python中的枚举类型
- 第五章 MNIST数字识别问题(二)
- 数据恢复工具 winhex使用教程
- 计算机类核心期刊投稿的一些资料汇总
- 凉爽的天气,蓝蓝的天
- Appium+网易mumu模拟器+python 使用笔记
- Python代码编辑器jupyter的使用
- webbrowser点击网页内部链接阻止从IE打开
- 一篇关于批处理文件的经典文章
- 360手机怎样更新系统版本android,360手机N5迎来安卓7.0稳定版升级
- 数组的降维与升维方法
- 【MM小贴士】特殊采购类型40
热门文章
- UVa145 Gondwanaland Telecom
- 大数据系列教程003-hadoop伪分布式环境搭建步骤03-安装虚拟机CentOS7
- 大学生求职 一些靠谱的求职网站
- python中notebook左侧in中_关于python:jupyter笔记本中的折叠单元格
- 图像处理 | 灰度线性变换与非线性变化
- java blender,如何在Java中使用Blender模型?
- python基于PHP+MySQL的美食网站的设计与实现
- 统计不同省份的商品点击排行(两种实现方式)
- MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务
- mysql建库授权_MySQL建库授权shell工具