手写VIO学习总结(一)
程序员文章站
2022-04-16 21:21:57
...
1.简介
贺一家和高博合作推出了一个关于 VIO 的课程,此课程主要为VIO学习者提供学习资源。VIO不仅应用在无人车、机器人,还应用于手机 AR 等领域。可以说,VIO 已成为 vSLAM 算法工程师的必备技能。课程介绍如下:
本博客主要记录学习课程的笔记和课程的作业。
作业1.1
阅读VIO 相关综述文献如a,回答以下问题:
• 视觉与IMU 进行融合之后有何优势?
• 有哪些常见的视觉+IMU 融合方案?有没有工业界应用的例子?
• 在学术界,VIO 研究有哪些新进展?有没有将学习方法用到VIO
中的例子?
你也可以对自己感兴趣的方向进行文献调研,阐述你的观点。
回答在我上一篇博客,视觉惯导研究综述中
作业1.2
课件提到了可以使用四元数或旋转矩阵存储旋转变量。当我们用计算出来的 对某旋转更新时,有两种不同方式:
请编程验证对于小量 = [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),推导以下导数:
性质:
手写答案如下:
上一篇: mysql获得两个日期之间的时间差(年、月、天、时、分、秒)
下一篇: 十个爆笑段子,不笑不要钱