1.SJ-SLAM-14
1、引言
SLAM:Simultaneous Localization and Mapping 同时定位与地图构建
搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。
视觉SLAM:以相机为主要传感器的SLAM
问题:从图像中估计相机的运动以及环境的情况
应用:机器人、AR/VR、无人机、无人驾驶等等。
运动过程中把环境描述出来,这个描述不是唯一的,比如百度地图那种也叫做地图,还有就是三维空间中的点,把这些点用来定位,那么这些点组成的也叫地图等等
视觉SLAM主要的困难之处
三维空间的运动
受噪声影响
数据来源只有图像
人类看到的是图像,计算机看到的是数值矩阵
从学习角度来看
牵涉到理论太广
从理论到实现困难
资料缺乏
相关书籍和课程
The Bible:Multiple View Geometry in Computer Vision
State Estimation for Robotics: A Matrix-Lie-Group Approach
Probabilistic Robotics(主要将二维的激光的)
观念:只有亲自动手实现了算法,才能谈得上理解
预备知识
数学:高等数学、线性代数(矩阵论)、概率论
编程:C++、linux,了解语法和基本命令即可
阅读第一章习题作为自测
例如:
类是什么?STL是什么?
2、初始SLAM
本讲目标
理解一个视觉SLAM框架由哪几个模块组成,各模块的任务是什么。
搭建编程环境,为开发和实验做准备。
理解如何在Linux下编译并运行一个程序。如果它出了问题,我们又如何对它进行调试。
掌握cmake的基本使用方法。
以激光为传感器的SLAM研究得也比较完善了,而以相机为传感器的SLAM还有比较长的路要走。
相机为传感器的SLAM不能把相机遮挡,以及环境要有一定纹理,不能是全黑或者全白等
RGBD比较适合于室内,在室外还是用单目或者双目要好些
视觉里程计:它跟里程计很像,里程计知道这一步跟下一步之间的运动,下一步和下下部的运动,通过这种信息累加起来就知道轨迹了。而视觉里程计呢,它是根据两个图像或者图像之间的关系,这个时刻的图像跟下个时刻的图像,下个时刻和下下时刻的图像,通过比较两两之间的图像运动给估计出来,再把这些运动累叠起来,从而把运动估计出来。就是通过两个帧或者多个帧局部的几个帧的运动把轨迹给估计出来。里程计有噪声,会产生漂移,所以需要使用后端的全局优化。
第二讲的实践部分
演示内容
安装Ubuntu
理解一个程序由哪些部分构成
Hello SLAM
头文件和库文件
使用IDE
1、首先把代码git到ubuntu下,
git clone https://github.com/gaoxiang12/slambook
进入第二章ch2
mkdir ch2
cd ch2
touch main.cpp
#include <iostream>
using namespace std;
int main(int argc,char **argv)
{
cout<<"Hello,SLAM!"<<endl;
return 0;
}
它是一个c++程序,需要用c++的编译器把它使用起来gcc或者g++
g++ main.cpp
生成a.out
也可以g++ main.cpp -o helloSLAM
一个工程倒无所谓,当工程很大的时候,有很多.cpp文件,这时候都用gcc或者g++去编译这是一件很痛苦的事情,也有称为Makefile的工具,在这里我们使用CMake这样的工具。
首先,它是一个工程管理文件,CMake的每个目录下都有一个CMakeLists.txt(它是一个文本文件)的文件,我们要在CMakeLists.txt里面去声明这个工程是有哪些文件所组成的,CMakeLists.txt本身是有一套语法的,虽然它是文本文件,比如说,
首先我们要建立一个工程名字:
要先指定CMake的版本,
cmake_minimum_required(VERSION 2.8)
然后用project新建一个工程:
project(helloSLAM)
add_executable通过main.cpp把它编译成一个helloslam的可执行程序
add_executable(helloslam main.cpp)
通过这三句话就告诉了cmake这个工程是这样子组织的
那么这时候,这个目录下就有了CMakeLists.txt,它说明了这个目录下面的CMake工程怎样的,以及源程序是怎样子的,那么这时候就可以调用cmake来编译这个工程,这个CMake它需要指定一个目录,这个目录目前就是在当前目录下".",这时候cmake就产生了很多编译信息,
这些编译信息会告诉你它使用的编译工具,以及最主要会生成一个Makefile文件,这个Makefile是自动生成的,这时候调用make,就可以对整个工程进行编译了,这个过程比之前一行一行去写g++来编译要强,因为我们现在只需要去维护这个CMakeLists.txt文件就可以了。
CMakeLists.txt
main.cpp
然后就是,当我们调用了cmake .的时候会产生很多中间文件,那么怎么处理呢?
我们更常见的做法是新建一个文件夹,进入到这个文件夹里面,对上层文件进行编译,如下,
这样做的好处就是所有编译出来的东西都在新建的文件夹里面,而在上层文件夹是干净的,只有一个main.cpp和CMakeLists.txt,如果当不想要这些输出结果的时候,就可以直接删掉build这个文件夹,
下面处理另一个问题,
程序除了可执行程序之外,还有一大堆并一定可以直接执行的程序,但是这些程序里面提供了一堆函数或者类,你可以在可执行程序里面调用,这时候他们就不是通过add_executable去生成的,它是一种叫做库的东西,下面演示一下,首先去新建一个库叫做hello.cpp
vim hello.cpp它提供了一个简单的函数
#include<iostream>
using namespace std;
void printHello()
{
cout<<"Hello,SLAM!!"<<endl;
}
这个函数还没有可执行程序去调用它,我们希望提供给其他程序用的,这时候怎么办呢,这时候需要一个库的概念,那么去CMakeLists.txt,里面添加add_library(hello hello.cpp)那么通过hello.cpp生成了一个库,这个库就叫做hello,这个库本身没有什么可以执行的东西,它只是向外提供了一个可以调用的函数,然后再对工程进行编译,可以看到除了生成了可执行程序helloslam之外,还生成了libhello.a的库文件,这个文件其实它本身是打了一个包,主要是对函数进行打了一个包,有了这个库之后,我们就可以去调用刚才那个hello.cpp文件里面的函数,为了调用它还需要一个hello.h的头文件来告诉它,我们的库里面有这样一个函数,
vim hello.h
#pragma once
void printHello();
把这个实现了的函数声明一下,那么这个hello.h和hello.cpp就构成了一个完整的库,这个库就可以在别的程序当中调用,
重新编写一个useHello.cpp来调用它,
#include "hello.h"
int main()
{
printHello();
return 0;
}
然后就在CMakeLists.txt下面去添加,
因为这个useHello是可执行的那么要加上
add_executable(useHello useHello.cpp)
而且还要把可执行文件链接到库上,使用如下
target_link_libraries(useHello hello)
然后进入到build进行cmake ..;然后执行make,就可以了,
那么去执行./useHello的时候就会去调用printHello()函数了。
那么从这个过程中,可以看出来,一个可执行的东西,可能链接了其他库里面很多可执行的东西,是别人实现好的东西,他打包成了一个头文件和一个库文件,那么有了这两个文件就可以对他进行调用,去使用它,
去实现这些东西,其实是分成了两步的,第一步就是,通过编译器来编译,第二步就是通过链接器来实现链接到相应库上面;
最后演示一下IDE的使用,使用KDevelop
先安装之sudo apt-get install kdevelop
它是直接支持cmake的c++,
如果在CMakeList.txt下加调试模式,如下
下面要去调试
要执行某个程序那么就要选择对该程序进行debug,
选择run->configure launches->然后选择useHello,
然后就可以单步调试等等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】