1.SLAM與ROS的關係

1.1.關於SLAM

在瞭解SLAM之前,需要先對機器人有一個整體的認識。機器人是一個複雜的裝置,涉及到執行機構、感知、決策等主要環節。機器人上的配備的常用執行機構有輪式運動底盤、機械手臂、音響和顯示屏;機器人上的感知設備通常有激光雷達、聲吶、攝像頭、IMU、輪式里程計編碼盤、麥克風、觸摸感應;機器人的決策是機器人智能的體現,機器人通常藉助感知裝置持續跟外部環境進行交互,從而來獲取機器人的狀態和環境的狀態,我們可以簡單的把機器人獲取自身狀態的行為叫做自我認知,把機器人獲取環境狀態的行為叫做環境認知。機器人的自我認知和環境認知往往是相輔相成互相作用的,所以這裡就不做區分了。由於目前的機器人智能還比較低級,所以這裡講到的機器人認知也是低級別的,例如人臉識別、語音識別、機器人定位、環境障礙物探測。有了認知,機器人就可以幫人類完成很多工作了,例如搬運貨物、照看小孩、陪伴閑聊、幫忙管理家裡的智能設備、查詢天氣交通新聞資訊等等。我們可以把機器人幫助人類完成的這些個工作叫做機器人的技能,機器人擁有的這些個技能我們可以簡單的理解為機器人低級別的思想。機器人的軀殼+機器人的認知+機器人的思想,基本上就是機器人該有的模樣了。

圖1.1.1 一個典型機器人的模樣

這樣一看,機器人是一個超級複雜的東西,但是機器人上現在關鍵性的技術就那麼幾個。其實,學界和工業界熱門的研究和開發也是圍繞這幾個關鍵技術展開的。關鍵技術1:機器人移動底盤,絕大部分機器人需要依靠移動底盤來行走,當然除了水下機器人和腿型機器人這些特殊形態外,電機的效率功率、電機控制電路、編碼器檢測、底盤運動模型等組成部分,機器人底盤是AGV智能車、家庭服務機器人、農業工業自動化移動平臺必不可少的關鍵組件。關鍵技術2:機械手臂,機器人抓取物品、組裝零件、寫字畫畫都需要用到機械手臂,高性能的舵機、精密的機械關節、智能關節控制演算法等幾個組成部分,機械手臂在工業自動化領域已經得到廣泛應用,比如汽車自動裝配、手機零配件裝配,不過應用在服務機器人和AGV智能車上的輕便微型機械手臂目前還不成熟或者說還不普及。關鍵技術3:SLAM導航,這裡終於講到了大名鼎鼎的SLAM技術了,學術上的SLAM是指同時定位和建圖技術,但是平時大家說的SLAM通常是廣義的機器人定位+環境建圖+自主導航+動態避障,我們這裡也討論的是廣義的SLAM,簡單點說SLAM技術幫助機器人認識環境並在環境中自由行走到目的地。關鍵技術4:語音識別,語音交互是大部分機器人的標配,人類通過語音交互向機器人下達任務指令,語音交互包括語音識別、語音合成、自然語言處理等部分組成,目前基於語音交互做出來的小機器人也是遍地開花。關鍵技術5:物體識別,機器人藉助攝像頭對自己所處環境的各種事物進行識別,比如流行的人臉識別、車牌識別、手勢識別等等。

關鍵技術1:機器人移動底盤

關鍵技術2:機械手臂

關鍵技術3:SLAM導航

關鍵技術4:語音交互

關鍵技術5:物體識別

本人在這裡總結歸納了機器人上的5大關鍵技術,由於個人能力和篇幅限制原因,接下來的內容將主要涉足機器人SLAM導航領域的相關技術。

