手写VIO作业总结(一)
程序员文章站
2022-04-16 21:21:09
...
**
手写VIO课程总结(一)
1、视觉与IMU融合之后的优势?
IMU适合计算短时间、快速的运动,视觉适合计算长时间、慢速的运动;可以利用视觉定位信息估计IMU的零偏,减少IMU零偏导致的发散和累积误差,IMU可以为视觉提供快速运动时的定位。
2、常见的视觉+IMU融合方案?工业界的例子?
主要的融合方案有两种,一种是基于松耦合,一种是基于紧耦合。具体的开源方案有以下几种:
VINS-mono(紧耦合)
MSCKF(紧耦合)
ROVIO(紧耦合)
OKVIS(紧耦合)
3、学术界,VIO研究进展?
4、编程实现四元数和李代数更新?
#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、求导?
参考博客:https://blog.csdn.net/orange_littlegirl/article/details/102874648
上一篇: 年轻人的爆笑语录和趣事