slam的简单操作以及原理

2023-05-16

slam的原理以及应用##

1 新建工作文件夹
使用mkdir命令新建文件夹 slambook和ch1文件夹,并利用cd命令进入ch1文件下,截图如在这里插入图片描述

2 编写helloslam小程序
使用vim命令创建helloslam.cpp文件,并填写如下代码
在这里插入图片描述

在这里插入图片描述

按esc键,输入:wq退出

3 编译helloslam程序
3.1 使用g++命令编译
编译命令使用如下图

在这里插入图片描述

此时利用ls命令可以看到ch1文件夹下多了一个a.out的可执行文件,其中a.out是该命令默认生成的可执行文件名字
在这里插入图片描述

若想生成其他名字的可执行文件,在调用g++命令时在其后添加-o,如下,可看到生成了hell的可执行文件

在这里插入图片描述

补充:关于g++命令的补充说明

g++ –c Hello.cc 编译文件,生成目标文件 Hello.o

g++ Hello.o –o abc 连接 并重命名为可执行文件 abc

g++ Hello.cc 编译连接一起,生成a.out

g++ Hello.cc –o hello 生成a.out并命名为hello

3.2 使用cmake编译
理论上说,任意一个C++ 程序都可以用g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和里边的源文件,这时输入的编译命令将越来越长。通常一个小型c++ 项目含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠g++ 命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++ 项目,使用一些工程管理工具会更加高效。在历史上工程师们曾使用makefile 进行自动编译,但下面要谈的cmake 比它更加方便

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

  首先利用rm命令将之前生成的可执行文件删除,此时ch1文件夹下只包含一个helloslam.cpp文件

3.2.1 制作一个工程
在ch1文件夹下,利用vim命令新建一个CMakeLists.txt文件,在该文件中添加如下部分
在这里插入图片描述

  每个CMakeLists.txt 文件,告诉cmake 我们要对这个目录下的文件做什么事情。CMakeLists.txt 文件内容需要遵守cmake 的语法。这个示例中,我们演示了最基本的工程:指定一个工程名和一个可执行程序

 注意:cmake根据CMakeLists.txt文件生成包含一系列文件的工程,其中生成的最重要的文件时makefile文件,make命令会根据此文件所制定的规则生成一些列文件(文件可能是库文件,也可能是可执行程序)

   此时ch1文件夹下只有2个文件,如下

在这里插入图片描述

3.2.2 调用cmke命令新建工程
命令使用如下,注意cmake命令后面有一个点(.),此点表示在当前文件夹,故此条命令的意思是在当前文件夹下创建工程。以下是正确创建后输出信息

在这里插入图片描述
执行cmake命令前该文件夹ch1种只有2个文件,执行cmake命令后再次调用ls命令可以看到该文件夹下多了很多文件夹和文件,如下
在这里插入图片描述

3.2.3 编译helloslam.cpp
调用命令make生成可执行文件,如下,图中可以看到生成了绿色的helloslam文件(可执行文件)
在这里插入图片描述

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

3.4 使用库文件来实现hello
此部分为另外一种生成hello程序功能的方法,故需要将之前的文件全部清空,即工作目录ch1下为空。

     在一个C++ 工程中,并不是所有代码都会编译成可执行文件。只有带有main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西,供其他程序调用。这个东西叫做库。一个库往往是许多算法、程序的集合。

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

3.4.1 生成静态库文件
A 在ch1目录下利用vim闯将文件libhelloslam.cpp,并添加代码如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

B 使用vim创建文件CMakeLists.txt,并添加如下代码

在这里插入图片描述

C 使用mkdir命令创建build目录,用于存放产生的一系列文件,如下

在这里插入图片描述

D 进入build文件夹,并调用cmake命令创建工程,如下

在这里插入图片描述

E 在ch1目录下调用make,生成库文件,如下,可以看到多出了一个文件 libhello.a

在这里插入图片描述

3.4.2 生成共享库文件
方法步骤与静态库文件基本相同,唯一不同的是在CMakeLists.txt文件中声明不一样,如下是共享库文件声明方法
在这里插入图片描述

    注意到:我们并没有注释掉静态库的声明,因为:2种库文件的生成互不影响,只要2种类型库文件的名字不一样即可,本例中静态库文件名字为hello,而共享库文件名字为hello1.

   其他步骤与静态库文件一样,成功生成后如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

A 利用vim在工作目录ch1下创建libhelloslam.h,并添加如下代码

在这里插入图片描述

B.利用vim在ch1目录下生成usehello.cpp,如下:

在这里插入图片描述

C.在CMakeLists.txt文件中添加可执行程序的生成命令,同时添加库文件的链接声明

在这里插入图片描述

D.在build文件夹中调用cmake和make,生成可执行程序usehello

在这里插入图片描述

3.5 使用IDE
集成开发环境(Integrated Development Environment,IDE)

    IDE 为开发者提供了跳转、补全、断点调试等很多方便的功能

    Linux 下的IDE 有很多种。虽然与Windows 下的Visual Studio 还有一些差距,不过支持C++ 开发的也有好几种,例如Eclipse、Qt Creator、Code::Blocks、Clion 等等

    Kdevelop的优点列举如下:
                                            1. 支持cmake 工程。
                                            2. 对c++ 支持较好(包括11 标准)。有高亮、跳转、补全等功能。能自动排版代码。
                                            3. 能方便地看到各个文件和目录树。
                                            4. 有一键编译、断点调试等功能。
                                            5. 无须付费。

3.5.1 安装
Kdevelop。它是一个免费软件,在Ubuntu 的源中提供,这意味着你可以用apt-get 来安装它

    输入sudo apt-get install kdevelop进行安装

3.5.2打开kdevelop
输入kdevelop打开,打开后界面如下
在这里插入图片描述

3.5.3 新建工程
a 点击上方的工程,选择从模版新建
在这里插入图片描述

 b.在创建新工程界面添加相应信息

在这里插入图片描述
c 点击上图中的next按钮,进行下一步
在这里插入图片描述

    d 点击finish按钮,完成工程的创建

在这里插入图片描述

      图中:第一栏是cmake命令的可执行程序目录;第二栏是本程序的编译运行目录,点击ok完成创建

      生成成功后结果图如下

在这里插入图片描述

3.5.4 添加相应代码
本工程使用库文件来输出helloworld

a.首先添加库文件的源文件,即libhello.cpp

   右键工程名helloslam,点击创建文件

在这里插入图片描述

在弹出的窗口中添加源文件的名字,即libhello.cpp,如下,点击ok按钮

在这里插入图片描述

在新创建的cpp文件中添加如下代码

在这里插入图片描述

b.添加库文件的头文件,即libhello.h,并添加如下代码

  与创建库文件libhello.cpp的方式相同,添加后如下图

在这里插入图片描述

c.在CMakeLists.txt文件中添加生成lib的相应信息

在这里插入图片描述

d.对main文件添加相应代码
在这里插入图片描述

e.在CMakeLists.txt文件中为此工程的可执行文件helloslam添加lib库的链接

在这里插入图片描述

3.5.5 编译程序
点击界面上的构建按钮,或者直接按F8,相当于输入了cmake和make命令
在这里插入图片描述
3.5.6 执行程序
a.执行程序前需要确保2步,其一就是已经点击过构建按钮(即已经正确编译链接,即cmake和make命令都执行成功,记住:只要make clean过工程,就需要重新构建);其二在点击execute按钮时需要指定启动器,即添加可执行程序的路径,如下
在这里插入图片描述
点击execute按钮,如果是第一次运行(或者使用过make clean,或清理过该工程)都会弹出配置启动器的对话框,如下

上图中选中工程名字helloslam, 然后点击新建,会自动弹出我们可执行程序的路径,如下,点击ok完成

在这里插入图片描述

再次点击界面上的execute按钮,成功执行

在这里插入图片描述

4 错误集锦
4.1 在步骤3.2.2时报错
错误信息如下所示时,请仔细检查自己的CMakeLists.txt文件
在这里插入图片描述

笔者报上述错误原因如下,即工程名中间多了一个空格,去掉空格后即正常建立工程

在这里插入图片描述

4.2 在步骤3.4.3的D步骤时
出现错误如图,此错误为找不到usehello.cpp中包含的头文件。

在这里插入图片描述

解决方法:确保此头文件【libhelloslam.h】在ch1目录情况下,查看usehello.cpp中include语句,正确的include语句如下:

笔者错误的include语句如下:注意引号和尖括号的区别

在这里插入图片描述

补充:引号和尖括号的include语句区别如下:

include有两种形式:

1,#include " *.h":表示先在当前工程目录下查找头文件,如果没有再按标准方式查找;这种方式常用于用户自定义头文件的查找。

2,#include<*.h>:表示按标准方式查找头文件,即直接到系统指定的某些目录中去找某些头文件。

4.3 在步骤3.4.3的D步
出现以下错误,则表示在CMakeLists.txt文件中忘记了将库文件链接到可执行程序上,即忘记写target_link_libraries(可执行程序名字 库文件名字)

