目录
a.VIO 文献阅读
阅读 VIO 相关综述文献如a,回答以下问题:
- 视觉与 IMU 进行融合之后有何优势?
- 有哪些常见的视觉 +IMU 融合方案?有没有工业界应用的例子?
- 在学术界, VIO 研究有哪些新进展?有没有将学习方法用到 VIO中的例子?
你也可以对自己感兴趣的方向进行文献调研,阐述你的观点。
解:
1.案优势与劣势对比:
方案 | IMU | 相机 |
优势 | 快速响应 不受成像质量的影响 角速度普遍准确 可估计绝对尺度 | 不产生偏漂移(静态时) 直接旋转和平移 |
劣势 | 存在零偏 低精度IMU积分位姿发散 高精度价格昂贵 | 受图像遮挡、运动物干扰 单目视觉无法测量尺度 单目纯旋转运动无法估计 快速运动时容易丢失 |
整体上,视觉和IMU融合存在一定的互补性质:
总结为:Low drift、high rate 、Robustness、物理尺度状态估计(位置、速度、姿态)
详解为:
- MU适合计算短时间、快速的运动;
- 视觉适合计算短时间、慢速的运动;
- 同时,可以利用视觉定位信息来估计IMU的零偏,减少IMU由零偏导致的发散和累计误差。反之,IMU可以为视觉提供快速运动的定位。
- 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十四讲>>