ROS通信架构(上)
?
?
ROS通信架構(上)
?
徐凱_xp
2019.04.30 14:23:54字數 1,821閱讀 105
Node&Master
在ROS的世界里,最小的進程單元就是節點(node)。一個軟件包里可以有多個可執行文件,可執行文件在運行之后就成了一個進程(process),這個進程在ROS中就叫做節點。
例如有一個node來控制底盤輪子的運動,有一個node驅動攝像頭獲取圖像,有一個node驅動激光雷達,有一個node根據傳感器信息進行路徑規劃……這樣做可以降低程序發生崩潰的可能性
Master
由于機器人的元器件很多,功能龐大,因此實際運行時往往會運行眾多的node,負責感知世界、控制運動、決策和計算等功能。那么如何合理的進行調配、管理這些node?這就要利用ROS提供給我們的節點管理器master, master在整個網絡通信架構里相當于管理中心,管理著各個node。node首先在master處進行注冊,之后master會將該node納入整個ROS程序中。node之間的通信也是先由master進行“牽線”,才能兩兩的進行點對點通信。當ROS程序啟動時,第一步首先啟動master,由節點管理器處理依次啟動node。
啟動master和node
啟動ROS時,
roscore此時ROS master啟動,同時啟動的還有 rosout 和 parameter server ,其中 rosout 是負責日志輸出的一個節點,其作用是告知用戶當前系統的狀態,包括輸出系統的error、warning等等,并且將log記錄于日志文件中, parameter server 即是參數服務器,它并不是一個node,而是存儲參數配置的一個服務器,后文我們會單獨介紹。每一次我們運行ROS的節點前,都需要把master啟動起來,這樣才能夠讓節點啟動和注冊。
具體啟動node的語句是:
通常我們運行ROS,就是按照這樣的順序啟動,有時候節點太多,我們會選擇用launch文件來啟動,下一小節會有介紹。 Master、Node之間以及Node之間的關系如下圖所示:
?
rosrun &rosnode
rosrun命令的詳細用法如下:
rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]rosrun將會尋找PACKAGE下的名為EXECUTABLE的可執行程序
rosnode 命令的詳細作用列表如下:
?
?
以上命令中常用的為前三個,在開發調試時經常會需要查看當前node以及node信息
roslaunch
通常一個機器人運行操作時要開啟很多個node,并不需要每個節點依次進行rosrun,ROS為我們提供了一個命令能一次性啟動master和多個node。該命令是:
roslaunch pkg_name file_name.launchroslaunch命令首先會自動進行檢測系統的roscore有沒有運行,也即是確認節點管理器是否在運行狀態中,如果master沒有啟動,那么roslaunch就會首先啟動master,然后再按照launch的規則執行。launch文件里已經配置好了啟動的規則。 所以 roslaunch 就像是一個啟動工具,能夠一次性把多個節點按照我們預先的配置啟動起來,減少我們在終端中一條條輸入指令的麻煩。
launch文件寫法及格式:
參考鏈接:http://wiki.ros.org/roslaunch/XML
通信方式
ROS的通信方式是ROS最為核心的概念,ROS系統的精髓就在于它提供的通信架構。ROS的通信方式有以下四種:
- Topic 主題
- Service 服務
- Parameter Service 參數服務器
- Actionlib 動作庫
Topic
topic是一種點對點的單向通信方式,這里的“點”指的是node,也就是說node之間可以通過topic方式來傳遞信息。
topic要經歷下面幾步的初始化過程:
首先,publisher節點和subscriber節點都要到節點管理器進行注冊;然后publisher會發布topic,subscriber在master的指揮下會訂閱該topic,從而建立起sub-pub之間的通信。
注意整個過程是單向的。其結構示意圖如下:
?
通信示例
以攝像頭畫面的發布、處理、顯示為例講講topic通信的流程:
在機器人上的攝像頭拍攝程序是一個node(圓圈表示,我們記作node1),當node1運行啟動之后,它作為一個Publisher就開始發布topic。比如它發布了一個topic(方框表示),叫做/camera_rgb,是rgb顏色信息,即采集到的彩色圖像。同時,node2假如是圖像處理程序,它訂閱了/camera_rgb這個topic,經過節點管理器的介紹,它就能建立和攝像頭節點(node1)的連接。
在node1每發布一次消息之后,就會繼續執行下一個動作,至于消息是什么狀態、被怎樣處理,它不需要了解;而對于node2圖像處理程序,它只管接收和處理/camera_rgb上的消息,至于是誰發來的,它不會關心。所以node1、node2兩者都是各司其責,不存在協同工作,我們稱這樣的通信方式是異步的。
ROS是一種分布式的架構,一個topic可以被多個節點同時發布,也可以同時被多個節點接收。比如在這個場景中用戶可以再加入一個圖像顯示的節點,我們在想看看攝像頭節點的畫面,則可以用自己的筆記本連接到機器人上的節點管理器,然后在自己的電腦上啟動圖像顯示節點。
這就體現了分布式系統通信的好處:擴展性好、軟件復用率高。
總結三點:
?
- topic通信方式是異步的,發送時調用publish()方法,發送完成立即返回,不用等待反饋。
- subscriber通過回調函數的方式來處理消息。
- topic可以同時有多個subscribers,也可以同時有多個publishers。ROS中這樣的例子有:/rosout、/tf等等。
Message
Topic有很嚴格的格式要求,,比如上節的攝像頭進程中的rgb圖像topic,它就必然要遵循ROS中定義好的rgb圖像格式。這種數據格式就是Message。Message按照定義解釋就是topic內容的數據類型,也稱之為topic的格式標準。這里和我們平常用到的Massage直觀概念有所不同,這里的Message不單單指一條發布或者訂閱的消息,也指定為topic的格式標準。
我們用一個具體的msg來了解,例如上例中的msg sensor_msg/image,位置存放在sensor_msgs/msg/image.msg里.
觀察上面msg的定義,是不是很類似C語言中的結構體呢?通過具體的定義圖像的寬度,高度等等來規范圖像的格式。所以這就解釋了Message不僅僅是我們平時理解的一條一條的消息,而且更是ROS中topic的格式規范。或者可以理解msg是一個“類”,那么我們每次發布的內容可以理解為“對象”,這么對比來理解可能更加容易。
操作命令
操作演示
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?
?
?
-
試用ROS系統
創建一個ROS Package 這個教程包括使用roscreate-pkg或者catkin去創建一個新的packa.
-
機器人操作系統ROS(二)-文件系統架構及概念
-
ROS機器人程序設計 | 期末知識點大總結
工作空間的框架是怎么樣的?有幾個文件夾? 一個包含功能包、可編輯源文件或編譯包的文件夾。同時編譯不同的功能包時非常...
?
-
ros系統入門筆記(一)
ROS的工程結構(文件系統) 1. catkin編譯的工作流程如下: 首先在工作空間catkin_ws/src/下...
冰星
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ROS通信架构(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu中运行pip时报错
- 下一篇: ROS通信架构(下)