1.从零开始手写 VIO-学习准备-习题

目录

a.VIO 文献阅读

b.四元数或和李代数更新

c.其他导数

 


a.VIO 文献阅读

阅读 VIO 相关综述文献如a,回答以下问题:

  1. 视觉与 IMU 进行融合之后有何优势?
  2. 有哪些常见的视觉 +IMU 融合方案?有没有工业界应用的例子?
  3. 在学术界, VIO 研究有哪些新进展?有没有将学习方法用到 VIO中的例子?

你也可以对自己感兴趣的方向进行文献调研,阐述你的观点。

解:

 

1.案优势与劣势对比:

方案

IMU

相机

优势

快速响应

不受成像质量的影响

角速度普遍准确

可估计绝对尺度

不产生偏漂移(静态时)

直接旋转和平移

劣势

存在零偏

低精度IMU积分位姿发散

高精度价格昂贵

受图像遮挡、运动物干扰

单目视觉无法测量尺度

单目纯旋转运动无法估计

快速运动时容易丢失

整体上,视觉和IMU融合存在一定的互补性质:

总结为:Low drifthigh rate Robustness、物理尺度状态估计(位置、速度、姿态)

   详解为

  1. MU适合计算短时间、快速的运动;
  2. 视觉适合计算短时间、慢速的运动;
  3. 同时,可以利用视觉定位信息来估计IMU的零偏,减少IMU由零偏导致的发散和累计误差。反之,IMU可以为视觉提供快速运动的定位。
  4. IMU可以提供尺度信息,避免单目无法测尺度

2.那些的视觉 +IMU 融合方案?有没有工业界应用的例子?

MSCKF、OKVIS、RBVIO、VINS

4.在学术界, VIO 研究有哪些新进展?有没有将学习方法用到 VIO中的例子?

a.VIO 结合直线和点特征

如:2018 rifo-VIO: Robust and Efficient Stereo Visual Inertial Odometry using Points and Lines

Stereo Visual-Inertial SLAM With Points and Lines

b.时间在线标定 

如:Online Temporal Calibration for Monocular Visual-Inertial Systems
c.多机器人协作

如CVI-SLAM – Collaborative Visual-Inertial SLAM
d.利用深度学习实现深度估计(机器学习)

如; Embedding Temporally Consistent Depth Recovery for Real-time Dense Mapping in Visual-inertial Odometry

e. 港科大多传感器融合

A General Optimization-based Framework for Global Pose Estimation with Multiple Sensors

b.四元数或和李代数更新

课件提到了可以使用四元数或旋转矩阵存储旋转变量。当我们用计算
出来的 ω 对某旋转更新时,有两种不同方式:

请编程验证对于小量 ω = [0.01, 0.02, 0.03]T,两种方法得到的结果非常接近,实践当中可视为等同。因此,在后文提到旋转时,我们并不刻意区分旋转本身是 q 还是 R,也不区分其更新方式为上式的哪一种。

解:程序如下:

#include <iostream>

//using eigen3
#include <Eigen/Core>
#include <Eigen/Dense>
#include <Eigen/Geometry>

using namespace std;


int main() {
    //随机生成随机旋转矩阵
    Eigen::Vector3d   rot_axis=Eigen::Vector3d::Random();
    rot_axis.normalize();

    Eigen::AngleAxisd  rot_angle_axis(M_PI/4,rot_axis);
    Eigen::Matrix3d  R=rot_angle_axis.toRotationMatrix();
    cout<<"rotation  matrix  R before  update"<<endl<<R<<endl;

    Eigen::Vector3d w(0.01,0.02,0.03);
    double  robot_angle=w.norm();
    Eigen::AngleAxisd  w_rot_angle_axis(robot_angle,w.normalized());

    //update R using w.toRotationMatrix()
    Eigen::Matrix3d     w_rot_matrix=w_rot_angle_axis.toRotationMatrix();
    R=R*w_rot_matrix;
    cout<<"rotation  matrix R after  update using matrix"<<endl<<R<<endl;

    //update R using q
    Eigen::Quaterniond  q(rot_angle_axis);
    Eigen::Quaterniond  q_w(1,0.5*w(0),0.5*w(1),0.5*w(2));
    q=q*q_w;

    q.normalize();
    cout<<"rotation  matrix R  after  update using q"<<endl<<q.toRotationMatrix()<<endl;

    return 0;
}

运行结果为:

c.其他导数

参考:

1.  https://www.cnblogs.com/goingupeveryday/p/5699053.html
2.  http://eigen.tuxfamily.org 

 3.https://github.com/YiChenCityU/Recent_SLAM_Research

4.高博<<视觉SLAM十四讲>>

 

 


 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值