从零开始的VIO——Eigen和Sophus的安装配置

本文介绍了在Ubuntu16.04上,使用Visual Studio Code和C++进行视觉惯性里程计(VIO)学习时,如何安装配置矩阵库Eigen和李代数库Sophus。通过详细步骤,包括添加includePath,编译安装Sophus,以及两种编译方式(g++和cmake)的实践,帮助读者顺利进行VIO的实践工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

笔者最近开始学习深蓝学院的网课《从零开始手写VIO》,先前读过《视觉slam十四讲》以及《机器人学中的状态估计》两本书,光是里面的数学推导都感到非常吃力,实操更是一塌糊涂。所以也是趁着有些矩阵分析和李代数的基础,借助于《从零开始手写VIO》课程,正式步入视觉惯性里程计的学习和实践,分享在学习中遇到的问题和经验。对于VIO实践来说,所有的研究都是基于三维运动的姿态变化为重点,所以第一步需要安装的库就是Sophus。

2.概述

操作系统:Ubuntu16.04。
编译环境:VSCode,C++。关于VSCode的介绍和安装这里就不再赘述了,需要关注的是工程的配置文件中 .vscode/c_cpp_properties.json 的变量 includePath,在之后的研究中如果需要添加新库,则需要把那个库的路径添加在这个变量中。
Eigen库:矩阵库,可以进行线性代数、向量、矩阵等操作和运算的C++库。解压即可用,不需要使用cmake。
Sophus库:支持二维运动SO(2)、SE(2),三维运动SO(3)、SE(3)等内容,是在Eigen库基础上的开发,分为模板类库和非模板类库,这里选择非模板类库。

3. Eigen和Sophus的安装

(1)矩阵Eigen

安装Eigen

sudo apt-get install libeigen3-dev

