日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视觉SLAM十四讲(2):初识SLAM

發布時間:2023/12/10 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视觉SLAM十四讲(2):初识SLAM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這一講主要介紹視覺SLAM的結構,并完成第一個SLAM程序:HelloSLAM。

目錄

2.1 小蘿卜的例子

單目相機

雙目相機

深度相機

2.2 經典視覺SLAM框架

2.3 SLAM問題的數學表述

2.4 編程實踐

Hello SLAM

使用cmake

使用庫


【高翔】視覺SLAM十四講

2.1 小蘿卜的例子

這一節高翔博士首先介紹了自己組裝的“小蘿卜”機器人,小蘿卜要想具有自主運動的能力,首先要知道自身的姿態,然后是了解外界的環境。這兩類問題都需要使用傳感器,視覺SLAM中常用的傳感器是相機,根據相機的工作工作方式不同,可以分為三類:單目相機(Monocular)、雙目相機(Stereo)、深度相機(RGB-D)。

單目相機

單目相機結構簡單,成本較低。本質上是拍照時的場景在相機的成像平面上留下一個投影,以二維的形式記錄了三維的世界。

單目SLAM估計的軌跡和地圖,將與真實的軌跡’地圖,相差一個因子,也就是所謂的尺度。由于單目SLAM無法僅憑圖像確定這個真實尺寸,所以又稱為尺度不確定性。 本質原因是通過單張圖像無法確定深度,為了得到這個深度,人們開始使用雙目相機和深度相機。


雙目相機

雙目相機由兩個單目相機組成,但這兩個相機之間的距離(稱為基線)是已知的。我們通過這個基線來估計每個像素的空間位置,基線距離越大,能夠測量到的就越遠,雙目與多目的缺點是配置與標定均較為復雜,其深度量程和精度受雙目的基線與分辨率的限制,而且視覺計算非常消耗計算資源,需要使用GPU和FPGA設備加速后,才能實時輸出整張圖像的距離信息。因此在現有的條件下,計算量是雙目的主要問題之一。


深度相機

深度相機又稱RGB-D相機,它最大的特點是可以通過紅外結構光或Time-of-Flight(ToF)原理,像激光傳感器那樣,通過主動向物體發射光并接收返回的光,測出物體離相機的距離。

目前常用的RGB-D相機還存在測量范圍窄、噪聲大、視野小、易受日光干擾、無法測量透射材質等諸多問題,在SLAM方面,主要用于室內


2.2 經典視覺SLAM框架

下圖為視覺SLAM的經典框架,視覺SLAM流程分為如下步驟:

  • 傳感器信息讀取:在視覺SLAM中主要為相機圖像信息的讀取和預處理。
  • 前端視覺里程計:其任務為估算相鄰圖像間相機的運動,以及局部地圖的樣子。
  • 后端非線性優化: 后端接受不同時刻視覺里程計測量的相機位姿,以及回環檢測的信息,對它們進行優化,得到全局一致的軌跡和地圖。
  • 回環檢測:判斷機器人是否到達過先前的位置,如果檢測到回環,會把信息提供給后端進行處理。
  • 建圖:根據估計的軌跡,建立與任務要求對應的地圖。
  • 關于這幾個模塊,在后面的張杰會詳細介紹,這里先了解即可。


    2.3 SLAM問題的數學表述

    這里使用數學語言來描述SLAM的過程,SLAM過程可總結為兩個方程:

    ??????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ??

    上式為運動方程,其中為時刻的位置,為傳感器的讀書,為過程中加入的噪聲,方程含義為:根據機器人上一時刻的位置和傳感器當前的輸入來判斷下一時刻機器人的位置。與運動方程相對應,還有一個觀測方程:

    ????????????????????????????????????????????????????????????????????????????????????

    其中是觀測噪聲,為機器人在位置上看到的路標,方程描述的是:根據機器人在位置上看到的路標時,產生的觀測數據。

    這兩個方程描述了最基本的SLAM問題:當知道運動測量的讀數,以及傳感器的讀數時,如何求解定位問題(估計)和建圖問題(估計),這樣就把SLAM問題建模成了一個狀態估計問題?


    2.4 編程實踐

    Hello SLAM

    像任何教科書一樣,這里從最基本的程序開始,這里使用的是C++代碼,這個程序很簡單,不多解釋了:

    #include <iostream> using namespace std;int main(int argc, char **argv) {cout << "Hello SLAM!" << endl;return 0; }

    在終端執行以下命令來編譯,生成一個可執行文件:

    g++ hellSLAM.cpp

    使用cmake

    生面的程序只有一個文件,使用g++可能比較方便,但是當文件越來越多時,就不那么方便了,因為這時輸入的編譯命令會越來越長。目前,工程上cmake是使用最廣泛的,可以很方便的生成一個makefile文件,然后再使用make命令來編譯整個工程。我們先創建一個CMakeLists.txt文件,內容如下:

    # 聲明要求的 cmake 最低版本 cmake_minimum_required(VERSION 2.8)# 聲明一個 cmake 工程 project(HelloSLAM)# 添加一個可執行程序 # 語法:add_executable( 程序名 源代碼文件 ) add_executable(helloSLAM helloSLAM.cpp)

    在終端使用如下命令調用camke對該工程進行cmake編譯,下面的點表示在當前目錄下進行cmake。

    cmake .

    現在可以使用make編譯,會看到生成可執行程序helloSLAM

    make

    使用庫

    下面演示如何生成一個庫,源文件如下:

    //這是一個庫文件 #include <iostream> using namespace std;void printHello() {cout << "Hello SLAM" << endl; }

    在CMakeLists.txt文件中添加如下內容,生成hello庫,然后和上面一樣,使用cmake編譯工程,不過這時生成的是靜態庫libhello.a。

    # 添加hello庫 add_library(hello libHelloSLAM.cpp)

    下面我們生成動態庫libhello_shared.so。

    # 共享庫 add_library(hello_shared SHARED libHelloSLAM.cpp)

    庫文件只是編譯好的二進制文件,如果想使用它,還需要對應的頭文件,頭文件如下:

    #ifndef LIBHELLOSLAM_H_ #define LIBHELLOSLAM_H_ // 上面的宏定義是為了防止重復引用這個頭文件而引起的重定義錯誤// 打印一句hello的函數 void printHello();#endif

    最后寫一個新文件來使用這個庫:

    #include "libHelloSLAM.h"// 使用 libHelloSLAM.h 中的 printHello() 函數 int main(int argc, char **argv) {printHello();return 0; }

    在CMakeLists.txt文件中添加以下內容,鏈接剛才生成的動態庫:

    # 添加可執行程序調用hello庫中函數 add_executable(useHello useHello.cpp) # 將庫文件鏈接到可執行程序上 target_link_libraries(useHello hello_shared)

    最后,再編譯即可生成可執行文件。

    總結

    以上是生活随笔為你收集整理的视觉SLAM十四讲(2):初识SLAM的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。