1. 程式人生 > >ROS學習之 roscpp內部架構概況

ROS學習之 roscpp內部架構概況


wiki連結:http://wiki.ros.org/roscpp/Internals
    這部分包括一個對roscpp內部架構組織高度概括的審視,從最底層開始。

    1.通用哲學

    roscpp的哲學是僅僅使一部分API對外可見。這意味著公共的標頭檔案不允許包含私有的標頭檔案。
    這意味著在最初時發生很多型別擦除。(???)
    通常我們會盡量減小包含的外部標頭檔案數目。例如,普通公共標頭檔案不允許包含Boost.Thread標頭檔案(CallbackQueue例外)。未來將去除花費很多編譯時間的Boost.Bind。

    2.xmlrpc(xml遠端過程呼叫)

    xml rpc是使用http協議做傳輸協議的rpc機制,使用xml文字的方式傳輸命令和資料.

    ros使用一個名叫xmlrpcpp的修改的第三方庫件。但它不支援在socket裡實現使用者輪詢程式碼,使用者要輪轉一個額外的執行緒去做這部分工作。

    使用xmlrpcpp時,所有使用都通過XMLRPSManager元件,所有與master的通訊都通過master::execute函式。

    3.PollSet/PollManager

    在最底層,所有非xmlrpc網路通過poll()實現,被PollSet類管理。

    4.連線和傳輸

    傳輸系統試圖使底層的傳輸原型(TCP、UDP)變得通用。
    有一個基本抽象類Transport(http://docs.ros.org/api/roscpp/html/classros_1_1Transport.html)它被TransportTCP類和TransportUDP類所繼承,它們實現了read()方法和write()方法。
    在更高層,Connection類(http://docs.ros.org/api/roscpp/html/classros_1_1Connection.html)提供了一個基於回撥的方式像傳輸層讀寫資料。這個類管理有多少資料被髮送和接收,當操作完成時,呼叫回撥函式。
    Connection類被ConnectionManager類管理,這個類主要負責管理TCP/UDP連線,並且保持Connection物件的指標,直到它們被delete掉。當ConnectionManager接到一個新來到的TCP或UDP連線時,它將以話題連線還是服務連線建立一個TransportSubscriberLink或是ServiceClientLink

    5.初始化

    這個主題在節點初始化部分已經講過,這裡再深入一下。roscpp有兩部分的初始化,init()方法和start()方法。init()方法做很少工作,主要就是解析一下環境和命令列引數,init()不允許參與實際的連線,因而,使用者可以手動檢測像是master啟動沒有,有沒有按自定義的行為啟動這樣的事。init()方法也不會啟動任何執行緒。

    start()方法參與大部分實際的初始化工作。start()可以手動呼叫,這樣之後要呼叫shutdown()。或者在第一個節點控制代碼被建立時自動被呼叫,當最後一個節點控制代碼被銷燬時,shutdown()被自動呼叫。

    start()將1.初始化所有的元件
        2.安裝SIGINT訊號控制代碼,如果需要的話
        3.建立rosout log4cxx新增器
        4.建立logger服務
        5.檢查/use_sim_time引數,如果被設定,訂閱/clock話題

    6.話題


    話題被TopicManager管理,它維護Subscription和Pulication列表。

    1)話題訂閱

    Subscription類管理話題的訂閱。一個話題只能有一個Subscription類,如果很多訊息訂閱者共同訂閱一個話題,則它們共享一個連線,以節省頻寬資源。
    Subscription類物件管理N個PublisherLink物件,每一個PubllisherLink物件連線著一個該話題的不同的Publisher.
    有兩種不同的PublisherLink物件,TransportPublisherLink通過傳輸層連線著一個publisher,而IntraprocessPublisherLink連線一個本地、內部執行緒的publisher,傳輸訊息資料時可以跳過傳輸層(可以的話提供免複製訊息傳遞)。
    
    publisherUpdate:當一個話題釋出者在master註冊之後,這個節點將接受一個“publisherUpdate” xmlrpc呼叫,它使Subscription::pubUpdate指向正確的話題。對於非內部執行緒連線,這將啟動一個對新publisher的非同步的xmlrpc請求,當請求通過時,Subscription::pendingConnectionDone()方法被呼叫。一旦這個請求完成,一個新的TransportPublisherLink物件為這個publisher建立。

    Retry:重試。如果一個TCP TransportPublisherLink物件與它的publisher連線中斷,它將嘗試重新與之連線。它的第一次重試被設定為連線斷開之後的100ms,以後重試時間間隔將加倍,直到20s後它被蓋掉。

    訊息訂閱回撥和去序列化:當一個訊息接收時,它被壓入一個訊息訂閱佇列SubscriptionQueue,這個佇列將在佇列滿時拋棄舊訊息。值的注意的是,這時訊息還沒有被去序列化。一個MessageDeserializer物件將被壓入佇列,而非訊息本身,這個物件被所有訊息回撥所共有,這意味著:
    因為佇列滿而被拋棄的訊息將不會被去序列化。
    直到第一次與訂閱相關的回撥函式被呼叫時訊息才會被去序列化。

    2)話題釋出

    對一個話題的釋出,由Publication類來管理。對於每一個話題,僅能有一個Publication物件。
    對於相同話題的許多個話題釋出者,它們共享連線。
    Publication物件管理N個SubscriberLink物件,每一個物件連線這個話題的一個訂閱者。與訊息釋出相似,訊息訂閱SubscriberLink物件也有兩種型別,使用傳輸層的TransportSubscriberLink和不經過傳輸層的IntraprocessSubscriberLink.

    3)內部執行緒無複製支援

    roscpp使用boost::shared_ptr和rtti(Runtime Type Information,執行時型別資訊)的組合提供基本安全的無複製內部執行緒間的訊息傳遞。基本安全是指訊息釋出者對於自己已經發布的訊息沒有修改的能力。注意,這僅僅適用於訊息被作為boost::shared_ptr型別傳遞的情況。否則,它將還會經歷序列化/去序列化的過程,即使它已經不經過傳輸層。
    內部執行緒訊息所經歷的過程:
        Publisher::publish()  被髮布
        TopicManager::publish()
            呼叫Publication::getPublishTypes()判斷訊息訂閱者(釋出訊息針對的物件)的型別
            如果存在‘需要序列化’的訊息訂閱者,序列化訊息
            如果不存在任何‘免複製’的訊息訂閱者,立即清除訊息指標和rtti資訊

        Publication::publish()
            尋找這個Publication中是否有InteraprocessSubscriberLink
            如果有,直接封裝訊息給它.    
        IntraprocessSubscriberLink::enqueueMessage()
        IntraprocessPublisherLink::handleMessage()
        Subscription::handleMessage()
            對於每一個subscriber,檢查rtti資訊是否一致,如果是,則將訊息新增進其訂閱佇列,直到ros::spin()呼叫時,呼叫回撥函式處理訊息。
        這些中的有些部分是不必須的。

