同时定位与地图构建:首先是估计自己的运动,然后描述环境这两件事。
困难之处:
数据来源只有图像等
视觉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文件