视觉SLAM十四讲_ch2初识SLAM

2023-12-29 09:48
文章标签 初识 十四 slam 视觉 ch2

本文主要是介绍视觉SLAM十四讲_ch2初识SLAM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

视觉十四讲 开篇

一:编译器 g++ [ 简单例子的首选 ]

能够将一个 .cpp 程序编译成一个可执行文件;
g++ 默认把源文件编译成 a.out 这个名字的程序

先用编辑器输入了 helloSLAM.cpp的源代码,g++编译器对源码进行编译

.cpp文件通一目录下,右击空白 选中“在终端打开(T)”,打开终端界面并输入:
g++ helloSLAM.cpp

如果顺利的话,这条命令应该没有任何输出。如果机器上出现“command not found”的错误,说明你可能还没有安装 g++,请用安装g++:

sudo apt-get install g++

刚才这条编译命令把 helloSLAM.cpp 这个文本文件编译成了一个可执行程序。我们检查当前目录,会发现多了一个 a.out 文件,而且它具有执行权限(终端里颜色不同)。我们输入./a.out 即可运行此程序:

% ./a.out
Hello SLAM!

如我们所想,这个程序输出“Hello SLAM!”,告诉我们它在正确运行。

二:使用 cmake 来管理源代码 [ 对于大工程项目 ]

在一个 cmake 工程中, 使用 cmake 命令生成一个 makefile 文件, 然后, 用 make命令, 根据这个
makefile 文件的内容,编译整个工程。

首先在 .cpp文件同目录下 新建一个 CMakeLists.txt 文件 ,填入以下内容:

# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 声明一个 cmake 工程
project( HelloSLAM )# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( helloSLAM helloSLAM.cpp )

每个 CMakeLists.txt 文件, 告诉 cmake 我们要对这个目录下的文件做什么事情。CMakeLists.txt 文件内容需要遵守 cmake 的语法。这个示例中,我们演示了最基本的工程:指定一个工程名和一个可执行程序。根据注释, 应该理解每句话做了些什么。
现在,在当前目录下(slambook/ch2/),调用 cmake 对该工程进行分析:

cmake .

cmake 会输出一些编译器等信息,然后在当前目录下生成一些中间文件,其中最重要的就是 MakeFile 。由于 MakeFile 是自动生成的,我们不必修改它。

生成:CMakeFiles 文件夹 、CMakeCache.txt 、cmake_install.cmake 、 Makefile

现在,用 make 命令对工程进行编译:

 make//以下均为自动输出
Scanning dependencies of target helloSLAM
[100%] Building CXX object CMakeFiles/helloSLAM.dir/helloSLAM.cpp.o
Linking CXX executable helloSLAM
[100%] Built target helloSLAM

编译过程中会输出一个编译进度。如果顺利通过,我们就得到在 CMakeLists.txt 声明的那个可执行程序 helloSLAM。
执行它:

./helloSLAM
//以下均为自动输出
Hello SLAM!

cmake 过程处理了工程文件之间的关系,而 make 过程实际调用了 g++ 来编译程序。

虽然这个过程中多了调用cmake 和 make 的步骤,但我们对项目的编译管理工作,从输入一串 g++ 命令,变成了维护若干个比较直观的 CMakeLists.txt 文件,这将明显降低维护整个工程的难度。比如,当我想新增一个可执行文件时,只需在 CMakeLists.txt 中添加一行“add_executable”命令即可,而后续的步骤都是不变的。cmake 会帮我们解决代码的依赖关系,无需我们输入一大串 g++ 命令。

三: 优化cmake 管理源代码 [ 对于大工程项目 ]

现在这个过程中,唯一让我们不满的是 , cmake生成的中间文件还留在我们代码文件当中。当我们想要发布代码时,并不希望把这些中间文件一同发布出去。这时我们还需把它们一个个删除,这十分的不便。一种更好的做法是 让这些中间文件都放在一个中间目录中 , 在编译成功后,把这个中间目录删除即可。所以,更常见的编译 cmake 工程的做法就是这样:

mkdir build   // 在.cpp同目录下新建一个文件夹 build
cd build      // 通过cd 进入到build文件夹
cmake ..      // 执行cmake 
make          //

