ROS通信架構(gòu)(上)

Node&Master

在ROS的世界里,最小的進(jìn)程單元就是節(jié)點(node)。一個軟件包里可以有多個可執(zhí)行文件,可執(zhí)行文件在運(yùn)行之后就成了一個進(jìn)程(process),這個進(jìn)程在ROS中就叫做節(jié)點。
例如有一個node來控制底盤輪子的運(yùn)動,有一個node驅(qū)動攝像頭獲取圖像,有一個node驅(qū)動激光雷達(dá),有一個node根據(jù)傳感器信息進(jìn)行路徑規(guī)劃……這樣做可以降低程序發(fā)生崩潰的可能性

Master

由于機(jī)器人的元器件很多,功能龐大,因此實際運(yùn)行時往往會運(yùn)行眾多的node,負(fù)責(zé)感知世界、控制運(yùn)動、決策和計算等功能。那么如何合理的進(jìn)行調(diào)配、管理這些node?這就要利用ROS提供給我們的節(jié)點管理器master, master在整個網(wǎng)絡(luò)通信架構(gòu)里相當(dāng)于管理中心,管理著各個node。node首先在master處進(jìn)行注冊,之后master會將該node納入整個ROS程序中。node之間的通信也是先由master進(jìn)行“牽線”,才能兩兩的進(jìn)行點對點通信。當(dāng)ROS程序啟動時,第一步首先啟動master,由節(jié)點管理器處理依次啟動node。

啟動master和node

啟動ROS時,

roscore

此時ROS master啟動,同時啟動的還有 rosout 和 parameter server ,其中 rosout 是負(fù)責(zé)日志輸出的一個節(jié)點,其作用是告知用戶當(dāng)前系統(tǒng)的狀態(tài),包括輸出系統(tǒng)的error、warning等等,并且將log記錄于日志文件中, parameter server 即是參數(shù)服務(wù)器,它并不是一個node,而是存儲參數(shù)配置的一個服務(wù)器,后文我們會單獨(dú)介紹。每一次我們運(yùn)行ROS的節(jié)點前,都需要把master啟動起來,這樣才能夠讓節(jié)點啟動和注冊。
具體啟動node的語句是:

rosrun pkg_name node_name

通常我們運(yùn)行ROS,就是按照這樣的順序啟動,有時候節(jié)點太多,我們會選擇用launch文件來啟動,下一小節(jié)會有介紹。 Master、Node之間以及Node之間的關(guān)系如下圖所示:


rosrun &rosnode

rosrun命令的詳細(xì)用法如下:

rosrun  [--prefix cmd] [--debug] pkg_name node_name [ARGS]

rosrun將會尋找PACKAGE下的名為EXECUTABLE的可執(zhí)行程序
rosnode 命令的詳細(xì)作用列表如下:



以上命令中常用的為前三個,在開發(fā)調(diào)試時經(jīng)常會需要查看當(dāng)前node以及node信息

roslaunch

通常一個機(jī)器人運(yùn)行操作時要開啟很多個node,并不需要每個節(jié)點依次進(jìn)行rosrun,ROS為我們提供了一個命令能一次性啟動master和多個node。該命令是:

roslaunch pkg_name file_name.launch

roslaunch命令首先會自動進(jìn)行檢測系統(tǒng)的roscore有沒有運(yùn)行,也即是確認(rèn)節(jié)點管理器是否在運(yùn)行狀態(tài)中,如果master沒有啟動,那么roslaunch就會首先啟動master,然后再按照launch的規(guī)則執(zhí)行。launch文件里已經(jīng)配置好了啟動的規(guī)則。 所以 roslaunch 就像是一個啟動工具,能夠一次性把多個節(jié)點按照我們預(yù)先的配置啟動起來,減少我們在終端中一條條輸入指令的麻煩。
launch文件寫法及格式:

<launch> <!--根標(biāo)簽-->
    <node> <!--需要啟動的node及其參數(shù)-->
    <include> <!--包含其他launch-->
    <machine> <!--指定運(yùn)行的機(jī)器-->
    <env-loader> <!--設(shè)置環(huán)境變量-->
    <param> <!--定義參數(shù)到參數(shù)服務(wù)器-->
    <rosparam> <!--啟動yaml文件參數(shù)到參數(shù)服務(wù)器-->
    <arg> <!--定義變量-->
    <remap> <!--設(shè)定參數(shù)映射-->
    <group> <!--設(shè)定命名空間-->
</launch> <!--根標(biāo)簽-->

參考鏈接:http://wiki.ros.org/roslaunch/XML

通信方式