相關推薦

ROS學習 roscpp內部架構概況

wiki連結:http://wiki.ros.org/roscpp/Internals     這部分包括一個對roscpp內部架構組織高度概括的審視,從最底層開始。    1.通用哲學     roscpp的哲學是僅僅使一部分API對外可見。這意味著公共的標頭檔案不允許

ROS學習編譯一個包

cti ges begin -s 包名 code start ner 一個 catkin_make -DCATKIN_WHITELIST_PACKAGES= "包名" $ catkin_make -DCATKIN_WHITELIST_PACKAGES="begin

ros學習kobuki

key con core sta -i fig other del mini sudo apt-get install ros-indigo-kobuki ros-indigo-kobuki-corerosrun kobuki_ftdi create_udev_rules#

Mysql數據庫學習高可用架構Atlas簡析

mysql數據庫 北京mysql mysql周末 數據庫管理員   Atlas是一個基於MySQL協議的數據中間層項目,在MySQL-Proxy 0.8.2版本基礎上修改了大量bug,添加了很多功能特性。目前該項目很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條。 

ROS學習路的整理

        ROS是基於linux系統的一個次級作業系統,目前被看做是機器人界的一套標準平臺,可以類比手機的安卓作業系統或者是電腦的windows作業系統。ROS最大的優點在於靈活、低耦合、分散式、開源以及功能強大而豐富的

