EnhancedMarkovSLAM v1.0 🧠 基于马尔可夫的单目SLAM

C++14 Eigen3 · OpenCV g2o · Pangolin 最后更新: 2026-03-19

一个完整的、模块化的单目视觉SLAM系统,集成了特征跟踪、局部建图、回环检测、图优化和实时3D可视化。核心设计借鉴ORB-SLAM思路,但引入马尔可夫状态估计增强鲁棒性。

📖 概述

EnhancedMarkovSLAM 是为Linux设计的单目SLAM框架。它在传统几何SLAM基础上,使用马尔可夫状态预测提高跟踪稳定性。系统包含以下主要模块:

🎯 Tracking

帧跟踪、运动模型、重定位、关键帧决策。

🗺️ LocalMapping

局部BA、地图点筛选、新点三角化。

🔄 LoopClosing

回环检测、Sim3计算、位姿图优化。

📐 Optimizer

基于g2o的BA、位姿优化、本质图优化。

📍 Map/KeyFrame/MapPoint

核心数据结构,线程安全。

👁️ Viewer

基于Pangolin的实时3D显示。

✨ 核心特性

⚡ 快速开始

运行demo:从摄像头或视频文件实时SLAM

# 编译后执行
./enhanced_markov_slam [video.mp4]    # 不带参数则打开默认摄像头

# 按键: q 或 ESC 退出

最小示例代码 (main.cpp):

#include "MarkovSLAM.h"
using namespace MarkovSLAM;

int main() {
    MarkovSLAMSystem slam;
    cv::Mat K = (cv::Mat_<double>(3,3) << 525,0,320, 0,525,240, 0,0,1);
    slam.SetCameraParameters(K, cv::Mat::zeros(4,1,CV_64F));

    cv::VideoCapture cap(0);
    cv::Mat frame;
    while(cap.read(frame)) {
        slam.ProcessFrame(frame, cv::getTickCount()/cv::getTickFrequency());
        if(cv::waitKey(1)=='q') break;
    }
    slam.Shutdown();
    return 0;
}

📦 编译与依赖

Ubuntu 22.04 / Debian 12

sudo apt install build-essential cmake git \
    libopencv-dev libeigen3-dev libpangolin-dev \
    libg2o-dev libsuitesparse-dev libglew-dev
⚠️ 如果系统没有libg2o-dev,请从源码编译g2o (推荐 2020xx 版本)。Pangolin 需 >=0.6。

CMake 构建

git clone https://github.com/your/EnhancedMarkovSLAM.git
cd EnhancedMarkovSLAM
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
./enhanced_markov_slam

🏗️ 系统架构

MarkovSLAMSystem 聚合所有模块并管理线程:

数据流:FrameTrackingKeyFrameLocalMapping / LoopClosingMap 更新 → Viewer

🎯 跟踪模块 (Tracking)

核心类 Tracking,负责每帧处理、初始化、跟踪、重定位。

状态机

NOT_INITIALIZED → INITIALIZING → TRACKING ↔ LOST

关键方法

bool ProcessFrame(const cv::Mat& image, double timestamp)

提取ORB特征,根据当前状态执行初始化、运动模型跟踪、参考关键帧跟踪或重定位。

初始化 (单目)

使用两帧匹配,通过 ReconstructWithHReconstructWithF 恢复位姿并三角化初始地图点。

运动模型

relative_motion_ 预测当前帧位姿,加速匹配。

🗺️ 局部建图 (LocalMapping)

独立线程处理新插入的关键帧:

🔄 回环检测 (LoopClosing)

目前为简化版,接口已预留。实际可扩展为基于词袋或外观的检测。

📐 优化器 (Optimizer)

封装g2o优化:

void BundleAdjustment(const vector<KeyFrame>& kfs, const vector<MapPoint>& pts, int iter)

全局BA,固定第一帧。

int PoseOptimization(shared_ptr<Frame> frame)

仅优化当前帧位姿,返回内点数量,使用鲁棒核函数。

void OptimizeEssentialGraph(const vector<KeyFrame>& keyframes)

优化Sim3位姿图,用于回环校正。

📐 三角化 (Triangulator)

纯静态工具类:

📌 关键帧 (KeyFrame)

继承自 Frame,增加:

重要方法:UpdateConnections() 基于共视地图点更新边。

📍 地图点 (MapPoint)

核心属性:世界坐标、观测关系、代表性描述子、坏点标记。

👁️ 可视化 (Viewer)

基于Pangolin的3D查看器,独立线程运行。绘制:

🧰 工具集 & 全局参数 (Common)

Utils 命名空间提供坐标变换、重投影误差、本质矩阵分解等。

Parameters global_params 可动态调整:

struct Parameters {
    int num_features = 1500;
    float max_reprojection_error = 12.0f;
    float min_parallax = 0.2f;          // 度
    float min_triangulation_dist = 0.05f;
    float max_triangulation_dist = 100.0f;
    // ... 见 Common.h
};

💡 示例:自定义数据集

#include "MarkovSLAM.h"
using namespace MarkovSLAM;

int main() {
    MarkovSLAMSystem slam;
    // TUM 相机参数
    cv::Mat K = (cv::Mat_<double>(3,3) << 535.4,0,320.1, 0,539.2,247.6, 0,0,1);
    slam.SetCameraParameters(K, cv::Mat::zeros(4,1,CV_64F));

    std::vector<std::string> images = loadImagePaths("rgb.txt");
    std::vector<double> timestamps = loadTimestamps("rgb.txt");

    for(size_t i=0; i<images.size(); ++i) {
        cv::Mat frame = cv::imread(images[i]);
        slam.ProcessFrame(frame, timestamps[i]);
        if(slam.GetCurrentPose() != Eigen::Matrix4d::Identity()) {
            auto pos = slam.GetCurrentPose().block<3,1>(0,3);
            printf("Frame %zu: x=%.2f y=%.2f z=%.2f\n", i, pos.x(), pos.y(), pos.z());
        }
        cv::waitKey(20);
    }
    slam.Shutdown();
    return 0;
}

⚙️ 关键配置参数 (Common.h)

参数默认值说明
num_features1500每帧提取ORB特征数量
min_tracked_points10跟踪至少需要的点
max_reprojection_error12.0重投影误差阈值(像素)
min_parallax0.2°三角化最小视差
min_triangulation_dist0.05m最近三角化距离
max_triangulation_dist100m最远三角化距离

🔍 故障排除

初始化失败/长时间不跟踪 确保相机缓慢移动且有足够纹理。检查相机内参是否正确。
编译找不到g2o 确保安装g2o并设置-DCMAKE_PREFIX_PATH,或使用CMake选项-DG2O_ROOT
可视化黑屏 检查Pangolin是否支持OpenGL,尝试降低窗口分辨率。
地图点很少 增大min_parallax或减小max_reprojection_error,确保三角化点质量。

📊 性能调优建议

📝 更新日志

版本 1.0.0 (2026-03-19)

版本 0.9.0 (2026-02-01)

⚖️ 许可证

MIT License

Copyright (c) 2026 EnhancedMarkovSLAM Contributors

允许自由使用、修改、分发,包括商业用途,需保留版权声明。

© 2026 EnhancedMarkovSLAM · 文档生成于 2026-03-19 · 基于实际代码