機器人操作系統(tǒng)ROS(二)-文件系統(tǒng)架構(gòu)及概念

大家好,關(guān)于機器人操作系統(tǒng)ROS的安裝,很多文章都寫的非常詳細,我也在這些材料的幫助下,在VMware上安裝了Ubuntu14.04以及對應(yīng)的ROS Indigo,詳情見Ubuntu14.04安裝和配置ROS Indigo。但是,著重強調(diào)一點,不同的Ubuntu系統(tǒng)版本對應(yīng)不同的ROS版本,因此安裝中的命令語句有差異,請大家務(wù)必先明確自己的開發(fā)環(huán)境。接下來,就開始ROS的學(xué)習(xí)之路!

ROS入門,非常推薦通過官網(wǎng)ROS Tutorials或者ROS中文網(wǎng)站學(xué)習(xí)(更加推薦英文網(wǎng)站)的初級教程(Beginner Level)學(xué)習(xí)。有一些ROS書籍,其實里面很多內(nèi)容是對官網(wǎng)的翻譯,但是這些書籍可能的局限性是:1)ROS版本問題;2)編程語言,有的書只提供C++代碼,有些只提供Python。但是在官網(wǎng),Python和C++版本的tutorials均有,選擇性更強。

本文主要是了解ROS的內(nèi)部構(gòu)成、文件夾結(jié)構(gòu)以及工作所需的核心文件。

ROS系統(tǒng)的架構(gòu)主要被設(shè)計和劃分為三部分,每一部分代表一個層級的概念:文件系統(tǒng)級(The filesystem level)、計算圖級(The computation graph level)、開源社區(qū)級(The community level)

一、ROS文件系統(tǒng)級

圖1

如圖1所示:

功能包-功能包是ROS中軟件組織的基本形式。一個功能包具有用于創(chuàng)建ROS程序的最小結(jié)構(gòu)和最少內(nèi)容。它可以包含ROS運行的進程(節(jié)點)、配置文件等;

功能包清單-功能包清單提供關(guān)于功能包、許可信息、依賴關(guān)系、編譯標志等的信息。一個包的清單有一個名為package.xml的文件管理;

綜合功能包-將幾個具有某些功能的功能包組織在一起,就獲得了一個綜合功能包(Stack)。

二、ROS計算圖級

圖2

ROS會創(chuàng)建一個連接到所有進程的網(wǎng)絡(luò)。在系統(tǒng)中的任何節(jié)點都可以訪問此網(wǎng)絡(luò),并通過該網(wǎng)絡(luò)與其他節(jié)點交互,獲取其他節(jié)點發(fā)布的信息,并且將自身數(shù)據(jù)發(fā)布到網(wǎng)絡(luò)上。如圖2所示:

節(jié)點-節(jié)點是主要的計算執(zhí)行進程;

節(jié)點管理器-節(jié)點管理器用于節(jié)點的名稱注冊、查找、設(shè)置節(jié)點間通信等;

參數(shù)服務(wù)器-參數(shù)服務(wù)器能夠使數(shù)據(jù)通過一個關(guān)鍵詞存儲在一個系統(tǒng)的核心位置;

消息-消息是節(jié)點之間溝通的一種方式;

主題-每個消息都必須有一個名稱來被ROS網(wǎng)絡(luò)路由。每一條消息都要發(fā)布到相應(yīng)的主題。當一個節(jié)點發(fā)送數(shù)據(jù)時,我們就說該節(jié)點正在向主題發(fā)布消息。節(jié)點可以通過訂閱某個主題,接受來自其他節(jié)點的消息。一個節(jié)點可以訂閱一個主題,而不需要該節(jié)點同時發(fā)布該主題。這就保證了消息的發(fā)布者和訂閱者間解耦。主題的名稱是獨一無二的,否則在同名主題之間的消息路由就會發(fā)生錯誤。

服務(wù)-如果需要直接與某個節(jié)點進行交互request/response,此時不能通過Topic,而需要服務(wù)。服務(wù)必須有唯一的名稱,當一個節(jié)點提供某個服務(wù)時,所有的幾點都可以通過使用ROS客戶端邊寫的代碼與它通信。

消息記錄包-消息記錄包是一種用于保存和回放ROS消息數(shù)據(jù)的文件格式。消息記錄包是一種用于存儲數(shù)據(jù)的主要機制,它能夠獲取并記錄各種難以收集的傳感器數(shù)據(jù)。可以通過消息記錄包反復(fù)獲取實驗數(shù)據(jù),進行必要的開發(fā)和算法測試。

三、官網(wǎng)初級文檔-文件系統(tǒng)架構(gòu)學(xué)習(xí)(我的ros版本是indigo)

1、創(chuàng)建工作空間(工作空間可以簡單理解為一個項目文件夾)

1)查看ROS正在使用的工作空間

echo $ROS_PACKAGE_PATH

顯示:/opt/ros/indigo/share:/opt/ros/indigo/stacks

2)創(chuàng)建工作空間

$ mkdir -p ~/softdemo/catkin_ws/src ? ? ? #mkdir->在當前目錄下創(chuàng)建子目錄

