視覺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按鈕,可以執行單步執行等。可以放置變量等看值多少
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章