原創(chuàng):王穩(wěn)鉞
資料來源:肖老師
本文主要介紹搭建一個無人機仿真平臺所需的軟件及其簡介。
1. ROS簡介及安裝
ROS是一個比較復(fù)雜的概念。在ROS WiKi中,ROS的定義為:一個開放源代碼的機器人元操作系統(tǒng)。這里有個比較關(guān)鍵的概念就是元操作系統(tǒng),它和常見的Windows、Linux、安卓等系統(tǒng)不同,它相當(dāng)于是在更底層的操作系統(tǒng)之上做了進一步的封裝。ROS提供了我們對于操作系統(tǒng)期望的服務(wù),包括硬件抽象、低級設(shè)備控制常用功能的實現(xiàn)、進程間的消息傳遞以及功能包管理。它還提供用于在多臺計算機之間獲取、構(gòu)建、編寫和運行代碼的工具和庫。換句話來說,ROS包括一個類似于操作系統(tǒng)的硬件抽象,但它不是一個傳統(tǒng)的操作系統(tǒng),它具有可用于異構(gòu)硬件的特性。此外它也是一個機器人的軟件平臺,提供了專門為機器人開發(fā)應(yīng)用程序的各種開發(fā)環(huán)境。無人機的外號叫空中機器人,所以無人機本質(zhì)上也是一個機器人。而且隨著無人機現(xiàn)在智能化成程度越來越高,更多的開發(fā)者其實已經(jīng)在關(guān)注無人機的上層控制,也就是常說的智能化的一些相關(guān)算法。所以將底層部分拿走之后只關(guān)注上層的話,那對于無人機的智能開發(fā)跟對機器人的智能開發(fā)是非常類似的。所以就把ROS這個機器人領(lǐng)域用的最多的一個開源的元操作系統(tǒng)拿來,用于在無人機上做上層的控制。
其實選擇ROS還有很多其他的原因。首先ROS它原本就集成好了很多高端的功能,包括SLAM,AMCL,Movelt!等。這些功能在ROS的開源社區(qū)內(nèi),已經(jīng)有其他的開發(fā)者完成開發(fā)了,想用的時候很方便的直接拿來用就好,不需要自己去把這些復(fù)雜的功能全部開發(fā)一遍。第二點是ROS具有大量的工具。比如常用于調(diào)試的rqt、可視化工具rviz、用于仿真的Gazebo等。集成了大量好用的工具,就可以便于開發(fā)者非常方便的去實現(xiàn)想要實現(xiàn)的功能。第三,從硬件層面上來說,大多數(shù)的機器人開發(fā)者不太熟悉嵌入式開發(fā),尤其是對于傳感器、執(zhí)行器驅(qū)動的開發(fā),這些驅(qū)動的開發(fā)也是ROS幫助完成了。市面上主流的傳感器和執(zhí)行器大多數(shù)都有ROS庫,這樣的話使用ROS就可以直接的獲取傳感器的信息和對執(zhí)行器進行操作,而不需要再去考慮驅(qū)動的問題。第四是多語言的支持。編程有非常多的語言,每個人習(xí)慣的語言不同,ROS一大優(yōu)點就是它具有對于多種語言支持的特性,主要支持C++、Python、LISP。對于C++和Python來說,ROS就相當(dāng)于是它們的一個庫,下面有很多相應(yīng)的類和方法,直接去使用就可以。第五是模塊化,不同的任務(wù)去用不同的模塊來實現(xiàn),這樣的話可以便于解耦,一個模塊出了問題之后不會影響到別的模塊。第六是資源并發(fā)處理。最后也是ROS最關(guān)鍵的一點就是它有非常活躍的開源社區(qū),所有的命令在官網(wǎng)上都有文檔說明,而且有非常非常多的已經(jīng)開發(fā)好的開源機器人項目,可以直接使用。
接下來介紹一下ROS的組件,下圖展示了主要組件。最下面是硬件接口層,也就是驅(qū)動,和傳感器、執(zhí)行器打交道的,像相機驅(qū)動、GPS/IMU的驅(qū)動、深度相機的驅(qū)動、音頻的驅(qū)動等等。再往上一層是通信層,也就是信息傳遞的時候所涉及到的一些層級,其中包括ros話題,ros服務(wù)等。再往上面是機器人的應(yīng)用框架,這些框架在實際做機器人開發(fā)的時候不用自己開發(fā)了,已經(jīng)提供好了。比如說用的比較多的TF,主要用來解決坐標(biāo)系之間的變換關(guān)系。如果自己去用變換矩陣推的話,比較麻煩,還可能推錯。但是TF就把坐標(biāo)系的變換關(guān)系用一個庫來幫助計算,很容易的實現(xiàn)坐標(biāo)系之間的變換。再往上是機器人的應(yīng)用。如果想要實現(xiàn)某個功能,可以先去ROS中找,很多時候都不需要自己實現(xiàn), ROS就已經(jīng)幫助集成好了。最上面這一層就是所謂的編程語言,對于ROS來說,編程語言就稱之為語言客戶層了。

