# Simple_VO **Repository Path**: bluestone029/simple_vo ## Basic Information - **Project Name**: Simple_VO - **Description**: 一个简单的双目视觉里程计,前端使用光流追踪角点+双目三角化地图点坐标+BA求解每帧位姿,后端使用滑窗BA估计关键帧位姿和地图点坐标。没有使用任何优化框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-12-14 - **Last Updated**: 2023-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 概述 一个简单的双目视觉里程计,前端使用光流追踪角点+双目三角化地图点坐标+BA求解每帧位姿,后端使用滑窗BA估计关键帧位姿和地图点坐标。**前后端都没有使用任何优化框架** 可以在桌面CPU(Ryzen5 3600)和嵌入式设备(Nvidia TX2)上实时运行 在KITTI上的运行效果参见**running_on_KITTI.mp4** 基于高翔博士的工作[slambook2](https://github.com/gaoxiang12/slambook2/tree/master/ch13) ## 依赖 * OpenCV 3 * glog,gflag,gtest * Eigen3,Sophus * Pangolin * cmake ## 如何运行 ```bash mkdir build cd build cmake .. make -j cd .. ./bin/run_kitti_stereo ``` 运行前修改**config/default.yaml**中的**dataset_dir** ## 目录结构 bin: 存放编译的可执行文件 lib: 存放编译的库文件 src: 存放cpp文件 inlcude/myslam: 存放头文件 config: 存放配置文件 test: 存放测试文件 cmake_modules: 存放第三方库的.cmake文件 ## 基本的数据结构 Frame: 关键帧,含有id、位姿、图像及左右图像中的特征点 Feature: 图像中的2D特征点 MapPoint: 世界坐标系中的3D路标点 Map: 全局地图,持有Frame和MapPoint对象,是前后端之间的桥梁 ## 各部分的处理逻辑 ### 前端 1. 前端本身有初始化、正常追踪、追踪丢失三种状态 2. 在初始化状态中,根据左右目之间的光流匹配,寻找可以三角化的地图点,成功时建立初始地图 3. 追踪阶段中,前端计算上一帧的特征点到当前帧的光流,根据光流结果计算图像位姿。该计算只使用左目图像,不使用右目 4. 如果能追踪到的点较少,就将当前帧设为关键帧。对于关键帧,做以下几件事: * 提取新的特征点; * 找到这些点在右图的对应点,用三角化建立新的路标点; * 将新的关键帧和路标点加入地图,并触发一次后端优化 ### 地图 地图以散列形式记录了所有的关键帧和对应的路标点,同时维护一个被激活的关键帧和地图视觉点。这里激活的概念即我们所谓的窗口,它会随着时间往前推动 激活的策略是保留最新的X个关键帧(X的数值可在config文件中设置) ### 后端 后端在地图更新被触发时,从地图中拿取被激活的关键帧和地图点,进行优化