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.初始化
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上放出,對於影象分類的效果有一定提升。我們知