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

手写VIO作业总结(一)

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

**

手写VIO课程总结(一)

1、视觉与IMU融合之后的优势?

​ IMU适合计算短时间、快速的运动,视觉适合计算长时间、慢速的运动;可以利用视觉定位信息估计IMU的零偏,减少IMU零偏导致的发散和累积误差,IMU可以为视觉提供快速运动时的定位。

2、常见的视觉+IMU融合方案?工业界的例子?

主要的融合方案有两种,一种是基于松耦合,一种是基于紧耦合。具体的开源方案有以下几种:

VINS-mono(紧耦合)

MSCKF(紧耦合)

ROVIO(紧耦合)

OKVIS(紧耦合)

3、学术界,VIO研究进展?

4、编程实现四元数和李代数更新?

手写VIO作业总结(一)

#include <iostream>
#include <sophus/se3.hpp>
#include <sophus/so3.hpp>
#include <Eigen/Core>
#include <Eigen/Geometry>
using namespace std;
using namespace Eigen;
int main()
{
    //初始化旋转矩阵
    Eigen:: Matrix3d R=Eigen::AngleAxisd(M_PI/4,Eigen::Vector3d(0,0,1)).toRotationMatrix();
    std::cout<<R.matrix()<<std::endl;
    Quaterniond q(R);
    Sophus::SO3d SO3_R(R);
    Sophus::SO3d SO3_q(q);
    std::cout<<"SO(3) from matrix: "<<SO3_R.matrix()<<std::endl;
    std::cout<<"SO3 from quaternion"<<SO3_q.matrix()<<std::endl;

    Vector3d update_w(0.01,0.02,0.03);//更新量
    Sophus::SO3d SO3_updated=SO3_R*Sophus::SO3d::exp(update_w);//右乘更新
    std::cout<<"SO3_updated = \n"<<SO3_updated.matrix()<<std::endl;

    Quaterniond update_q(1,0.005,0.01,0.015);//[1,1/2w]
    update_q.normalize();//归一化处理
    Eigen::Quaterniond q_updated=q*update_q;
    //q_updated.normalize();//note:对更新量单独归一化或者更新完进行归一化都可以,结果一致
    Sophus::SO3d SO3_q_updated(q_updated);
    std::cout<<"SO3_q_updated"<<SO3_q_updated.matrix()<<std::endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(update_quaternion)

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-std=c++11 -o3")

find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})

include_directories("/usr/local/include/eigen3")

add_executable(update_quaternion main.cpp ${Sophus_LIBRARIES})

5、求导?

手写VIO作业总结(一)

手写VIO作业总结(一)
手写VIO作业总结(一)
参考博客:https://blog.csdn.net/orange_littlegirl/article/details/102874648