1. 项目概述:从论文到实践的ROVIO深度拆解
最近在整理过去几年做过的视觉惯性里程计项目,ROVIO(Robust Visual Inertial Odometry)这个名字总是绕不开。它不像现在的那些基于优化的、动辄上千个状态量的滑动窗口方案那么“重”,但其基于扩展卡尔曼滤波(EKF)的紧耦合设计,在特定场景下展现出的实时性和鲁棒性,至今仍有很强的工程参考价值。网上关于它的论文解读不少,但大多停留在公式推导,真正结合代码、踩过坑、把它用在实际机器人或设备上的经验分享却不多。今天我就结合自己多次在嵌入式平台和移动机器人上部署、调试ROVIO的经历,来一次彻底的拆解。目标很明确:不光要讲清楚ROVIO为什么这么设计,更要分享它在工程落地时,你会遇到哪些真问题,以及怎么去解决。无论你是正在学习VIO的学生,还是需要在资源受限平台上实现可靠定位的工程师,希望这篇结合了理论、源码和实战踩坑记录的总结,能给你带来直接可用的参考。
2. ROVIO的核心思想与滤波框架选择
2.1 为什么是EKF?紧耦合的优势在哪?
提到视觉惯性里程计,现在的主流无疑是基于非线性优化的方法,比如VINS-Mono、ORB-SLAM3,它们利用滑动窗口,通过最小化重投影误差和IMU预积分误差来优化状态,精度高,能有效处理闭环。那ROVIO为什么反其道而行之,坚持使用看似“古老”的EKF呢?这得从它的设计目标和应用场景说起。
ROVIO诞生于对计算效率和高速运动鲁棒性的极致追求。EKF是一种递归的滤波器,它的状态向量维度是固定的。在ROVIO中,这个状态向量主要包括:机器人位姿(位置、姿态)、速度、IMU的零偏(陀螺仪和加速度计),以及一系列被跟踪的视觉特征点的逆深度。注意,是逆深度(1/距离),而不是三维坐标。这是第一个关键点:在EKF框架下,对特征参数化方式的选择直接影响滤波器的性能和稳定性。使用逆深度,可以让深度估计从近到远(甚至无穷远)都有一个相对良好的数值特性,更适合EKF的线性化假设。
而“紧耦合”,指的是视觉观测和IMU数据在状态估计的最底层(即滤波器的更新步骤)就融合在一起。与之相对的是“松耦合”,比如用视觉里程计单独算出一个位姿,再和IMU积分的结果用另一个滤波器融合。紧耦合的优势在于,它充分利用了传感器之间的互补性:IMU高频但漂移,视觉相对低频但绝对测量准。紧耦合能够在每一次视觉特征点被观测到时,直接用它来修正包括IMU零偏在内的所有状态,从而实时地抑制IMU的漂移。这对于高速机动(如无人机翻滚、车辆急转弯)的场景至关重要,因为松耦合的延迟可能导致融合结果严重滞后。
实操心得:在工程选型时,如果你的设备算力有限(比如主频几百MHz的嵌入式处理器),但又需要处理高速运动,ROVIO这类EKF-based方案仍然是一个强有力的候选。它的计算量主要取决于跟踪的特征点数量,通常几十个点就能稳定工作,对CPU和内存的压力远小于维护一个包含多帧的滑动窗口。
2.2 ROVIO滤波器的状态向量与递推流程
理解了“为什么用EKF”和“什么是紧耦合”,我们深入到ROVIO的滤波器内部。它的状态向量可以表示为:
[ \mathbf{x} = [\mathbf{x}_\text{robot}, \lambda_1, \lambda_2, ..., \lambda_N]^T ]
其中,(\mathbf{x}_\text{robot}) 是机器人状态,通常包含:
- 位置 (\mathbf{p}_{WI}) (世界系到IMU系)
- 姿态(用四元数 (\mathbf{q}_{WI}) 表示)
- 速度 (\mathbf{v}_W) (在世界系下)
- 陀螺仪零偏 (\mathbf{b}_g)
- 加速度计零偏 (\mathbf{b}_a)
而 (\lambda_i) 就是第 (i) 个特征点的逆深度。注意,这个特征点的三维坐标并不是直接存在于状态向量中,而是通过它第一次被观测到的相机帧的位姿(存储在滤波器外的一个“旧状态”中)和它的逆深度推导出来的。这是一种“锚点”参数化方法,减少了状态维度。
滤波器的运作遵循标准的EKF预测-更新循环:
- 预测步(Propagation):当新的IMU数据(角速度和加速度)到来时,基于IMU的运动模型,对机器人状态(位置、姿态、速度)进行预测。同时,根据IMU零偏的噪声模型,预测其协方差会增大。特征点的逆深度在这个阶段被认为是不变的(静态世界假设)。
- 更新步(Update):当相机图像到来时,对当前图像中跟踪到的特征点进行提取和匹配。对于每一个成功匹配的特征点,计算其在当前相机帧中的像素观测位置(u, v),并与根据当前状态预测的该特征点投影位置进行比较,产生视觉残差。这个残差用于更新整个状态向量(包括机器人状态和所有被观测到的特征点的逆深度)以及对应的协方差矩阵。
这个流程听起来清晰,但工程实现的魔鬼藏在细节里。例如,IMU预测步需要数值积分,常用四阶龙格-库塔法;视觉更新时,特征点的投影涉及到从锚点帧到当前帧的坐标变换,以及相机模型(通常是针孔或鱼眼)的投影函数,这些函数的雅可比矩阵(即线性化)的计算是否正确,直接决定了滤波器的收敛性。
3. 关键工程实现细节与源码级解析
3.1 图像处理与特征管理:效率的基石
ROVIO的实时性,很大程度上得益于其高效且节俭的图像处理策略。它并不像ORB-SLAM那样每一帧都提取数百个ORB特征点,而是采用了稀疏光流跟踪。
特征提取:只在关键帧(或需要补充特征时)提取特征点。ROVIO默认使用FAST角点,因为其计算速度极快。提取后,会进行非极大值抑制,确保特征点在图像上分布均匀,避免扎堆。均匀分布对运动估计的精度和鲁棒性更有好处。
特征跟踪:对于状态中已有的特征点,在下一帧图像到来时,使用金字塔LK光流法进行跟踪。这是一种基于灰度值不变假设的跟踪方法,通过迭代计算特征点在小邻域内的像素位移。金字塔的引入是为了处理大尺度运动,从粗到精地计算光流,提高了跟踪的成功率和范围。
特征管理:这是ROVIO稳定工作的核心逻辑之一,也是源码中值得仔细研究的部分。管理器需要决定:
- 何时剔除特征点:如果特征点跟踪丢失(光流失败)、超出图像边界、或者其逆深度估计的不确定性(协方差)变得过大,就需要将其从状态向量中移除。移除时,需要从状态向量和协方差矩阵中正确地“抠掉”对应的行和列,这是一个容易出错的操作。
- 何时添加新特征点:当跟踪的特征点数量低于某个阈值(例如20个),或者当前图像区域缺乏特征点时,需要提取新的特征点。新特征点初始化时,其逆深度被赋予一个较大的初始方差(表示非常不确定),通常初始值设为平均场景深度的倒数(如1/5米)。它的锚点帧被设为当前帧。
避坑指南:在移植或调试ROVIO时,特征跟踪的失败是首要的排查点。光照剧烈变化、运动模糊、缺乏纹理的区域都会导致光流跟踪大面积失败。工程上可以:
- 增加图像预处理:如直方图均衡化来增强对比度。
- 调整光流参数:如扩大搜索窗口、增加金字塔层数。
- 引入更鲁棒的特征描述子(如Brief)进行短暂匹配,作为光流跟踪失败的补救措施,但这会增加计算量。
3.2 IMU处理与预积分:应对高速与噪声
IMU数据是高频(通常100-1000Hz)且含有噪声的。ROVIO在预测步中直接使用IMU的原始角速度和加速度(减去当前估计的零偏)进行运动积分。这里有两个工程重点:
时间同步与插值:相机和IMU的时间戳必须精确同步。硬件同步是最佳方案。如果做不到,则需要软件对齐。在代码中,通常维护一个IMU数据的缓冲区。当进行到某个相机时刻的状态预测时,需要整合从上一相机时刻到当前相机时刻之间的所有IMU数据。这里涉及到对IMU数据的积分,理想情况下应使用更高精度的积分方法。
IMU噪声参数标定:这是影响滤波器性能的超关键参数。主要包括:
- 陀螺仪和加速度计的噪声密度(
gyr_n,acc_n):描述了传感器白噪声的强度,直接影响预测步中过程噪声的协方差Q。 - 零偏的随机游走噪声密度(
gyr_w,acc_w):描述了零偏随时间随机变化的强度。
这些参数通常可以从IMU数据手册中找到,但“数据手册值”和“实际值”往往有差距。不准确的噪声参数会导致滤波器要么过于“保守”(信任预测,不相信观测,估计滞后),要么过于“激进”(过分信任带噪声的观测,估计抖动)。最可靠的方法是通过采集一段静止的IMU数据,使用Allan方差工具进行标定。
关于预积分的思考:在基于优化的VIO中,IMU预积分是为了避免在优化中重复积分,并分离出与零偏相关的部分。在EKF中,由于是递归滤波,每次预测步都是从最新状态开始积分,所以没有“预积分”的严格概念。但思想是相通的:我们需要高效且准确地计算两个时间点之间的相对运动增量。在ROVIO的实现中,这部分就是标准的IMU动力学方程积分。
3.3 滤波更新与雅可比矩阵:线性化的艺术
EKF的核心是将非线性系统在当前状态估计处线性化。对于ROVIO,非线性主要来自两方面:IMU的运动模型(旋转动力学)和相机的观测模型(投影函数)。因此,正确计算这两个模型的雅可比矩阵(即状态预测和观测预测对状态向量的偏导数)是滤波器正确的数学基础。
运动模型雅可比(F矩阵):描述了从k时刻到k+1时刻,状态误差是如何传递的。它包含了姿态误差(常用扰动角建模)、速度误差、位置误差与IMU噪声、零偏噪声之间的关系。这部分公式复杂但相对标准,许多文献都有推导。在代码中,需要确保旋转部分的雅可比(涉及SO(3)李代数)计算正确。
观测模型雅可比(H矩阵):这是ROVIO实现中更具特色也更易出错的部分。观测是特征点在图像上的像素坐标(u,v)。状态是机器人位姿和特征点的逆深度。H矩阵需要回答:当机器人位姿或特征点逆深度发生微小变化时,投影的像素位置会如何变化?
计算链很长:从特征点在锚点帧下的三维坐标(由锚点帧位姿和逆深度决定)-> 变换到当前世界坐标系 -> 变换到当前IMU坐标系 -> 变换到当前相机坐标系 -> 投影到归一化平面 -> 加上畸变 -> 乘以内参得到像素坐标。每一步都需要求偏导。ROVIO代码中通过自动微分或手动推导实现了这个复杂的雅可比计算。
调试经验:当滤波器发散,或者估计轨迹出现系统性漂移时,在排除了数据同步和特征跟踪问题后,下一步就应该怀疑雅可比矩阵的正确性。一个实用的调试方法是进行数值梯度检验。即,给某个状态量(如某个位置分量)一个微小的扰动δ,分别用观测模型函数计算扰动前和扰动后的投影坐标,用差分 (h(x+δ) - h(x)) / δ 来近似该状态量对应的雅可比矩阵元素。将这个数值梯度与你代码中解析计算的雅可比值进行比较。如果差异显著,就说明你的解析雅可比推导或编码有误。这是定位EKF实现bug的利器。
4. 工程部署实战与参数调试心法
4.1 跨平台移植:从ROS到嵌入式设备
原始ROVIO代码基于ROS框架,提供了良好的传感器驱动和可视化工具。但在实际产品中,我们可能需要将其移植到没有ROS的嵌入式平台(如STM32H7+RTOS,或NX/Orin等嵌入式Linux)。
第一步:剥离ROS依赖。核心是rovio::Filter这个类,它封装了整个EKF状态、预测和更新逻辑。你需要:
- 替换
ros::Time为你的时间源(如std::chrono或平台特定时钟)。 - 替换图像输入。将
cv::Mat格式的图像数据,通过你的相机驱动(如V4L2, MIPI-CSI)直接填充进来。 - 替换IMU输入。从你的IMU驱动(如SPI/I2C读取的原始数据)读取数据,并转换为角速度(rad/s)和加速度(m/s²)。
- 重写输出接口。将估计的位姿、速度等信息,通过串口、网络或共享内存发送给其他模块(如控制器、导航栈)。
第二步:优化计算性能。嵌入式平台算力有限,需要做针对性优化:
- 启用编译器优化:如GCC的
-O3,并针对平台指令集(如ARM Neon)进行优化。 - 简化矩阵运算:ROVIO使用了Eigen库。确保你的Eigen版本开启了向量化。对于固定维度的小矩阵(如3x3, 4x4),使用Eigen的
Matrix3d,Quaterniond等固定尺寸类型,性能优于动态类型。 - 降低特征点数量:这是最直接有效的手段。在纹理丰富的场景,跟踪15-25个高质量特征点足以维持滤波稳定,能大幅减少更新步的计算量(因为H矩阵的行数减少)。
- 调整图像分辨率:将输入图像降采样(如从640x480到320x240),能显著减少光流跟踪的计算量。
第三步:处理线程与时序。ROVIO内部有预测(高频IMU)和更新(低频图像)两个主要过程。在嵌入式实时系统中,你需要精心设计线程:
- 一个高优先级线程或中断服务程序处理IMU数据,只进行状态预测和缓存数据。
- 一个较低优先级线程处理图像,进行特征提取、跟踪和EKF更新。务必保证在处理图像更新时,IMU预测线程不会被长时间阻塞,否则会丢失IMU数据,破坏运动积分。通常使用锁或无锁队列进行线程间数据(如图像、IMU数据包)的交换。
4.2 参数调试:从“能用”到“好用”
ROVIO有一系列配置文件(.yaml或.info)控制其行为。调参是工程应用中最耗时但也最关键的一环。参数可以分为几类:
1. 特征跟踪相关:
maxFeatureNum: 最大跟踪特征数。嵌入式平台建议15-30。patchSize: 用于光流跟踪的图像块大小。太大计算慢,太小易跟丢。通常15x15或19x19是个不错的起点。minDistance: 特征点之间的最小像素距离。避免特征点聚集,建议设为patchSize的1.5倍左右。
2. 滤波器噪声参数(重中之重):
sigma_imu_gyr_noise,sigma_imu_acc_noise: 对应IMU的噪声密度。如果使用普通消费级IMU(如MPU6050),gyr_n可能在1e-3 rad/s/sqrt(Hz)量级,acc_n在1e-2 m/s²/sqrt(Hz)量级。务必根据你的IMU Allan方差标定结果设置。sigma_gyr_bias,sigma_acc_bias: 零偏的随机游走噪声。通常比噪声密度小一个数量级。sigma_init_rho: 新特征点逆深度的初始标准差。假设场景平均深度5米,逆深度0.2,标准差可以设为0.2(即100%不确定性)。这个值设置过小,会让新特征点过于“自信”,可能引入野值;设置过大,则收敛慢。
3. 相机-IMU外参:
q_CI,r_CI: 相机到IMU的旋转(四元数)和平移。必须精确标定!使用Kalibr等工具进行离线标定。微小的角度误差(如1度)在旋转时会导致巨大的像素投影误差。cam_intrinsics: 相机内参和畸变系数。同样需要精确标定。
调试流程建议:
- 静态初始化:将设备静止放置几十秒,让滤波器收敛。观察位置和速度估计是否接近零,姿态是否稳定。如果静态下位置漂移很大,首先检查IMU的加速度计零偏
b_a是否被正确估计。加速度计零偏的误差会直接通过二次积分变成巨大的位置漂移。可以尝试稍微增大sigma_acc_bias,让滤波器更快地学习零偏。 - 简单运动测试:让设备做缓慢的平移和旋转。观察估计轨迹是否平滑,有无跳变。如果旋转时估计轨迹发散,可能是陀螺仪噪声参数
sigma_imu_gyr_noise设置过小,或者相机-IMU外参旋转部分不准确。 - 挑战性运动测试:进行快速运动、晃动。此时特征跟踪容易丢失。如果频繁丢失导致滤波器不稳定,可以尝试:a) 提高图像帧率;b) 使用更快的快门减少运动模糊;c) 略微增大光流的搜索窗口。
核心心法:调参的本质是调整滤波器对“预测”(IMU动力学模型)和“观测”(视觉特征)的信任权重。噪声参数调大,表示你认为这个传感器/模型更不可靠,滤波器会降低它的权重。当运动估计过于平滑但滞后明显(“钝”),可能是过于信任预测(视觉观测噪声设得太大,或IMU噪声设得太小)。当估计结果高频抖动(“抖”),可能是过于信任观测(视觉观测噪声设得太小,或IMU噪声设得太大)。你需要在这两者之间根据实际场景找到平衡点。
5. 典型问题排查与性能优化策略
5.1 滤波器发散:诊断与恢复
滤波器发散是EKF最常见的问题,表现为状态估计误差(协方差)急剧增大或估计值明显违背物理规律(如速度激增)。
诊断步骤:
- 检查数据源头:确认IMU和相机数据流是否连续,时间戳是否单调递增,有无丢帧。检查IMU量程是否饱和(高速旋转下陀螺仪输出是否达到最大值)。
- 检查特征跟踪:可视化跟踪的特征点。是否大面积跟丢?新特征点是否被正确添加到合理的图像区域(避免添加到移动物体上)?光流跟踪的质量直接决定观测更新的有效性。
- 检查创新序列:在EKF中,“创新”(Innovation)是实际观测值与预测观测值之差。理论上,创新序列应该是一个零均值的白噪声。你可以实时监控视觉重投影误差的均值。如果均值持续偏离零,说明观测模型存在系统性误差(如相机内参不准、外参不准、或存在未建模的镜头畸变)。
- 检查协方差矩阵:监控状态协方差矩阵的对角线元素(方差)。如果某个状态(特别是位置或某个特征点逆深度)的方差爆炸式增长,说明系统已经不可观测或线性化完全失效。
恢复策略:
- 紧急重置:最简单的办法是检测到发散后,重置滤波器状态。例如,将位置和速度重置为零,姿态重置为初始值(或从其他传感器如磁力计获取),协方差重置为初始值。这是一种“硬重启”。
- 部分重置:更优雅的方式是只重置出问题的部分。例如,如果判断是特征点深度估计全部失效导致的发散,可以清空所有特征点状态,重新初始化。而保留机器人位姿和速度的估计(假设IMU短时积分还可靠)。
- 增加鲁棒核函数:在计算视觉残差时,对残差应用一个鲁棒核函数(如Huber核),可以降低外点(错误匹配的特征点)对状态更新的影响。ROVIO原始代码中可能没有显式使用,但自己实现一个并不复杂。
5.2 尺度漂移与可观性分析
单目VIO(包括ROVIO)一个固有的问题是尺度不确定性。虽然IMU提供了绝对的加速度测量,可以恢复尺度,但在某些运动下,尺度可能仍然会缓慢漂移,尤其是在长时间缺乏激励(如匀速直线运动)的情况下。
根本原因:从滤波器的角度看,当加速度计零偏b_a和重力加速度方向g以及尺度s之间存在某种耦合时,它们可能不是完全可观测的。例如,在匀速运动阶段,加速度计只测量重力,此时对b_a和俯仰/横滚角的估计会相互影响。
工程缓解措施:
- 运动激励:让设备在初始化及运行过程中,包含足够的旋转和加速度变化,有助于改善可观性。简单的静止初始化往往不是最佳选择。
- 零偏建模与约束:不要将IMU零偏建模为纯随机游走。可以加入一些先验约束,例如假设零偏变化非常缓慢(设置很小的
sigma_gyr_bias,sigma_acc_bias)。或者在静止时段,强制将加速度计读数减去当前b_a后与重力向量对齐,对姿态和b_a进行微调。 - 融合其他绝对尺度信息:如果场景中有已知尺寸的物体(如一张A4纸,一个门框),可以利用这些信息对尺度进行偶尔的校正。或者,如果系统有轮式里程计或GPS(即使频率很低),可以将其作为另一个观测源,以绝对尺度信息更新滤波器,有效抑制尺度漂移。
5.3 在复杂场景下的性能边界与优化
ROVIO在纹理丰富、静态场景、光照稳定的环境下表现最佳。但现实世界是复杂的。
应对动态物体:移动的行人、车辆会导致特征点跟踪在外点,污染状态估计。策略:
- 动态检测:使用简单的光流一致性检查。一个静态场景中的特征点,其光流向量场应该是连续的、符合一个基础矩阵模型的。不符合该模型的点可能是动态点,在更新时给予其极低的权重或直接剔除。
- 语义分割:如果算力允许,运行一个轻量级的语义分割网络(如MobileNet+DeepLab),将“人”、“车”等动态物体类别上的特征点直接屏蔽掉。
应对弱纹理环境:如白墙、走廊。特征点稀少且质量差。
- 补充其他特征:除了点特征,可以考虑引入线特征(在结构化环境中更稳定)。但这需要扩展状态向量和观测模型,工程量大。
- 多传感器融合:这是最有效的方案。引入一个2D激光雷达,即使只有单线,也能提供在走廊等环境下的强约束。可以将激光扫描匹配得到的位移和旋转,作为一个额外的观测源,与ROVIO的EKF进行松耦合或紧耦合。
应对剧烈光照变化:从室内到室外,或经过阴影区域。
- 图像预处理增强:使用自适应直方图均衡化(CLAHE)比简单的直方图均衡化效果更好。
- 特征描述子增强:在光流跟踪的同时,为特征点计算一个简单的描述子(如BRIEF)。当光流因光照变化失败时,可以尝试用描述子进行小范围匹配来恢复跟踪,而不是直接丢弃该特征点。
性能优化终极策略:当在嵌入式平台遇到性能瓶颈,且调整参数无法满足实时性要求时,需要考虑算法层面的简化:
- 降低更新频率:不一定每帧图像都进行EKF更新。可以每2帧或每3帧更新一次,中间帧只进行特征跟踪和IMU预测。
- 简化状态向量:对于某些应用,如果尺度绝对重要且不变,可以将尺度因子固定。或者,如果设备在平面上运动(如扫地机器人),可以简化为2D位姿估计。
- 考虑更轻量的滤波器:如果资源极其紧张,可以考虑信息滤波(EIF)或无迹卡尔曼滤波(UKF)的某些简化变种,但需要权衡实现复杂度和精度损失。
6. 与基于优化方法的对比思考及选型建议
在项目实践中,我们常常面临选择:用ROVIO这类滤波方法,还是用VINS、ORB-SLAM这类优化方法?
计算与资源消耗:
- 滤波(ROVIO):计算复杂度与状态向量维度成线性关系(O(n)),更准确地说,与特征点数量N成线性。内存消耗固定。在Jetson Nano或树莓派4B上,做到20-30Hz稳定运行相对容易。
- 优化(滑动窗口):计算复杂度与窗口内关键帧数量、地图点数量成更高次方关系(Bundle Adjustment的求解)。内存消耗随窗口大小增长。在同等硬件上,要达到高频率(如30Hz以上)需要更多的优化和裁剪。
精度与全局一致性:
- 滤波:本质上是局部最优的。它只维护当前时刻的状态估计,对过去的线性化点不会回头优化。因此,线性化误差会累积,在长路径或大旋转后,误差可能比优化方法大。它没有显式的闭环检测和全局优化。
- 优化:在滑动窗口内进行多次迭代优化,能更好地逼近非线性问题的最优解。通过闭环检测和位姿图优化,可以修正累积误差,实现全局一致性。
鲁棒性与初始化:
- 滤波:EKF对初始值比较敏感,但一旦初始化成功,对连续跟踪的鲁棒性可能更好,因为每一帧都基于前一帧的最优估计进行递推。对于纯旋转等退化运动,只要特征点还能跟踪,滤波器通常不会立刻崩溃。
- 优化:通常需要更精细的初始化过程(如SFM)。在特征跟踪短暂丢失时,可能通过重定位找回,但如果在纹理差、动态物体多的场景连续几帧跟踪失败,整个系统容易丢失。优化方法对异常值更敏感,需要更鲁棒的成本函数(如Cauchy损失)。
工程集成复杂度:
- 滤波:结构相对简单,数据流清晰(预测->更新),易于调试和集成到更大的系统中。状态输出频率高且延迟低。
- 优化:系统更复杂,涉及关键帧管理、地图点管理、闭环检测线程、全局优化线程等,模块间耦合度高,调试难度相对较大。
选型建议:
- 选择ROVIO/EKF方案,如果:你的硬件资源严格受限(MCU或低端嵌入式CPU);你对状态输出的高频(>=100Hz)和低延迟有硬性要求(如高速无人机控制);你的应用场景主要是短时间、局部区域的导航和避障,不需要全局地图和闭环;你希望系统简单、可靠、易于调试和集成。
- 选择优化/滑动窗口方案,如果:你的硬件有足够的算力(如Intel NUC, Jetson AGX Orin);你的任务需要长时间的运行和高精度的全局地图(如移动建图、自动驾驶定位);你的场景包含回环(如仓库巡检、室内清扫);你愿意投入更多时间进行复杂的系统调试和参数整定。
在我个人的多个项目中,对于室内移动机器人(如AMR)、小型竞速无人机,ROVIO因其轻量、高频、低延迟的特性,往往是首选的VIO方案。而对于需要建图、长时间漫游的移动平台,则会选择基于优化的方案。很多时候,没有最好的方案,只有最适合当前项目约束的方案。理解ROVIO的里里外外,不仅能让你用好它,更能让你深刻理解VIO问题的本质,从而在面对其他方案时,也能快速抓住其核心与优劣。