ROS的通信方式是ROS最為核心的概念,ROS系統(tǒng)的精髓就在于它提供的通信架構(gòu)。ROS的通信方式有以下四種:

  • Topic 主題
  • Service 服務(wù)
  • Parameter Service 參數(shù)服務(wù)器
  • Actionlib 動作庫

Topic

topic是一種點對點的單向通信方式,這里的“點”指的是node,也就是說node之間可以通過topic方式來傳遞信息。
topic要經(jīng)歷下面幾步的初始化過程:
首先,publisher節(jié)點和subscriber節(jié)點都要到節(jié)點管理器進(jìn)行注冊;然后publisher會發(fā)布topic,subscriber在master的指揮下會訂閱該topic,從而建立起sub-pub之間的通信。
注意整個過程是單向的。其結(jié)構(gòu)示意圖如下:


通信示例

以攝像頭畫面的發(fā)布、處理、顯示為例講講topic通信的流程:
在機(jī)器人上的攝像頭拍攝程序是一個node(圓圈表示,我們記作node1),當(dāng)node1運(yùn)行啟動之后,它作為一個Publisher就開始發(fā)布topic。比如它發(fā)布了一個topic(方框表示),叫做/camera_rgb,是rgb顏色信息,即采集到的彩色圖像。同時,node2假如是圖像處理程序,它訂閱了/camera_rgb這個topic,經(jīng)過節(jié)點管理器的介紹,它就能建立和攝像頭節(jié)點(node1)的連接。
在node1每發(fā)布一次消息之后,就會繼續(xù)執(zhí)行下一個動作,至于消息是什么狀態(tài)、被怎樣處理,它不需要了解;而對于node2圖像處理程序,它只管接收和處理/camera_rgb上的消息,至于是誰發(fā)來的,它不會關(guān)心。所以node1、node2兩者都是各司其責(zé),不存在協(xié)同工作,我們稱這樣的通信方式是異步的。


ROS是一種分布式的架構(gòu),一個topic可以被多個節(jié)點同時發(fā)布,也可以同時被多個節(jié)點接收。比如在這個場景中用戶可以再加入一個圖像顯示的節(jié)點,我們在想看看攝像頭節(jié)點的畫面,則可以用自己的筆記本連接到機(jī)器人上的節(jié)點管理器,然后在自己的電腦上啟動圖像顯示節(jié)點。
這就體現(xiàn)了分布式系統(tǒng)通信的好處:擴(kuò)展性好、軟件復(fù)用率高。
總結(jié)三點:

  • topic通信方式是異步的,發(fā)送時調(diào)用publish()方法,發(fā)送完成立即返回,不用等待反饋。
  • subscriber通過回調(diào)函數(shù)的方式來處理消息。
  • topic可以同時有多個subscribers,也可以同時有多個publishers。ROS中這樣的例子有:/rosout、/tf等等。
Message

Topic有很嚴(yán)格的格式要求,,比如上節(jié)的攝像頭進(jìn)程中的rgb圖像topic,它就必然要遵循ROS中定義好的rgb圖像格式。這種數(shù)據(jù)格式就是Message。Message按照定義解釋就是topic內(nèi)容的數(shù)據(jù)類型,也稱之為topic的格式標(biāo)準(zhǔn)。這里和我們平常用到的Massage直觀概念有所不同,這里的Message不單單指一條發(fā)布或者訂閱的消息,也指定為topic的格式標(biāo)準(zhǔn)。
我們用一個具體的msg來了解,例如上例中的msg sensor_msg/image,位置存放在sensor_msgs/msg/image.msg里.

std_msg/Header header
    uint32    seq
    time    stamp
    string    frame_id
uint32    height
uint32    width
string    encoding
uint8    is_bigendian
uint32    step
uint8[]    data

觀察上面msg的定義,是不是很類似C語言中的結(jié)構(gòu)體呢?通過具體的定義圖像的寬度,高度等等來規(guī)范圖像的格式。所以這就解釋了Message不僅僅是我們平時理解的一條一條的消息,而且更是ROS中topic的格式規(guī)范?;蛘呖梢岳斫鈓sg是一個“類”,那么我們每次發(fā)布的內(nèi)容可以理解為“對象”,這么對比來理解可能更加容易。

操作命令
操作演示
roslaunch robot_sim_demo robot_spawn.launch
rostopic list
rostopic info /camera/rgb/image_raw
rosrun image_view image_view image:=/camera/rgb/image_raw

rostopic info /camera/depth/image_raw

類型依舊是sensor_mags/Image,所以依舊可以用 image_view node來查看

rosrun robpt_sim_demo robot_keyboard_teleop.py
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容