干貨:機(jī)器人開(kāi)源操作系統(tǒng)ROS
導(dǎo)讀:前不久,John 為大家介紹過(guò)物聯(lián)網(wǎng)開(kāi)源操作系統(tǒng),或許大家還記憶猶新。今天,要介紹的是一款機(jī)器人領(lǐng)域的開(kāi)源操作系統(tǒng):ROS。
簡(jiǎn)介
ROS,英文全稱(chēng) Robot Operating System,即機(jī)器人操作系統(tǒng)。它的目標(biāo)是為機(jī)器人軟件開(kāi)發(fā)者的提供了一個(gè)靈活的框架,其中包含一些列的工具、庫(kù)和約定。同時(shí),ROS還可以為異質(zhì)計(jì)算機(jī)集群,提供了類(lèi)似操作系統(tǒng)的中間件。
總結(jié)起來(lái),正如下圖所示:ROS = 架構(gòu) + 工具 + 功能 + 生態(tài)系統(tǒng)。
服務(wù)
ROS提供標(biāo)準(zhǔn)的操作系統(tǒng)服務(wù)例如硬件抽象、底層設(shè)備控制、常用功能實(shí)現(xiàn)、進(jìn)程間消息傳遞、軟件包管理。ROS基于一種圖狀架構(gòu),從而不同節(jié)點(diǎn)的進(jìn)程能接受,發(fā)布,聚合各種信息(例如傳感,控制,狀態(tài),規(guī)劃等等)。
分層
ROS可以分成兩層:低層是操作系統(tǒng)層(上面有描述),上層則是廣大開(kāi)發(fā)者貢獻(xiàn)的功能各異的軟件包例如定位繪圖,行動(dòng)規(guī)劃,感知,模擬等等。
生態(tài)系統(tǒng)
ROS生態(tài)系統(tǒng)的軟件可以分成三組:
- 獨(dú)立于開(kāi)發(fā)語(yǔ)言和平臺(tái)的工具,用于構(gòu)建和發(fā)布基于ROS的軟件。
- ROS客戶端庫(kù)的實(shí)現(xiàn)例如 roscpp、rospy、roslisp。
- 利用一個(gè)或者多個(gè)ROS客戶端庫(kù),包含相關(guān)應(yīng)用代碼的軟件包。
ROS客戶端庫(kù),主要包括開(kāi)發(fā)語(yǔ)言例如C++、Python、LISP,由于依賴(lài)于大量開(kāi)源軟件,所以可在類(lèi)Unix系統(tǒng)上使用。對(duì)于這些客戶端庫(kù),Ubuntu Linux 是完全支持的,而其他系統(tǒng)例如Fedora Linux、Mac OS X、 Microsoft Windows 是“實(shí)驗(yàn)性”(不是太完善的)的支持。另外,這些客戶端庫(kù)也得到了開(kāi)發(fā)者社區(qū)的支持。
第三種的軟件包,通常由于開(kāi)發(fā)者自己開(kāi)發(fā),使用的功能和應(yīng)用包括:硬件驅(qū)動(dòng)、機(jī)器人模塊、數(shù)據(jù)類(lèi)型、計(jì)劃、感知、即時(shí)定位和地圖構(gòu)建,仿真工具以及其他算法。
許可證
所有,獨(dú)立于開(kāi)發(fā)語(yǔ)言的工具和主要客戶端庫(kù)(C++,Python,LISP),都在BSD開(kāi)源授權(quán)協(xié)議下發(fā)布,這些開(kāi)源軟件可以免費(fèi)用于商用和研究目的。其他的軟件包例如開(kāi)發(fā)者自己開(kāi)發(fā)的,使用其他開(kāi)源許可授權(quán),例如Apache 2.0、 GPL 、MIT 甚至專(zhuān)利許可。用戶可以自行判斷軟件包,是否具有滿足自己需求的許可證。
分布式和模塊化
ROS的設(shè)計(jì),盡可能體現(xiàn)分布式和模塊化。
用戶可根據(jù)自己的需求,或多或少地定制使用ROS。ROS的模塊化特點(diǎn),可以讓你自行選擇哪些部分需要ROS,哪些部分可以自己實(shí)現(xiàn)。
ROS,也具有分布式的特性,從而也培養(yǎng)了用戶共享軟件包的大型社區(qū)。它使得開(kāi)發(fā)者在ROS核心系統(tǒng)基礎(chǔ)上,增添許多新功能。
社區(qū)
過(guò)去幾年以來(lái),ROS已經(jīng)成為全世界范圍內(nèi),具有大量用戶的大型社區(qū)。以前,很多用戶來(lái)自于實(shí)驗(yàn)室,但現(xiàn)在,越來(lái)越多的商業(yè)用戶也加入進(jìn)來(lái),特別是在工業(yè)和服務(wù)機(jī)器人領(lǐng)域。
ROS 社區(qū)十分活躍,根據(jù)統(tǒng)計(jì),ROS 社區(qū)具有超過(guò)1500個(gè)電子郵件列表的參與者,3300個(gè)用戶合作化開(kāi)發(fā)維基文檔,5700用戶在社區(qū)進(jìn)行ROS相關(guān)的提問(wèn)和回答,一共有超過(guò)22000條的維基包,每天超過(guò)30條。問(wèn)答網(wǎng)站有超過(guò)13000個(gè)問(wèn)題,70%的回答率。
合作化
ROS則致力于在不同的機(jī)器人平臺(tái)之間,簡(jiǎn)化創(chuàng)建機(jī)器人軟件任務(wù)的復(fù)雜性。
其實(shí),創(chuàng)建一個(gè)健壯、通用的機(jī)器人軟件,并不是那么簡(jiǎn)單。從機(jī)器人的角度講,即使對(duì)于人類(lèi)來(lái)講微不足道的問(wèn)題,也會(huì)由于任務(wù)或者環(huán)境的不同,而變得很復(fù)雜。所以,靠單獨(dú)的個(gè)體、實(shí)驗(yàn)室、機(jī)構(gòu)可以自己獨(dú)立處理這些任務(wù),是無(wú)法勝任的。
所以,ROS就是為了鼓勵(lì)協(xié)作化的機(jī)器人軟件開(kāi)發(fā)。ROS,就是為了讓擅長(zhǎng)不同技術(shù)領(lǐng)域的開(kāi)發(fā)小組合作起來(lái),彼此借鑒各自的專(zhuān)長(zhǎng),共同應(yīng)對(duì)機(jī)器人所需要面對(duì)的復(fù)雜任務(wù)。
ROS,為大多數(shù)的機(jī)器人項(xiàng)目提供了很多價(jià)值,也代表了世界***機(jī)器人的合作化的開(kāi)發(fā)趨勢(shì)。ROS其中一個(gè)核心價(jià)值,就是分享通用的組件。如果你覺(jué)得ROS有用,你也可以加入ROS社區(qū)。
核心組件
ROS的核心組件主要分為三部分:通信基礎(chǔ)結(jié)構(gòu)、機(jī)器人特定功能庫(kù) 、工具。
***,通信基礎(chǔ)結(jié)構(gòu)
ROS,在底層提供消息傳送接口以及進(jìn)程之間的通信,起到了一種中間件的作用。ROS的中間件提供這些功能:
- 發(fā)布和訂閱匿名消息傳遞
- 消息記錄和回放
- 遠(yuǎn)程過(guò)程調(diào)用的請(qǐng)求和響應(yīng)
- 分布式參數(shù)系統(tǒng)
消息傳輸
通信系統(tǒng),一般來(lái)說(shuō),是實(shí)現(xiàn)一個(gè)全新機(jī)器人系統(tǒng)的首要需求。ROS內(nèi)置了經(jīng)過(guò)完善測(cè)試的消息系統(tǒng),通過(guò)匿名發(fā)布和訂閱機(jī)制,管理分布式節(jié)點(diǎn)之間的通信,從而節(jié)省開(kāi)發(fā)者的開(kāi)發(fā)時(shí)間。
另外,使用消息傳輸系統(tǒng)的還有一個(gè)重要優(yōu)勢(shì),就是讓開(kāi)發(fā)者能夠清楚地實(shí)現(xiàn)系統(tǒng)結(jié)點(diǎn)之間的接口,有利于提高封裝性和代碼復(fù)用程度。這些消息接口結(jié)構(gòu),會(huì)在消息接口描述語(yǔ)言中定義。
消息記錄和回放
因?yàn)榘l(fā)布/訂閱系統(tǒng)是匿名和異步的,所以數(shù)據(jù)可以被很容易地獲取和回放,并不需要改動(dòng)任何代碼。
例如,你有一個(gè)任務(wù)A,從傳感器中讀取數(shù)據(jù)。你正在開(kāi)發(fā)任務(wù)B,處理任務(wù)A產(chǎn)生的數(shù)據(jù)。ROS,讓由任務(wù)A發(fā)布的數(shù)據(jù)很容易地記錄到一個(gè)文件中,然后過(guò)一段時(shí)間,從文件中重新發(fā)布這些數(shù)據(jù)。這種消息傳輸抽象機(jī)制,讓任務(wù)B無(wú)法得知數(shù)據(jù)的來(lái)源(來(lái)自任務(wù)A還是日志文件)。
這是一個(gè)十分強(qiáng)大的設(shè)計(jì)模式,可以顯著降低開(kāi)發(fā)成本、提高系統(tǒng)的靈活性和模塊化程度。
遠(yuǎn)程過(guò)程調(diào)用
異步發(fā)布/訂閱消息機(jī)制,可以滿足機(jī)器大部分的通信需求。但是,某些特殊情況下,你會(huì)需要進(jìn)程之間的同步請(qǐng)求/響應(yīng)。ROS 使用“服務(wù)”,提供這種功能。和另外一個(gè)功能“主題”類(lèi)似,數(shù)據(jù)在進(jìn)程之間通過(guò)服務(wù)調(diào)用傳輸。服務(wù)調(diào)用在同樣簡(jiǎn)單的消息接口描述語(yǔ)言中定義。
分布式參數(shù)系統(tǒng)
ROS中間件,通過(guò)參數(shù)服務(wù)器(一種多元、共享的字典,通過(guò)網(wǎng)絡(luò)API訪問(wèn))為任務(wù)提供分享配置信息的方法。系統(tǒng)讓你可以輕易地改變?nèi)蝿?wù)配置,甚至讓任務(wù)可以改變其他任務(wù)的配置。
第二,機(jī)器人庫(kù)
除了核心的中間件,ROS還提供通用的機(jī)器人庫(kù),功能如下:
- 機(jī)器人標(biāo)準(zhǔn)消息定義
- 機(jī)器人幾何庫(kù)
- 機(jī)器人描述語(yǔ)言
- 可搶占遠(yuǎn)程過(guò)程調(diào)用
- 診斷
- 姿態(tài)評(píng)估
- 定位
- 繪圖
- 導(dǎo)航
標(biāo)準(zhǔn)機(jī)器人消息
經(jīng)過(guò)社區(qū)多年的討論和開(kāi)發(fā),最終實(shí)現(xiàn)了標(biāo)準(zhǔn)的消息格式,覆蓋了絕大部分的機(jī)器人案例。
這些消息定義,有的針對(duì)于幾何概念例如:姿勢(shì)、變換、向量;有的針對(duì)于傳感器例如:攝像頭、慣性測(cè)量單元和激光器;有的針對(duì)導(dǎo)航數(shù)據(jù)例如:量距、路徑和地圖,以及許多其他概念。
在應(yīng)用中,使用這些標(biāo)準(zhǔn)消息,開(kāi)發(fā)者可以讓代碼,無(wú)縫地和ROS生態(tài)系統(tǒng)的其他部分對(duì)接,例如開(kāi)發(fā)工具或者功能庫(kù)。
機(jī)器人幾何庫(kù)
許多機(jī)器人項(xiàng)目中的一個(gè)通用挑戰(zhàn),就是讓機(jī)器人的不同部分相互協(xié)調(diào)。例如,你想聯(lián)合攝像頭的數(shù)據(jù)和雷達(dá)的數(shù)據(jù),你必須知道傳感器位于什么地方,具有共同的參考系,特別是針對(duì)那些具有很多活動(dòng)部件的類(lèi)人機(jī)器人。
在ROS中,我們通過(guò) tf (變換)庫(kù)來(lái)解決這個(gè)問(wèn)題,它可以持續(xù)追蹤機(jī)器人系統(tǒng)每個(gè)部件的位置。
tf 庫(kù),首先考慮到了效率,用于管理協(xié)調(diào)機(jī)器人的變換數(shù)據(jù),超過(guò)100度的自由,并且更新率達(dá)到數(shù)百赫茲。tf 庫(kù)可以定義靜態(tài)變換,例如固定于移動(dòng)基座的攝像頭;還有動(dòng)態(tài)變換,例如機(jī)器人手臂的聯(lián)合。
你可以變換系統(tǒng)中任何兩個(gè)坐標(biāo)系的傳感器數(shù)據(jù)。tf 庫(kù)可以處理以下的情況例如:信息的生產(chǎn)者和消費(fèi)者分布于網(wǎng)絡(luò)中不同位置,或者信息更新的速率不同。
機(jī)器人描述語(yǔ)言
ROS,還可以解決另外一個(gè)通用機(jī)器人問(wèn)題,就是如何以一種機(jī)器可以讀懂的方式描述機(jī)器人。
ROS提供了一些列工具,進(jìn)行機(jī)器人描述和建模,使得它可以被ROS系統(tǒng)其余部分讀懂,這些部分包括:tf、robot_state_publisher、rviz。
ROS中描述機(jī)器人的格式是URDF(統(tǒng)一機(jī)器人描述格式),你可以使用XML文檔描述機(jī)器人的物理屬性,例如肢體長(zhǎng)度、輪子大小、傳感器位置和機(jī)器人每個(gè)部分的視覺(jué)外觀。
一旦以這種方式定義,你可以很容易通過(guò)使用tf庫(kù),以及模擬器和運(yùn)動(dòng)規(guī)劃器,讓機(jī)器人***地呈現(xiàn)在三維空間中。
可搶占的遠(yuǎn)程過(guò)程調(diào)用
主題(匿名發(fā)布/訂閱)以及服務(wù)(遠(yuǎn)程過(guò)程調(diào)用),可以覆蓋機(jī)器人中大多數(shù)的通信案例。但是,有時(shí)你需要發(fā)起一個(gè)全局尋找行為,并且檢測(cè)它的進(jìn)展,并且能夠?qū)崿F(xiàn)搶占,完成后還要接到通知。
ROS為這個(gè)使用案例,設(shè)計(jì)了動(dòng)作(action)庫(kù)。動(dòng)作庫(kù),和服務(wù)一樣,只是它們還可以報(bào)告進(jìn)展,得到最終反饋。它們可以被調(diào)用者搶占。
你可以讓機(jī)器人根據(jù)導(dǎo)航到達(dá)指定位置,監(jiān)測(cè)它在到達(dá)過(guò)程中的進(jìn)展,在途中讓它停止或者重新規(guī)劃路徑,成功或者失敗后得到通知。
動(dòng)作庫(kù)是一個(gè)十分強(qiáng)大的概念,它貫穿整個(gè)ROS生態(tài)系統(tǒng)。
診斷
ROS提供了一種標(biāo)準(zhǔn)的方法,產(chǎn)生、搜集和統(tǒng)計(jì)機(jī)器人的診斷信息。讓開(kāi)發(fā)者可以很容易了解機(jī)器人的狀態(tài),并且可以決定如何處理出現(xiàn)的問(wèn)題。
姿態(tài)評(píng)估、本地化和導(dǎo)航
另外,ROS也提供了一些更加強(qiáng)大功能,可以幫助你啟動(dòng)你的機(jī)器人項(xiàng)目。這些ROS軟件包,可以解決一些基礎(chǔ)問(wèn)題例如姿勢(shì)評(píng)估、地圖中定位,構(gòu)建地圖和移動(dòng)導(dǎo)航。
第三,工具
ROS 其中一個(gè)***大的功能就是工具,這些工具支持內(nèi)省、調(diào)試、繪圖,以及系統(tǒng)狀態(tài)可視化。
發(fā)布/訂閱機(jī)制,讓你可以自發(fā)地內(nèi)省通過(guò)系統(tǒng)的數(shù)據(jù)流,更容易地理解和調(diào)試系統(tǒng)發(fā)生的問(wèn)題。ROS工具利用這種內(nèi)省功能,以及一些列的圖形化和命令行工具,簡(jiǎn)化開(kāi)發(fā)和調(diào)試。
命令行工具
ROS 可以無(wú)圖形化界面的條件下使用。所有的核心功能和內(nèi)省工具,都可以通過(guò)超過(guò)45種的命令行工具訪問(wèn)。這些命令可以啟動(dòng)小組結(jié)點(diǎn),內(nèi)省主題、服務(wù)和行動(dòng),記錄和回放數(shù)據(jù),以及其他許多情況。如果你愿意使用圖形化工具,rviz 和 rqt 則提供了相似的功能。
rviz
rivz 可能是***的ROS工具,它提供了通用功能,對(duì)于許多傳感器數(shù)據(jù)類(lèi)型和URDF描述的機(jī)器人,進(jìn)行三維視覺(jué)化。
rviz 可以可視化處理許多消息類(lèi)型,例如雷達(dá)掃描、三維點(diǎn)云、攝像頭圖像。它也可以使用tf 庫(kù),按照你選擇的坐標(biāo)系,顯示所有的傳感器數(shù)據(jù),同樣也可以將機(jī)器人呈現(xiàn)出來(lái)。在同一個(gè)應(yīng)用中,視覺(jué)化所有的數(shù)據(jù)可以讓開(kāi)發(fā)者很快看到機(jī)器人所看到的東西,從而可以區(qū)分傳感器失調(diào)或者機(jī)器人模型失準(zhǔn)引發(fā)的問(wèn)題。
rqt
rqt,是一個(gè)基于QT框架的工具,用于開(kāi)發(fā)機(jī)器人圖形化接口。你可以創(chuàng)建定制接口,組成和配置內(nèi)置rqt插件的擴(kuò)展庫(kù),用于標(biāo)簽、多畫(huà)面和其他布局。你也可以通過(guò)編寫(xiě)自己的rqt插件,你引入新的接口。
rqt_graph 插件,提供了ROS系統(tǒng)的內(nèi)省和可視化,展示他們之間的結(jié)點(diǎn)和連接,讓你可以便于調(diào)試和理解運(yùn)行系統(tǒng)及其組成。
rqt_plot 插件,讓你可以監(jiān)測(cè)編碼器、電壓或者隨著時(shí)間而變化的數(shù)字。rqt_plot插件讓你可以選擇繪圖后端(例如matplotlib、Qwt、 pyqtgraph),以***地滿足需求。
rqt_topic 和 rqt_publisher 插件,可用于主題和監(jiān)測(cè)。前者,允許你監(jiān)測(cè)和內(nèi)省系統(tǒng)內(nèi)發(fā)布的任何主題。后者,讓你可以發(fā)布自己的消息到任何主題,促進(jìn)系統(tǒng)的專(zhuān)門(mén)實(shí)驗(yàn)。
對(duì)于數(shù)據(jù)的記錄和回放,ROS使用“包”格式 。包文件可以通過(guò)rqt_bag 插件創(chuàng)建和圖形化訪問(wèn)。插件可以將數(shù)據(jù)記錄到包,從包中選擇特定的主題回放,可視化包內(nèi)容,包括顯示圖片和繪制隨著時(shí)間推移的數(shù)值。
結(jié)語(yǔ)
ROS,剛剛度過(guò)9歲生日。這款機(jī)器人開(kāi)源操作系統(tǒng)在機(jī)器人的感知、物體識(shí)別、臉部識(shí)別、姿勢(shì)識(shí)別、運(yùn)動(dòng)、運(yùn)動(dòng)理解、結(jié)構(gòu)與運(yùn)動(dòng)、立體視覺(jué)、控制、規(guī)劃等多個(gè)領(lǐng)域都有相關(guān)應(yīng)用。
John 衷心地希望這款機(jī)器人的介紹對(duì)大家有幫助,同時(shí)希望聽(tīng)到來(lái)自大家的寶貴意見(jiàn),一起探討。