SLAM導航技術,主要用來解決機器人的定位、環境建圖、自主導航、動態避障等問題。SLAM這項技術其實已經有幾十年的歷史了,SLAM最早是出現在軍事應用中,比如勇氣號火星探測車,在不能實時遙控的未知環境行星上的探測車為了執行任務,需要藉助SLAM技術來導航和避障。後來慢慢的SLAM技術就從軍用轉民用了,有了我們現在看到的小到家裡的掃地機器人大到無人駕駛汽車的各種SLAM應用,還有各種AR和VR應用很多也用到了SLAM技術。

其實單獨的定位技術我們日常生活中能見到很多,比如最常用的GPS定位技術、wifi定位技術、磁條導軌定位技術。單獨的環境建圖技術也有很多成熟的應用,比如醫學中的CT對人體的全方位掃描技術、電影製作中對某個三維物體的掃描建模、隧道勘探測繪等。但是面對機器人這樣一個複雜的應用,單獨的定位技術和單獨的環境建圖技術都不能很好的解決問題,於是結合了定位與建圖的SLAM技術就出現了。接下來,簡單的梳理一下定位、建圖、SLAM同時定位於建圖、SLAM導航技術的理論發展過程。

(1)機器人中的不確定性

機器人所處的環境存在大量不可預測性,機器人中感測器的測量存在雜訊和幹擾,電機等執行機構也存在一定程度的不可靠性,還有一些不確定性是由機器人的軟體導致的。要研究機器人的感知和行為就必須對這些不確定性進行建模,利用概率理論可以明確的表示這種不確定性,並且可以利用概率演算法來對概率分佈進行推理計算,以數學的方式合理的表示機器人的模糊性和置信度。簡單點說,就是通過對機器人的概率建模,可以對機器人的不確定性進行明確的可計算性的表示。

(2)機器人中的狀態估計

處理機器人中的這種不確定性的概率技術我們稱之為概率機器人技術,其核心是用感測器數據來估計狀態的思路。

圖1.1.2 機器人與環境交互

機器人通過感測器對機器人自身狀態和環境狀態進行測量,這裡的機器人狀態包括機器人位姿、運動里程計信息、線速度和角速度信息等,而環境狀態包括環境中物體的位置、物體的特徵等。機器人同時利用控制動作來調用執行機構和環境進行交互,這裡的控制動作包括機器人運動、物體操縱等。這樣,機器人在通過感測器測量和控制動作與環境進行交互的過程中,對環境模型和機器人位姿進行估計。對環境模型的迭代估計就是我們常說的環境建圖,對機器人位姿的迭代估計就是我們常說的機器人定位。

利用感測器測量和控制動作對環境模型和機器人位姿進行估計由概率法則迭代計算來完成。控制動作的概率模型我們稱之為運動概率模型,感測器測量的概率模型我們稱之為測量概率模型,這裡的概率法則迭代計算過程就是大名鼎鼎的貝葉斯迭代網路。

圖1.1.3 貝葉斯迭代網路

(3)貝葉斯濾波及其各種實現演算法

通過對機器人中狀態估計的瞭解,我們知道了貝葉斯概率法則起著重要的作用,而且大部分計算置信度的通用演算法都是由貝葉斯演算法給出的。這裡說的貝葉斯演算法也稱作貝葉斯濾波,該演算法根據測量和控制數據計算置信度分佈bel()。貝葉斯濾波是一種遞歸演算法,也就是說t時刻的置信度由t-1時刻的置信度來計算。

貝葉斯濾波演算法具有兩個基本步驟,即預測和更新。根據運動概率模型,可以對初步的預測置信度分佈;然後利用測量概率模型,對上一步預測得到的置信度分佈做進一步的更新計算。貝葉斯濾波的具體實現演算法有多種,根據置信度表示方式的不同,貝葉斯濾波的具體實現演算法可以分為參數化實現演算法和非參數化實現演算法兩種。參數化實現演算法,就是將置信度分佈用多元高斯分佈的參數進行表示。根據採用不同高斯分佈的參數,又可以分為卡爾曼濾波和信息濾波。非參數化實現演算法,就是將置信度分佈用有限數量的具體值來近似表示。根據採用不同具體值近似的方法,又可以分為直方圖濾波和粒子濾波。