ROS學習路(二)檔案系統

    在ROS的檔案包裡面,有純粹的程式碼,也有編譯後的二進位制檔案。如何將這些檔案有條不紊的整理起來呢?於是就有了下面這種檔案系統: 對於每一個特定的功能,用一個資料夾包起來,就是所謂的功能包: (1)config:放置功能包中的配置檔案,由使用者建立,檔名可以不同

ros學習camera calibration 單目攝像頭標定

環境:ubuntu16.04 ros版本 kinetic 標定筆記本單目攝像頭 需要的準備:1、標定圖:下面這張列印到a4紙上。 2、攝像機驅動,我使用的是usb_cam,下載地址:https://github.com/ros-drivers/usb_c

ros學習apriltags2_ros

apriltags2的執行很簡單,主要就是幾個引數的設定問題記錄一下。 一、準備 1、apriltags2可以在 https://github.com/dmalyuta/apriltags2_ros.git 下載,下載後放到catkin_ws工作目錄下。 編譯:

ROS學習認識

本人準備做一個ROS學習系列文章,目的是對自己的學習經歷做一個總結,同時,也是希望能夠幫助到想要學習ROS的人。 一.ROS是什麼 提到ROS,大家應該都清楚,它是機器人作業系統英文的首寫字母縮寫(Robot Operation System),這是它的名字,那麼從它

詳解深度學習經典網路架構(十):九大框架彙總

目錄 0、概覽 2、總結 本文是對本人前面講的的一些經典框架的彙總。 純手打,如果有不足之處,可以在評論區裡留言。 0、概覽 1、個人心得 (1)LeNet:元老級框架,結構簡單,卻開創了卷積神經網路的新紀元,具有重要的學

無線通訊網路學習LTE網路架構篇(20141208)

今天來學習一下LTE的網路架構: 1.LTE網路架構簡化了既有通訊網路架構,並可以與其他IP網路進行通訊的無縫整合,使其成為扁平化的全IP網路架構(Falt-All-IP); 2.改網路主要由EPC(核心網)與E-UTRAN組成,通過其他傳輸介質接入其他通訊網路,如下圖所示

ROS學習launch檔案編寫

1.一個簡單的launch檔案//在catkin_ws/src/下建立一個包,單獨存放launch 檔案 cd catkin_ws/src catkin_create_pkg my_launch //回到catkin_ws目錄下 catkin_make在包 my_launch

我的ROS學習路——ROS安裝

1.進入ubuntu的‘軟體與更新’(soft and update)介面,選中以下四個 main universe  restricted multiverse 如圖: 2,。在linux終端輸入 

ROS學習 cpp時間

wiki連結: http://wiki.ros.org/roscpp/Overview/Time    1.時刻和時間間隔         ROS有內建的時間和時間間隔原始型別,rsolib程式包提供了ros::Time和ros::Duration類         tim

ROS學習tf基本用法

主要細節參見wiki,這裡我寫一下它的broadcaster和listener做個記錄: tf_broadcaster.cpp: #include<ros/ros.h> #include<tf/transform_broadcaster.h> in

ROS學習釋出訊息——Publisher_程式碼分析

//一個非常詳細的版本: //本檔名字為: publisher.cpp #include "ros/ros.h" #include "std_msgs/String.h" #include <i

ROS學習CMakelists.txt和package.xml

package.xml 當你的package裡已經包含配置檔案(package.xml),ROS能夠找到它。執行:rospack find [包名稱]。應該注意到我們剛才所建立的package.xml依賴於 roscpp 和 std_msgs.而catkin恰

ROS學習 cpp回撥函式和輪轉(spin)

wiki連結: http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning 資料(雲飛機器人實驗室的一篇小文): http://www.yfworld.com/?p=2318 這篇文章會幫助理解ros::s

ROS學習 cpp訊息釋出者和訊息訂閱者

wiki連結: http://wiki.ros.org/roscpp/Overview/Publishers%20and%20Subscribers一、釋出一個話題     其它相關連結:         ros::NodeHandle,ros::NodeHandle::

詳解深度學習經典網路架構(九):DPN(Dual Path Network)

目錄 0、簡介 1、優勢 3、總結 0、簡介 論文:Dual Path Networks 演算法詳解: 介紹的duall path networks(DPN)是顏水成老師新作,2017年4月在arxiv上放出,對於影象分類的效果有一定提升。我們知