视觉SLAM十四讲---第一、二讲(讲解slam框架, c++编译实践)

同时定位与地图构建:首先是估计自己的运动,然后描述环境这两件事。

困难之处:

数据来源只有图像等

视觉slam14讲有编程内容

在这里插入图片描述
书中有相关知识的小例题

一、视觉slam框架分为四个模块

定位和建图的相互耦合,把误差放在一起优化

基于激光的相机的传感器各有优劣
激光比较成熟,相机还不稳定(2016年)
相机便宜,计算资源大,光线充足,环境要有可辨识度。

按照种类来说,视觉slam分为三种:

单目相机,只能通过图像;双目相机和深度相机有距离这个因素。
距离只能通过移动之后来测量(否则不知道距离到底多远,近处物体变化大);

双目测量通过两个摄像头来产生深度(双眼看到的不一样);

深度相机通过物理方式,测量一个面,知道每一个点的深度,tof方法和结构光的方法(主动测量,功耗大,适合室内,量程小)。

在这里插入图片描述

视觉里程计:通过测量两两帧(或者多帧)之间的关系,估计运动,再把运动叠加起来

因为里程计是把局部的信息累加,因此也会累计局部的误差。因此需要后端优化。

回环检测,如果回到之前的位置,就可以调整里程计的信息,得到全局一致的机构

~因为得到的是特征点地图,因此为了应用,还需要重建。

二、视觉里程计
特征点法和直接发
三、后端有话
在噪声的消息中估计,滤波—>图优化
四、回环检测
以后讲
五、建图
十三讲中

slam可以看做离散时间1.。。k,机器人有不同的位置xk,看做随机变量,满足一定随机分布的。

运动方程:
在这里插入图片描述

观测方程
通过路标表示空间的一些东西
如果传感器在xk处探测到路标yj
在这里插入图片描述
观测取决于在xk看到的路标数量

六、实践
1、初试c++
git clone代码然后新建.cpp文件

#include <iostream>
using namespace std;

int main( int argc, char** argv)
{
cout<<"hello world"<<endl;
return 0;
}

用gcc或者g++来编译c++文件

g++ main.cpp

什么都没有提示就是正常
然后ls一下,发现有a.out这就是编译出的文件。
然后运行

./a.out

就会得到hello world

这里面省略了很多步骤,都采用默认,首先,改out文件名

g++ main.cpp -o helloslam

就会生成helloslam文件(注意这里没有.o

2、
但是当c++文件夹里的依赖的文件太多,用g++的话太麻烦,因此可以用makefile,但是写makefile太麻烦,直接跳到cmake

cmake是一个工程管理文件
cmake有一个cmakelists,说有哪些文件组成

vi CMakeLists.txt

本身有一套语法

cmake_minimum_required( VERSION 3.10.2)#指出cmake的版本
project(hello)#新建工程名为hello
add_executable( helloslam main.cpp)#将main.cpp编译成helloslam的可执行文件

编译

cmake .#就是直接编译整个目录(别忘了点)

生成Makefile文件,然后在make就可以进行编译

make

这样从一行一行些g++变成维护CMakeLists文本文件就可以,实际编译是make

一个小技巧,就是我们可以在文件夹下创建一个名为bulid的子文件件,CMakeLists文件还是放在父文件夹中,在bulid文件夹中运行cmake …就可以编译父文件件,这样产生的一些中间文件就可以都放在build文件夹中,如果 不想要可以直接删除

程序除了可执行文件,还有一些定义函数和类的文件,这些不是通过executable来生成,通过库生成。

#include <iostream>
using namespace std;

void printhello()
{
cout<<"hello slam"<<;
}

然后修改CMakeLists文件添加进生成hello库的语句

cmake_minimum_required( VERSION 3.10.2 )#指出cmake的版本
project(hello)#新建工程名为hello
add_executable( helloslam main.cpp )#将main.cpp编译成helloslam的可执行文件
add_library(hello hello.cpp)

然后生成MakeFiles文件,再make
发现生成
libhello.a 文件

然后我们需要调用的话还需要一个.h头文件

vi hello.h

告诉ta库函数中有这样一个函数
文件内容:

#pragma once#保证一个文件只包含一次

void printhello();#函数声明

hello.h和hello.cpp就构成了一个完成的库

我们来调用一下
定义usehello.cpp,需要首先引用头文件

#include "hello.h"

int main()
{
printhello();
}

对于c++程序编译,采用kedevelopIDE开发,视频中可以从CMakeLists直接导入项目,但是在我电脑上不可以,因此还是新建工程,然后将需要用到的文件移到目录中。

对于调用的函数,可以按住ctrl跳进定义函数中

debug
对于c++的某些问题,是可以通过编译的,但是运行不成功,因此需要debug。

程序中有release模式的debug模式,release模式中程序进行优化,运行很快,debug模式可以找错误,因此首先需要声明是debug模式,可以放断点。

在CMakeLists的project下写

set( CMAKE_BUILD_TYPE "DEBUG")

在点击build以后在配置中添加可执行文件,然后配置可执行文件,最后放置断点,debug按钮,可以执行单步执行等。可以放置变量等看值多少
在这里插入图片描述
--------------------补充---------------------------
导入工程的时候直接选择文件夹就可以,不能选择cmakelists.text文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值