$ cd ~/softdemo/catkin_ws/src

$ catkin_init_workspace ? ? ?

3)編譯工作空間

$ cd ~/softdemo/catkin_ws/ ? ? ? ??

$ catkin_make? ? #編譯必須在catkin_ws文件夾下,如果在任何src文件夾下的功能包編譯,都會 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?報錯

4)完成配置

$ source devel/setup.bash

至此,文件結(jié)構(gòu)如下:

~softdemo->catkin_ws->build? devel? src

2、創(chuàng)建ROS功能包和綜合功能包

$ cd ~/catkin_ws/src

創(chuàng)建功能包beginner_tutorials,并且建立依賴,可以是rospy(基于Python)或者roscpp(基于C++)(Now use the catkin_create_pkg script to create a new package called 'beginner_tutorials' which depends on std_msgs, roscpp, and rospy:)

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

3、編譯ROS功能包(主要是代碼編譯)

$ cd ~/catkin_ws/

$ catkin_make

備注:必須在工作空間文件夾(catkin_ws)運行catkin_make,否則報錯

4、ROS節(jié)點

使用某個節(jié)點時,只需要寫出包名和節(jié)點名字就可以調(diào)用節(jié)點,不需要寫路徑

$ rosrun [package_name] [node_name]

修改節(jié)點的名字可以直接在命令行進行(同時可以運行該幾點做其他任務(wù)):

$ rosrun turtlesim turtlesim_node __name:=my_turtle

展示當前運行的節(jié)點:

$ rosnode list

5、ROS Topic使用

舉例:調(diào)用小烏龜節(jié)點,然后點擊鍵盤,使得烏龜根據(jù)鍵盤上下左右按鍵來運動

1)調(diào)用小烏龜節(jié)點,彈出如圖3所示的界面(turtlesim是功能包)

$ rosrun turtlesim turtlesim_node

圖3

2)在新的終端,調(diào)用鍵盤遙操作(keyboard teleoperation)節(jié)點,小烏龜動起來了,如圖4

$ rosrun turtlesim turtle_teleop_key

圖4

3)之所以上面的小烏龜能夠響應(yīng)鍵盤鍵,出現(xiàn)圖4的運動軌跡,就是因為節(jié)點turtlesim_node和turtle_teleop_key通過topic進行了通信(turtle_teleop_key is publishing the key strokes on a topic, while turtlesim subscribes to the same topic to receive the key strokes)

4)為了展示它們間的關(guān)系,調(diào)用rqt_graph,結(jié)果見圖5

$ rosrun rqt_graph rqt_graph

圖5

圖5表明當前topic名稱是:/turtle1/cmd_vel

5)基于rostopic tool 可以從ROS Topics獲取信息

$ rostopic -h

rostopic bw? ? display bandwidth used by topic

rostopic echo? print messages to screen

rostopic hz? ? display publishing rate of topic

rostopic list? print information about active topics

rostopic pub? ? publish data to topic

rostopic type? print topic type

比如:$ rostopic echo /turtle1/cmd_vel

6、ROS Message

ROS Topic通信是通過節(jié)點間發(fā)送message來實現(xiàn)的,ROS里面要求節(jié)點間發(fā)送message的類型必須一致(Communication on topics happens by sending ROS messages between nodes. For the publisher (turtle_teleop_key) and subscriber (turtlesim_node) to communicate, the publisher and subscriber must send and receive the same type of message.)ROS里,通過rostopic type來決定message的type:$ rostopic type [topic]

比如上面提到的topic:/turtle1/cmd_vel,其對應(yīng)的消息類型為:

$ rostopic type /turtle1/cmd_vel

結(jié)果為:geometry_msgs/Twist

進一步獲取message的詳細信息:

$ rosmsg show geometry_msgs/Twist

得到:

geometry_msgs/Vector3 linear

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

float64 z

7、接下來基于以上內(nèi)容,通過給節(jié)點turtlesim_node發(fā)信息,來控制其運動。

1)使用rostopic pub來發(fā)布當前topic的信息:rostopic pub [topic] [msg_type] [args]

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

以上命令結(jié)果見下圖6

圖6

2)該指令的作用下,發(fā)現(xiàn)小烏龜運動了一下就停止了。怎樣讓小烏龜一直運動下去,使用‘rostopic pub -r’指令

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

該語句仿真效果見下圖,在實際中,小烏龜一直沿著這個圓圈運動,直到強制跳出該語句

圖7

3)獲取信息發(fā)布的頻率:rostopic hz [topic]

$ rostopic hz /turtle1/pose

subscribed to [/turtle1/pose]

average rate: 59.354

min: 0.005s max: 0.027s std dev: 0.00284s window: 58

average rate: 59.459

min: 0.005s max: 0.027s std dev: 0.00271s window: 118

average rate: 59.539

min: 0.004s max: 0.030s std dev: 0.00339s window: 177

average rate: 59.492

min: 0.004s max: 0.030s std dev: 0.00380s window: 237

average rate: 59.463

min: 0.004s max: 0.030s std dev: 0.00380s window: 290

