视觉SLAM十四讲(2):初识SLAM
這一講主要介紹視覺SLAM的結構,并完成第一個SLAM程序:HelloSLAM。
目錄
2.1 小蘿卜的例子
單目相機
雙目相機
深度相機
2.2 經(jīng)典視覺SLAM框架
2.3 SLAM問題的數(shù)學表述
2.4 編程實踐
Hello SLAM
使用cmake
使用庫
【高翔】視覺SLAM十四講
2.1 小蘿卜的例子
這一節(jié)高翔博士首先介紹了自己組裝的“小蘿卜”機器人,小蘿卜要想具有自主運動的能力,首先要知道自身的姿態(tài),然后是了解外界的環(huán)境。這兩類問題都需要使用傳感器,視覺SLAM中常用的傳感器是相機,根據(jù)相機的工作工作方式不同,可以分為三類:單目相機(Monocular)、雙目相機(Stereo)、深度相機(RGB-D)。
單目相機
單目相機結構簡單,成本較低。本質上是拍照時的場景在相機的成像平面上留下一個投影,以二維的形式記錄了三維的世界。
單目SLAM估計的軌跡和地圖,將與真實的軌跡’地圖,相差一個因子,也就是所謂的尺度。由于單目SLAM無法僅憑圖像確定這個真實尺寸,所以又稱為尺度不確定性。 本質原因是通過單張圖像無法確定深度,為了得到這個深度,人們開始使用雙目相機和深度相機。
雙目相機
雙目相機由兩個單目相機組成,但這兩個相機之間的距離(稱為基線)是已知的。我們通過這個基線來估計每個像素的空間位置,基線距離越大,能夠測量到的就越遠,雙目與多目的缺點是配置與標定均較為復雜,其深度量程和精度受雙目的基線與分辨率的限制,而且視覺計算非常消耗計算資源,需要使用GPU和FPGA設備加速后,才能實時輸出整張圖像的距離信息。因此在現(xiàn)有的條件下,計算量是雙目的主要問題之一。
深度相機
深度相機又稱RGB-D相機,它最大的特點是可以通過紅外結構光或Time-of-Flight(ToF)原理,像激光傳感器那樣,通過主動向物體發(fā)射光并接收返回的光,測出物體離相機的距離。
目前常用的RGB-D相機還存在測量范圍窄、噪聲大、視野小、易受日光干擾、無法測量透射材質等諸多問題,在SLAM方面,主要用于室內。
2.2 經(jīng)典視覺SLAM框架
下圖為視覺SLAM的經(jīng)典框架,視覺SLAM流程分為如下步驟:
關于這幾個模塊,在后面的張杰會詳細介紹,這里先了解即可。
2.3 SLAM問題的數(shù)學表述
這里使用數(shù)學語言來描述SLAM的過程,SLAM過程可總結為兩個方程:
??????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ??
上式為運動方程,其中為時刻的位置,為傳感器的讀書,為過程中加入的噪聲,方程含義為:根據(jù)機器人上一時刻的位置和傳感器當前的輸入來判斷下一時刻機器人的位置。與運動方程相對應,還有一個觀測方程:
????????????????????????????????????????????????????????????????????????????????????
其中是觀測噪聲,為機器人在位置上看到的路標,方程描述的是:根據(jù)機器人在位置上看到的路標時,產生的觀測數(shù)據(jù)。
這兩個方程描述了最基本的SLAM問題:當知道運動測量的讀數(shù),以及傳感器的讀數(shù)時,如何求解定位問題(估計)和建圖問題(估計),這樣就把SLAM問題建模成了一個狀態(tài)估計問題?
2.4 編程實踐
Hello SLAM
像任何教科書一樣,這里從最基本的程序開始,這里使用的是C++代碼,這個程序很簡單,不多解釋了:
#include <iostream> using namespace std;int main(int argc, char **argv) {cout << "Hello SLAM!" << endl;return 0; }在終端執(zhí)行以下命令來編譯,生成一個可執(zhí)行文件:
g++ hellSLAM.cpp使用cmake
生面的程序只有一個文件,使用g++可能比較方便,但是當文件越來越多時,就不那么方便了,因為這時輸入的編譯命令會越來越長。目前,工程上cmake是使用最廣泛的,可以很方便的生成一個makefile文件,然后再使用make命令來編譯整個工程。我們先創(chuàng)建一個CMakeLists.txt文件,內容如下:
# 聲明要求的 cmake 最低版本 cmake_minimum_required(VERSION 2.8)# 聲明一個 cmake 工程 project(HelloSLAM)# 添加一個可執(zhí)行程序 # 語法:add_executable( 程序名 源代碼文件 ) add_executable(helloSLAM helloSLAM.cpp)在終端使用如下命令調用camke對該工程進行cmake編譯,下面的點表示在當前目錄下進行cmake。
cmake .現(xiàn)在可以使用make編譯,會看到生成可執(zhí)行程序helloSLAM
make使用庫
下面演示如何生成一個庫,源文件如下:
//這是一個庫文件 #include <iostream> using namespace std;void printHello() {cout << "Hello SLAM" << endl; }在CMakeLists.txt文件中添加如下內容,生成hello庫,然后和上面一樣,使用cmake編譯工程,不過這時生成的是靜態(tài)庫libhello.a。
# 添加hello庫 add_library(hello libHelloSLAM.cpp)下面我們生成動態(tài)庫libhello_shared.so。
# 共享庫 add_library(hello_shared SHARED libHelloSLAM.cpp)庫文件只是編譯好的二進制文件,如果想使用它,還需要對應的頭文件,頭文件如下:
#ifndef LIBHELLOSLAM_H_ #define LIBHELLOSLAM_H_ // 上面的宏定義是為了防止重復引用這個頭文件而引起的重定義錯誤// 打印一句hello的函數(shù) void printHello();#endif最后寫一個新文件來使用這個庫:
#include "libHelloSLAM.h"// 使用 libHelloSLAM.h 中的 printHello() 函數(shù) int main(int argc, char **argv) {printHello();return 0; }在CMakeLists.txt文件中添加以下內容,鏈接剛才生成的動態(tài)庫:
# 添加可執(zhí)行程序調用hello庫中函數(shù) add_executable(useHello useHello.cpp) # 將庫文件鏈接到可執(zhí)行程序上 target_link_libraries(useHello hello_shared)最后,再編譯即可生成可執(zhí)行文件。
總結
以上是生活随笔為你收集整理的视觉SLAM十四讲(2):初识SLAM的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 画面感十足 翟志刚:天上剪脚趾甲特别累
 - 下一篇: python控制浏览器导出数据_Djan