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