在这里插入图片描述

4.4 在步骤3.4.3的D步
出现以下错误,表示忘记在usehello.cpp中添加include,即没有包含库文件的头文件(libhelloslam.h)

在这里插入图片描述

注意:若库文件的头文件(libhelloslam.h)和target_link_libraries(可执行程序名字 库文件名字)均忘记添加,则会先出现4.4的错误,解决掉之后会出现4.3的错误。原因是在CMakeLists.txt文件中首先是生成可执行文件,然后才链接可执行文件到库文件上。

参考:
https://blog.csdn.net/u013378306/article/details/52424826 【gcc/g++编译 cpp/c文件 生成可执行文件】


作者:guosuling
来源:CSDN
原文:https://blog.csdn.net/guosuling/article/details/83930164
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

slam的简单操作以及原理 的相关文章

  • 【IMX6ULL学习笔记之驱动学习02】LED字符设备驱动

    字符设备驱动开发 配置开发环境 新建一个VScode文档 xff0c 先配置开发环境 Ctrl span class token operator 43 span Shift span class token operator 43 spa
  • 第八章——常用数据排序算法之归并排序

    第八章 常用数据排序算法 概述 插入排序 选择排序和冒泡排序这些算法有一个共同的特点 xff0c 为了将N个无序数据进行排序最多需进行N 1轮处理 xff0c 每轮处理范围大小不同 xff08 2 N 1 xff09 xff0c 平均约N
  • ERROR:Did not find a cmdline Flattened Device Tree

    span class token operator 61 span span class token operator gt span bootz span class token number 80800000 span span cla
  • Linux中的英文简称的名字全称

    Linux中英文简称的全称 知道全称能更方便的记忆 ALSA xff08 Advanced Linux Sound Architecture xff09 高级Linux声音架构V4L2 xff08 Video for linux2 xff0
  • LeetCode_26

    删除有序数组中的重复项 给你一个 升序排列 的数组 nums xff0c 请你 原地 删除重复出现的元素 xff0c 使每个元素 只出现一次 xff0c 返回删除后数组的新长度 元素的 相对顺序 应该保持 一致 由于在某些语言中不能改变数组
  • 快乐的shell命令行

    快乐的shell命令行 PART1 基础 1 权限 超级用户权限 普通用户 2 复制粘贴 复制 xff1a 鼠标左键沿着文本拖动高亮的文本被复制到X管理的缓冲区 xff08 或者双击一个单词 xff09 粘贴 xff1a 鼠标中键 3 简单
  • Linux三剑客(grep、awk、sed)

    Linux三剑客 xff08 grep awk sed xff09 grep xff08 文本过滤工具 xff09 A 10显示匹配字符串后面10行内容 n显示匹配字符串在匹配文件中的行号 w整个字符串匹配 c显示匹配个数 C 10显示匹配
  • 查询Linux内核中的结构体/函数定义

    查询Linux内核中的结构体 函数定义 下载 安装Ctags 下载ctags源码https ctags sourceforge net 解压tar zxvf ctags 5 8 tar gz配置 configure编译make安装sudo
  • 新广告法违规词、敏感词在线检测工具

    新广告法的上线实行 xff0c 限制了很多的违规词 xff0c 敏感词的使用 xff0c 极限用语的处罚由原来的退一赔三变更为罚款二十万元起 如何确定广告中是否存在有敏感词呢 小龙经过多方努力 xff0c 终于开发出了新广告法违规词 敏感词
  • Linux应用学习——GDB调试

    GDB调试学习记录 常用操作 以client c为例 span class token macro property span class token directive hash span span class token directi
  • Linux学习笔记

    Linux学习笔记 Linux驱动 GPIO GIC中断 Cortex A7中断管理器GIC IIC设备框架 SPI设备框架 MISC驱动框架 Input设备框架 Platform设备框架 USB设备 Linux应用开发 Shell 快乐的
  • Cortex-A7中断控制器GIC

    Cortex A7中断控制器GIC 中断号 芯片内部的中断都会引起IRQ InterruptGIC将所有的中断源 最多1020个中断ID 分为三类 SPI SharedPeripheralInterrupt 共享中断 xff0c 外部中断都
  • Linux应用学习——多进程

    进程 当一个进程正常终止时可以通过int atexit void function void 注册进程终止处理函数 PART1 进程相关概念 进程是一个动态的过程 xff0c 而非一个静态的文件 xff0c 是程序的一次运行过程 xff0c
  • Linux应用学习——多线程

    多线程 PART1 线程相关概念 线程时参与系统调度的最小单位 被包含在进程之中 xff0c 是进程中的实际运行单位 一个进程可以创建多个线程 xff0c 多个线程实现并发运行 xff0c 每个线程执行不同的任务 线程时最基本的运行单位 x
  • Linux编程小工具

    编程小技巧 1 函数 结构体查询 需求背景 xff1a 安装了ctag安装使用ctag可以通过vim t 34 i2c client 34 来查询i2c client结构体的信息 不方便的地方 xff1a 需要进入指定的目录下才行 Git
  • Linux应用学习_网络开发

    Linux应用学习 网络开发 1 TCP套接字编程 1 1 套接字 1 1 1 通用套接字sockaddr span class token keyword struct span span class token class name s
  • Linux应用学习——高级I/O复用

    高级I O 阻塞I O 阻塞 xff0c 进入休眠状态 xff0c 让出CPU的使用权 xff0c 等待阻塞的条件为真普通文件一定是以非阻塞的方式进行I O操作文件默认是通过阻塞式操作的 fd span class token operat
  • 《从0到1大话操作系统》--(2)纸质内存中的数据结构

    你一定听过那句著名的等式 xff1a 程序 61 数据结构 43 算法 你可能不相信 xff0c 一个叫尼古拉斯 沃斯 xff08 Niklaus Wirth xff09 的瑞士计算机科学家 xff0c 凭这句话 xff0c 获得了图灵奖
  • 《从0到1大话操作系统》--(1)万物起源:编码

    古希腊毕达哥拉斯学派的世界观人为世界的本质是数 在计算机的世界中 xff0c 所有的一切也确实是数 万物起源 xff1a 编码 1 万物皆可编码2 ASCII编码3 互不兼容4 Unicode编码 1 万物皆可编码 曾经有一位懵懂的少年 x
  • 【安全】如何关闭Windows系统的137, 139, 445端口?

    4月14日晚 xff0c 一个叫Shadow Brokers的黑客组织泄露了一大波Windows的远程漏洞利用工具 xff0c 事件细节可以参照运维派前面的文章 Windows血崩 xff0c 一波大规模 0day 攻击泄漏 恩威科技 am