圖1.1.4 貝葉斯濾波及各種具體實現演算法

由於貝葉斯濾波理論及各種具體實現演算法涉及到大量深奧的數學知識,由於篇幅和個人能力受限,就不展開了,有興趣的朋友可以參閱《概率機器人》這本書,這裡面有細緻的講解和推導。為了加深大家在閱讀和編寫代碼時的理解,這裡貼出了貝葉斯濾波的偽代碼實現,和機器人中廣泛應用的卡爾曼濾波和粒子濾波的展示實例。

圖1.1.5 基礎貝葉斯濾波的偽代碼實現
圖1.1.6 卡爾曼濾波的偽代碼實現
圖1.1.7 卡爾曼濾波對置信度分佈的更新過程
圖1.1.8 粒子濾波的偽代碼實現
圖1.1.9 粒子濾波對置信度分佈的更新過程

(4)機器人中的運動與測量概率模型

瞭解了機器人中的狀態估計及各種濾波概率演算法後,我們發現機器人的運動和測量概率模型對演算法中的預測和更新步驟起著至關重要的作用。

運動模型我們都知道,就是機器人一個地方運動到另一個地方,位姿變化與運動控制量之間的關係。那什麼叫運動概率模型呢?由於控制量作用在機器人上使機器人的位姿變化的過程是一個存在誤差的不確定過程,所以控制量作用後產生的結果需要用一個概率分佈來描述,這就是運動概率模型。根據運動控制量的不同,可以分成速度運動模型和里程計運動模型。速度運動模型中,控制量是線速度和角速度;里程計運動模型中,控制量是機器人的前後時刻的相對位姿。速度運動模型中,線速度和角速度會受到機器人底盤構造的約束。實驗表明,里程計運動模型雖然仍存在誤差,但比速度運動模型要更精確。

圖1.1.10 機器人的運動概率模型

同樣的道理,機器人上的感測器在測量過程中存在誤差,所以測量結果需要用一個概率分佈來描述。主要討論當下最流行的機器人測距儀,即激光掃描測距儀。由測距儀的近似物理模型,可以沿著一個波束測量到附近物體的距離,也就是波束模型。另一種測距儀模型不依賴任何感測器的物理模型,而是將感測器掃描到的終點值映射到地圖的全局坐標空間,這就是似然域模型。估計一個測量和地圖之間的相關性中,測距儀用到了地圖匹配模型。還有一種是從感測器原始測量中提取特徵,提取出來的特徵我們可以稱之為路標,這就是路標模型。

圖1.1.11 機器人的測量概率模型

(5)移動機器人定位與建圖

圖1.1.12 移動機器人定位與建圖

在瞭解了機器人中的狀態估計、狀態估計的各種概率實現演算法、機器人運動與測量概率模型,我們再來重新理解上面這樣一個經典的貝葉斯迭代網路,就很好理解了,這個裡麪包含了機器人定位和建圖兩大問題。機器人的定位其實就是位姿估計問題,位姿估計的概率實現演算法可以有上面提到的EKF、AMCL等演算法來實現,由於這兩種演算法在機器人位姿估計中都很流行,所以就不多展開了。機器人的建圖其實就是環境特徵估計問題,同樣也可以用概率的方法就行估計。

(6)SLAM同時定位與建圖

上面已經單獨的提出了機器人定位與機器人建圖的方法,但是獨立的定位問題是建立在地圖已知的情況下的,單獨的建圖問題也是建立在定位已知的情況下的。當機器人不能得到環境地圖,也不知道自身位姿的時候,SLAM問題就出現了。也就是說SLAM要同時的進行機器人定位和建圖,這個問題比單獨的定位和單獨的建圖都要難得多。

在討論具體的SLAM演算法之前,我們先要了解SLAM的兩種主要形式:在線SLAM問題和全SLAM問題。

圖1.1.13 在線SLAM問題和全SLAM問題

