cheng-chi/ORB_SLAM3:gopro_slam


处理流程

这个 gopro_slam.cc 文件是一个专门处理 GoPro 视频的单目惯性 SLAM 程序。以下是它的核心流程:

核心流程概述

1. 初始化阶段

  • 命令行参数解析:使用 CLI11 库解析输入参数
    • 词汇表文件、设置文件、输入视频、IMU 数据等
  • 加载遥测数据:从 JSON 文件中读取 GoPro 的 IMU 数据(加速度计和陀螺仪)
  • 创建 SLAM 系统:初始化 ORB-SLAM3 系统,配置为单目惯性模式

2. 视频处理循环

for (int frame_idx = 0; frame_idx < nImages; frame_idx++) {
    // 1. 计算当前帧时间戳
    double tframe = (double)frame_idx / fps;
    
    // 2. 读取视频帧
    cap.read(im);
    
    // 3. 图像预处理(调整大小、应用掩码)
    
    // 4. 收集IMU数据(从上一帧到当前帧的所有IMU测量)
    
    // 5. 调用SLAM系统处理
    auto result = SLAM.LocalizeMonocular(im_track, tframe, vImuMeas);
    
    // 6. 检查跟踪状态,丢失帧超过阈值则退出
}

这个程序本质上是一个离线视频处理工具,将 GoPro 录制的视频和 IMU 数据输入 ORB-SLAM3 系统,输出相机的运动轨迹,常用于机器人导航、增强现实或 3D 重建应用。

输出文件

1. save_map (地图保存)

内容

  • 完整的地图数据结构:包含所有关键帧、地图点、观测关系等
  • Atlas 对象序列化:整个地图集合的二进制或文本格式存储
  • 词汇表信息:包含词汇表文件名和校验和

数据结构

// 保存内容包括:
- 词汇表名称和校验和
- Atlas对象(包含所有地图)
  - 关键帧 (KeyFrames)
  - 地图点 (MapPoints) 
  - 观测关系
  - 图结构连接
  - IMU预积分数据

坐标系

  • 世界坐标系:地图中的所有 3D 点和相机位姿都在统一的世界坐标系中
  • 初始化坐标系:以第一个关键帧为参考建立的坐标系
  • 尺度:对于单目 +IMU 系统,通过 IMU 初始化确定真实尺度

2. output_trajectory_csv (轨迹 CSV 文件)

文件格式

frame_idx,timestamp,state,is_lost,is_keyframe,x,y,z,q_x,q_y,q_z,q_w
0,1234567890.123456,2,false,true,0.0,0.0,0.0,0.0,0.0,0.0,1.0
1,1234567890.156789,2,false,false,0.1,0.05,0.02,0.01,0.02,0.03,0.999
...

字段说明

  • frame_idx: 帧索引号
  • timestamp: 时间戳(秒)
  • state: 跟踪状态(数字编码)
  • is_lost: 是否跟踪丢失(true/false)
  • is_keyframe: 是否为关键帧(true/false)
  • x,y,z: 相机位置坐标(米)
  • q_x,q_y,q_z,q_w: 相机姿态四元数

坐标系定义

// 关键代码分析:
Sophus::SE3f Two = vpKFs[0]->GetPoseInverse();  // 第一个关键帧的逆变换
Sophus::SE3f Tcw = (*iter_relative_pose) * Trw; // 相机到世界变换
Sophus::SE3f Twc = Tcw.inverse();               // 世界到相机变换

3. 坐标系详细说明

世界坐标系 (World Frame)

  • 原点:第一个关键帧的相机位置作为原点
  • 轴向定义
    • Z 轴:相机初始光轴方向(前向)
    • X 轴:相机右方向
    • Y 轴:相机下方向(右手坐标系)

相机坐标系 (Camera Frame)

  • 标准计算机视觉约定
    • Z 轴:光轴方向(指向前方)
    • X 轴:图像右方向
    • Y 轴:图像下方向

IMU 坐标系影响

  • 对于 IMU_MONOCULAR 模式,坐标系会考虑 IMU 的重力对齐
  • IMU 数据帮助确定真实的重力方向和尺度

4. 坐标变换关系

// 位姿表示:
Twc: 世界坐标系到相机坐标系的变换
- twc: 相机在世界坐标系中的位置 (x,y,z)
- q: 相机在世界坐标系中的姿态 (四元数)
 
// 变换链:
世界点 → 相机坐标系点
P_camera = Twc * P_world

UMI 项目可改进点