下圖展示了ROS的文件系統(tǒng)。因為ROS主要運行在Linux系統(tǒng)下,而Linux將所有東西的看作是文件。



下面介紹ROS計算圖,其實就是ROS的工作流程。

圖中node1、node 2 等一共有五個節(jié)點,也就是有五個進程,一般來說一個節(jié)點來完成一個核心的功能。節(jié)點跟節(jié)點之間是通過特定的消息信息傳遞方式去來溝通的,也或者說是叫交互。信息傳遞的方式主要有主題或者話題 (topic)、服務(wù)(service)、動作(action)、參數(shù)服務(wù)器(parameter server)等。節(jié)點1和節(jié)點3之間的通信就是通過服務(wù)器的需求與響應(yīng),那對應(yīng)的就是客戶端向服務(wù)器發(fā)起需求,然后服務(wù)服務(wù)器向客戶端去進行反饋這樣的一個過程。在無人機中一些比較關(guān)鍵的操作是用服務(wù)來實現(xiàn)的。比如給無人機解鎖和上鎖,因為解鎖和上鎖就直接決定了無人機是不是要飛了。如果解鎖的時候旁邊有人,那可能螺旋槳一轉(zhuǎn)起來就會傷到人。所以解鎖和上鎖是比較重要的,它是用服務(wù)來實現(xiàn)的,一定要有一個反饋,代表這個解鎖和上鎖是成功了還是失敗了。話題或者主題只發(fā)布消息,消息發(fā)送之后,至于其他節(jié)點收到了沒有,執(zhí)行的情況怎么樣,就不再關(guān)心了。發(fā)出消息后,中間像是一個話題池子(topic 1、topic2、topic 3),等待其他節(jié)點去訂閱這些話題,然后就收到了這些消息了。參數(shù)服務(wù)器存儲了整個計算圖中的節(jié)點所需要用到的參數(shù)。ROS就通過使用節(jié)點把代碼跟功能解耦,提高了系統(tǒng)的容錯力和可維護性。在寫程序的時候,最好是讓每一個節(jié)點都具有單一的功能,而不是要寫一個特別大的節(jié)點,這個節(jié)點把所有的事都包了。這并不是一個很好的軟件開發(fā)的一個方式,因為一旦有一個程序崩潰,這整個節(jié)點就全廢了,機器人肯定就會有比較嚴(yán)重的問題。有這么多節(jié)點,就需要有一個管理器來管理這些節(jié)點,這個就是節(jié)點管理器(master),它用于節(jié)點的名稱注冊和查找,也負責(zé)設(shè)置節(jié)點間的通信。
ROS的安裝可以參照 http://wiki.ros.org/Installation/Ubuntuguan 官網(wǎng)安裝,下圖的網(wǎng)站中也有一些安裝的說明。

