SLAM初探

news2024/11/27 2:35:12

SLAM初探

1.视觉SLAM框架

在这里插入图片描述

整个视觉SLAM包括以下流程

  • 传感器信息读取,主要是相机图像信息的读取和处理
  • 前端视觉里程计,它的任务是估算相邻图像之间相机的运动和局部的地图
  • 后端优化,接受不同时刻视觉里程计输出的相机位姿以及回环检测的信息,对他们进行规模更大的优化,得到全局一致的轨迹和地图
  • 回环检测,判断机器人是否到达先前的位置
  • 建图,根据估计的轨迹,建立环境地图

2.数学描述

第一行式子为运动方程,第二行式子为观测方程

x k = f ( x k − 1 , u k , w k ) z k , j = h ( y j , x k , v k , j ) x_k = f(x_{k-1},u_k,w_k) \\ z_{k,j}=h(y_j,x_k,v_{k,j}) xk=f(xk1,uk,wk)zk,j=h(yj,xk,vk,j)

x代表机器人自身的姿态信息,涉及到SLAM中的定位问题。y代表传感器观测的路标点信息,涉及到SLAM中建图问题。SLAM解决的问题是已知控制输入u和观测值z,推断最大可能性的x和y。

本质上是个状态估计问题:如何通过带有噪声的测量数据估计内部的状态变量

状态估计问题的求解,依据方程形式和噪声分布可以分为线性/非线性和高斯/非高斯系统。其中先行高斯系统的无偏最优估计可以由卡尔曼滤波给出。在复杂的非线性非高斯系统中可以使用扩展卡尔曼滤波(EKF)、粒子滤波(PF)以及非线性优化解决。目前广泛使用非线性优化方案来进行状态估计。

3.实践部分

3.1 HelloSLAM(使用Cmake)

源程序main.cpp

#include <iostream>

int main(){
    cout<<"hello SLAM!"<<endl;
    return 0;
}

CMakeLists.txt

project(helloSLAM)

add_executable(sayhello main.cpp)

最终利用cmake指令会编译出sayhello.a可执行文件

3.2 HelloSLAM(使用库)

源程序main.cpp

#include <hello.h>

int main(){
    sayHello();
    return 0;
}

调用库hello.cpp

#include <hello.h>
#include <iostream>

using namespace std;

void sayHello(){
    cout<<"hello SLAM!"<<endl;
}

头文件hello.h

#ifndef __HELLO_H__
#define __HELLO_H__

void sayHello();

#endif

CMakeLists.txt

project(helloSLAM)

include_directories("include")               //提供头文件的声明
add_library(libhello src/hello.cpp)          //将src目录下的hello.cpp编译成一个库
add_executable(sayhello main.cpp)            //将源程序编译成一个可执行文件sayhello.a
target_link_libraries(sayhello libhello)     //把编译好的库链接到可执行文件

4.作业

4.1 阅读综述论文(个人认为很有必要读一读)

  • 《Visual simultaneous localization and mapping: a survey》
  • 《Past,Present,and Future of Simultaneous Localization And Mapping: Towards the Robust-Perception Age》
  • 《基于单目视觉的同时定位与地图构建方法综述》

4.2 CMake实践

书写⼀个由 cmake 组织的 C++ ⼯程,要求如下:

  • include/hello.h 和 src/hello.c 构成了 libhello.so 库。hello.c 中提供⼀个函数 sayHello(),调⽤此函数时往屏幕输出⼀⾏“Hello SLAM”。我们已经为你准备了 hello.h 和 hello.c 这两个⽂件,见“code/”⽬录下。

  • ⽂件 useHello.c 中含有⼀个 main 函数,它可以编译成⼀个可执⾏⽂件,名为“sayhello”。

  • 默认⽤ Release 模式编译这个⼯程。

  • 如果⽤户使⽤ sudo make install,那么将 hello.h 放⾄/usr/local/include/下,将 libhello.so 放⾄/usr/local/lib/下。

请按照上述要求组织源代码⽂件,并书写 CMakeLists.txt。

本工程的目录结构如下:

在这里插入图片描述

CMakeList.txt文件代码如下:

//指定cmake版本
cmake_minimum_required(VERSION 3.0)
//命名工程
project(sayhello)
//设置编译模式为Release
set(CMAKE_BUILD_TYPE "Release")
//添加可执行文件sayhello
add_executable(sayhello useHello.cpp)
//引入头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
//生成hello.cpp库
add_library(hello SHARED ${PROJECT_SOURCE_DIR}/src/hello.cpp)
//链接动态库
target_link_libraries(sayhello hello)
//将hello.h安装到/usr/local/include目录下
install(FILES ${PROJECT_SOURCE_DIR}/include/hello.h DESTINATION /usr/local/include)
//将动态链接库libhello.so安装到/usr/local/lib目录下
install(TARGETS hello LIBRARY DESTINATION /usr/local/lib)

