投影匹配--帧间跟踪版
(SearchByProjection) 函数 1. 函数目标与核心思想 SearchByProjection 是 ORB-SLAM2 中用于连续帧间跟踪 (Frame-to-Frame Tracking) 的核心函数之一。 核心思想:利用上一帧 (LastFrame) 已经构建好的三维地图点 (MapPoint),结合当前帧 (CurrentFrame) 的初始位姿估计,来预测这些三维点在当前帧图像上的二维投影位置。然后在这些投影位置附近的小范围内搜索,以找到对应的二维特征点,从而建立匹配关系。 这是一种基于模型的预测与搜索策略,比盲目搜索或纯二维匹配更高效和鲁棒。 2. 前提条件 LastFrame 中已经有一些特征点被成功三角化,并形成了稳定的 MapPoint(即已知其三维世界坐标)。 对 CurrentFrame 的相机位姿 CurrentFrame.mTcw (从世界坐标系到当前相机坐标系的变换) 有一个初始的估计。这个估计可能来自: 匀速运动模型。 上一帧成功跟踪后的位姿。 重定位成功后的位姿。 3. 主要执行步骤与思想 a....
通过词袋进行匹配
词袋模型 (Bag-of-Words, BoW) 1. 基本概念 词袋模型源于自然语言处理,在计算机视觉中被借鉴用于图像表示和检索。其核心思想是: 将图像看作是由一些基本的“视觉单词”(Visual Words)组成的文档。 忽略特征点的空间布局信息(至少在生成 BoW 向量时),只关心图像中出现了哪些视觉单词以及它们的频率。 目的是得到一个能够概括图像内容的、紧凑的全局描述符。 2. ORB-SLAM2 中的 BoW 实现 a. 视觉词典 (Visual Vocabulary / Dictionary) 构建:这是一个离线预训练的过程。使用大量不同场景下的 ORB 特征描述子,通过聚类算法(如层次 K-Means)构建一个词典树(Vocabulary Tree)。 结构:树的叶子节点代表一个视觉单词。每个视觉单词对应着描述子空间中的一个聚类中心。词典通常包含大量(例如 10410^4104 - 10610^6106)视觉单词。 作用:提供一个标准化的参照系,用于将连续的 ORB 描述子**量化(Quantize)**为离散的视觉单词 ID。 b....
单目初始化中的特征匹配
Frame::GetFeaturesInArea 函数 1. 函数目标 该函数的核心目的是在给定的图像帧 (Frame) 中,高效地查找满足以下条件的特征点: 位于以指定点 (x, y) 为圆心、r 为半径的圆形区域内。 其所在的图像金字塔层级 (octave) 在指定的 [minLevel, maxLevel] 范围内(可选)。 这在特征匹配、局部地图跟踪等场景中非常常用,需要在某个预期位置附近搜索对应的特征点。 2. 面临的挑战与常规思路 如果图像中有大量特征点(例如上千个),最直观的方法是: 遍历当前帧中的所有特征点。 对每一个特征点,计算它到圆心 (x, y) 的距离。 判断距离是否小于 r,并且层级是否符合要求。 缺点: 计算量巨大,需要对所有点进行距离计算,对于实时性要求高的 SLAM 系统来说效率太低。 3. ORB-SLAM2 的优化策略:网格化加速 (Grid-based Acceleration) 为了解决效率问题,ORB-SLAM2...
关键帧类
KeyFrame(关键帧)是 ORB_SLAM2 系统中非常核心的一个概念和数据结构。它不是每一帧都创建,而是从普通的 Frame 对象中选取具有代表性的帧来创建。关键帧构成了地图的基础,用于跟踪、局部建图和回环检测。 以下是对 KeyFrame 类的详细解析: 1. 关键帧的角色与创建 作用:关键帧是地图的基本单元,存储了比普通帧更持久和重要的信息,用于优化相机轨迹和构建环境地图。它们之间通过共视图(Covisibility Graph)和生成树(Spanning Tree)等结构连接起来。 创建:关键帧由一个 Frame 对象、一个指向地图 Map 的指针和一个指向关键帧数据库 KeyFrameDatabase 的指针来构造。构造时,它会从父 Frame 复制大量信息,如时间戳、相机参数、特征点、描述子、地图点关联等,并被赋予一个唯一的 mnId。 2. 核心数据成员(属性) KeyFrame 类包含了众多成员变量来存储其状态和信息,主要分为几类: 标识与时间戳: mnId: 关键帧的唯一 ID。 mnFrameId: 创建此关键帧的原始 Frame 的...
mappoint类
MapPoint 类的核心定位:场景中的三维点 简单来说,MapPoint 类代表了在三维真实世界中的一个静态点。在 SLAM 系统运行过程中,相机会从不同的视角观测到场景中的特征点(比如墙角、纹理清晰的物体表面等)。当系统通过三角化等方法确定了这些二维图像特征点对应的三维空间位置后,就会创建一个 MapPoint 对象来存储这个三维点的信息。 MapPoint 类的主要职责和包含的信息: MapPoint 类不仅仅存储一个三维点的坐标,它还包含了大量与这个三维点相关的观测信息、几何属性以及在 SLAM 系统不同模块中用于追踪和优化的状态信息。 以下是 MapPoint 类的主要成员变量和功能的概览: 1. 核心属性 (Core Properties): mWorldPos (类型: cv::Mat): 含义: 地图点在世界坐标系下的三维坐标 (通常是一个 3x1 的列向量)。这是 MapPoint 最基本也是最重要的信息。 获取/设置: 通过 GetWorldPos() 和 SetWorldPos() 方法。 mnId (类型: long unsigned...
C++学习笔记—现代C++代码命名规范
命名规范总览 类别 命名规则 示例 函数名 小驼峰式 (camelCase) calculateTotal(), getUserName() 变量名 小驼峰式 (camelCase) userCount, totalAmount 参数名 小驼峰式 (camelCase) inputValue, maxSize 成员变量 尾缀下划线或m_前缀 userName_, m_userName 类名 大驼峰式 (PascalCase) UserAccount, DataProcessor 常量 全大写+下划线 MAX_BUFFER_SIZE, PI_VALUE 宏定义 全大写+下划线 DEBUG_MODE, SAFE_DELETE 详细规则及示例 1. 函数名 (小驼峰式) 1234void calculateTotal();std::string getUserName();bool isValid(int value);void setConfiguration(const Config& config); 2. 变量名...
C++学习笔记—指针和const
理解const与指针的规则 在C++中理解const与指针的组合,可以遵循两个简单规则: 星号(*)前的const:表示指针指向的内容不能修改 星号(*)后的const:表示指针本身不能改变指向 详细分析各种情况 1. 常量指针 12const int* p1 = &value;int const* p2 = &value; // 与上面等价 可以理解为const int 和 int const是同一种类型,创建了一个指针指向了这个类型 这两种写法完全等价,都表示: 类型:指向整型常量的指针 限制:不能通过此指针修改所指向的值 可以:改变指针指向的地址 读法:“p1是一个指针,指向const int” 示例: 1234int a = 5, b = 10;const int* p = &a; // p指向a*p = 6; // 错误!不能通过p修改a的值p = &b; // 正确,p可以改变指向 2. 指针常量 1int* const p3 =...
orbslam2
一、Docker 容器创建 123456789101112sudo docker run -dit \--gpus all \-e NVIDIA_DRIVER_CAPABILITIES=all \--name=orbslam2 \--privileged \-v /dev:/dev \-v /home/xfy/docker_practice/orbslam2Base20.04:/home/docker \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=unix$DISPLAY \-w /home \--net=host \ubuntu:20.04 二、Ubuntu 源配置 安装 vim 1apt install vim 备份原始源 1cp /etc/apt/sources.list /etc/apt/sources.list.backup 编辑源文件 1234vim /etc/apt/sources.list# gg dG 移动到文件第一行并删除所有内容# i进入编辑模式#...
docker常用命令
镜像管理 (Image Management) docker image ls / docker images: 查看镜像 docker search [image]: 检索镜像 eg. docker search nginx docker pull [image]: 拉取镜像 docker push [image]: 上传镜像 eg. docker push geekhour/hello-docker:latest docker save [image] -o FILE / docker save [image] > FILE: 保存镜像 eg. docker save geekhour/hello-docker:latest > hello-docker.tar docker load -i FILE: 导入镜像 eg. docker load -i hello-docker.tar docker history [image]: 查看镜像历史 docker rmi [image] / docker image rm [image]:...
docker
基本操作 1. 拉取镜像 (docker pull) 作用: 从镜像仓库 (默认是 Docker Hub) 下载镜像到你的本地机器。 语法: docker pull <仓库名>/<镜像名>:<标签> <仓库名>: 可选,如果是 Docker Hub 上的官方镜像或知名镜像,通常可以省略。如果是个人或其他组织的镜像,需要指定,例如 osrf/ros。 <镜像名>: 必须,例如 ubuntu, ros。 <标签>: 可选,用于指定镜像的版本。如果不指定,默认拉取 latest 标签。强烈建议总是指定明确的标签,以保证环境的可复现性。例如 ubuntu:22.04, ros:noetic-ros-base。 示例: 拉取官方的 Ubuntu 22.04 镜像:你会看到 Docker 开始下载镜像的各个层 (layer)。 1docker pull ubuntu:22.04 拉取 ROS Noetic 的基础镜像 (来自 Open Source Robotics...