无人机仿真平台搭建
原創:王穩鉞
資料來源:肖老師
本文主要介紹搭建一個無人機仿真平臺所需的軟件及其簡介。
1. ROS簡介及安裝
ROS是一個比較復雜的概念。在ROS WiKi中,ROS的定義為:一個開放源代碼的機器人元操作系統。這里有個比較關鍵的概念就是元操作系統,它和常見的Windows、Linux、安卓等系統不同,它相當于是在更底層的操作系統之上做了進一步的封裝。ROS提供了我們對于操作系統期望的服務,包括硬件抽象、低級設備控制常用功能的實現、進程間的消息傳遞以及功能包管理。它還提供用于在多臺計算機之間獲取、構建、編寫和運行代碼的工具和庫。換句話來說,ROS包括一個類似于操作系統的硬件抽象,但它不是一個傳統的操作系統,它具有可用于異構硬件的特性。此外它也是一個機器人的軟件平臺,提供了專門為機器人開發應用程序的各種開發環境。無人機的外號叫空中機器人,所以無人機本質上也是一個機器人。而且隨著無人機現在智能化成程度越來越高,更多的開發者其實已經在關注無人機的上層控制,也就是常說的智能化的一些相關算法。所以將底層部分拿走之后只關注上層的話,那對于無人機的智能開發跟對機器人的智能開發是非常類似的。所以就把ROS這個機器人領域用的最多的一個開源的元操作系統拿來,用于在無人機上做上層的控制。
其實選擇ROS還有很多其他的原因。首先ROS它原本就集成好了很多高端的功能,包括SLAM,AMCL,Movelt!等。這些功能在ROS的開源社區內,已經有其他的開發者完成開發了,想用的時候很方便的直接拿來用就好,不需要自己去把這些復雜的功能全部開發一遍。第二點是ROS具有大量的工具。比如常用于調試的rqt、可視化工具rviz、用于仿真的Gazebo等。集成了大量好用的工具,就可以便于開發者非常方便的去實現想要實現的功能。第三,從硬件層面上來說,大多數的機器人開發者不太熟悉嵌入式開發,尤其是對于傳感器、執行器驅動的開發,這些驅動的開發也是ROS幫助完成了。市面上主流的傳感器和執行器大多數都有ROS庫,這樣的話使用ROS就可以直接的獲取傳感器的信息和對執行器進行操作,而不需要再去考慮驅動的問題。第四是多語言的支持。編程有非常多的語言,每個人習慣的語言不同,ROS一大優點就是它具有對于多種語言支持的特性,主要支持C++、Python、LISP。對于C++和Python來說,ROS就相當于是它們的一個庫,下面有很多相應的類和方法,直接去使用就可以。第五是模塊化,不同的任務去用不同的模塊來實現,這樣的話可以便于解耦,一個模塊出了問題之后不會影響到別的模塊。第六是資源并發處理。最后也是ROS最關鍵的一點就是它有非常活躍的開源社區,所有的命令在官網上都有文檔說明,而且有非常非常多的已經開發好的開源機器人項目,可以直接使用。
接下來介紹一下ROS的組件,下圖展示了主要組件。最下面是硬件接口層,也就是驅動,和傳感器、執行器打交道的,像相機驅動、GPS/IMU的驅動、深度相機的驅動、音頻的驅動等等。再往上一層是通信層,也就是信息傳遞的時候所涉及到的一些層級,其中包括ros話題,ros服務等。再往上面是機器人的應用框架,這些框架在實際做機器人開發的時候不用自己開發了,已經提供好了。比如說用的比較多的TF,主要用來解決坐標系之間的變換關系。如果自己去用變換矩陣推的話,比較麻煩,還可能推錯。但是TF就把坐標系的變換關系用一個庫來幫助計算,很容易的實現坐標系之間的變換。再往上是機器人的應用。如果想要實現某個功能,可以先去ROS中找,很多時候都不需要自己實現, ROS就已經幫助集成好了。最上面這一層就是所謂的編程語言,對于ROS來說,編程語言就稱之為語言客戶層了。
下圖展示了ROS的文件系統。因為ROS主要運行在Linux系統下,而Linux將所有東西的看作是文件。
下面介紹ROS計算圖,其實就是ROS的工作流程。
圖中node1、node 2 等一共有五個節點,也就是有五個進程,一般來說一個節點來完成一個核心的功能。節點跟節點之間是通過特定的消息信息傳遞方式去來溝通的,也或者說是叫交互。信息傳遞的方式主要有主題或者話題 (topic)、服務(service)、動作(action)、參數服務器(parameter server)等。節點1和節點3之間的通信就是通過服務器的需求與響應,那對應的就是客戶端向服務器發起需求,然后服務服務器向客戶端去進行反饋這樣的一個過程。在無人機中一些比較關鍵的操作是用服務來實現的。比如給無人機解鎖和上鎖,因為解鎖和上鎖就直接決定了無人機是不是要飛了。如果解鎖的時候旁邊有人,那可能螺旋槳一轉起來就會傷到人。所以解鎖和上鎖是比較重要的,它是用服務來實現的,一定要有一個反饋,代表這個解鎖和上鎖是成功了還是失敗了。話題或者主題只發布消息,消息發送之后,至于其他節點收到了沒有,執行的情況怎么樣,就不再關心了。發出消息后,中間像是一個話題池子(topic 1、topic2、topic 3),等待其他節點去訂閱這些話題,然后就收到了這些消息了。參數服務器存儲了整個計算圖中的節點所需要用到的參數。ROS就通過使用節點把代碼跟功能解耦,提高了系統的容錯力和可維護性。在寫程序的時候,最好是讓每一個節點都具有單一的功能,而不是要寫一個特別大的節點,這個節點把所有的事都包了。這并不是一個很好的軟件開發的一個方式,因為一旦有一個程序崩潰,這整個節點就全廢了,機器人肯定就會有比較嚴重的問題。有這么多節點,就需要有一個管理器來管理這些節點,這個就是節點管理器(master),它用于節點的名稱注冊和查找,也負責設置節點間的通信。
ROS的安裝可以參照 http://wiki.ros.org/Installation/Ubuntuguan 官網安裝,下圖的網站中也有一些安裝的說明。
2. Gazebo簡介及安裝
Gazebo是一個基于物理仿真的3D機器人模擬器,能夠對于復雜的室內外環境精確的模擬一個或多個機器人的運動,對機器人設計、場景測試都十分有用。下圖展示了Gazebo真實界面。
圖中的中間的部分,就是交互的場景。通過這場景可以看出這應該是一個室內場景。一般來說室內場景都不封頂,因為封頂了的話,攝像頭就不能夠很好地看到全局了。所以通常Gazebo的室內場景都是不做封頂的,默認的話就是把天花板的都打開了。其中一片藍色區域其實是有一個無人機,它使用的是一個二維的激光雷達,激光線用藍色做了可視化,就實現了這樣的效果,這個就是Gazebo的一個交互場景。左邊是一些像模型光線、風、環境等物理引擎的一些設置,它的一些屬性也可以看到,可以通過 insert 去在使用過程中去人為的添加一些物體。在圖中最下面,可能看得不是很清楚,有一個實時因子(real time factor),它表明的就是仿真時間和真實的流逝時間的比值。因為仿真其實是可以加速和減速的,如果這個因子是1代表實際的時間流過一秒,仿真時間也流過過一秒,它是完全模擬實際場景。后面還有一個數值是FPS(每秒的幀數),這個主要是由顯卡性能決定的,一般到六十幾基本上就是Gazebo渲染速度的上限了,顯卡再好也不可能超過這個速度了。但如果顯卡比較差,然后仿真場景也比較的大的話,FPS可能就會比較低,這樣就會導致在執行視覺相關的算法時,仿真會出現問題。還有像激光雷達,尤其是三維激光雷達,它的獲取點云的是需要大量的計算量的。Gazebo的插件是允許使用GPU 來做激光雷達數據的獲取。在這種情況下,如果GPU不行,那激光雷達的數據獲取可能也有問題。所以說一個好的顯卡對于仿真也是很有必要的。
下圖的鏈接中有詳細的Gazebo安裝說明。因為在裝ROS的時候,它會自帶的把Gazebo裝上,默認裝的Gazebo的版本比較低,有些地方適配性不是很好,所以要先把之前裝的卸載。卸載之后,就可以按照Gazebo的官網進行安裝。Gazebo安裝完成后,按照鏈接的說明文檔繼續安裝插件及模型文件。
3. MAVROS簡介及安裝
MAVROS是個比較重要的一個功能包。下圖展示了真實無人機和仿真兩種情況,這有助于理解ROS和PX4的關系以及MAVROS的作用。
真實無人機我這里頭有三個模塊。首先第一個模塊是在Pixhawk中跑的PX4程序,這個就是飛行控制器。其實就是裝在無人機上的一個小盒子,它又外接了電機、一些傳感器、遙控器的接收機等等,它主要負責底層控制的部分。那上層控制是在哪跑的呢?上層控制是在上位機,比如說英偉達TX2,通常就是更強大,比如英特爾的芯片等。這些芯片它們的算力比較高,在這上面可以運行更復雜的一些程序,比如對圖像的處理等等程序。這部分就是ROS發揮特長的地方了。像TX2等一般裝的都是Linux 系統,ROS就可以就在里面跑一些高級的程序。但如果程序想要給底層的控制器發指令,這是兩個硬件,這兩個硬件之間怎么通信呢?一般來說是通過串口通信,連個 USB 線就能通信了。通信這是硬件連接,那還需要有軟件的協議,這個協議就是MAVLink協議。但MAVLink協議比較復雜,人們認為ROS比較簡單,就使用了MAVROS,MAVROS是ROS的一個功能包,它把MAVLink協議給封裝成了ROS協議。這是它的一部分功能,這樣的話在上位機發一個話題,比如說發一個速度指定的話題,然后通過MAVROS就能夠傳到PX4,然后它就會按照這個速度去飛,這就是MAVROS的功能。MAVROS還有一個功能,它提供了一個 UDP 的橋接。QGroundControl是地面站,在地面上去監測無人機的一些數據,那這個通信往往就是無線通信了,因為飛機在天上飛,地面站是在地面端,它就要通過無線通信。這會通過UDP的方式來通信,但也需要有對應的協議,也可以使用MAVROS。
在仿真時,仿真無人機跟真實無人機其實非常的相像,但是有些地方做了有對應的映射。首先PX4通過在Linux中編譯,編譯出了一套飛行控制器。這套飛行控制器模擬了Pixhawk上的PX4,但從外界的直觀感受上來說是一樣的,無論是參數的調節,消息的輸入輸出,給人的直觀感受都是一模一樣的。第二點不一樣的就是模擬物理環境了,因為真實的無人機,它的螺旋槳跟大氣的交互,傳感器跟環境的交互,這些都是在真實世界中發生的。電腦中沒有這些東西,所以需要通過Gazebo來去模擬真實世界中發生的這些物理過程,去模擬無人機動力傳感器獲得的數據等等。最后就是模擬的上位機,比如說本來的上位機可能是在TX2上或者是英特爾的UC上,在這些小型的電腦主機上運行的。那仿真時電腦主機就變成了筆記本或者是臺式機了。那因為都是運行的 Linux 系統,系統是完全一樣的,所以說寫的程序沒有什么區別。在ROS程序仿真中, ROS程序也就是在這個所謂的模擬上位機中運行,然后通過ROS話題的發布、 服務的請求,然后去經由MAVROS轉到MAVLink去做通信。
但其實MAVROS和MAVLink是存在著坐標系差異的,這在使用中需要非常注意。
4. PX4簡介及源碼編譯
PX4的定義是一個開源自動駕駛飛行棧,簡單理解它就是一個飛行控制軟件。下圖展示了PX4的特點。
PX4的另一個定義把PX4分成了兩部分——飛行棧和中間件。飛行棧就是飛行控制軟件,包括了狀態估計,也就是通過傳感器的數據來估計無人機現在的位置、姿態、速度、角速度、加速度等。飛行控制就是去讓無人機飛的穩定,飛行方向等。中間件它是一個通用的機器人層,它是跟底層的硬件打交道的,還包括硬件之間或者說不同的模塊之間的通信。
PX4是如何編譯的呢?因為PX4沒有辦法像前面的那些可以直接從Ubuntu的 App庫中裝,這就需要自己源碼編譯。通過下圖鏈接中的說明文檔就可以很快解決。
5. XTDrone配置
這么多軟件,它們之間的關系是什么樣的呢?是如何聯系在一起的呢?下圖做了展示。
XTDrone的源碼下載也有說明文檔,按照下圖鏈接中的說明文檔就可以成功下載。
其實本文中出現的說明文檔寫的非常詳細,還有很多本文中沒有提到的內容。感興趣的同學可以仔細閱讀,希望可以成功搭建出無人機仿真平臺。
總結
- 上一篇: ubuntu server 12.04中
- 下一篇: 前端JSON转excel下载