以上數(shù)據(jù)表明發(fā)布信息的頻率是60Hz

8、ROS services

1)節(jié)點(node)之間通信的另一種方式就是通過ROS services。services允許節(jié)點間發(fā)request,收response。這一過程是通過rosservice模塊來實現(xiàn)的

Topics上可以使用的語句包括:

rosservice list? ? ? ? print information about active services

rosservice call? ? ? ? call the service with the provided args

rosservice type? ? ? ? print service type

rosservice find? ? ? ? find services by service type

rosservice uri? ? ? ? ? print service ROSRPC uri

2)通過rosparam可以獲取或者處理ROS Parameter Server上的數(shù)據(jù)

rosparam set? ? ? ? ? ? set parameter

rosparam get? ? ? ? ? ? get parameter

rosparam load? ? ? ? ? load parameters from file

rosparam dump? ? ? ? ? dump parameters to file

rosparam delete? ? ? ? delete parameter

rosparam list? ? ? ? ? list parameter names

rosparam 使用 YAML markup language,文件的合適是.yaml,比如:$ rosparam dump params.yaml

9、ROS調(diào)試控制臺和日志記錄(rqt_console and rqt_logger_level)

rqt_console->顯示節(jié)點的輸出(rqt_console attaches to ROS's logging framework to display output from nodes)

rqt_logger_level->改變節(jié)點日志的冗長級別(rqt_logger_level allows us to change the verbosity level (DEBUG, WARN, INFO, and ERROR) of nodes as they run.)

相關(guān)命令:

$ rosrun rqt_console rqt_console ? ? ?#效果見圖8

圖8

$ rosrun rqt_logger_level rqt_logger_level? ? ? ? ? #效果見圖9

圖9

‘rqt_logger_level->改變節(jié)點日志的冗長級別’這句話啥意思?感覺怪怪的

解釋:實際上,運行時,如圖9最右邊日志列表所示,有以下級別:Fatal、Error、Warn、Info、Debug,級別依次降低。在運行‘$ rosrun rqt_logger_level rqt_logger_level’這句話后,會彈出一個管理界面,你可以選擇你關(guān)注的誒之類別是那個level,比如你選擇‘warn’,辣么,在console的管理界面就只會顯示W(wǎng)arn日志以及它級別以上的日志,比如Fatal、Error,而不會顯示‘Info、Debug’這些level的信息。同理,如果只選擇Fatal,則只顯示Fatal級別的信息

10、多個節(jié)點同時發(fā)布-roslaunch

roslaunch可以將同一個launch file里的節(jié)點同時發(fā)布:$ roslaunch [package] [filename.launch]

11、ROS文檔編輯-rosed

rosed可以僅僅根據(jù)包的名字和文檔名字就編輯文檔,而不需要寫該文檔的路徑:$ rosed [package_name] [filename]

12、ROS消息和服務(wù)-msg和srv

msg:ROS使用了一種簡化的消息類型描述語言來描述ROS節(jié)點發(fā)布的數(shù)據(jù)值。通過這樣的描述語言,ROS能夠使用多種編程語言生成不同類型消息的源代碼。ROS提供了很多預(yù)定義消息類型。如果你創(chuàng)建了一種新的消息類型,那么就要把消息的類型定義放到功能包的msg/文件夾下。在該文件夾下,有用于定義各種消息的文件。這些文件都以.msg為擴展名。消息類型必須具有兩個主要部分:字段和常量。字段定義了要在消息中傳輸?shù)臄?shù)據(jù)類型,常量用與定義字段的名稱。

ROS消息中的一種特殊數(shù)據(jù)類型是報文頭,主要用于添加時間戳、坐標位置等。報文頭還允許對消息進行編號。通過在報文頭內(nèi)部附加信息,可以知道是哪個節(jié)點發(fā)出的消息,或者可以添加一些能夠被ROS處理的其他功能。

創(chuàng)建一個消息:

$ roscd beginner_tutorials

$ mkdir msg

$ echo "int64 num" > msg/Num.msg

srv:ROS使用了一種簡化的服務(wù)描述語言來描述ROS服務(wù)器。這直接借鑒了ROS msg消息的數(shù)據(jù)格式,以實現(xiàn)節(jié)點之間的請求/響應(yīng)通信。服務(wù)的描述存儲在功能包的srv/子目錄下.srv文件中。

創(chuàng)建一個服務(wù):

$ roscd beginner_tutorials

$ mkdir srv

#這次我們不再手動創(chuàng)建服務(wù),而是利用roscp從其他的package中復(fù)制一個服務(wù)。

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

其實,因為建立msg和srv的時候,同時需要修改beginner_tutorials功能包下的package.xml和CMakeLists.txt兩個文件,這部分修改配置的內(nèi)容沒有在此顯示,有需要的請點擊ROS消息和服務(wù)-msg和srv

好的,ROS文件系統(tǒng)架構(gòu)以及概念總結(jié)到這里,希望對大家有所幫助,再次強調(diào),更加準確的ROS入門知識請直接查看官網(wǎng)ROS Tutorials。同時請大牛不吝賜教,非常感謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內(nèi)容