您当前的位置: 首页 > 

MSCKF-Based Visual-Wheel Odometry 轮速视觉融合里程计

发布时间:2020-12-04 07:00:00 ,浏览量:1

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

Sliding Windows Filter(SWF)在VIO、SLAM这个领域应用非常广,比如MSCKF、OKVIS、VINS-Mono等等,几乎可以说是VIO的标配。

SWF可以分成基于滤波器的和基于优化的两种。最典型的基于滤波器的方法就是MSCKF算法了。它是基于EKF的算法,在marginalize state的时候处理比较简单,只需要把对应的covariance的对应行列直接丢弃就可以了。而基于优化的方法在边缘化时需要对Hessian矩阵做舒尔补,操作会复杂一些。

为了尝试一下SWF,我们先从简单的基于滤波的方法入手.本文实现了一个基于MSCKF的Visual+Wheel融合的Odometry.

下面是分别是仿真和用KAIST数据测试的结果

更多可参考

https://zhuanlan.zhihu.com/p/270670373

注意:这里为了凸显加了视觉校正效果,把wheel的noise设的比较大,轨迹不太平滑。如果想要平滑一些,可以适当调低wheel的noise。

代码请见

https://github.com/ydsf16/TinyGrapeKit

传感器配置

Visual部分,用一个单目相机。Wheel部分可以是左右轮速度或位移

坐标系统

轮速坐标系/Odometry坐标系{0}: 车辆后轴中心、贴地. x轴向前, y轴向左,z轴向上.

全局坐标系{G}:与初始时刻的轮速坐标系重合的坐标系。

相机坐标系{C}: x轴向右,y轴向下,z轴向前

内外参数

内参数:1)相机内参;

2)左右轮轴距b,左右轮速系数、将编码器count转成距离米,或者速度转成m/s。

外参数:轮速坐标系到相机坐标系的旋转与平移.

我们假设这些内外参数都假设预先标定好的。实际上,也可以把这些内外参数放到状态向量里面估计,这也是很多论文里面常见的做法,比如OpenVINS。但是,具体这些内外参数能不能估计出来,是不是可观的,可以参考一下黄国权老师的论文

状态向量

滑窗里面的状态分成两类,一类是Odometry的位姿。

另一个类是一串相机位姿:

总的状态是当前Odometry位姿+N帧的相机位姿:

跟MSCKF一样,我们把协方差分块表示:

这里我们使用最简单的滑窗维护方式,当新的一帧进到滑窗后,就直接把老的一帧给边缘化掉。因为是EKF,就是直接把最后一帧相机pose从x中去掉,然后把对应的协方差的行和列删除掉.

Wheel Propagation

EKF算法分成两步:Propagation+Update。在这里,我们用wheel的信息进行状态的propagation,用视觉信息做update。下面先推导Propagation部分。这里的推导,参考了Mingyang Li的paper[2]。

按照IMU处理的方法,首先把ODE方程列出来

下面就可以对ODE方程进行积分了。简单起见,直接用欧拉积分了。如果考虑精度,可以使用中值或者龙格库塔:

用这个式子,就可以进行均值的Propagation。对于协方差的Propgation,我们先求雅克比。这里定义旋转的Error为:

状态增广

当新来一帧图像,可以通过odometry位姿,计算出相机位姿。

然后把它放到状态向量里面。相应的要把协方差矩阵进行扩展:

Update

7.1视觉Update

MSCKF的很大的优势就是没有把特征点放到状态向量里面,降低了计算量。

当特征点丢失的时候,才拿来进行更新。特征点丢失有两种情况:

  • 当特征点丢失的时候,才拿来进行更新。特征点丢失有两种情况:

  • 另一种是边缘化的时候,也就是把最后一帧滑出窗口的时候,把在这一帧里面新建的特征点都丢弃,也就是都拿来做更新。

这里说的特征点/feature,同时表示3D点,也表示在图像上的2D位置。

A. 一个特征点的处理

因为与是正交的.所以

做了上面的操作之后,就可以得到一个不含特征点的线性方程:

B. 多个特征点的处理

上面一个特征点可以得到一个(18)式。多个特征点就可以得到很多的(18)式,把他们堆叠起来,有得到一个很大的线性方程:

这个方程的行数一般很大,直接用来做EKF更新效率很低。MSCKF又用QR分解,进行了一次压缩。具体的对H*做QR分解

带入到(19)式中,可以得到,

左右两边,同时乘以有

最后,我们得到一个压缩后的线性方程

这方程的行数最大和状态的维度相同。最终用来做EKF更新的也就是(20)式。

C. 边缘化

边缘化,或者说如何删除滑窗里的状态。前面也已经提到了,我们使用了最简单的策略。就直接把最老的一帧去掉。去掉的这帧里的所有特征点都被拿来做更新。

最后,总结一下,当一帧图像来了之后的处理步骤

  • 增广状态

  • 做特征点跟踪。

  • 收集跟踪丢失的的所有特征点{}

  • 收集将要被边缘化的帧中的所有特征点:{}

  • 利用特征点{}和{}构造线性方程(20),并执行EKF更新。

  • 边缘化操作:将x中边缘化掉的pose去掉,将协方差矩阵中对应的行和列删除。

平面约束Update

一般车辆都是运动在平面上的,在更新的时候,我们引入一个平面约束。这部分参考了Stergios I. Roumeliotis 的PaperVINS On wheels[3]

实现

全部工程代码请见:

https://github.com/ydsf16/TinyGrapeKit

实验

仿真测试,很明显,VWO-MSCKF比纯Wheel里程计精度更好.

数据集测试

我们这里使用了KAIST数据集,链接是:

https://irap.kaist.ac.kr/dataset/

同样的,相比纯Wheel odom,精度会有所提高.

注意:这里的测试,Wheel内参数精度都是比较低的,所以raw odom的精度不是很高.如果wheel内参数精度很高的话,VWO-MSCKF精度不一定更高.

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

关注
打赏
1688896170
查看更多评论

暂无认证

  • 1浏览

    0关注

    106368博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0647s