乾貨:機器人開源操作系統ROS
導讀
前不久,John 為大家介紹過物聯網開源操作系統,或許大家還記憶猶新。今天,要介紹的是一款機器人領域的開源操作系統:ROS。
簡介
ROS,英文全稱 Robot Operating System,即機器人操作系統。它的目標是為機器人軟體開發者的提供了一個靈活的框架,其中包含一些列的工具、庫和約定。同時,ROS還可以為異質計算機集群,提供了類似操作系統的中間件。
總結起來,正如下圖所示:ROS = 架構 + 工具 + 功能 + 生態系統。
服務
ROS提供標準的操作系統服務例如硬體抽象、底層設備控制、常用功能實現、進程間消息傳遞、軟體包管理。ROS基於一種圖狀架構,從而不同節點的進程能接受,發布,聚合各種信息(例如感測,控制,狀態,規劃等等)。
分層
ROS可以分成兩層:低層是操作系統層(上面有描述),上層則是廣大開發者貢獻的功能各異的軟體包例如定位繪圖,行動規劃,感知,模擬等等。
生態系統
ROS生態系統的軟體可以分成三組:
獨立於開發語言和平台的工具,用於構建和發布基於ROS的軟體。
ROS客戶端庫的實現例如 roscpp、rospy、roslisp。
利用一個或者多個ROS客戶端庫,包含相關應用代碼的軟體包。
ROS客戶端庫,主要包括開發語言例如C++、Python、LISP,由於依賴於大量開源軟體,所以可在類Unix系統上使用。對於這些客戶端庫,Ubuntu Linux 是完全支持的,而其他系統例如Fedora Linux、Mac OS X、 Microsoft Windows 是「實驗性」(不是太完善的)的支持。另外,這些客戶端庫也得到了開發者社區的支持。
第三種的軟體包,通常由於開發者自己開發,使用的功能和應用包括:硬體驅動、機器人模塊、數據類型、計劃、感知、即時定位和地圖構建,模擬工具以及其他演算法。
許可證
所有,獨立於開發語言的工具和主要客戶端庫(C++,Python,LISP),都在BSD開源授權協議下發布,這些開源軟體可以免費用於商用和研究目的。其他的軟體包例如開發者自己開發的,使用其他開源許可授權,例如Apache 2.0、 GPL 、MIT 甚至專利許可。用戶可以自行判斷軟體包,是否具有滿足自己需求的許可證。
分布式和模塊化
ROS的設計,儘可能體現分布式和模塊化。
用戶可根據自己的需求,或多或少地定製使用ROS。ROS的模塊化特點,可以讓你自行選擇哪些部分需要ROS,哪些部分可以自己實現。
ROS,也具有分布式的特性,從而也培養了用戶共享軟體包的大型社區。它使得開發者在ROS核心系統基礎上,增添許多新功能。
社區
過去幾年以來,ROS已經成為全世界範圍內,具有大量用戶的大型社區。以前,很多用戶來自於實驗室,但現在,越來越多的商業用戶也加入進來,特別是在工業和服務機器人領域。
ROS 社區十分活躍,根據統計,ROS 社區具有超過1500個電子郵件列表的參與者,3300個用戶合作化開發維基文檔,5700用戶在社區進行ROS相關的提問和回答,一共有超過22000條的維基包,每天超過30條。問答網站有超過13000個問題,70%的回答率。
合作化
ROS則致力於在不同的機器人平台之間,簡化創建機器人軟體任務的複雜性。
其實,創建一個健壯、通用的機器人軟體,並不是那麼簡單。從機器人的角度講,即使對於人類來講微不足道的問題,也會由於任務或者環境的不同,而變得很複雜。所以,靠單獨的個體、實驗室、機構可以自己獨立處理這些任務,是無法勝任的。
所以,ROS就是為了鼓勵協作化的機器人軟體開發。ROS,就是為了讓擅長不同技術領域的開發小組合作起來,彼此借鑒各自的專長,共同應對機器人所需要面對的複雜任務。
ROS,為大多數的機器人項目提供了很多價值,也代表了世界一流機器人的合作化的開發趨勢。ROS其中一個核心價值,就是分享通用的組件。如果你覺得ROS有用,你也可以加入ROS社區。
核心組件
ROS的核心組件主要分為三部分:通信基礎結構、機器人特定功能庫 、工具。
第一,通信基礎結構
ROS,在底層提供消息傳送介面以及進程之間的通信,起到了一種中間件的作用。ROS的中間件提供這些功能:
發布和訂閱匿名消息傳遞
消息記錄和回放
遠程過程調用的請求和響應
分布式參數系統
消息傳輸
通信系統,一般來說,是實現一個全新機器人系統的首要需求。ROS內置了經過完善測試的消息系統,通過匿名發布和訂閱機制,管理分布式節點之間的通信,從而節省開發者的開發時間。
另外,使用消息傳輸系統的還有一個重要優勢,就是讓開發者能夠清楚地實現系統結點之間的介面,有利於提高封裝性和代碼復用程度。這些消息介面結構,會在消息介面描述語言中定義。
消息記錄和回放
因為發布/訂閱系統是匿名和非同步的,所以數據可以被很容易地獲取和回放,並不需要改動任何代碼。
例如,你有一個任務A,從感測器中讀取數據。你正在開發任務B,處理任務A產生的數據。ROS,讓由任務A發布的數據很容易地記錄到一個文件中,然後過一段時間,從文件中重新發布這些數據。這種消息傳輸抽象機制,讓任務B無法得知數據的來源(來自任務A還是日誌文件)。
這是一個十分強大的設計模式,可以顯著降低開發成本、提高系統的靈活性和模塊化程度。
遠程過程調用
非同步發布/訂閱消息機制,可以滿足機器大部分的通信需求。但是,某些特殊情況下,你會需要進程之間的同步請求/響應。ROS 使用「服務」,提供這種功能。和另外一個功能「主題」類似,數據在進程之間通過服務調用傳輸。服務調用在同樣簡單的消息介面描述語言中定義。
分布式參數系統
ROS中間件,通過參數伺服器(一種多元、共享的字典,通過網路API訪問)為任務提供分享配置信息的方法。系統讓你可以輕易地改變任務配置,甚至讓任務可以改變其他任務的配置。
第二,機器人庫
除了核心的中間件,ROS還提供通用的機器人庫,功能如下:
機器人標準消息定義
機器人幾何庫
機器人描述語言
可搶佔遠程過程調用
診斷
姿態評估
定位
繪圖
導航
標準機器人消息
經過社區多年的討論和開發,最終實現了標準的消息格式,覆蓋了絕大部分的機器人案例。
這些消息定義,有的針對於幾何概念例如:姿勢、變換、向量;有的針對於感測器例如:攝像頭、慣性測量單元和激光器;有的針對導航數據例如:量距、路徑和地圖,以及許多其他概念。
在應用中,使用這些標準消息,開發者可以讓代碼,無縫地和ROS生態系統的其他部分對接,例如開發工具或者功能庫。
機器人幾何庫
許多機器人項目中的一個通用挑戰,就是讓機器人的不同部分相互協調。例如,你想聯合攝像頭的數據和雷達的數據,你必須知道感測器位於什麼地方,具有共同的參考系,特別是針對那些具有很多活動部件的類人機器人。
在ROS中,我們通過 tf (變換)庫來解決這個問題,它可以持續追蹤機器人系統每個部件的位置。
tf 庫,首先考慮到了效率,用於管理協調機器人的變換數據,超過100度的自由,並且更新率達到數百赫茲。tf 庫可以定義靜態變換,例如固定於移動基座的攝像頭;還有動態變換,例如機器人手臂的聯合。
你可以變換系統中任何兩個坐標系的感測器數據。tf 庫可以處理以下的情況例如:信息的生產者和消費者分布於網路中不同位置,或者信息更新的速率不同。
機器人描述語言
ROS,還可以解決另外一個通用機器人問題,就是如何以一種機器可以讀懂的方式描述機器人。
ROS提供了一些列工具,進行機器人描述和建模,使得它可以被ROS系統其餘部分讀懂,這些部分包括:tf、robot_state_publisher、rviz。
ROS中描述機器人的格式是URDF(統一機器人描述格式),你可以使用XML文檔描述機器人的物理屬性,例如肢體長度、輪子大小、感測器位置和機器人每個部分的視覺外觀。
一旦以這種方式定義,你可以很容易通過使用tf庫,以及模擬器和運動規劃器,讓機器人完美地呈現在三維空間中。
可搶佔的遠程過程調用
主題(匿名發布/訂閱)以及服務(遠程過程調用),可以覆蓋機器人中大多數的通信案例。但是,有時你需要發起一個全局尋找行為,並且檢測它的進展,並且能夠實現搶佔,完成後還要接到通知。
ROS為這個使用案例,設計了動作(action)庫。動作庫,和服務一樣,只是它們還可以報告進展,得到最終反饋。它們可以被調用者搶佔。
你可以讓機器人根據導航到達指定位置,監測它在到達過程中的進展,在途中讓它停止或者重新規劃路徑,成功或者失敗後得到通知。
動作庫是一個十分強大的概念,它貫穿整個ROS生態系統。
診斷
ROS提供了一種標準的方法,產生、搜集和統計機器人的診斷信息。讓開發者可以很容易了解機器人的狀態,並且可以決定如何處理出現的問題。
姿態評估、本地化和導航
另外,ROS也提供了一些更加強大功能,可以幫助你啟動你的機器人項目。這些ROS軟體包,可以解決一些基礎問題例如姿勢評估、地圖中定位,構建地圖和移動導航。
第三,工具
ROS 其中一個最強大的功能就是工具,這些工具支持內省、調試、繪圖,以及系統狀態可視化。
發布/訂閱機制,讓你可以自發地內省通過系統的數據流,更容易地理解和調試系統發生的問題。ROS工具利用這種內省功能,以及一些列的圖形化和命令行工具,簡化開發和調試。
命令行工具
ROS 可以無圖形化界面的條件下使用。所有的核心功能和內省工具,都可以通過超過45種的命令行工具訪問。這些命令可以啟動小組結點,內省主題、服務和行動,記錄和回放數據,以及其他許多情況。如果你願意使用圖形化工具,rviz 和 rqt 則提供了相似的功能。
rviz
rivz 可能是最著名的ROS工具,它提供了通用功能,對於許多感測器數據類型和URDF描述的機器人,進行三維視覺化。
rviz 可以可視化處理許多消息類型,例如雷達掃描、三維點雲、攝像頭圖像。它也可以使用tf 庫,按照你選擇的坐標系,顯示所有的感測器數據,同樣也可以將機器人呈現出來。在同一個應用中,視覺化所有的數據可以讓開發者很快看到機器人所看到的東西,從而可以區分感測器失調或者機器人模型失准引發的問題。
rqt
rqt,是一個基於QT框架的工具,用於開發機器人圖形化介面。你可以創建定製介面,組成和配置內置rqt插件的擴展庫,用於標籤、多畫面和其他布局。你也可以通過編寫自己的rqt插件,你引入新的介面。
rqt_graph 插件,提供了ROS系統的內省和可視化,展示他們之間的結點和連接,讓你可以便於調試和理解運行系統及其組成。
rqt_plot 插件,讓你可以監測編碼器、電壓或者隨著時間而變化的數字。rqt_plot 插件讓你可以選擇繪圖後端(例如matplotlib、Qwt、 pyqtgraph),以最好地滿足需求。
rqt_topic和rqt_publisher插件,可用於主題和監測。前者,允許你監測和內省系統內發布的任何主題。後者,讓你可以發布自己的消息到任何主題,促進系統的專門實驗。
對於數據的記錄和回放,ROS使用「包」格式 。包文件可以通過rqt_bag 插件創建和圖形化訪問。插件可以將數據記錄到包,從包中選擇特定的主題回放,可視化包內容,包括顯示圖片和繪製隨著時間推移的數值。
結語
ROS,剛剛度過9歲生日。這款機器人開源操作系統在機器人的感知、物體識別、臉部識別、姿勢識別、運動、運動理解、結構與運動、立體視覺、控制、規劃等多個領域都有相關應用。
John 衷心地希望這款機器人的介紹對大家有幫助,同時希望聽到來自大家的寶貴意見,一起探討。
參考資料
【1】http://www.ros.org/
題圖和文圖來源於 ros.org
※小程序初體驗:推薦幾種正確的打開姿勢!
※增材製造:會成為柔性電子技術發展的轉折點嗎?
※英特爾發布物聯網計算卡:信用卡大小,功能齊全!
※重磅:三進位存儲器可運行計算任務!
※2016軟體漏洞排行榜:谷歌安卓系統「奪冠
TAG:IntelligentThings |
※FIWARE開源平台:創造出物聯網市場新商機
※AWS李沐:一種開源、端到端的新型人工智慧框架編譯器——NNVM編譯器
※OpenAI,正在籌建專門為人工智慧程序員打造的開源「健身房」
※華盛頓大學聯合AWS開源NNVM:面向AI框架的新型端到端編譯器
※蘋果不過啦?開源iOS和OS X內核XNU
※AMD開源高性能機器智能庫MIOpen
※OpenVAS開源風險評估系統部署方案
※Go 語言,開源服務端代碼自動生成 框架-EasyGoS
※谷歌開源物體檢測系統 API
※谷歌PAIR瞄準 AI 交互,開源兩大機器學習可視化數據工具
※PDF 開源編輯器PDF Mod
※AMD 開源高性能機器智能庫MIOpen;英特爾研發更人性化自動駕駛車
※TFS:新一代開源文件系統
※FB開源人工智慧框架ParlAI:可輕鬆訓練評估對話模型
※推動AI民主化 英特爾開源BigDL背後的原動力
※運行在樹莓派和 Arduino 上的開源社交機器人套件
※「深度學習框架的未來」李沐:AWS開源端到端AI框架編譯器NNVM
※專訪英特爾STO馬子雅:開源BigDL,AI民主化的一步妙棋
※14 個開源 REST 與 SOAP 服務 API 測試工具