随机推荐

  • Linux中断、系统调用处理流程与进程切换

    1 中断与系统调用的过程 1 程序控制流 正常程序的控制流只有next xff08 执行下一条指令 xff09 和goto xff08 跳转到另一条指令执行 xff09 除了正常控制流之外 xff0c 还有异常控制流 xff0c 广义上异常
  • 开篇叙事

    开篇叙事 我为什么会在这儿我的主题我的经历 我为什么会在这儿 作为我第一次踏足CSDN xff0c 当然 xff0c 我说的是在CSDN上写博客 xff0c 我在CSDN上阅读博客已经有很长一段时间了 xff0c 这里有非常多的非常棒的博主
  • Redhat(红帽) Linux软件包管理rpm概述

    1 软件包管理的内涵 习惯了Windows上安装软件的方式 下载安装包 xff0c 双击运行 xff0c 点击几次下一步后 xff0c 软件就安装完了 我也是常年使用Windows xff0c 习惯了Windows的方式 xff0c 却从来
  • FreeRTOS(一):裸机系统与多任务系统

    裸机系统与多任务系统 3 1裸机系统3 1 1轮询系统3 1 2前后台系统 3 2多任务系统总结 3 1裸机系统 裸机 xff1a 英文名是Bare machine Bare metal xff0c 指没有配置操作系统和其他软件的电子计算机
  • FreeRTOS(二):数据结构—列表与列表项

    数据结构 列表与列表项 4 列表与列表项4 1链表4 1 1单向链表4 1 2双向链表4 1 3链表与数组的对比 4 2FreeRTOS中链表的实现4 2 1实现链表节点1 定义链表节点数据结构2 链表节点初始化 4 2 2实现链表根节点1
  • Cordova技术初次学习

    文章目录 前言一 Cordova 是什么 xff1f 二 关于Cordova环境搭建前提要求 xff1a 1 利用npm 安装2 创建应用3 添加平台4 运行 三 结语 前言 这是一篇关于Cordova入门学习的记录文章 一 Cordova
  • 修改datax,Java获取mongo,Document转换成json,遇到的类型问题,用JsonWriterSettings解决

    java numberlong 解决方法 在修改datax插件的时候遇到了问题 问题 xff1a 我们存在mongo中带有数据类型 xff0c 如图 我们直接将Document转json会带上类型 且在mongo java driver的j
  • VirtualBox 主机ping不通虚拟机的解决办法

    visualBox的主机是ping不通虚拟机的 但是虚拟机能ping通主机 要先进行以下配置 第一个网卡为NAT Network 在网络配置中 xff0c 新建一个网卡2为桥接网卡 新建共享文件夹 国外一个老哥说的 xff0c 不新建共享文
  • 基于python实现相关模板匹配跟踪之SSDA算法

    基于python实现相关模板匹配跟踪之SSDA算法 1 单张图片匹配 1 1代码 1 2 效果 2 视频跟踪 2 1代码 2 2 效果 2 3 优化思路 3 参考链接 相关模板匹配跟踪和质心跟踪都是传统算法 相较于AI算法 具有极快的处理速
  • AGV小车经典算法设计及应用

    1 AGV小车的发展背景 在现代化工业的发展中 xff0c 提倡高效 xff0c 快速 xff0c 可靠 xff0c 提倡将人从简单的工作中解放出来 机器人逐渐替代了人出现在各个工作岗位上 机器人具有可编程 可协调作业和基于传感器控制等特点
  • 扒完社交网络关系才明白,《权力的游戏》凭什么是神作

    摘要 xff1a 凡人皆有一死 没错 xff0c 但那是 凡人 会数据的 xff0c 都不是凡人 DT君当你看冰火的时候 xff0c 你在看什么 xff1f 作为一个 冰与火之歌 的资深迷弟 xff0c 看到如今的冰火电视 Valar Mo
  • 数字IC设计入门(1)初识电路板和芯片

    本文为入门级同学和零电子基础同学准备 xff0c 有一定电子基础的请直接忽略 xff0c 芯片从本质上说还是电路 xff0c 因此有必要从电路板开始了解芯片工作过程 xff0c 下面将简单介绍一块电脑主机板 电路板已在我们生活中无处不在 x
  • 数电4_4——常见组合逻辑电路(3)数据选择器

    数据选择器 1 1 工作原理1 1 1 电路图1 1 2 写出逻辑表达式 1 1 3 对应真值表 1 2 应用1 2 1 用双四选一设计八选一1 2 2 用数据选择器设计组合逻辑电路1 2 2 1 用四选一实现1 2 2 2 用八选一实现1
  • 机器学习实战之科比数据集分析(随机森林寻最优值参数)

    文章目录 总体思路分为三部1 查看数据 xff0c 对数据进行清洗 xff0c 规约1 1 查看数据1 2 数据清洗 规约1 3 删除不相关的特征1 4 数据one hot处理 2 建立模型 xff0c 挑选出最优参数2 1 准备数据集 训
  • 一文读懂anchor-base和anchor-free

    1 从Faster RCNN看Anchor Faster RCNN相对于Fast RCNN的一个改进是引入了RPN网络 xff0c RPN用于区域推荐 xff0c 替换了此前的SS算法使得网络在整体上更加的CNN化 那么RPN是怎么进行区域
  • 用MATLAB提取字符串中的特定类别(数字等)

    如果一个字符串中包含多种格式的字符 xff0c 想把其中特定的一种提取出来 xff0c 有一个函数可以轻松解决 xff1a TF 61 isstrprop str category 确定输入文本中的字符是否为指定的类别 xff0c 如字母
  • 云计算基础与应用 第三章 云服务器

    以下为自己个人做的笔记 xff0c 不带有商业性质 xff0c 纯粹交流分享学习资料 xff0c 如有侵权 xff0c 请联系作者 xff0c 作者看到会第一时间删除 xff0c 如有侵权敬请见谅 文章目录 3 1 云服务器概述3 2 云服
  • 工作记录:NX系统烧录

    一 固件 BSP下载 https developer nvidia com embedded L4T r32 Release v4 2 t186ref release aarch64 Tegra Linux Sample Root File
  • YOLO v5获取目标的坐标位置,以及将crop融合到全黑背景中

    可能很多人不知道我这个标题后面这句话的含义 xff0c 因为这个场景可能很多地方压根用不到 xff0c 暂时不细说 我是上个月开始接触yolov5 v6 2版本做目标识别的 xff0c 也没有什么深度学习和pytorch的概念 xff0c
  • slam的简单操作以及原理

    slam的原理以及应用 1 新建工作文件夹 使用mkdir命令新建文件夹 slambook和ch1文件夹 xff0c 并利用cd命令进入ch1文件下 xff0c 截图如 2 编写helloslam小程序 使用vim命令创建helloslam