VIO(visualinertialodometry )是指视觉传感器(camera ) IMU (inertialmeasurementunit )一起进行自主定位。 目前主要应用手机AR、无人车高精度地图、无人机等领域。 这个技术现在怎么样了? 虽然理论已经成熟,但仅靠vio解决定位的应用并不多。 手机AR是比较成功的、只靠vio就能完成的比较好的APP部署,自动驱动、UAV和移动机器人几乎没有只靠vio完成的。
我把VIO分成前端和后端两部分。 顺便总结一下知识点。
一:视觉和IMU前端数据处理
对于视觉前端做法基本分为三种:
特征点提取(feature detection)+根据描述子匹配特征点
orbslam、okvis等主流算法由于有描述符,具有地图维护方便的优点。 这很重要,特别是在室内环境中,在视觉上的共视关系较大的情况下,该方法可以大幅提高定位精度和局部稳定性。 例如手机AR、室内移动机器人推荐这种方法。 缺点是必须针对每个帧图像提取特征点数量的描述符,这样会浪费时间。 (实际上,提取描述符的时间并不像很多人想象的那么多。 1000个特点,用3000元的手机提取brief描述符的话,10ms左右。 )另一个缺点是,在跟踪过程中,如果移动太快(图像模糊),则容易发生跟踪失败。 光流比较好。 (其实这种差距并不特别明显。
特征点提取+光流跟踪
主流是例如vins、svo的初始化(后面的方法也相似)。 优点是简单高效,跟踪必须稳健。 缺点很明显。 构建全局地图并不容易,视觉限制仅依赖于滑动窗口中的关键帧。 例如vins的闭环和重定位需要另外提取特征点和描述符。 另外,klt的跟踪时间也很长(约需要20ms )。 用手机)。 vins为什么那么好呢? 后端做得很好,这个稍后再说。 rovio的方法就是这样的。
直接法
主流方法为lsdslam、dso。 优点是在弱纹理下,鲁棒性好。 缺点很明显,全局地图不容易维护,对照明影响大,不能在高精度地图中使用等。
视觉前端涉及的知识点。
初始化的2D-2D相对极几何。
fundamental matrix、essential matrix、homography matrix和SVD
fundamental matrix=k.inverse (.transpose ) *essential matrix*k.inverse ),其中k是摄影机的内部参与。
p1*E*p2=0这是基本矩阵的约束,其中p1,p2是匹配点的归一化坐标(u1,v1,1 );u2,v2,1 ).e是essential matrix。 这里,可以看出每个匹配点对都会产生制约。 E=t^ * R其中t^为translation的斜对称矩阵,因此e有6个自由度,且由于尺度原因e只有5个自由度,所以至少需要5个匹配点。
homegraphy因为认为两张图像上的点都在平面上,所以p2=H*p1。 h有八个自由度。 因为每个重合点都有两个约束,所以至少需要四组matchs才能求解。
在slam中,线性方程有很多可以求解的地方,但SVD分解是最容易使用的工具。 假设有一个A*x=0的形式。 假设a是mn的矩阵。 如果a是满秩的方正的话,x有唯一的解。 在mn的情况下,有多个解。 这是我们不希望的。 如果是mn的话就没有解,所以可以根据分解了奇异值的最小奇异值对应的右奇异特征向量来解。
对于IMU前端
IMU前端基本上是使用预积分的方式,与积分的不同(预积分考虑了gravity )。 imu预积分主要是在2帧的图像之间与新imu的15个状态变量(p、v、q、ba、bg )的Jacob和covariance。
假设积分的非线性微分方程如下。
x'=f(t,x ) )。
如果积分的时间间隔为delta_t,theEulermethodassumesthatf(t,x ) is constant over delta_t :
x(tDelta_t )=x ) t ) delta_t * f(t ) t,x ) ) ) ) ) ) ) x ) ) ) x ) ) 65
然而,由于在delta_t期间内f(t,x )不是常数,因此出现了一种closed-form integration methods,假设
x'(t )=a*x ) t ),请注意这是一种连续的时间关系。
如果积分的时间间隔为(t,t delta_t ),则为:
xn1=exp(a*Delta_t ) xn1=exp(a*Delta_t )=I a* delta _ t1/2 * a* a* delta _ t * delta _ t ) ) ) .
取mddx一次近似,可以用离散时间更新jacob和covariance。
* jacobian=(Ia*Delta_t ) Jacobian; covariance=(Ia*Delta_t ) covariance ) Ia*Delta_t ) V * noise * V.transpose )每个预积分的初始值: jacobian是单位矩阵,C是co variariance
为什么需要jacobian和covariance? 雅可比主要是为了求一阶逼近的p,v,r
eigen :3360 quaterniondcorrected _ delta _ q=delta _ q * utility 33603360 deltaq (dq _ dbg * dbg ); eigen :3360 vector 3d corrected _ delta _ v=delta _ vdv _ db a* db adv _ dbg * dbg; eigen :3360 vector 3d corrected _ delta _ p=delta _ PDP _ db a* db ADP _ dbg * dbg; covariance主要是为了求出imu误差项的权重:
eigen :矩阵双精度,15,15sq rt _ info=eigen :3360 llt eigen 33603360矩阵双精度,15,15 (预集成) 对于初始的position和quaternion,可以假设0和单位矩阵。 该初始值一般结合visual information求出。 例如vins-mono。