4.3 运行ORB-SLAM2

编译ORB-SLAM2工程这部分就不细说了,主要注意三点

  • Pangolin不能安装最新版本 需要安装旧版本
  • 对于处理器核数小的用户,比如使用虚拟机的,建议将build.sh里的make -j 都改成make 以防止编译时死机
  • src目录下的部分源代码文件缺少头文件<unistd.h>
  • include目录下LoopClosing.h中第49行的代码应改成如下代码:
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;

4.3.1 测试RGB-D数据集

这里需要到TUM官网下载数据集,本人下载的数据集是rgbd_dataset_freiburg1_desk,在associations文件夹下已经有了它的关联文件fr1_desk.txt。执行下面命令,跑RGB-D的demo:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ./Examples/RGB-D/rgbd_dataset_freiburg1_desk ./Examples/RGB-D/associations/fr1_desk.txt 

效果如下图:

在这里插入图片描述


4.3.2 用自己的摄像头实时跑ORB-SLAM2

首先需要调用OpenCV来打开摄像头并读取帧送入ORB-SLAM2系统中进行追踪,代码如下:

//
// Created by xiang on 11/29/17.
//

// 该文件将打开你电脑的摄像头,并将图像传递给ORB-SLAM2进行定位
// 需要opencv
#include <opencv2/opencv.hpp>

// ORB-SLAM的系统接口
#include "System.h"

#include <string>
#include <chrono>   // for time stamp
#include <iostream>

using namespace std;

// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myslam.yaml";
string vocFile = "./ORBvoc.txt";

int main(int argc, char **argv) {

    // 声明 ORB-SLAM2 系统
    ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);

    // 获取相机图像代码
    cv::VideoCapture cap(0);    // change to 1 if you want to use USB camera.

    // 分辨率设为640x480
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

    // 记录系统时间
    auto start = chrono::system_clock::now();

    while (1) {
        cv::Mat frame;
        cap >> frame;   // 读取相机数据
        auto now = chrono::system_clock::now();
        auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);
        SLAM.TrackMonocular(frame, double(timestamp.count())/1000.0);
    }

    return 0;
}

还需要对自己的相机进行标定,标定文件如下:

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 500.0
Camera.fy: 500.0
Camera.cx: 320.0
Camera.cy: 240.0

Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0

# Camera frames per second 
Camera.fps: 30.0

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 0

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000

# ORB Extractor: Scale factor between levels in the scale pyramid   
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid  
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast      
ORBextractor.iniThFAST: 10
ORBextractor.minThFAST: 5

将上述两个文件都放到Example文件夹下,注意这里也将Vocabulary文件夹下的ORBvoc.txt文件放进来了

在这里插入图片描述

为了执行myslam.cpp内的内容 ,我们还需要在整个工程CMakeLists.txt中添加为myslam生成可执行内容的代码

add_executable(myslam Examples/Monocular/myslam.cpp)
target_link_libraries(myslam ${PROJECT_NAME})

编译运行效果如下:

在这里插入图片描述

对桌子上的物体进行实时环境建模

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++高阶数据结构】LRU

​ &#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏…

LeetCode刷题复盘笔记—一文搞懂动态规划之583. 两个字符串的删除操作问题(动态规划系列第四十篇)

今日主要总结一下动态规划的一道题目&#xff0c;583. 两个字符串的删除操作 题目&#xff1a;583. 两个字符串的删除操作 Leetcode题目地址 题目描述&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意…

ArcGIS基础实验操作100例--实验56 TIFF与GRID栅格转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验56 TIFF与GRID栅格转换 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

orika 工具下划线转驼峰不同字段名映射

