openVSLAM——实现与代码解析

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

文件结构

参考:开源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;

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值