ros程序源碼分析1--message篇

ros本地的安裝目錄爲opt/ros/kineticnode

ros.h所在絕對路徑opt/ros/kinetic/include/ros/ros.hc++

代碼中使用#include 「ros/ros.h」函數

ros.h中的源碼this

 

ros.h是一個頭文件集合,包含所需的全部基礎頭文件。spa

 

String.h位於include/std_msgs/String.hstd_msgs下都是內建基礎類型,String.h3d

內容比較多,注意String實際是一個別稱,它的全稱是::std_msgs::String_<std::allocator<void> >orm

定義的語句是typedef ::std_msgs::String_<std::allocator<void> > String;對象

String有一個成員是data,用來存數據。注意String定義的對象必定要用它的data成員來存放數據。blog

以及包含一些運算符重載,更多的內容就看不懂了接口

 

ros::init() ROS節點初始化函數

有三種重載形式,ros源代碼中的重載大部分都是頂層調用同名底層。1調用2,2調用3.

 

ros::init中有network::initmaster::initthis_node::initfile_log::initparam::init

 

使用NodeHandle接口時使用此種參數形式,第四個參數options缺省(3個選擇)

 

NodeHandle是句柄類,在ros/node_handle.h中定義,最主要是不少函數集合,自己數據不多(命名空間名之類).

roscpp用於建立訂閱者和發佈者等的接口。必須在使用前用ros::init()實例化。

NodeHandle下的advertise方法返回一個Publisher對象,攜帶要發佈的topic

 

結尾的advertise是下面這種重載形式,功能在註釋中。

 

Publisherros/publisher.h中定義的一個類,其中有重載的publish方法,只傳遞一個msg信息就能夠進行發佈。

 

 

ros::ok()定義在init.cpp中的一個函數,定義以下

g_ok初始默認爲false,通過init()後變爲true,當程序遇到shutdown()g_ok變爲false

ok()用來斷定程序是否應該繼續運行。

 

ROS_INFO()至關於c中的printfROS_INFO_STREAM()至關於c++中的cout

源碼未找到。

 

ros_Rateros/rate.h中定義的類,構造函數須要一個頻率數據,經常使用的是其兩個公共方法sleep()reset();

 

 

ros::spinOnce()ros::spin()都是ROS消息回調函數,用於處理callback函數

 

消息發佈器在一個while裏面一直循環發送「hello world」topic上。消息訂閱器一旦知道chatter上面有data,就會將這data做爲參數傳入callback函數中,可是此時尚未執行callback函數,而是把callback函數放到了一個回調函數隊列中。因此當發佈器不斷髮送datachatter上面時,就會有相應的callback函數進入隊列中,它們函數名同樣,只是實參不同。。

spinOnce函數被調用時,spinOnce就會調用回調函數隊列中第一個callback函數,此時callback函數才被執行,而後等到下次spinOnce函數又被調用時,回調函數隊列中第二個callback函數就會被調用,以此類推。

因此,這會有一個問題。由於回調函數隊列的長度是有限的,若是發佈器發送數據的速度太快,spinOnce函數調用的頻率太少,就會致使隊列溢出,一些callback函數就會被擠掉,致使沒被執行到。

而對於spin函數,一旦進入spin函數,它就不會返回了,至關於它在本身的函數裏面死循環了。只要回調函數隊列裏面有callback函數在,它就會立刻去執行callback函數。若是沒有的話,它就會阻塞,不會佔用CPU

(本大段是粘貼自其餘博客)

 

Subscriberros/subscriber.h中定義的類,內容很少,初級也不須要顯式用到裏面的成員。

NodeHandle類中的subscribe()方法對應advertise(),用來訂閱,也定義在ros/node_handle.h中,

@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋體"; }@font-face { font-family: "Calibri"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; font-family: Calibri; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

相關文章
相關標籤/搜索