同時定位與地圖構建:首先是估計自己的運動,然後描述環境這兩件事。
困難之處:
數據來源只有圖像等
視覺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按鈕,可以執行單步執行等。可以放置變量等看值多少