ROS探索总结(一)(二)(三):ROS总体框架 ROS总体框架 ROS新手教程
ROS探索總結(一)——ROS簡介
一、歷史
? ? ? ?隨著機器人領域的快速發展和復雜化,代碼的復用性和模塊化的需求原來越強烈,而已有的開源機器人系統又不能很好的適應需求。2010年Willow Garage公司發布了開源機器人操作系統ROS(robot operating system),很快在機器人研究領域展開了學習和使用ROS的熱潮。
? ? ? ?ROS系統是起源于2007年斯坦福大學人工智能實驗室的項目與機器人技術公司Willow Garage的個人機器人項目(Personal Robots Program)之間的合作,2008年之后就由Willow Garage來進行推動。已經有四年多的時間了 (視頻)。隨著PR2那些不可思議的表現,譬如疊衣服,插插座,做早飯,ROS也得到越來越多的關注。Willow Garage公司也表示希望借助開源的力量使PR2變成“全能”機器人。
? ? ? ?PR2價格高昂,2011年零售價高達40萬美元。PR2現主要用于研究。PR2有兩條手臂,每條手臂七個關節,手臂末端是一個可以張合的鉗子。PR2依靠底部的四個輪子移動。在PR2的頭部,胸部,肘部,鉗子上安裝有高分辨率攝像頭,激光測距儀,慣性測量單元,觸覺傳感器等豐富的傳感設備。在PR2的底部有兩臺8核的電腦作為機器人各硬件的控制和通訊中樞。兩臺電腦安裝有Ubuntu和ROS。
二、設計目標
? ? ? ?ROS是開源的,是用于機器人的一種后操作系統,或者說次級操作系統。它提供類似操作系統所提供的功能,包含硬件抽象描述、底層驅動程序管理、共用功能的執行、程序間的消息傳遞、程序發行包管理,它也提供一些工具程序和庫用于獲取、建立、編寫和運行多機整合的程序。
? ? ? ?
? ? ? ?ROS的首要設計目標是在機器人研發領域提高代碼復用率。ROS是一種分布式處理框架(又名Nodes)。這使可執行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到數據包(Packages)和堆棧(Stacks)中,以便于共享和分發。ROS還支持代碼庫的聯合系統。使得協作亦能被分發。這種從文件系統級別到社區一級的設計讓獨立地決定發展和實施工作成為可能。上述所有功能都能由ROS的基礎工具實現。
三、主要特點
? ??? ?ROS的運行架構是一種使用ROS通信模塊實現模塊間P2P的松耦合的網絡連接的處理架構,它執行若干種類型的通訊,包括基于服務的同步RPC(遠程過程調用)通訊、基于Topic的異步數據流通訊,還有參數服務器上的數據存儲。但是ROS本身并沒有實時性。
? ? ? ?ROS的主要特點可以歸納為以下幾條:
? ? ?(1)點對點設計
? ? ? ?一個使用ROS的系統包括一系列進程,這些進程存在于多個不同的主機并且在運行過程中通過端對端的拓撲結構進行聯系。雖然基于中心服務器的那些軟件框架也可以實現多進程和多主機的優勢,但是在這些框架中,當各電腦通過不同的網絡進行連接時,中心數據服務器就會發生問題。
? ? ? ROS的點對點設計以及服務和節點管理器等機制可以分散由計算機視覺和語音識別等功能帶來的實時計算壓力,能夠適應多機器人遇到的挑戰。
? ? ? ?(2)多語言支持
? ? ? ?在寫代碼的時候,許多編程者會比較偏向某一些編程語言。這些偏好是個人在每種語言的編程時間、調試效果、語法、執行效率以及各種技術和文化的原因導致的結果。為了解決這些問題,我們將ROS設計成了語言中立性的框架結構。ROS現在支持許多種不同的語言,例如C++、Python、Octave和LISP,也包含其他語言的多種接口實現。
? ? ? ?ROS的特殊性主要體現在消息通訊層,而不是更深的層次。端對端的連接和配置利用XML-RPC機制進行實現,XML-RPC也包含了大多數主要語言的合理實現描述。我們希望ROS能夠利用各種語言實現的更加自然,更符合各種語言的語法約定,而不是基于C語言給各種其他語言提供實現接口。然而,在某些情況下利用已經存在的庫封裝后支持更多新的語言是很方便的,比如Octave的客戶端就是通過C++的封裝庫進行實現的。
? ? ? ?為了支持交叉語言,ROS利用了簡單的、語言無關的接口定義語言去描述模塊之間的消息傳送。接口定義語言使用了簡短的文本去描述每條消息的結構,也允許消息的合成,例如下圖就是利用接口定義語言描述的一個點的消息:
? ? ? ?每種語言的代碼產生器就會產生類似本種語言目標文件,在消息傳遞和接收的過程中通過ROS自動連續并行的實現。這就節省了重要的編程時間,也避免了錯誤:之前3行的接口定義文件自動的擴展成137行的C++代碼,96行的Python代碼,81行的Lisp代碼和99行的Octave代碼。因為消息是從各種簡單的文本文件中自動生成的,所以很容易列舉出新的消息類型。在編寫的時候,已知的基于ROS的代碼庫包含超過四百種消息類型,這些消息從傳感器傳送數據,使得物體檢測到了周圍的環境。 ? ? ? ?最后的結果就是一種語言無關的消息處理,讓多種語言可以自由的混合和匹配使用。
? ? ? ?(3)精簡與集成
? ? ? ?大多數已經存在的機器人軟件工程都包含了可以在工程外重復使用的驅動和算法,不幸的是,由于多方面的原因,大部分代碼的中間層都過于混亂,以至于很困難提取出它的功能,也很難把它們從原型中提取出來應用到其他方面。? ? ? 為了應對這種趨勢,我們鼓勵將所有的驅動和算法逐漸發展成為和ROS沒有依賴性單獨的庫。ROS建立的系統具有模塊化的特點,各模塊中的代碼可以單獨編譯,而且編譯使用的CMake工具使它很容易的就實現精簡的理念。ROS基本將復雜的代碼封裝在庫里,只是創建了一些小的應用程序為ROS顯示庫的功能,就允許了對簡單的代碼超越原型進行移植和重新使用。作為一種新加入的有優勢,單元測試當代碼在庫中分散后也變得非常的容易,一個單獨的測試程序可以測試庫中很多的特點。
? ? ? ?ROS利用了很多現在已經存在的開源項目的代碼,比如說從Player項目中借鑒了驅動、運動控制和仿真方面的代碼,從OpenCV中借鑒了視覺算法方面的代碼,從OpenRAVE借鑒了規劃算法的內容,還有很多其他的項目。在每一個實例中,ROS都用來顯示多種多樣的配置選項以及和各軟件之間進行數據通信,也同時對它們進行微小的包裝和改動。ROS可以不斷的從社區維護中進行升級,包括從其他的軟件庫、應用補丁中升級ROS的源代碼。
? ? ? ?(4)工具包豐富
? ? ? ?為了管理復雜的ROS軟件框架,我們利用了大量的小工具去編譯和運行多種多樣的ROS組建,從而設計成了內核,而不是構建一個龐大的開發和運行環境。 ? ? ? ?這些工具擔任了各種各樣的任務,例如,組織源代碼的結構,獲取和設置配置參數,形象化端對端的拓撲連接,測量頻帶使用寬度,生動的描繪信息數據,自動生成文檔等等。盡管我們已經測試通過像全局時鐘和控制器模塊的記錄器的核心服務,但是我們還是希望能把所有的代碼模塊化。我們相信在效率上的損失遠遠是穩定性和管理的復雜性上無法彌補的。? ? ? ?(5)免費并且開源
? ? ? ROS所有的源代碼都是公開發布的。我們相信這將必定促進ROS軟件各層次的調試,不斷的改正錯誤。雖然像Microsoft Robotics Studio和Webots這樣的非開源軟件也有很多值得贊美的屬性,但是我們認為一個開源的平臺也是無可為替代的。當硬件和各層次的軟件同時設計和調試的時候這一點是尤其真實的。 ? ? ? ROS以分布式的關系遵循這BSD許可,也就是說允許各種商業和非商業的工程進行開發。ROS通過內部處理的通訊系統進行數據的傳遞,不要求各模塊在同樣的可執行功能上連接在一起。如此,利用ROS構建的系統可以很好的使用他們豐富的組件:個別的模塊可以包含被各種協議保護的軟件,這些協議從GPL到BSD,但是許可的一些“污染物”將在模塊的分解上就完全消滅掉。參考資料: (1)《開源機器人操作系統——ROS》 張建偉等著 (2)《an open-source Robot Operating System》 paper (3) ?willowgarage公司網站:http://www.willowgarage.com/
(4) ?ROS官方wiki:http://www.ros.org
----------------------------------------------------------------
ROS探索總結(二)——ROS總體框架
一、 ?總體結構
? ? ? ?根據ROS系統代碼的維護者和分布來標示,主要有兩大部分: ? ? ?(1)main:核心部分,主要由Willow Garage公司和一些開發者設計、提供以及維護。它提供了一些分布式計算的基本工具,以及整個ROS的核心部分的程序編寫。 ? ? ?(2)universe:全球范圍的代碼,有不同國家的ROS社區組織開發和維護。一種是庫的代碼,如OpenCV、PCL等;庫的上一層是從功能角度提供的代碼,如人臉識別,他們調用下層的庫;最上層的代碼是應用級的代碼,讓機器人完成某一確定的功能。 ? ? ? ?一般是從另一個角度對ROS分級的,主要分為三個級別:計算圖級、文件系統級、社區級。二、 ?計算圖級
? ? ? ?計算圖是ROS處理數據的一種點對點的網絡形式。程序運行時,所有進程以及他們所進行的數據處理,將會通過一種點對點的網絡形式表現出來。這一級主要包括幾個重要概念:節點(node)、消息(message)、主題(topic)、服務(service)。? ? ? ?(1) ?節點
? ? ? ?節點就是一些直行運算任務的進程。ROS利用規模可增長的方式是代碼模塊化:一個系統就是典型的由很多節點組成的。在這里,節點也可以被稱之為“軟件模塊”。我們使用“節點”使得基于ROS的系統在運行的時候更加形象化:當許多節點同時運行時,可以很方便的將端對端的通訊繪制成一個圖表,在這個圖表中,進程就是圖中的節點,而端對端的連接關系就是其中弧線連接。? ? ? ?(2) ?消息
? ? ? ?節點之間是通過傳送消息進行通訊的。每一個消息都是一個嚴格的數據結構。原來標準的數據類型(整型,浮點型,布爾型等等)都是支持的,同時也支持原始數組類型。消息可以包含任意的嵌套結構和數組(很類似于C語言的結構structs)。? ? ? ?(3) ?主題
? ? ? ?消息以一種發布/訂閱的方式傳遞。一個節點可以在一個給定的主題中發布消息。一個節點針對某個主題關注與訂閱特定類型的數據。可能同時有多個節點發布或者訂閱同一個主題的消息。總體上,發布者和訂閱者不了解彼此的存在。
? ? ? ?(4) ?服務
? ? ? ? 雖然基于話題的發布/訂閱模型是很靈活的通訊模式,但是它廣播式的路徑規劃對于可以簡化節點設計的同步傳輸模式并不適合。在ROS中,我們稱之為一個服務,用一個字符串和一對嚴格規范的消息定義:一個用于請求,一個用于回應。這類似于web服務器,web服務器是由URIs定義的,同時帶有完整定義類型的請求和回復文檔。需要注意的是,不像話題,只有一個節點可以以任意獨有的名字廣播一個服務:只有一個服務可以稱之為“分類象征”,比如說,任意一個給出的URI地址只能有一個web服務器。? ? ? ? 在上面概念的基礎上,需要有一個控制器可以使所有節點有條不紊的執行,這就是一個ROS的控制器(ROS Master)。 ? ? ? ? ROS Master 通過RPC(Remote Procedure Call Protocol,遠程過程調用)提供了登記列表和對其他計算圖表的查找。沒有控制器,節點將無法找到其他節點,交換消息或調用服務。
? ? ? ? 比如控制節點訂閱和發布消息的模型如下:
? ? ? ??ROS的控制器給ROS的節點存儲了主題和服務的注冊信息。節點與控制器通信從而報告它們的注冊信息。當這些節點與控制器通信的時候,它們可以接收關于其他以注冊及節點的信息并且建立與其它以注冊節點之間的聯系。當這些注冊信息改變時控制器也會回饋這些節點,同時允許節點動態創建與新節點之間的連接。
? ? ? ? 節點與節點之間的連接是直接的,控制器僅僅提供了查詢信息,就像一個DNS服務器。節點訂閱一個主題將會要求建立一個與出版該主題的節點的連接,并且將會在同意連接協議的基礎上建立該連接。 ? ? ? ? ?另:ROS控制器控制服務:
三、 ?文件系統級
? ? ? ? ROS文件系統級指的是在硬盤上面查看的ROS源代碼的組織形式。? ? ? ? ROS中有無數的節點、消息、服務、工具和庫文件,需要有效的結構去管理這些代碼。在ROS的文件系統級,有以下幾個重要概念:包(package)、堆(stack)、
? ? ? ? (1) ?包
? ? ? ? ROS的軟件以包的方式組織起來。包包含節點、ROS依賴庫、數據套、配置文件、第三方軟件、或者任何其他邏輯構成。包的目標是提供一種易于使用的結構以便于軟件的重復使用。總得來說,ROS的包短小精干。
? ? ? ? (2) ?堆
? ? ? ? 堆是包的集合,它提供一個完整的功能,像“navigation stack”。Stack與版本號關聯,同時也是如何發行ROS軟件方式的關鍵。
? ? ? ? ROS是一種分布式處理框架。這使可執行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到包(Packages)和堆(Stacks)中,以便于共享和分發。下圖是在包和堆在文件中的具體結構: ? ? ? ? ?Manifests (manifest.xml):提供關于Package元數據,包括它的許可信息和Package之間依賴關系,以及語言特性信息像編譯旗幟(編譯優化參數)。
? ? ? ? ?Stack manifests (stack.xml):提供關于Stack元數據,包括它的許可信息和Stack之間依賴關系。
四、 ?社區級
? ? ? ? ROS的社區級概念是ROS網絡上進行代碼發布的一種表現形式。結構如下圖所示:? ? ? ? 代碼庫的聯合系統。使得協作亦能被分發。這種從文件系統級別到社區一級的設計讓獨立地發展和實施工作成為可能。正是因為這種分布式的結構,似的ROS迅速發展,軟件倉庫中包的數量指數級增加。
參考資料: (1)《開源機器人操作系統——ROS》 張建偉等著 (2)《an open-source Robot Operating System》 paper (3) ?willowgarage公司網站:http://www.willowgarage.com/
(4) ?ROS官方wiki:http://www.ros.org
----------------------------------------------------------------
ROS探索總結(三)——ROS新手教程
前面我們介紹了ROS的特點和結構,接下來就要開始準備動手感受一下ROS的強大了。ROS官網的wiki上針對新手的教程很詳細,最好把所有的新手教程都搞清楚,這是后面開發最基礎的東西。盡管如此,ROS對于新手來說還是很難上手,這里,我就來總結一下我當時學習的歷程,也為其他新手作為一個參考。
一、ROS的安裝
? ? ? ? ROS的安裝當然是我們開始動手的第一步了,這里我們使用的操作系統是ubuntu,因為ROS在ubuntu上的支持是最好的。 ? ? ? ? 如果是新手,我建議使用”apt-get“的方法進行安裝,不走很簡單,按照wiki上說的,大概半個小時就可以安裝完畢完全版的ROS:(現在最新版的ROS是groovy,但是我還是習慣使用fuerte) ? ? ? ??http://ros.org/wiki/fuerte/Installation/Ubuntu
? ? ? ? 如果想挑戰源碼編譯,當然也沒有問題: ? ? ? ??http://ros.org/wiki/fuerte/Installation/Ubuntu/Source
? ? ? ? 安裝完畢之后運行一下“roscore”,如果沒有問題,安裝就成功了!
注:groovy版本的安裝: ? ? ? ?“apt-get”:http://www.ros.org/wiki/groovy/Installation/Ubuntu 源碼編譯:http://www.ros.org/wiki/groovy/Installation/Source
二、ROS的新手教程
? ? ? ? wiki上的新手教程還是很詳細的,對代碼都有解釋,新手一定要把這些例子和代碼搞明白: ? ? ? ??http://www.ros.org/wiki/ROS/Tutorials
? ? ? ? 上面的教程都是英文的,如果感覺略有壓力(本人就是),可以參考下面這兩個博客中的部分翻譯: http://blog.sina.com.cn/s/articlelist_1712413141_0_1.html
?不過往后面的學習都是英文的資料了,還是要努力適應看英文的文檔。 ? ? ? ? ROS使用的編程語言主要是C++和python,所以也有針對這兩種語言的功能包roscpp和rospy,這兩個包的教程與上面的教程基本相似,看完上面的教程也可以看看這兩個包的教程: ? ? ? ??http://www.ros.org/wiki/rospy_tutorials
? ? ? ??http://www.ros.org/wiki/roscpp/Tutorials
? ? ? ? 努力學習完上面的這些教程,你至少應該明白ROS里面的節點和消息是干什么用的了吧,如果還沒理解,那就再多看幾遍吧!
三、ROS中的常用功能
? ? ? ? ?ROS中提供了很多強大的功能,我們學習完上面的基本知識之后要繼續進行深入。? ? ? ? ?1、rviz ? ? ??
? ? ? ? ?rviz是ROS中一款強大的3D可視化工具,這個玩意在后面可是要頻繁用到的,是必須要弄明白的,詳細的教程可以參考wiki: ? ? ? ? ?http://www.ros.org/wiki/rviz? ?? ? ? ? ? ?我們可以在里面創建自己的機器人,并且讓機器人動起來。還可以創建地圖,顯示3D點云等等,總之,想在ROS中顯示的東東都可以在這里顯示出來。當然這些顯示都是通過消息的訂閱來完成的,機器人通過ROS發布數據,rviz訂閱消息接收數據,然后顯示,這些數據也是有一定的數據格式的,可以參考下面的鏈接: ? ? ? ? ?http://www.ros.org/wiki/rviz/DisplayTypes看到上面的機器人了吧,是不是很酷,在rviz中,這樣的機器人模型是通過urdf文件描述的,具體urdf文件怎么寫,參考wiki: ? ? ? ? ?http://www.ros.org/wiki/urdf
? ? ? ? ??2、tf
? ? ? ? ? tf是ROS中的坐標變換系統,在機器人的建模仿真中經常用到。? ? ? ? ?ROS中主要有兩種坐標系: ? ? ? ? (1)固定坐標系:用于表示世界的參考坐標系; ? ? ? ? (2)目標坐標系:相對于攝像機視角的參考坐標系。 ? ? ? ? 教程見:http://www.ros.org/wiki/tf
? ? ? ? 3、gazebo
? ? ? ? 這個工具是ROS中的物理仿真環境,gazebo本身就是一款機器人的仿真軟件,基于ODE的物理引擎,可以模擬機器人以及環境中的很多物理特性,這個軟件可以稍作了解,并不是后面開發所必須要的。 ? ? ? ? 教程見:http://www.ros.org/wiki/simulator_gazebo/Tutorials四、ROS常用機器人
? ? ? ? 1、PR2
?看ROS的應用時,最常見到的機器人就是PR2。這個機器人是ROS的主要維護者(Willow Garage)針對ROS量身定做的機器人,有兩個運行ubuntu和ROS的電腦,和兩個機器臂以及很多牛逼的傳感器,功能是非常強大的,但是售價那是相當的昂貴,國內很少見到,基本都是在國外的研究所里。這款機器人的ROS包比較多,從仿真到導航,所以代碼具有比較高的參考價值,當然新手還是先看看其他機器人的代碼再來挑戰PR2吧,代碼比較龐雜。 ? ? ? ?wiki:http://www.ros.org/wiki/Robots/PR2
? ? ? ? 2、TurtleBot? ? ??
這個機器人應該算是應用ROS小型移動機器人的典型代表了,資料、文檔和代碼比較多,主要在建立模型和導航定位方面,代碼比較容易理解,可以作為新手參考的最佳機器人了,上面rviz中顯示的那個機器人就是它了。 ? ? ? ? wiki:http://www.ros.org/wiki/Robots/TurtleBot
? ? ? ? 3、Husky、Erratic
? ? ?? 這兩款機器人和TurtleBot機器人差不多,都是小型的輪式移動機器人,同樣可以作為新手學習的參考:? ? ? ? ??http://www.ros.org/wiki/Robots/Husky ? ? ? ? ??http://www.ros.org/wiki/Robots/Erratic
這些教程和機器人基本都是我當時學習的時候研究和了解過的,總結在此也讓那些比較迷茫的初學者作為參考,可以盡快了解和掌握ROS。再次強調一下,wiki上的新手教程是一定要先熟悉的,后面的內容在后續學習過程中可以一邊做一邊學習。 ? ? ? ? ?*此文只代表個人觀點,僅作為參考
----------------------------------------------------------------
歡迎大家轉載我的文章。
轉載請注明:轉自古-月
http://blog.csdn.net/hcx25909
總結
以上是生活随笔為你收集整理的ROS探索总结(一)(二)(三):ROS总体框架 ROS总体框架 ROS新手教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV之gpu 模块. 使用GPU
- 下一篇: ROS探索总结(四)(五)(六)——简单