文件结构
参考:开源SLAM框架学习——OpenVSLAM源码解析: 第一节 安装和初探

OpenVSLAM实现
源码:OpenVSLAM
配置:社区
参考:教程
- Eigen :3.3.0及之后的版本
- g2o :安装最新版本.
- SuiteSparse :系数矩阵库,安装g2o需要
- FBoW:特征点字典,使用指定版本
- yaml-cpp:0.6.0 及之后的版本
- OpenCV : 3.3.1及之后的版本
- Pangolin: 可视化工具,安装最新版本
输入:视频/图片、配置文件
配置文件.yaml
#==============#
# Camera Model #
#==============#
Camera.name: "EuRoC monocular"
#相机设置:单目monocular、双目stereo、RGBD
Camera.setup: "monocular"
#成像模型:透视perspective、鱼眼fisheye、全景equirectangular
Camera.model: "perspective"
# 相机内参
Camera.fx: 458.654
Camera.fy: 457.296
Camera.cx: 367.215
Camera.cy: 248.375
# 畸变参数:透视成像为5个畸变系数;鱼眼相机为k1 k2 k3 k4四个畸变系数;全景没有设置畸变系数
Camera.k1: -0.28340811
Camera.k2: 0.07395907
Camera.p1: 0.00019359
Camera.p2: 1.76187114e-05
Camera.k3: 0.0
# 视频帧率
Camera.fps: 20.0
# 图像宽高
Camera.cols: 752
Camera.rows: 480
# 颜色模式Gray, RGB, BGR
Camera.color_order: "Gray"
#================#
# ORB Parameters #
#================#
#一帧图像所提取的最多关键点数
Feature.max_num_keypoints: 1000
#金字塔层数和尺度因子
Feature.scale_factor: 1.2
Feature.num_levels: 8
#FAST角点检测的灰度阈值
Feature.ini_fast_threshold: 20
#如果上面的阈值没有检测到角点,采用更低的阈值
Feature.min_fast_threshold: 7
...
运行结果(图书馆)

OpenVSLAM模块

跟踪模块
通过关键点匹配和位姿优化,对连续输入到OpenVSLAM的每一帧估计其摄像机的位姿。这个模块还决定是否插入一个新的关键帧(KF)。当一个帧被认为是一个新的关键帧KF时,它被发送给映射和全局优化模块。在跟踪模块中,基本的数据处理包括初始化、帧跟踪、重定位、位姿优化以及插帧处理。
1.初始化

特征点提取与匹配:orb
正则化特征点:为了后续使用RANSAC(随机从大样本中抽取小样本用于求解问题)计算SVD分解等到更一致的结果,消除特征点在图像中位置分布对结果的影响。

//src/openvslam/solve/common.cc
void normalize(const std::vector<cv::KeyPoint>& keypts, std::vector<cv::Point2f>& normalized_pts, Mat33_t& transform) {
float mean_x = 0;//平均值
float mean_y = 0;
const auto num_keypts = keypts.size();//统计数量
normalized_pts.resize(num_keypts);//将点向量设置为同样大小
//计算平均值
for (const auto& keypt : keypts) {
mean_x += keypt.pt.x;
mean_y += keypt.pt.y;
}
mean_x = mean_x / num_keypts;
mean_y = mean_y / num_keypts;
float mean_l1_dev_x = 0;
float mean_l1_dev_y = 0;
for (unsigned int index = 0; index < num_keypts; ++index) {
normalized_pts.at(index).x = keypts.at(index).pt.x - mean_x;//xi-x
normalized_pts.at(index).y = keypts.at(index).pt.y - mean_y;//yi-y
mean_l1_dev_x += std::abs(normalized_pts.at(index).x);//取绝对值
mean_l1_dev_y += std::abs(normalized_pts.at(index).y);
}
mean_l1_dev_x = mean_l1_dev_x / num_keypts;//平均偏差σx
mean_l1_dev_y = mean_l1_dev_y / num_keypts;//平均偏差σy
//取逆
const float mean_l1_dev_x_inv = static_cast<float>(1.0) / mean_l1_dev_x;
const float mean_l1_dev_y_inv = static_cast<float>(1.0) / mean_l1_dev_y;

本文详细介绍了OpenVSLAM框架的初始化过程,包括特征点的正则化、2D-2D对极约束、本质矩阵的求解以及三角化。在初始化后,通过匹配和位姿优化创建地图,涉及关键帧的设定、3D点的三角化以及全局优化。内容涵盖了相机模型、ORB特征参数和OpenVSLAM模块的功能。
964

被折叠的 条评论
为什么被折叠?



