ROS簡(jiǎn)介
- 個(gè)人理解筷凤,如有紕漏請(qǐng)指出。
什么是ROS
ROS是面向機(jī)器人的開源的元操作系統(tǒng)(meta-operating system)逼裆。它能夠提供類似傳統(tǒng)操作系統(tǒng)的諸多功能睛驳,如硬件抽象、底層設(shè)備控制凭峡、常用功能實(shí)現(xiàn)、進(jìn)程間消息傳遞和程序包管理等决记。此外摧冀,它還提供相關(guān)工具和庫,用于獲取系宫、編譯按价、編輯代碼以及在多個(gè)計(jì)算機(jī)之間運(yùn)行程序完成分布式計(jì)算。
這是維基上的解釋笙瑟,讓我們結(jié)合項(xiàng)目仔細(xì)分析一下。
假設(shè)我們要制作一個(gè)無人機(jī)癞志,進(jìn)行路徑規(guī)劃算法的驗(yàn)證往枷,有一些傳感器比如GPS,陀螺儀凄杯,氣壓計(jì)作為輸入错洁,上位機(jī)通過一些運(yùn)算,計(jì)算出無人機(jī)行進(jìn)的路線戒突,然后將路線傳給飛控屯碴,飛控對(duì)電機(jī)進(jìn)行控制,最終實(shí)現(xiàn)無人機(jī)的路線規(guī)劃膊存。
如果整個(gè)框架都要自己來寫导而,那我們需要了解各個(gè)傳感器的通信方式忱叭,電機(jī)的控制,還需要將這些與頂層算法進(jìn)行交互今艺,這需要懂得東西就很多了韵丑,現(xiàn)在有了飛控,對(duì)底層的傳感器已經(jīng)做了一層抽象珠叔,將同一時(shí)刻的各個(gè)傳感器的數(shù)據(jù)組成一個(gè)數(shù)據(jù)包以MAVLink協(xié)議的形式向上層傳輸古毛。處理計(jì)算機(jī)需要做的就是讀出這個(gè)以MAVLink協(xié)議的數(shù)據(jù)包艺演,作為輸入,進(jìn)行一系列計(jì)算陌僵,輸出目標(biāo)點(diǎn)的經(jīng)度、緯度创坞、高度等信息碗短,并交由飛控對(duì)飛機(jī)進(jìn)行調(diào)整,飛往目標(biāo)點(diǎn)摆霉。換句話說豪椿,我們需要一個(gè)中間件,來翻譯MAVLink協(xié)議携栋,這就有很多種選擇了搭盾,為了開發(fā)方便,我們選用了ROS作為這一個(gè)翻譯者婉支,但ROS的作用遠(yuǎn)不止翻譯的功能鸯隅。
分布式計(jì)算
- 一些機(jī)器人搭載多臺(tái)計(jì)算機(jī),每臺(tái)計(jì)算機(jī)用于控制機(jī)器人的部分驅(qū)動(dòng)器或傳感器
- 即使只有一臺(tái)計(jì)算機(jī)向挖,通常仍將程序劃分為獨(dú)立運(yùn)行且相互協(xié)作的小的模塊來完成復(fù)雜的控制任務(wù)蝌以,這也是常見的做法
- 當(dāng)多個(gè)機(jī)器人需要協(xié)同完成一個(gè)任務(wù)時(shí),往往需要互相通信來支撐任務(wù)的完成
- 用戶通常通過臺(tái)式機(jī)何之、筆記本或者移動(dòng)設(shè)備發(fā)送指令控制機(jī)器人跟畅,這種人機(jī)交互接口可以認(rèn)為是機(jī)器人軟件的一部分
ROS1只是相對(duì)的分布式計(jì)算,對(duì)節(jié)點(diǎn)來說是分布式的溶推,但Master層面上并不是分布式徊件,還是需要主從節(jié)點(diǎn)的方式,ROS2在這個(gè)基礎(chǔ)上進(jìn)行了底層通信方式的改進(jìn)蒜危,使用DDS(Data Distribution Service)數(shù)據(jù)分發(fā)服務(wù)進(jìn)行真正意義上的分布式計(jì)算虱痕。
軟件復(fù)用
ROS標(biāo)準(zhǔn)包(Standard Packages)提供穩(wěn)定、可調(diào)式的各類重要機(jī)器人算法實(shí)現(xiàn)辐赞。
ROS通信接口正在成為機(jī)器人軟件互操作的事實(shí)標(biāo)準(zhǔn)部翘,也就是說絕大部分最新的硬件驅(qū)動(dòng)和最前沿的算法實(shí)現(xiàn)都可以在ROS中找到。例如响委,在ROS的官方網(wǎng)頁上有著大量的開源軟件庫新思,這些軟件使用ROS通用接口窖梁,從而避免為了集成它們而重新開發(fā)新的接口程序。
快速測(cè)試
精心設(shè)計(jì)的ROS系統(tǒng)框架將底層硬件控制模塊和頂層數(shù)據(jù)處理與決策模塊分離表牢,從而可以使用模擬器替代底層硬件模塊窄绒,獨(dú)立測(cè)試頂層部分,提高測(cè)試效率崔兴。
ROS另外提供了一種簡(jiǎn)單的方法可以在調(diào)試過程中記錄傳感器數(shù)據(jù)及其他類型的消息數(shù)據(jù)彰导,并在試驗(yàn)后按時(shí)間戳回放。通過這種方式敲茄,每次運(yùn)行機(jī)器人可以獲得更多的測(cè)試機(jī)會(huì)位谋。例如,可以記錄傳感器的數(shù)據(jù)堰燎,并通過多次回放測(cè)試不同的數(shù)據(jù)處理算法掏父。在ROS術(shù)語中,這類記錄的數(shù)據(jù)叫作包(bag)秆剪,一個(gè)被稱為rosbag的工具可以用于記錄和回放包數(shù)據(jù)
軟件結(jié)構(gòu)
我們可以通過ROS的分布式計(jì)算來一窺其軟件結(jié)構(gòu)和設(shè)計(jì)思想赊淑。
節(jié)點(diǎn)
ROS用節(jié)點(diǎn)(Node)的概念表示一個(gè)應(yīng)用程序,不同node之間通過事先定義好格式的話題(Topic)仅讽,服務(wù)(Service)陶缺,動(dòng)作(Action)來實(shí)現(xiàn)連接。
話題
消息傳遞的理念是:當(dāng)一個(gè)節(jié)點(diǎn)想要分享信息時(shí)洁灵,它就會(huì)發(fā)布(publish)消息到對(duì)應(yīng)的一個(gè)或者多個(gè)話題饱岸;當(dāng)一個(gè)節(jié)點(diǎn)想要接收信息時(shí),它就會(huì)訂閱(subscribe)它所需要的一個(gè)或者多個(gè)話題徽千。ROS節(jié)點(diǎn)管理器負(fù)責(zé)確保發(fā)布節(jié)點(diǎn)和訂閱節(jié)點(diǎn)能找到對(duì)方苫费;而且消息是直接地從發(fā)布節(jié)點(diǎn)傳遞到訂閱節(jié)點(diǎn),中間并不經(jīng)過節(jié)點(diǎn)管理器轉(zhuǎn)交双抽。
所有訂閱該話題的節(jié)點(diǎn)都會(huì)收到該話題上的所有消息百框,不管你是否想要接收。
詳細(xì)點(diǎn)講:”生產(chǎn)”消息的程序只管發(fā)布消息牍汹,而不用關(guān)心該消息是如何被消費(fèi)的琅翻; 消費(fèi)消息的程序只管訂閱該話題或者他所需要消息的所有話題,而不用關(guān)心這些消息數(shù)據(jù)是如何生產(chǎn)的柑贞。
這個(gè)特性十分重要,這就意味著我們?cè)谶@種通信機(jī)制中是一對(duì)多或者多對(duì)一的機(jī)制聂抢,而在下一種通信機(jī)制中將是一對(duì)一的機(jī)制钧嘶!
服務(wù)
服務(wù)調(diào)用是雙向的,一個(gè)節(jié)點(diǎn)給另一個(gè)節(jié)點(diǎn)發(fā)送信息并等待響應(yīng)琳疏,因此信息流是雙向的有决。作為對(duì)比闸拿,當(dāng)消息發(fā)布后,并沒有響應(yīng)的概念书幕,甚至不能保證系統(tǒng)內(nèi)有節(jié)點(diǎn)訂閱了這些消息新荤。
服務(wù)調(diào)用實(shí)現(xiàn)的是一對(duì)一通信。每一個(gè)服務(wù)由一個(gè)節(jié)點(diǎn)發(fā)起台汇,對(duì)這個(gè)服務(wù)的響應(yīng)返回同一個(gè)節(jié)點(diǎn)苛骨。另一方面,每一個(gè)消息都和一個(gè)話題相關(guān)苟呐,這個(gè)話題可能有很多的發(fā)布者和訂閱者痒芝。
最后,總結(jié)一下
ROS的優(yōu)點(diǎn)
首先是開源牵素,帶來的是完善的社區(qū)严衬,遇到的大部分問題基本都能搜到,也帶來了更多的擴(kuò)展笆呆,MATLAB2015以后版本內(nèi)建了ROS的支持请琳,模塊化使得其可以隨意增刪功能,使用了語言無關(guān)的消息類型赠幕,使其可以支持多種編程語言俄精,C++,Python,JAVA等都支持,可以很方便的進(jìn)行數(shù)據(jù)的繪制,也是PX飛控推薦使用的交互方式之一劣坊。
ROS的不足
- 多個(gè)機(jī)器人組成的集群嘀倒; ROS的單master結(jié)構(gòu)就蛋疼了。
- 小型嵌入式平臺(tái)局冰,甚至“裸奔”的微控制器测蘑;依賴于Ubuntu的ROS太重了。
- 實(shí)時(shí)系統(tǒng):包括進(jìn)程間和跨機(jī)器通信康二,ROS做不到碳胳。
- 非理想的網(wǎng)絡(luò);ROS延遲很大沫勿,甚至斷網(wǎng)再連接時(shí)會(huì)掛挨约。
- 生產(chǎn)制造等環(huán)境:ROS可靠性還不夠。