在線SLAM演算法的代表是EKF SLAM,歷史上最早並可能是最有影響力的SLAM演算法,可以說是SLAM研究的元老級演算法。EKF SLAM中的地圖是基於特徵的,地圖由點地標組成。除了估計機器人當前的位姿,EKF SLAM演算法還估計路徑上遇到的所有地標的坐標,也就是機器人位姿和地圖地標點包含進聯合狀態矢量裏,演算法對該聯合狀態矢量進行估計。

圖1.1.14 EKF SLAM偽代碼實現

全SLAM演算法的代表是GraphSLAM,該演算法將機器人的運動路徑和測量組件成一個軟約束的圖,利用圖論中的優化演算法對整個圖中的軌跡點和測量點進行估計。由於圖的稀疏性特點,可以大大加快計算。

圖1.1.15 GraphSLAM偽代碼實現

EKF SLAM和GraphSLAM是兩個極端。EKF SLAM需要取得每一時刻的信息,把信息分解為概率分佈,因此每一步的計算代價都非常昂貴。而GraphSLAM剛好相反,只是簡單的積累每一時刻的信息,也就是簡單的將收到的信息存儲下來,然後可以離線的進行推理的步驟,加之存儲下來的信息的稀疏性,因此GraphSLAM計算的開銷是比較小的,但是隨著地圖規模擴大演算法會消耗越來越多的內存直至崩潰。面對這兩個極端問題,當然就會有介於EKF SLAM和GraphSLAM是兩個極端之間的折中的方法,就是SEIF SLAM。SEIF SLAM演算法繼承了EKF SLAM信息表示的高效性,也保留了GraphSLAM計算代價小的優點,可以說SEIF SLAM是高效和可實現的SLAM演算法。還有另外一種高效和可實現的SLAM演算法,就是FastSLAM,該演算法使用粒子濾波估計機器人的路徑,我們都知道粒子濾波和眾多基於參數化的濾波演算法相比存在計算開銷小和便於處理非線性模型的優勢,基於FastSLAM的多個變種演算法在機器人已經得到廣泛的應用了,比如gmapping等等,由於篇幅限制就不展開了。

(7)現今主流的SLAM演算法

現今在機器人上使用最廣泛的應該算激光SLAM了,在掃地機器人、服務機器人、AGV智能車上普遍搭載了單線激光雷達SLAM演算法,像無人駕駛汽車、戶外機器人則普遍搭載了多線激光雷達SLAM。另一種熱門的研究是視覺SLAM,視覺SLAM有配備單目、雙目、深度相機的多種形態,並且根據採用視覺特徵點的區別還有直接法、半直接法、稀疏法之分。然後還有就是各種複合式的SLAM演算法,比如激光與視覺融合的SLAM、融合了IMU的視覺SLAM。最後,就是一些最新穎的SLAM演算法,比如用深度學習來做的端到端的SLAM、基於物體識別的語義SLAM。由於本文的重點不是SLAM綜述,所以具體的演算法性能比較就不展開了,有興趣的朋友可以參閱相關SLAM綜述文章。

圖1.1.16現今主流的SLAM演算法

(8)機器人自主導航與動態避障

機器人用SLAM構建出了環境的地圖,在已知了環境地圖的情況下,可以用SLAM的重定位功能或者單獨的基於已知地圖的定位演算法比如AMCL來進行機器人的定位。環境地圖和機器人位姿都有了,就可以開始來做自主導航和避障了。機器人自主導航可以分成兩個實現部分,第一個部分就是路徑規劃,第二個部分就是控制策略。路徑規劃利用地圖信息尋找一條能到達目標的全局路徑,全局路徑在機器人導航過程中起到全局戰略性的指導。理想情況是,機器人完全按照全局路徑移動到目標,但是實際環境往往是多變和複雜的,而且機器人實際控制也會存在偏差,所以機器人的實際運動控制需要有一套控制策略來最終實現。控制策略需要盡量逼近全局路徑、盡量遠離障礙物、最快時間到達目標等因素,這些因素可以用一個回報函數來評價,尋找最佳控制策略的過程中遞歸的計算每一次行動的回報函數值。這樣控制策略在回報函數的指引下,就可以給出最佳的控制策略,控制策略控制機器人完成實際的移動。

