为什么orb-slam系列、VINS系列不能稠密建图
1. ORB-SLAM系列
ORB-SLAM2和ORB-SLAM3建图环节输出稀疏点云地图,无法直接生成稠密重建结果。
1.1 稀疏重建的核心原因
ORB-SLAM系列算法核心目标是实现 高精度、鲁棒的实时定位,而非稠密几何重建。通过高效提取ORB特征点(FAST角点+BRIEF描述子)实现快速匹配,仅维护关键特征点的三维坐标。这种设计源于三重约束:(1)实时性要求——稠密处理全图像素会导致计算量指数增长(如ORB-SLAM2单关键帧处理需385ms);(2)传感器限制——单目/双目仅能恢复特征点深度,RGB-D数据也未用于稠密重建;(3)架构设计——线程分工(跟踪/局部建图/回环)均围绕稀疏特征优化,未集成深度图融合或曲面重建模块。
1.2 从代码层面分析ORB-SLAM为什么是稀疏建图
(1)前端跟踪 (Tracking Thread)
-
在
Tracking::Track()函数中,核心任务是提取ORB特征点(ORBextractor),然后在上一帧或参考关键帧中找到这些特征点的匹配。 -
它只处理这些被成功提取和匹配的、数量有限(通常几百到一千多)的角点,图像中的大片平滑区域、边缘等信息被完全忽略。
-
相机位姿是通过最小化这些稀疏特征点的重投影误差来计算的(
Optimizer::PoseOptimization)。
(2)局部建图 (LocalMapping Thread)
-
当一个关键帧被创建并送入
LocalMapping::Run()后,系统会处理这个关键帧中的特征点。 -
核心函数
LocalMapping::CreateNewMapPoints()会遍历当前关键帧的特征点,并尝试与它共视程度最高的其他关键帧中的对应点进行 三角化(Triangulate),以恢复出三维空间点。 -
只有那些能够被成功三角化并且满足一系列几何约束(如视差角、深度等)的特征点,才会被创建为一个新的
MapPoint对象,并加入到全局地图mpMap中。
(3)核心数据结构 (MapPoint 和 KeyFrame)
-
MapPoint类 是地图的基本单元。它存储的是一个三维点的坐标、平均观测方向、描述子等信息。整个地图就是由一个std::set<MapPoint*>来管理的。 -
地图的规模完全取决于被成功三角化并持续跟踪的特征点的数量,而不是图像的像素数量。代码中没有任何处理稠密像素或深度图的逻辑。
1.3 为什么需要稀疏建图
ORB--SLAM并是不为了稀疏建图,我们需要的只是三维的地图点,这些三维地图点帮助我们优化位姿态、确定回环,并在跟踪失败的时候进行重定位。所谓的稀疏地图只是可视化了这些三维地图点,实际上我们只是构建了一个相对结构,完全不是为了建图。
2. VINS-Mono / VINS-Fusion
VINS系列是“紧耦合的视觉-惯性里程计”,其核心是状态估计,视觉部分同样是基于稀疏特征。
2.1 从代码层面分析VINS为什么是稀疏特征点
(1)前端视觉跟踪 (feature_tracker节点)
-
这个节点的作用是从每一帧图像中提取FAST角点(
cv::goodFeaturesToTrack)。 -
然后使用KLT光流法(
cv::calcOpticalFlowPyrLK)来跟踪这些角点在连续帧之间的运动。 -
它只输出这些被跟踪的、稀疏的角点及其在图像中的像素坐标。同样,图像的绝大部分信息被丢弃了。
(2)后端优化 (vins_estimator节点)
-
后端维护一个滑动窗口(Sliding Window)内的相机状态(位姿、速度、IMU偏置)和三维特征点位置。
-
其Cost Function由两部分构成:IMU预积分残差和视觉重投影残差。
-
关键在于,视觉重投影残差的计算只依赖于前端送来的那些稀疏特征点。优化器调整相机位姿和三维点的位置,使得这些三维点重新投影到各个观测帧上的像素坐标与其实际被跟踪到的像素坐标尽可能接近。
-
在
Estimator::processImage()函数中,它将跟踪到的特征点打包成测量(measurement),然后送入非线性优化器(Ceres Solver)求解。
(3)建图的本质
-
在VINS中,“地图点”就是滑动窗口内那些被用于优化的三维特征点。
-
当一个特征点滑出窗口时,它通常就被丢弃了(除非有特殊处理,如存储用于闭环)。系统不会,也没有机制去利用这些信息构建一个全局稠密的地图。
-
它的首要任务是利用这些特征点作为“锚点”来约束IMU的积分漂移,从而获得精确的运动估计。建图本身不是目的。
3. 稀疏与稠密重建的技术对比
4. 定位与稠密建图
视觉SLAM中的mapping是一个非常广义的概念,例如:
- ORB-SLAM生成的稀疏点云地图:由少量、但具有代表性的三维特征点(Landmarks)组成,这种地图仍是服务于定位;
- LSD-SLAM生成的半稠密地图:重建图像中梯度变化明显的区域,如物体的边缘和轮廓线,这种地图有助于进行一些基础的避障,但计算开销又远小于稠密建图;
- 稠密地图:例如ElasticFusion、Kintinuous、以及所有基于TSDF的重建方法,构建出与真实世界表面几乎完全一致的三维模型,可以是稠密的点云、体素栅格(Voxel Grid)或者三角面片,这种地图目的就是高保真地复现整个环境;
- 语义地图:这通常是一个结合了SLAM、深度学习和目标检测的复杂系统。在几何地图(可以是稀疏、半稠密或稠密)的基础上,为地图中的物体赋予语义标签。 这种地图可以实现高级人机交互与任务规划。它不仅告诉机器人“这里有一个障碍物”,还能精确告诉它这是什么:“这是一把椅子”或者“这是一扇门”。
我认为定位与稠密建图完全是两个部分,定位算法计算地图点的目的也是为了精确计算位姿,如果真的想实现稠密建图,需要的是完全不同的算法,需要融合精确的前端相机位姿和后端的稠密建图算法,是在定位的基础上进行的,比定位更麻烦。
更多推荐



所有评论(0)