2. Gazebo簡介及安裝
Gazebo是一個基于物理仿真的3D機器人模擬器,能夠?qū)τ趶?fù)雜的室內(nèi)外環(huán)境精確的模擬一個或多個機器人的運動,對機器人設(shè)計、場景測試都十分有用。下圖展示了Gazebo真實界面。

圖中的中間的部分,就是交互的場景。通過這場景可以看出這應(yīng)該是一個室內(nèi)場景。一般來說室內(nèi)場景都不封頂,因為封頂了的話,攝像頭就不能夠很好地看到全局了。所以通常Gazebo的室內(nèi)場景都是不做封頂?shù)?,默認的話就是把天花板的都打開了。其中一片藍色區(qū)域其實是有一個無人機,它使用的是一個二維的激光雷達,激光線用藍色做了可視化,就實現(xiàn)了這樣的效果,這個就是Gazebo的一個交互場景。左邊是一些像模型光線、風(fēng)、環(huán)境等物理引擎的一些設(shè)置,它的一些屬性也可以看到,可以通過 insert 去在使用過程中去人為的添加一些物體。在圖中最下面,可能看得不是很清楚,有一個實時因子(real time factor),它表明的就是仿真時間和真實的流逝時間的比值。因為仿真其實是可以加速和減速的,如果這個因子是1代表實際的時間流過一秒,仿真時間也流過過一秒,它是完全模擬實際場景。后面還有一個數(shù)值是FPS(每秒的幀數(shù)),這個主要是由顯卡性能決定的,一般到六十幾基本上就是Gazebo渲染速度的上限了,顯卡再好也不可能超過這個速度了。但如果顯卡比較差,然后仿真場景也比較的大的話,F(xiàn)PS可能就會比較低,這樣就會導(dǎo)致在執(zhí)行視覺相關(guān)的算法時,仿真會出現(xiàn)問題。還有像激光雷達,尤其是三維激光雷達,它的獲取點云的是需要大量的計算量的。Gazebo的插件是允許使用GPU 來做激光雷達數(shù)據(jù)的獲取。在這種情況下,如果GPU不行,那激光雷達的數(shù)據(jù)獲取可能也有問題。所以說一個好的顯卡對于仿真也是很有必要的。
下圖的鏈接中有詳細的Gazebo安裝說明。因為在裝ROS的時候,它會自帶的把Gazebo裝上,默認裝的Gazebo的版本比較低,有些地方適配性不是很好,所以要先把之前裝的卸載。卸載之后,就可以按照Gazebo的官網(wǎng)進行安裝。Gazebo安裝完成后,按照鏈接的說明文檔繼續(xù)安裝插件及模型文件。

3. MAVROS簡介及安裝
MAVROS是個比較重要的一個功能包。下圖展示了真實無人機和仿真兩種情況,這有助于理解ROS和PX4的關(guān)系以及MAVROS的作用。