圖1.1.17 主流路徑規劃演算法

1.2.關於ROS

ROS機器人操作系統在機器人應用領域很流行,依託代碼開源和模塊間協作等特性,給機器人開發者帶來了很大的方便。

ROS是一個適用於機器人的開源的元操作系統。其實它並不是一個真正的操作系統,其底層的任務調度、編譯、定址等任務還是由Linux操作系統完成,也就是說ROS實際上是運行在Linux上的次級操作系統。但是ROS提供了操作系統應用的各種服務(如:硬體抽象、底層設備控制、常用函數實現、進程間消息傳遞、軟體包管理等),也提供了用於獲取、編譯、跨平臺運行代碼的工具和函數。ROS主要採用松耦合點對點進程網路通信,目前主要還是支持Ubuntu系統,windows和Mac OS目前支持的還不好,所以推薦在Ubuntu系統上安裝使用ROS。

總結起來就是,使用ROS能夠方便迅速的搭建機器人原型。ROS使用了BSD許可證,這是一個很寬鬆的開放許可證,允許在商業和閉源產品中使用,這一點對開發產品的創業公司很重要。ROS當前的代碼統計量,總行數超過1400萬,作者超過2477名。代碼語言以C++為主,63.98%的代碼是用C++編寫的,排名第二的是python,佔13.57%,可以說ROS基本上都是使用這兩種語言,來實現大部分的功能。

圖1.2.1 ROS的圖標

大家一聽到ROS機器人操作系統,就被操作系統幾個字給嚇到了。其實,ROS就是一個分散式的通信機制,幫助程序進程之間更方便的通信。由於機器人是一個多部件的設備,四肢、視覺、聽覺等部位都有配套的程序進行控制,那麼要協調這些部位怎麼辦呢?就需要讓這些分散的部位能夠互相的通信,這正是ROS被設計的最初目的。隨著越來越多的人參與到ROS的開發完善,ROS才發展成今天很完善很系統的樣子來,涵蓋了大量的第三方工具和大量的實用的開源演算法軟體包。搞懂了ROS的通信機制後,機器人的各種演算法的開發還是基於我們常見的C++和Python的。

節點是主要的計算執行進程,功能包中創建的每個可執行程序在被啟動載入到系統進程中後,該進程就是一個ROS節點,node1、node2、node3等都是節點(node)。節點都是各自獨立的可執行文件,能夠通過主題(topic)、服務(server)或參數伺服器(parameter server)與其他節點通信。ROS通過使用節點將代碼和功能解耦,提高了系統的容錯力和可維護性。所以你最好讓每一個節點都具有特定的單一的功能,而不是創建一個包羅萬象的大節點。節點如果用c++進行編寫,需要用到ROS提供的庫roscpp;節點如果用python進行編寫,需要用到ROS提供的庫rospy。

圖1.2.2 ROS網路通信的架構

如果你是剛剛接手ROS方面的開發或項目,你肯定會覺得ROS中的各種概念非常奇怪,但是當你對ROS的使用熟練之後,你就覺得這些概念很好理解了。與其他操作系統相似,一個ROS程序的不同組件要被放在不同的文件夾下,這些文件夾是根據不同的功能來對文件進行組織的。

圖1.2.3 ROS程序的組織形式

1.3.SLAM與ROS的關係

SLAM最核心的地方在演算法,側重點在於如何構建出效果好的地圖,並為機器人導航提供更好的數據保障。ROS幫忙解決感測器驅動、顯示、各種核心演算法間的溝通協調問題。如果做商用產品就另當別論了,商業的產品一般會專門開發自己的一套驅動、調度、顯示的系統,或者拿ROS系統來裁剪以保障穩定性和效率。

推薦閱讀:

相關文章