我们新建了一个中间文件夹 “build” , 然后进入 build 文件夹 , 通过 cmake … 命令 , 对上一层文件夹,也就是代码所在的文件夹进行编译。这样 , cmake 产生的中间文件就会生成在 build 文件夹中 , 与源代码分开。当我们发布源代码时 , 只要把 build 文件夹删掉即可。

四: 使用库

在一个 C++ 工程中, 并不是所有代码都会编译成可执行文件。只有带有 main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西, 供其他程序调用。这个东西叫做库。一个库往往是许多算法、程序的集合, 我们会在之后的练习中,接触到许多库。OpenCV 库提供了许多计算机视觉相关的算法,而 Eigen 库提供了矩阵代数的计算。

因此,我们要学习如何用 cmake 生成库,并且使用库中的函数。现在我们书写一个 libHelloSLAM.cpp 文件:

//libHelloSLAM.cpp  这是一个库文件
#include <iostream>using namespace std;void printHello()
{cout<<"Hello SLAM"<<endl;
}

这个库提供了一个 printHello 函数,调用此函数将输出一个信息。但是它没有 main函数,这意味着这个库中没有可执行文件。我们在 CMakeLists.txt 里加一句:

add_library( hello libHelloSLAM.cpp )

这条命令告诉 cmake,我想把这个文件编译成一个叫做“hello”的库。然后,和上面一样,使用 cmake 编译整个工程:

cd build
cmake ..
make

这时,在 build 文件夹中会生成一个 libhello.a 文件, 这就是我们得到的库。

在 Linux 中, 库文件分成静态库共享库两种 。静态库以.a 作为后缀名, 共享库以.so结尾。所有库都是一些函数打包后的集合, 差别在于静态库每次被调用都会生成一个副本, 而共享库则只有一个副本, 更省空间。如果我们想生成共享库而不是静态库,只需用:

add_library( hello_shared SHARED libHelloSLAM.cpp )

就可以编译成一个共享库。此时得到的文件是 libhello_shared.so 了。

库文件是一个压缩包, 里头带有编译好的二进制函数。不过,仅有.a 或.so 库文件的话, 我们并不知道它里头的函数到底是什么,调用的形式又是什么样的。为了让别人(或者自己)使用这个库, 我们需要提供一个头文件, 说明这些库里都有些什么。因此, 对于库的使用者, 只要拿到了头文件和库文件, 就可以调用这个库了。下面我们来写 libhello 的头文件。

//libHelloSLAM.h  库文件的头文件
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
void printHello();
#endif

这样, 根据这个文件和我们刚才编译得到的库文件,就可以使用这个函数了。下面我们写一个可执行程序, 调用这个简单的函数:

//useHello.cpp 带有main的可执行文件#include "libHelloSLAM.h" int main( int argc, char** argv )
{printHello();return 0;
}

然后, 在 CMakeLists.txt 中添加一个可执行程序的生成命令, 链接到刚才我们使用的库上:

add_executable( useHello useHello.cpp )
target_link_libraries( useHello hello_shared )

通过这两句话, useHello 程序就能顺利使用 hello_shared 库中的代码了。这个小例子演示了如何生成并调用一个库。请注意对于他人提供的库, 我们也可用同样的方式对它们进行调用,整合到自己的程序中。

总结:

  1. 首先, 程序代码由头文件和源文件组成;
  2. 带有 main 函数的源文件编译成可执行程序, 其他的编译成库文件。
  3. 如果可执行程序想调用库文件中的函数, 它需要参考该库提供的头文件, 以明白调用的格式。同时, 要把可执行程序链接到库文件上。

这篇关于视觉SLAM十四讲_ch2初识SLAM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549134

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论问题和挑战,探索前沿技术。诚邀高校、科研院所、企业等有关方面的专家学者参加会议。 9月13日(周五):签到日 9月14日(周六):会议日 9月15日(周日

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

Python计算机视觉编程 第十章

目录 一、OpenCv基础知识 1.读取和写入图像 2.颜色空间 3.显示图像和结果 二、处理视频 1.输入视频 2.将视频读取到NumPy数组中 三、跟踪 1.光流 2.Lucas-Kanade算法 一、OpenCv基础知识 OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。 1.读取和写入图像 import cv2# 读取图像im = c

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai