欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手写VIO学习总结(一)

程序员文章站 2022-04-16 21:21:57
...

1.简介

贺一家和高博合作推出了一个关于 VIO 的课程,此课程主要为VIO学习者提供学习资源。VIO不仅应用在无人车、机器人,还应用于手机 AR 等领域。可以说,VIO 已成为 vSLAM 算法工程师的必备技能。课程介绍如下:

手写VIO学习总结(一)
本博客主要记录学习课程的笔记和课程的作业。

作业1.1

阅读VIO 相关综述文献如a,回答以下问题:
• 视觉与IMU 进行融合之后有何优势?
• 有哪些常见的视觉+IMU 融合方案?有没有工业界应用的例子?
• 在学术界,VIO 研究有哪些新进展?有没有将学习方法用到VIO
中的例子?
你也可以对自己感兴趣的方向进行文献调研,阐述你的观点。
回答在我上一篇博客,视觉惯导研究综述中

作业1.2

课件提到了可以使用四元数或旋转矩阵存储旋转变量。当我们用计算出来的ww 对某旋转更新时,有两种不同方式:
手写VIO学习总结(一)
请编程验证对于小量ww = [0.01, 0.02, 0.03]T,两种方法得到的结果非常接近,实践当中可视为等同。因此,在后文提到旋转时,我们并不刻意区分旋转本身是q 还是R,也不区分其更新方式为上式的哪一种。

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "sophus/so3.h"
#include "sophus/se3.h"
using namespace std; 

int main( int argc, char** argv )
{
    // 沿Z轴转90度的旋转矩阵
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
    cout << "R * R^t ?= I"<< endl << R * R.transpose() <<endl;

    Sophus::SO3 SO3_R(R);               // 从旋转矩阵构造Sophus::SO(3)
    Eigen::Quaterniond q(R);            // 从旋转矩阵构造四元数

    // 李代数更新
    Eigen::Vector3d update_so3(0.01, 0.02, 0.03); //更新量
    Sophus::SO3 SO3_updated = SO3_R * Sophus::SO3::exp(update_so3);
    cout<<"SO3 updated = "<< endl << SO3_updated.matrix() <<endl;
    
    //四元数更新
    Eigen::Quaterniond q_update(1, update_so3(0)/2, update_so3(1)/2, update_so3(2)/2); 
    Eigen::Quaterniond q_updated = (q * q_update).normalized(); //四元数归一化
    cout<<"q2R = "<< endl << q_updated.toRotationMatrix() <<endl;

    return 0;
}

结果显示:

作业1.2

使用右乘so(3),推导以下导数:
手写VIO学习总结(一)
性质:
手写VIO学习总结(一)
手写答案如下:
手写VIO学习总结(一)