真實無人機我這里頭有三個模塊。首先第一個模塊是在Pixhawk中跑的PX4程序,這個就是飛行控制器。其實就是裝在無人機上的一個小盒子,它又外接了電機、一些傳感器、遙控器的接收機等等,它主要負責(zé)底層控制的部分。那上層控制是在哪跑的呢?上層控制是在上位機,比如說英偉達TX2,通常就是更強大,比如英特爾的芯片等。這些芯片它們的算力比較高,在這上面可以運行更復(fù)雜的一些程序,比如對圖像的處理等等程序。這部分就是ROS發(fā)揮特長的地方了。像TX2等一般裝的都是Linux 系統(tǒng),ROS就可以就在里面跑一些高級的程序。但如果程序想要給底層的控制器發(fā)指令,這是兩個硬件,這兩個硬件之間怎么通信呢?一般來說是通過串口通信,連個 USB 線就能通信了。通信這是硬件連接,那還需要有軟件的協(xié)議,這個協(xié)議就是MAVLink協(xié)議。但MAVLink協(xié)議比較復(fù)雜,人們認為ROS比較簡單,就使用了MAVROS,MAVROS是ROS的一個功能包,它把MAVLink協(xié)議給封裝成了ROS協(xié)議。這是它的一部分功能,這樣的話在上位機發(fā)一個話題,比如說發(fā)一個速度指定的話題,然后通過MAVROS就能夠傳到PX4,然后它就會按照這個速度去飛,這就是MAVROS的功能。MAVROS還有一個功能,它提供了一個 UDP 的橋接。QGroundControl是地面站,在地面上去監(jiān)測無人機的一些數(shù)據(jù),那這個通信往往就是無線通信了,因為飛機在天上飛,地面站是在地面端,它就要通過無線通信。這會通過UDP的方式來通信,但也需要有對應(yīng)的協(xié)議,也可以使用MAVROS。
在仿真時,仿真無人機跟真實無人機其實非常的相像,但是有些地方做了有對應(yīng)的映射。首先PX4通過在Linux中編譯,編譯出了一套飛行控制器。這套飛行控制器模擬了Pixhawk上的PX4,但從外界的直觀感受上來說是一樣的,無論是參數(shù)的調(diào)節(jié),消息的輸入輸出,給人的直觀感受都是一模一樣的。第二點不一樣的就是模擬物理環(huán)境了,因為真實的無人機,它的螺旋槳跟大氣的交互,傳感器跟環(huán)境的交互,這些都是在真實世界中發(fā)生的。電腦中沒有這些東西,所以需要通過Gazebo來去模擬真實世界中發(fā)生的這些物理過程,去模擬無人機動力傳感器獲得的數(shù)據(jù)等等。最后就是模擬的上位機,比如說本來的上位機可能是在TX2上或者是英特爾的UC上,在這些小型的電腦主機上運行的。那仿真時電腦主機就變成了筆記本或者是臺式機了。那因為都是運行的 Linux 系統(tǒng),系統(tǒng)是完全一樣的,所以說寫的程序沒有什么區(qū)別。在ROS程序仿真中, ROS程序也就是在這個所謂的模擬上位機中運行,然后通過ROS話題的發(fā)布、 服務(wù)的請求,然后去經(jīng)由MAVROS轉(zhuǎn)到MAVLink去做通信。
但其實MAVROS和MAVLink是存在著坐標(biāo)系差異的,這在使用中需要非常注意。

4. PX4簡介及源碼編譯
PX4的定義是一個開源自動駕駛飛行棧,簡單理解它就是一個飛行控制軟件。下圖展示了PX4的特點。

PX4的另一個定義把PX4分成了兩部分——飛行棧和中間件。飛行棧就是飛行控制軟件,包括了狀態(tài)估計,也就是通過傳感器的數(shù)據(jù)來估計無人機現(xiàn)在的位置、姿態(tài)、速度、角速度、加速度等。飛行控制就是去讓無人機飛的穩(wěn)定,飛行方向等。中間件它是一個通用的機器人層,它是跟底層的硬件打交道的,還包括硬件之間或者說不同的模塊之間的通信。
PX4是如何編譯的呢?因為PX4沒有辦法像前面的那些可以直接從Ubuntu的 App庫中裝,這就需要自己源碼編譯。通過下圖鏈接中的說明文檔就可以很快解決。

5. XTDrone配置
這么多軟件,它們之間的關(guān)系是什么樣的呢?是如何聯(lián)系在一起的呢?下圖做了展示。

XTDrone的源碼下載也有說明文檔,按照下圖鏈接中的說明文檔就可以成功下載。

其實本文中出現(xiàn)的說明文檔寫的非常詳細,還有很多本文中沒有提到的內(nèi)容。感興趣的同學(xué)可以仔細閱讀,希望可以成功搭建出無人機仿真平臺。