1.问题: 业务需要把第三方接口的带下划线的字段规范为驼峰的字段 第三方接口的bean对象: public class ObjectsDetail extends XMLElementData implements Serializable {private static final long serialVersionUID 5080447582610246168L;private String objectclass;priv…

用300行Python代码实现一个人脸识别系统源码,基于dlib

用300行Python代码实现一个人脸识别系统 完整代码下载地址&#xff1a;用300行Python代码实现一个人脸识别系统源码&#xff0c;基于dlib 今天我们来python实现一个人脸识别系统&#xff0c;主要是借助了dlib这个库&#xff0c;相当于我们直接调用现成的库来进行人脸识别&…

科技云报道:“大建设”时期,AI算力何去何从?

科技云报道原创。 算力就是生产力&#xff0c;得算力者得天下。 随着新一代人工智能技术的快速发展和突破&#xff0c;以深度学习计算模式为主的AI算力需求呈指数级增长。 数据显示&#xff0c;在1960到2010年间&#xff0c;AI的计算复杂度每两年翻一番&#xff1b;在2010到2…

fastposter v2.11.0 天花板级的海报生成器

fastposter v2.11.0 天花板级的海报生成器 &#x1f525;&#x1f525;&#x1f525; fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图&#xff0c;在对应的位置放上组件&#xff08;文字、图片、二维&#x1f434;、头像&#xff09;即可生成海报。 点击代…

实验二十一 配置NAT

实验二十一 配置NAT实验要求&#xff1a; 静态NAT: 在Router的公网侧接口GE0/0/1下配置静态NAT&#xff0c;将私有 IP地址 192.168.0.2与公有IP地址202.10.1.3绑定起来。 NAT SERVER的配置 动态NAT和easy IP的配置网络拓扑图&#xff1a;操作步骤&#xff1a;一、静态NAT1、配置…

Actipro-wpf-controls-22.1.4 2023注册版

Actipro WPF 控件 用于构建漂亮的 Windows Presentation Foundation 桌面应用程序的大量 UI 控件 特征 超过 100 个 WPF 控件和组件在各种产品中可用&#xff0c;Ω578867473它们通过丰富的特性和功能改进应用程序的 UI。 受办公室启发的用户界面 复制现代 Office 应用程序的外…

【数据结构】计数排序、基数排序

文章目录计数排序基数排序计数排序 计数排序也是非比较排序的一种&#xff0c;在之前的博客介绍的都是比较排序&#xff0c;跟之前的比较排序相比计数排序并不是很常用&#xff0c;不常用的原因也是它的局限性耗费空间很大&#xff0c;只能对整数进行排序&#xff0c;并且数据在…

【验证码逆向专栏】某验四代滑块验证码逆向分析

文章目录声明逆向目标通讯流程验证码流程分析逆向分析captcha_id 参数challenge 参数w 参数结果验证声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与…

剑指 Offer 27. 二叉树的镜像(Leetcode 226. 翻转二叉树)(二叉树后序遍历)

题目&#xff1a; 链接&#xff1a;剑指 Offer 27. 二叉树的镜像&#xff1b;Leetcode 226. 翻转二叉树 难度&#xff1a;简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,…

调用Ishingami Homma解析函数测试PAWN算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 灵敏度分析分为局部灵敏度分析和全局灵敏度分析&#xff1b;局部灵敏度分析包括&#xff1a;直接求导法、有限差分法、格林函数…

06-07-Alibaba Nacos注册中心源码剖析

Nacos&Ribbon&Feign核心微服务架构图 架构原理 1、微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时外发布 Http 接口供其它系统调用(一般都是基于SpringMVC) 2、服务消费者基于 Feign 调用服务提供者对外发布的接口&#xff0c;先对调用的本地接口加上注…

Github每日精选(第85期):PDF 文档的 React 组件react-pdf-viewer

react-pdf-viewer react-pdf-viewer 用于查看 PDF 文档的 React 组件。它是用 TypeScript 编写的&#xff0c;完全由 React hooks 提供支持。 github 的地址在这里。 使用实例 添加水印 默认情况下&#xff0c;每个页面由画布、文本和注释层构成。在此示例中&#xff0c;我…

RCE(命令执行)总结

文章目录RCE(命令、代码执行)总结1、过滤cat、flag等关键字1.1 常见linux系统命令1.2 使用转义符1.3 使用引号1.4 内联执行绕过1.5 编码绕过1.6 进制绕过1.7 过滤文件名(如&#xff1a; /etc/passwd文件)1.8 使用$*和$&#xff0c;$x,${x}1.9 读取文件命令1.10 查找文件命令(fi…

【观察】汇聚中国开源数据库创新力量,openGauss驶入发展“快车道”

毫无疑问&#xff0c;数据库是“软件产业皇冠上的明珠”&#xff0c;是数字基础设施不可或缺的底座之一。但也要看到&#xff0c;由于数据库难度大&#xff0c;产业投入周期长&#xff0c;迫切需要凝聚产业力量共建基础能力。在此背景之下&#xff0c;作为定位企业级开源数据库…

H264 NALU分析以及提取h264实战

1.H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264&#xff0c;在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10&#xff0c;⼜叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4 AVC或直…

Java学习(22)调试初步——debug入门

程序调试-debug 调试的作用 让程序员能看清程序每一步的效果&#xff0c;在需要查看结果的时候&#xff0c;使用debug查看实际结果是否与预期结果一致。案例 (1) 设置断点 鼠标左键双击设置/取消&#xff0c;或者右键选择Toggle Breakpoint。 (2) 执行调试 Run→\to→Debug&a…