尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

视觉惯性组合导航从原理到实践:无人系统开发验证平台搭建指南

视觉惯性组合导航从原理到实践:无人系统开发验证平台搭建指南 如果你最近在搞无人机、机器人或者车载平台你应该会注意到一个趋势以前大家做自主定位首选RTK、激光雷达或者纯视觉方案但现在越来越多的团队开始把“视觉 惯性”作为标配也就是视觉惯性组合导航。我做这个方向也有一些时间了从最初的VIO算法学习到后来搭建完整的无人系统验证平台踩了不少坑也积累了一些能直接用在项目里的实践方法。这篇内容我打算从应用优势、技术类别说起再把一套视觉惯性组合导航无人系统开发验证平台的完整构建思路分享出来重点是让正准备入门或者刚搭过一半系统的朋友少走点弯路。视觉惯性组合导航的本质是用相机捕捉丰富的环境纹理用IMU捕捉高频的角速度和加速度两者结合互相弥补缺陷。相机在弱纹理、光照突变、快速运动时会失效IMU则会在长时间运行后因为积分漂移彻底偏离真实位置。单独用其中一个都不会有好的长期鲁棒性组合起来才能既有短时间的稳定性又有长时间的低漂移。这套思路放在无人系统上直接决定了设备能不能在没有外部定位信号的环境里完成自主飞行、自主行走和精准停靠。这篇内容适合三类读者打算在企业里选型的工程师做算法研究需要系统化验证的研究生还有想把VIO从“能跑demo”推进到“能稳定交付”的开发团队。我不会堆公式重点讲清楚原理和工程落地的关键环节文末会给出我实际搭建和调试平台时的常见问题与排查表希望能帮你把立项到验证的时间压缩一半以上。1. 视觉惯性组合导航的核心应用优势为什么非“视觉惯性”不可很多刚接触这个领域的人会问一个问题现在相机分辨率越来越高算力也越来越强为什么不能只用视觉做定位答案是视觉本质上是“相对测量”它没有绝对尺度单目时而且在快速旋转、运动模糊、无纹理墙面、光线剧变这些场景下鲁棒性会大打折扣。IMU虽然短期精度很高不受光线影响但它的加速度计和陀螺仪都有零偏零偏随时间积累导致速度估计发散、位置漂移几秒钟内看起来没问题跑上几十秒就完全不能看了。两者的互补性非常清晰。视觉负责低频高精度的位置修正把IMU因为积分累计出来的误差定期“拉回来”IMU负责高频的姿态和短时间平滑把视觉帧与帧之间因为运动过快导致的匹配失败、时间戳间隔问题“填平”。视觉惯性组合导航的优势可以从下面几个维度来看。1.1 场景覆盖能力大幅提升单一视觉方案在走廊、隧道、室内、夜晚这些无GPS环境下很难独立工作而组合导航只要环境里还有一点点视觉特征加上IMU的支撑就能维持系统的姿态和位置估算。我实测过在一个几乎没有纹理的白墙走廊里走路纯视觉VIO几乎在起步阶段就会丢特征点但有了IMU约束后依靠重力和陀螺仪依然能维持几秒到十几秒的稳定位姿等转到下一个有明显特征的区域再恢复视觉定位。这种能力对轮式机器人和无人机在室内作业非常关键。1.2 定位频率和实时性明显提升工业相机一般跑30帧/秒IMU原始数据则能到200Hz到1000Hz。如果只依赖相机做位姿估计控制系统的延迟会达到30毫秒以上对于高速飞行的无人机来说这个延迟是灾难性的。视觉惯性组合导航的常见做法是IMU作为预测端高频输出位姿相机作为更新端低频修正。这样系统输出的位姿频率可以达到200Hz以上直接喂给飞控、底盘控制延迟和反馈平滑度都有质的改善。1.3 抗干扰与自主能力增强磁力计在室内或者电机大电流供电时读数会被严重干扰GPS在城市峡谷、室内厂房、桥洞下基本瘫痪。视觉惯性组合导航不依赖外部信号是一种完全自主的感知方案配合一些轻量级的回环检测还可以实现对历史轨迹的闭合消除累计误差这在建图和长期定位任务里非常有用。1.4 硬件成本可控部署门槛低相比激光雷达方案视觉惯性组合导航的传感器成本可以压到几百到两千元人民币以内。消费级双目相机加一个内置IMU的飞控板已经可以稳定跑出厘米级到分米级的相对定位精度。对量产型机器人产品来说这套方案在性能和成本之间找到了很好的平衡点这也是近两年扫地机器人、割草机器人、配送无人车纷纷切换到这个方向的原因之一。2. 视觉惯性组合导航的主要类别与选用思路了解完优势之后接下来就是选型。业内对视觉惯性组合导航有很多分类方式我建议从两个维度来理解融合深度和状态估计方法。融合深度决定系统结构的复杂度状态估计方法决定系统的精度和计算代价。这两者搭配起来基本能覆盖市面上所有主流方案。2.1 融合深度松耦合与紧耦合松耦合是最早期也比较容易理解的方式。视觉模块先独立解算出位姿IMU也先独立进行惯导解算最后通过卡尔曼滤波或者简单的加权融合将两个结果合并成一个输出。这种方式的好处是模块化强、调试方便视觉和惯导可以分头维护和升级缺点是误差会提前在视觉模块内部产生IMU的原始数据被没有充分利用系统的整体精度天花板很低。现在市面上很多车载组合导航产品还保留了松耦合的架构因为它们的视觉模块本身已经非常成熟只需要和IMU做一个相对简单的融合就能满足车道级导航需求。紧耦合则在底层就把视觉特征点和IMU原始测量数据放进同一个优化或者滤波框架里利用IMU在帧间提供运动约束同时用视觉特征点提供几何约束两者互相修正、联合估计。这种方案精度上限高、鲁棒性好是当前视觉惯性SLAM/VIO的主流架构也是VINS-Mono、ORB-SLAM3、OpenVINS等开源项目采用的方案。代价是计算复杂度更高、系统耦合度更强调试和排错门槛也高一些。除非你的项目对精度要求很苛刻否则不建议在初期直接上紧耦合而是先跑通整个系统链路再逐步替换算法。2.2 状态估计方法滤波与优化在紧耦合内部还可以根据状态估计手段分成滤波法和优化法。滤波法的代表是MSCKF多状态约束卡尔曼滤波。它的核心思想是维护一个滑窗内的多个相机状态把IMU的传播和相机观测统一放进扩展卡尔曼滤波器EKF中处理。这个方案计算量相对较小适合嵌入式平台很长一段时间里是移动设备视觉惯性里程计的首选。OpenVINS就是MSCKF的现代开源实现。它的缺点是EKF的线性化点固定长时间运行或者运动剧烈时容易出现线性化误差累积。优化法以VINS-Mono、ORB-SLAM3为代表采用因子图Factor Graph或滑动窗口束调整Bundle AdjustmentBA的方式反复迭代优化位姿和地图点。这个思路在精度上通常优于滤波法尤其是在有明显回环的场景下能通过全局优化把漂移控制得比较低。缺点是计算量偏大在算力有限的小型无人系统上需要做一些剪枝策略比如限制滑窗大小、降低特征点数量、使用IMU预积分加速等。类别估算方法代表开源方案精度算力需求适合场景松耦合加权融合/残差补偿车载组合导航中低车道级定位、工业车辆松耦合EKF简易UAV导航中低低成本飞控增强紧耦合EKF滤波MSCKF/OpenVINS中高中嵌入式实时平台紧耦合非线性优化VINS-Mono/ORB-SLAM3高高无人机、机器人科研学习型端到端网络为近期热点方向中高极端退化场景研究2.3 主流开源方案的实际对比与选型建议VINS-Mono是香港科技大学开源的单目视觉惯性系统支持在线标定、回环检测、全局位姿图优化非常适合用来学习紧耦合的核心架构。它的代码结构清晰中文资料丰富是目前国内团队入门视觉惯性组合导航的首选。我的经验是先在VINS-Mono上跑通EuRoC数据集理解它的IMU预积分公式和前端的特征跟踪逻辑再根据自己的硬件条件替换传感器和标定流程这样上手速度最快。ORB-SLAM3延续了ORB-SLAM系列的优秀工程实践支持单目、双目、RGB-D以及惯导模式。它的视觉前端用了ORB特征配合DBoW2词袋做回环系统鲁棒性很强。但它的代码量比较大模块间耦合度较高对新手来说直接读源码压力不小。如果你已经有SLAM基础想找一个“生产级可用”的视觉惯性系统来扩展ORB-SLAM3会更合适。OpenVINS是MSCKF的开源实现专为研究而设计代码紧凑论文复现方便。如果你要在嵌入式设备上部署尤其要用小算力跑实时视觉惯性我建议优先研究OpenVINS。它的状态管理方式和特征更新策略都很工程化对资源受限的无人系统很有参考价值。还有一类比较前沿的方向是用深度学习做视觉惯性融合比如用循环神经网络RNN或者图神经网络替代传统状态估计模块直接从图像序列和IMU序列中回归位姿。这类方法在设计思路上很吸引人对光照变化和纹理缺失的鲁棒性可能更好但目前的落地难点在于泛化能力不够、对训练数据的依赖非常大而且可解释性不强。如果你做的是产品化项目我不建议在核心定位模块上赌这类方案但在前沿研究和课题申请中使用会很有亮点。2.4 选型逻辑小结我的选型建议可以概括成一句话先看算力预算再看精度需求最后看团队基础。算力有限且精度要求一般在分米级以内直接上OpenVINS这个Filter类方案算力充足且精度要求高优先上VINS-Fusion或者ORB-SLAM3如果是纯粹做产品原型验证不想在算法上投入太多人力可以考虑松耦合的产品级集成方案把精力放在系统集成和应用逻辑上。视觉惯性组合导航没有绝对的好坏只有是否匹配你的当前约束。3. 一种视觉惯性组合导航无人系统开发验证平台搭建全过程理论和算法聊完了这一部分我重点分享我搭建的一套视觉惯性组合导航无人系统开发验证平台。这套平台的定位不是某个具体产品而是一个通用的算法验证和性能评估环境可以适配轮式机器人、四旋翼无人机等多种载体方便在室内外不同场景下测试视觉惯性组合导航的精度、鲁棒性和实时性。3.1 系统架构与平台设计思路整套平台自上而下分成四个层次载体层、传感层、计算层、评估层。载体层是实际的运动平台我用了底盘带编码器的轮式机器人和一台小型四旋翼方便对比不同运动特性下视觉惯性系统的表现传感层包括双目相机、IMU、GPS/RTK模块作为参考真值、激光雷达可选计算层是板载计算机负责运行视觉惯性算法、实时控制和数据记录评估层是离线的Python工具链用来比对估计轨迹与真值轨迹生成误差指标和可视化图表。在设计这套平台时我给自己定了几个硬性要求传感器时间戳必须统一、采集软件必须支持多传感器同步记录、算法模块必须支持实时运行和离线回放两种模式。前两个要求是关于数据质量的第三个要求是关于算法调试效率的。如果你也打算搭建类似平台我强烈建议一开始就把这三个问题考虑进去不然后面每次采集数据都会遇到时间戳对不上、数据包格式混乱这种让人非常崩溃的问题。3.2 传感器硬件选型与关键参数平台的核心传感器组合是一台双目全局快门相机型号选择的是某厂商的工业级双目模组固定在机器人前端出厂自带双目外参标定参数。IMU选用的是某款内置在板卡上的6轴惯性传感器零偏稳定性大约在10度/小时以内支持最高1000Hz输出。相比消费级手机里的IMU这类传感器在温度变化和振动环境下表现更稳定。相机分辨率我设置为640×480帧率30fps。你可能觉得这个分辨率太低但实际上对视觉惯性导航来说高分辨率并不一定带来高精度。分辨率越高特征提取和匹配的计算量越大处理延迟也越难控制另一方面高分辨率下的运动模糊和卷帘快门效应会更明显反而伤害位姿估计的稳健性。640×480这个分辨率配合全局快门在室内外常见场景下已经能提供足够的特征点和稳定的图像质量。除了相机和IMU参考真值系统我用了RTK在开阔环境下静态定位精度能到2厘米左右。室内测试时我会用运动捕捉系统或者高精度激光雷达建图结果作为替代真值。需要注意的是不同真值系统的坐标系基准不一样评估前必须做好坐标系对齐否则误差分析会得出错误结论。3.3 软硬件时间同步与数据采集时间同步是视觉惯性组合导航工程化的第一道坎。相机图像有硬件触发信号或曝光时间戳IMU则有自己的内部定时器。如果两者时间基准不一致算法里运动补偿和状态更新的时序就会错乱精度会暴跌。我在平台上采用的方案是由计算板上的同步控制器为相机提供硬件触发脉冲同时将触发时刻对应的系统硬件时间戳写入图像元数据IMU则通过SPI或者串口连续输出数据并由同一硬件定时器打上时间戳。这样相机和IMU的时间基准都被同步到同一个主时钟上时间偏差控制在亚毫秒级。对于还没有硬件同步模块的朋友可以用软件同步的方式通过NTP或PTP协议校时并用线性插值把IMU数据对齐到相机时间戳。这种方式精度不如硬件同步但作为起步验证完全够用VINS等开源算法对时间戳偏差也有一定的容忍度。数据采集软件我用ROS搭建录制rosbag包把相机图像、IMU数据、真值轨迹、控制指令都存成统一话题。使用rosbag的好处是离线复现和算法调试非常方便开发时可以先录一段数据然后在桌面上反复回放调整算法参数不用每次都重新跑真机这对迭代速度的提升非常明显。3.4 标定流程外参与零偏的坑没有好标定就没有好定位。视觉惯性组合导航对三个标定环节特别敏感相机内参标定、相机与IMU外参标定、IMU内参标定。相机内参我使用Kalibr工具完成。流程是打印一张非对称棋盘格标定板调整标定板在相机视野中的位置和角度采集大约一到两分钟的图像和IMU数据然后运行Kalibr完成相机内参和畸变参数的估计。这里有个细节不要只在正对着相机的位置采集标定板要把标定板放在视野边角、不同距离和不同俯仰角度这样能提供更充分的约束畸变参数估计才可靠。相机与IMU外参标定同样用Kalibr联合标定。把标定板放置在多个位置传感器平台缓慢改变姿态让IMU的加速度计和陀螺仪持续感受到激励。这个过程看似简单但失败率很高。如果采集时运动过快或者静止时间太长标定结果很容易不收敛。我自己的经验是每个姿态大约保持0.5到1秒整体采集2到3分钟运动中尽量覆盖俯仰、横滚、偏航三个轴向的转动不要只在一个平面内转动。IMU内参标定主要是估计零偏和噪声密度我用的是imu_utils工具包采集6小时静止数据来统计长期零偏特性。实际部署时不需要常做一般出厂一次即可。值得提醒的是IMU的零偏会随温度变化工业级IMU有温控机制还好消费级IMU在环境温度变化大的场景下实际零偏和标定值会明显不一致这也是有些系统白天正常、晚上精度变差的原因之一。3.5 核心算法模块实现细节平台运行的视觉惯性组合导航算法是我在VINS-Fusion基础上做了改造的开源版本。主要改造点有三个一是支持了外部时间戳对齐和传感器中断信号的输入让算法能和平台的硬件同步机制配合二是增加了退化场景检测当视觉特征数量不足或者光流中值过大时主动降低视觉权重、提高IMU权重避免系统在恶劣视觉条件下被“带偏”三是增加了轨迹评估结果的实时输出方便在真机上直接看到当前定位误差。在VINS-Fusion启动后系统会先进入初始化阶段。初始化时视觉部分通过本质矩阵或者单应矩阵估计初始旋转IMU部分则通过静止或者加速度观测估计重力方向和初始零偏。初始化质量直接影响后续定位我见过很多工程案例因为初始化时抖动过大或相机视野太暗导致系统启动后几十秒内位姿发散。要避免这个问题启动前最好让无人系统保持静止或非常缓慢运动并确保相机朝向具有充足纹理的区域。系统运行中核心线程包括前端光流跟踪、IMU预积分、滑动窗口非线性优化、回环检测与全局优化。前端光流跟踪使用的是Lucas-Kanade金字塔光流跟踪速度比ORB特征快很多但在快速运动和光照突变时容易丢点。为了平衡速度和鲁棒性我把关键帧之间的光流跟踪窗口设为三层金字塔同时每隔一段时间强制提取一次新的FAST角点确保特征点均匀分布。滑动窗口内的非线性优化是整个算法最耗计算量的部分。我限制窗口大小为10帧每次边缘化掉最老的帧通过Ceremain Solver做增量求解。在Jetson Orin NX平台上这个优化过程大约消耗8到12毫秒加上前端处理总体帧率可以稳定在30Hz以上CPU占用率在60%到80%之间余量虽然不算很大但足够支撑实时控制。3.6 性能评估指标体系评估一套视觉惯性组合导航系统的表现不能只盯着一张轨迹图看感觉。我通常使用绝对轨迹误差ATE和相对位姿误差RPE两个指标配合不同运动速度、不同场景下的误差分布来做判断。ATE衡量的是整体轨迹与真值的全局偏差直观反映定位精度的“总体水平”RPE则主要是衡量每米或每个时间段的局部误差适合评估系统短时漂移特性。离线评估我用的是evo工具支持TUM和EuRoC格式的轨迹文件读入、自动时间对齐、尺度修正和绘图。对比视觉惯性算法和真值轨迹前需要先做位姿对齐一般使用Umeyama算法求解两个轨迹之间的相似变换把算法轨迹“嵌入”到真值坐标系里。如果做VIO没有回环只做6自由度刚体变换对齐即可如果做SLAM带回环可以再做一次完整相似变换把尺度误差也暴露出来。指标计算方式重点关注ATE (m)对齐后轨迹逐点位姿差全局累计漂移RPE (m/s)固定时间间隔的位姿差局部平滑和稳定性EPE (m)末端定位误差起点终点一致性时间同步误差(ms)相机/IMU时间戳差数据链路质量3.7 场景测试与结果分享搭建完成后我在室内办公室、室外草地、地下车库三种典型场景下分别进行了测试。室内办公室有丰富的纹理和明显的闭环路径视觉惯性组合导航表现最好50米往返距离末端误差大约0.15米。室外草地场景中草地纹理周期性很强前端光流容易出现歧义匹配加上地面不平带来的高频振动RPE明显变大50米路径末端误差大约0.5米。地下车库光线较暗部分区域几乎无纹理视觉特征数量一度降到几十个系统主要靠IMU维持位姿30米直线路径末端误差接近0.8米但也没有发散这说明IMU约束起到了预期效果。三组数据给我的启发是视觉惯性组合导航在中等纹理、稳定照明条件下精度最可靠在暗光、弱纹理和强振动环境下系统会退化为接近于纯惯导状态精度下降是正常的。工程上要做的是提前识别这种退化在算法里给出置信度输出让上层控制模块根据置信度调整速度、路径或者切换到其他定位源而不是指望单一方案在极端场景下还保持高精度。4. 常见问题与排查技巧实录这一部分我整理了在实际开发中反复遇到的几类问题。这些坑在论文里基本不会写但如果你做真机测试几乎都会碰上。我把问题现象、排查思路和解决办法整理成速查表方便照着排查。4.1 时间戳不同步导致精度大幅下降现象是算法整体能跑但轨迹严重抖动回环检测频繁但优化后仍然有很明显的锯齿形路径。排查第一步是检查rosbag里的相机话题和IMU话题消息时间戳。我用一个小脚本统计两个话题的时间差发现相机曝光时间戳与IMU数据时间戳经常相差几十毫秒。原因是相机驱动的发布端和IMU驱动发布端各自调用了不同的时钟源没有统一到系统时钟。解决方法是重写传感器驱动将相机曝光回调的时间统一由主控板系统时钟打戳并在相机元数据里记录触发时刻IMU则在读取到FIFO数据的瞬间就读取系统时钟打戳。调整后时间戳偏差降到1毫秒以内算法精度恢复到了预期水平。4.2 初始化容易失败或初始轨迹扭曲很多开发者在室内暗光环境或者快速启动时会遇到系统初始化失败或者启动后轨迹出现明显扭曲。原因多半是初始化阶段IMU数据不够“干净”相机视野里也没有足够的特征点用于估计初始位姿。解决办法是要求系统在启动前进行1到2秒的静止或缓慢平动并让相机正对纹理较丰富的区域。IMU初始化完成后再开始运动路径成功率会提高很多。4.3 快速旋转和扫射运动导致光流丢失快速旋转时图像模糊和特征点快速移出视野是光流丢失的主要原因。我尝试过两种优化一是使用ROI限制光流搜索范围并增大金字塔层数二是增加IMU旋转补偿在光流跟踪前用IMU陀螺仪的积分值做图像坐标的旋转预估将搜索中心从原位置移动到旋转后的预测位置。第二种方案效果明显但要注意IMU零偏带来的旋转预估误差会在图像边缘放大所以还是要限制最大搜索半径。4.4 回环检测不稳定或误回环当平台经过相似的走廊、重复纹理区域时容易出现误回环。误回环会让优化后的轨迹出现“拉变形”的异常。排查时先看回环候选帧的DBoW匹配得分和几何验证内点率如果得分高但内点率低大概率是感知别名问题。我在工程里增加了共视区域比例约束要求候选帧和当前帧在词袋匹配之外还要有超过15%的图像区域重叠才会触发几何验证误回环率下降了很多。4.5 算力占用过高导致嵌入式平台发热降频Jetson平台跑紧耦合优化加回环时如果全负荷长时间运行很容易触发降频从而引起延迟升高和精度下降。我的经验是给算法进程分配合适的CPU核心并利用jetson_clocks锁定高功耗模式在算法侧减少局部优化频率从每一帧都优化改为每两帧优化一次同时增加关键帧筛选阈值减少无效关键帧。这样预计能节省25%到40%的计算量对精度影响很小。4.6 问题排查速查表现象可能原因快速排查解决办法轨迹抖动时间戳不同步统计话题时间差统一打戳到系统时钟初始化失败IMU激励不足/纹理弱查看初始化日志保持静止2秒再运动快速运动丢点光流搜索范围不足打开光流跟踪调试显示IMU旋转预补偿金字塔加深误回环感知别名查看内点率/得分增加共视区域约束精度突然变差温度导致IMU零偏变化对比冷热启动误差运行中标定/温度补偿计算延迟高优化频率过高查看线程耗时降低优化频率/限制窗口5. 后续可以继续扩展的方向平台搭好之后后续可以扩展的方向非常多。比较实用的一个方向是加入视觉里程计辅助的动态物体滤除通过IMU和视觉的互相校验把场景中运动的人、车等动态物体识别出来从而避免它们污染地图和定位。另一个方向是引入多源融合在视觉惯性基础上叠加轮速计、磁力计或气压计形成更完整的组合导航系统这在轮式机器人和地面无人车上尤其有价值。再往深处走还可以把回环检测和语义地图结合起来在视觉惯性组合导航输出的位姿基础上增量构建一个带语义标签的二维或三维地图让导航模块不只获得“我在哪”还能知道“我看到了什么”。这个方向对后续的导航规划和任务决策非常有帮助也是产品从“能走”进化到“能干活”的关键一步。最后一点心得是视觉惯性组合导航的难点从来不在某一个算法点而是在系统的整体一致性上包括时间戳、标定、传感器配置、运动模式和场景约束。把平台各个模块的接口和评估体系标准化比单独调优某一个模块更值得投入时间。有了稳定的验证平台你才能系统地观察算法改良带来的真实收益而不是靠感觉调参数。希望这次分享能给正在搭建视觉惯性组合导航系统的团队一些参考也欢迎大家在实际调试中总结更多的排坑经验一起交流。
返回列表