解压完成后确认Eigen的路径,可以把eigen-3.3.7中的Eigen文件夹单独复制出来,与eigen-3.3.7同一个路径下(方便写代码的时候直接使用“#include <Eigen/…>”),把该路径添加进includePath。我的是 /usr/local/include/Eigen。如下图所示:
在这里插入图片描述
程序中添加Eigen的头文件测试,例如以下代码,没有报错即表示安装成功。

#include <Eigen/Core>
#include <Eigen/Geometry>

(2)李代数Sophus

通过以下命令下载非模板类的Sophus库:

<think>好的,我现在要帮助用户了解如何从零开始实现视觉惯性里程计(VIO)。首先,我需要回忆VIO的基本概念组成部分。VIO结合了视觉(如摄像头)惯性测量单元(IMU)的数据,用于估计设备的运动轨迹周围环境的结构。用户提到他们想手写代码实现,所以需要从基础开始逐步构建。 根据用户提供的引用,特别是引用[1]、[3]、[4],VIO的实现涉及初始化、传感器数据融合、状态估计、后端优化等。首先,我需要确定VIO的框架,比如松耦合还是紧耦合。引用[4]提到松耦合紧耦合的分类,而通常紧耦合效果更好,但实现更复杂。因此,可能需要从松耦合开始,逐步深入。 接下来,步骤可能包括传感器数据的同步时间戳对齐,这在引用[3]中提到了时间戳标定的重要性。然后是IMU视觉数据的预处理,比如IMU的零偏校正视觉特征点的提取与跟踪。 然后是状态估计,可能需要使用滤波方法(如卡尔曼滤波)或者优化方法(如非线性最小二乘)。引用[2]提到了高斯牛顿法用于曲线拟合,这可能在后端优化中使用。因此,后端优化部分需要实现如Bundle Adjustment结合IMU数据的方法。 此外,初始化过程是关键,引用[1][4]都提到需要正确的初始化外参标定。可能需要使用视觉信息来初始化IMU的参数,比如尺度、重力方向等。 最后,代码实现部分需要分模块,比如数据读取、预处理、状态预测、优化、地图管理等。可能需要使用C++或Python,但用户提供的示例代码是Python,但实际VIO系统可能更常用C++以提高效率。 在实现过程中,需要注意IMU视觉数据的同步,时间戳的处理,以及如何处理传感器丢失的情况,如引用[3]提到的视觉丢失时IMU顶替。此外,累积误差的问题需要通过回环检测或者全局优化来解决,但可能在初始实现中先处理局部优化。 可能还需要参考现有的开源项目,如VINS-Mono或OKVIS,了解它们的结构,但用户要求手写代码,所以需要从零开始构建基本框架。 总结步骤可能为: 1. 传感器数据读取与同步 2. IMU数据预处理(去噪、零偏校正) 3. 视觉特征提取与匹配 4. 初始化外参标定 5. 紧耦合的滤波或优化方法实现 6. 后端非线性优化(如基于高斯牛顿法或LM算法) 7. 尺度估计重力对齐 8. 处理累积误差闭环检测 需要确保每个模块的正确性,逐步集成测试。例如,先实现IMU的积分预测,再处理视觉的位姿估计,然后将两者融合。可能出现的问题包括时间不同步、参数标定不准确、优化过程中的数值不稳定等,需要通过调试测试来解决。</think>### 从零开始实现视觉惯性里程计(VIO)的步骤详解 #### 一、基础理论与框架设计 1. **VIO核心原理** VIO通过融合相机(视觉)IMU(惯性)数据,估计载体在短时间内的相对运动。视觉提供环境特征点约束,IMU提供高频运动预测,两者互补: - IMU适合快速运动但存在零偏漂移[^3] - 视觉适合慢速运动但能校正IMU零偏并提供尺度信息[^4] 2. **系统框架选择** 推荐从**紧耦合**框架入手(直接融合原始数据),尽管实现复杂度高于松耦合,但精度更高: ```text VIO Pipeline: 传感器数据 → 时间同步 → 视觉特征提取 + IMU预积分 → 紧耦合优化 → 位姿输出 ``` --- #### 二、核心模块实现步骤 ##### 1. 传感器数据同步与预处理 - **时间戳对齐**:使用线性插值或滑动窗口对齐相机与IMU的时间戳[^1] - **IMU预处理**: - 零偏校正:通过静止状态下的均值计算初始零偏 - 角速度积分公式(四元数更新): $$ q_{t+1} = q_t \otimes \left[1, \frac{1}{2}\omega\Delta t\right]^T $$ 其中$\omega$为陀螺仪测量值 ##### 2. 视觉前端实现 ```cpp // 示例:ORB特征提取(OpenCV) cv::Ptr<cv::ORB> orb = cv::ORB::create(500); std::vector<cv::KeyPoint> kps; cv::Mat descriptors; orb->detectAndCompute(img, cv::Mat(), kps, descriptors); ``` - **光流跟踪**:使用LK光流法匹配相邻帧特征点 - **关键帧选择**:基于平移/旋转量阈值判断 ##### 3. IMU预积分 - 计算两帧图像间的IMU运动增量: $$ \Delta v = \sum_{k=i}^{j-1} (R_k a_k - g)\Delta t $$ $$ \Delta p = \sum \Delta v_k \Delta t $$ 其中$R_k$为姿态矩阵,$a_k$为加速度计测量值[^4] ##### 4. 紧耦合非线性优化 使用**滑动窗口优化**最小化视觉重投影误差与IMU预积分误差: $$ \min_{\mathbf{x}} \left( \sum \rho \left( \| r_p \|^2_{\Sigma_p} \right) + \sum \| r_I \|^2_{\Sigma_I} \right) $$ - 残差项: - 视觉残差$r_p = z - \pi(T_{cw}X)$ - IMU残差$r_I = \log\left( \Delta \hat{T}_{ij}^{-1} T_i^{-1} T_j \right)$ - 求解方法:高斯牛顿法或Levenberg-Marquardt算法[^2] --- #### 三、关键问题解决方案 1. **初始化** - **视觉-IMU外参标定**:通过手眼标定法计算$T_{imu}^{cam}$ - **尺度恢复**:单目视觉通过SFM计算特征点深度,结合IMU加速度约束求解尺度因子 2. **零偏在线估计** 将加速度计陀螺仪零偏作为状态量加入优化变量: $$ \mathbf{x} = [T_{wb}, v, b_a, b_g, \lambda_1, ..., \lambda_n] $$ 3. **关键代码示例(C++伪代码)** ```cpp class VIOOptimizer { public: void addImuResidual(const ImuData& imu) { // 添加IMU预积分残差块 problem.AddResidualBlock( new ImuCostFunction(imu.delta_p, imu.delta_v, imu.delta_q), nullptr, pose_i, pose_j, bias_a, bias_g ); } void addVisionResidual(const Feature& feat) { // 添加视觉重投影残差块 problem.AddResidualBlock( new ReprojectionCost(feat.uv_observed), new CauchyLoss(0.5), pose, landmark ); } }; ``` --- #### 四、测试与调试建议 1. **仿真数据验证** 使用EuRoC MAV数据集,对比轨迹的ATE(绝对轨迹误差) 2. **真机调试技巧** - 优先调试IMU积分:静止状态下积分速度应趋近于零 - 可视化特征跟踪:确保匹配点分布均匀且跟踪稳定 3. **性能优化方向** - 使用Schur补加速H矩阵求逆 - 引入FEJ(First Estimate Jacobians)避免线性化点不一致 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值