總體結(jié)構(gòu)
根據(jù)ROS系統(tǒng)代碼的維護(hù)者和分布來(lái)標(biāo)示,主要有兩大部分:
- main:核心部分生巡,主要由Willow Garage公司和一些開(kāi)發(fā)者設(shè)計(jì)耙蔑、提供以及維護(hù)。它提供了一些分布式計(jì)算的基本工具孤荣,以及整個(gè)ROS的核心部分的程序編寫(xiě)纵潦。
- universe:全球范圍的代碼,有不同國(guó)家的ROS社區(qū)組織開(kāi)發(fā)和維護(hù)垃环。一種是庫(kù)的代碼邀层,如OpenCV、PCL等;庫(kù)的上一層是從功能角度提供的代碼遂庄,如人臉識(shí)別寥院,他們調(diào)用下層的庫(kù);最上層的代碼是應(yīng)用級(jí)的代碼,讓機(jī)器人完成某一確定的功能涛目。
一般是從另一個(gè)角度對(duì)ROS分級(jí)的秸谢,主要分為三個(gè)級(jí)別:計(jì)算圖級(jí)凛澎、文件系統(tǒng)級(jí)、社區(qū)級(jí)估蹄。
計(jì)算圖級(jí) Computation Graph level
計(jì)算圖是ROS處理數(shù)據(jù)的一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式塑煎。程序運(yùn)行時(shí),所有進(jìn)程以及他們所進(jìn)行的數(shù)據(jù)處理臭蚁,將會(huì)通過(guò)一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式表現(xiàn)出來(lái)最铁。這一級(jí)主要包括幾個(gè)重要概念:節(jié)點(diǎn)(node)、消息(message)垮兑、主題(topic)冷尉、服務(wù)(service)。
節(jié)點(diǎn) Node
節(jié)點(diǎn)就是一些直行運(yùn)算任務(wù)的進(jìn)程系枪。ROS利用規(guī)娜干冢可增長(zhǎng)的方式是代碼模塊化:一個(gè)系統(tǒng)就是典型的由很多節(jié)點(diǎn)組成的。在這里私爷,節(jié)點(diǎn)也可以被稱(chēng)之為“軟件模塊”雾棺。我們使用“節(jié)點(diǎn)”使得基于ROS的系統(tǒng)在運(yùn)行的時(shí)候更加形象化:當(dāng)許多節(jié)點(diǎn)同時(shí)運(yùn)行時(shí),可以很方便的將端對(duì)端的通訊繪制成一個(gè)圖表衬浑,在這個(gè)圖表中捌浩,進(jìn)程就是圖中的節(jié)點(diǎn),而端對(duì)端的連接關(guān)系就是其中弧線(xiàn)連接嚎卫。
消息 Message
節(jié)點(diǎn)之間是通過(guò)傳送消息進(jìn)行通訊的嘉栓。每一個(gè)消息都是一個(gè)嚴(yán)格的數(shù)據(jù)結(jié)構(gòu)宏榕。原來(lái)標(biāo)準(zhǔn)的數(shù)據(jù)類(lèi)型(整型拓诸,浮點(diǎn)型,布爾型等等)都是支持的麻昼,同時(shí)也支持原始數(shù)組類(lèi)型奠支。消息可以包含任意的嵌套結(jié)構(gòu)和數(shù)組(很類(lèi)似于C語(yǔ)言的結(jié)構(gòu)structs)。
主題 Topic
消息以一種發(fā)布/訂閱的方式傳遞抚芦。一個(gè)節(jié)點(diǎn)可以在一個(gè)給定的主題中發(fā)布消息倍谜。一個(gè)節(jié)點(diǎn)針對(duì)某個(gè)主題關(guān)注與訂閱特定類(lèi)型的數(shù)據(jù)〔媛眨可能同時(shí)有多個(gè)節(jié)點(diǎn)發(fā)布或者訂閱同一個(gè)主題的消息尔崔。總體上褥民,發(fā)布者和訂閱者不了解彼此的存在季春。
服務(wù) Service
雖然基于話(huà)題的發(fā)布/訂閱模型是很靈活的通訊模式,但是它廣播式的路徑規(guī)劃對(duì)于可以簡(jiǎn)化節(jié)點(diǎn)設(shè)計(jì)的同步傳輸模式并不適合消返。在ROS中载弄,我們稱(chēng)之為一個(gè)服務(wù)耘拇,用一個(gè)字符串和一對(duì)嚴(yán)格規(guī)范的消息定義:一個(gè)用于請(qǐng)求,一個(gè)用于回應(yīng)宇攻。這類(lèi)似于web服務(wù)器惫叛,web服務(wù)器是由URIs定義的,同時(shí)帶有完整定義類(lèi)型的請(qǐng)求和回復(fù)文檔逞刷。需要注意的是嘉涌,不像話(huà)題,只有一個(gè)節(jié)點(diǎn)可以以任意獨(dú)有的名字廣播一個(gè)服務(wù):只有一個(gè)服務(wù)可以稱(chēng)之為“分類(lèi)象征”亲桥,比如說(shuō)洛心,任意一個(gè)給出的URI地址只能有一個(gè)web服務(wù)器。
節(jié)點(diǎn)控制器 Master
在上面概念的基礎(chǔ)上题篷,需要有一個(gè)控制器可以使所有節(jié)點(diǎn)有條不紊的執(zhí)行词身,這就是一個(gè)ROS的控制器(Master)。
ROS Master通過(guò)RPC(Remote Procedure Call Protocol番枚,遠(yuǎn)程過(guò)程調(diào)用)提供了登記列表和對(duì)其他計(jì)算圖表的查找法严。沒(méi)有控制器,節(jié)點(diǎn)將無(wú)法找到其他節(jié)點(diǎn)葫笼,交換消息或調(diào)用服務(wù)深啤。
比如控制節(jié)點(diǎn)訂閱和發(fā)布消息的模型如下:
ROS的控制器給ROS的節(jié)點(diǎn)存儲(chǔ)了主題和服務(wù)的注冊(cè)信息。節(jié)點(diǎn)與控制器通信從而報(bào)告它們的注冊(cè)信息路星。當(dāng)這些節(jié)點(diǎn)與控制器通信的時(shí)候溯街,它們可以接收關(guān)于其他以注冊(cè)及節(jié)點(diǎn)的信息并且建立與其它以注冊(cè)節(jié)點(diǎn)之間的聯(lián)系。當(dāng)這些注冊(cè)信息改變時(shí)控制器也會(huì)回饋這些節(jié)點(diǎn)洋丐,同時(shí)允許節(jié)點(diǎn)動(dòng)態(tài)創(chuàng)建與新節(jié)點(diǎn)之間的連接呈昔。
節(jié)點(diǎn)與節(jié)點(diǎn)之間的連接是直接的,控制器僅僅提供了查詢(xún)信息友绝,就像一個(gè)DNS服務(wù)器堤尾。節(jié)點(diǎn)訂閱一個(gè)主題將會(huì)要求建立一個(gè)與出版該主題的節(jié)點(diǎn)的連接,并且將會(huì)在同意連接協(xié)議的基礎(chǔ)上建立該連接迁客。
另:ROS控制器控制服務(wù):
文件系統(tǒng)級(jí) Filesystem level
ROS文件系統(tǒng)級(jí)指的是在硬盤(pán)上面查看的ROS源代碼的組織形式郭宝。
ROS中有無(wú)數(shù)的節(jié)點(diǎn)、消息掷漱、服務(wù)粘室、工具和庫(kù)文件,需要有效的結(jié)構(gòu)去管理這些代碼卜范。在ROS的文件系統(tǒng)級(jí)衔统,有以下幾個(gè)重要概念:包(package)、堆(stack)、
包 Package
ROS的軟件以包的方式組織起來(lái)缰冤。包包含節(jié)點(diǎn)犬缨、ROS依賴(lài)庫(kù)、數(shù)據(jù)套棉浸、配置文件怀薛、第三方軟件、或者任何其他邏輯構(gòu)成迷郑。包的目標(biāo)是提供一種易于使用的結(jié)構(gòu)以便于軟件的重復(fù)使用枝恋。總得來(lái)說(shuō)嗡害,ROS的包短小精干焚碌。
堆 Stack
堆是包的集合,它提供一個(gè)完整的功能霸妹,像“navigation stack”十电。Stack與版本號(hào)關(guān)聯(lián),同時(shí)也是如何發(fā)行ROS軟件方式的關(guān)鍵叹螟。
ROS是一種分布式處理框架鹃骂。這使可執(zhí)行文件能被單獨(dú)設(shè)計(jì),并且在運(yùn)行時(shí)松散耦合罢绽。這些過(guò)程可以封裝到包(Packages)和堆(Stacks)中畏线,以便于共享和分發(fā)。下圖是在包和堆在文件中的具體結(jié)構(gòu):
Manifests (manifest.xml):提供關(guān)于Package元數(shù)據(jù)良价,包括它的許可信息和Package之間依賴(lài)關(guān)系寝殴,以及語(yǔ)言特性信息像編譯旗幟(編譯優(yōu)化參數(shù))。
Stack manifests (stack.xml):提供關(guān)于Stack元數(shù)據(jù)明垢,包括它的許可信息和Stack之間依賴(lài)關(guān)系蚣常。
社區(qū)級(jí) Community level
ROS的社區(qū)級(jí)概念是ROS網(wǎng)絡(luò)上進(jìn)行代碼發(fā)布的一種表現(xiàn)形式。結(jié)構(gòu)如下圖所示:
代碼庫(kù)的聯(lián)合系統(tǒng)袖外。使得協(xié)作亦能被分發(fā)史隆。這種從文件系統(tǒng)級(jí)別到社區(qū)一級(jí)的設(shè)計(jì)讓獨(dú)立地發(fā)展和實(shí)施工作成為可能魂务。正是因?yàn)檫@種分布式的結(jié)構(gòu)曼验,似的ROS迅速發(fā)展,軟件倉(cāng)庫(kù)中包的數(shù)量指數(shù)級(jí)增加粘姜。
文件系統(tǒng)工具
代碼分布在許多ROS packages中鬓照,用命令行工具比如ls和cd去尋找起來(lái)非常的枯燥,這就是為什么提供ROS工具去幫助你的原因孤紧。
rospack
rospack可以看到許多packages的信息豺裆。這里我們以find選項(xiàng)為例,用來(lái)返回package的路徑。用法:
$ rospack find [package_name]
例子:
$ rospack find roscpp
返回:
/opt/ros/indigo/share/roscpp
roscd
roscd是rosbash套件的一部分臭猜,可以用來(lái)改變當(dāng)前工作目錄躺酒。
用法:
$ roscd [location_name[/subdir]]
例子:
$ roscd roscpp
可以用Unix命令打印絕對(duì)路徑:
$ pwd
可以看到:
/opt/ros/indigo/share/roscpp
注意:roscd和其它ros工具只會(huì)在ROS_PACKAGE_PATH中指定了的目錄中才能找到ROS packages,查看ROS_PACKAGE_PATH蔑歌,可以用命令:
$ echo $ROS_PACKAGE_PATH
ROS_PACKAGE_PATH中有許多用冒號(hào)分開(kāi)的路徑羹应,看起來(lái)像:
/home/ros/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks
roscd命令也可以進(jìn)入packages或者stack的子目錄
$ roscd roscpp/cmake
輸出:
/opt/ros/indigo/share/roscpp/cmake
roscd log
roscd log命令可以進(jìn)入ROS儲(chǔ)存log文件的文件夾。注意如果你至今還沒(méi)有運(yùn)行任何ros程序次屠,那么會(huì)出現(xiàn)錯(cuò)誤說(shuō)命令不存在园匹。
如果你之前已經(jīng)運(yùn)行過(guò)一些ros程序,可以運(yùn)行:
$ roscd log
rosls
rosls是rosbash套件的一部分劫灶,可以列出一個(gè)packages中的目錄裸违。
用法:
$ rosls [location_name[/subdir]]
例子:
$ rosls roscpp_tutorials
返回:
cmake package.xml srv
回顧
不難發(fā)現(xiàn)ros工具的名字都是在對(duì)應(yīng)的UNIX命令的前面加上一個(gè)ros:
- rospack = ros + pack(age)
- roscd = ros + cd
- rosls = ros + ls
現(xiàn)在你可以在ROS中到天馬行空了,讓我們一起創(chuàng)建一個(gè)package吧本昏。