ros的底層通訊都是基於xml-rpc協議實現的,以xml-rpc的方式傳輸資料存在一定的延時和阻塞。在資料量小、頻率低的情況下,傳輸耗費的時間可以忽略不計。但當傳輸影象流,點雲等資料量較大的訊息,或者執行有一定的實時性要求的任務時,因傳輸而耗費的時間就不得不考慮。nodelet包就是為改善這一狀況設計的,它提供一種方法,可以讓多個演算法程式在乙個程序中用 shared_ptr 實現零拷貝通訊(zero copy transport),以降低因為傳輸大資料而損耗的時間。簡單講就是可以將多個node**在一起管理,使得同乙個manager裡面的topic的資料傳輸更快。
二、nodelet用法:
nodelet manager - launch a nodelet manager node. 啟動乙個manager
nodelet load pkg/type manager - launch a nodelet of type pkg/type on manager manager. 向manager中載入nodelet
nodelet standalone pkg/type - launch a nodelet of type pkg/type in a standalone node.
nodelet unload name manager - unload a nodelet a nodelet by name from manager. 從manager中移除nodelet
三、nodelet launch編寫示例
在roslaunc**件中使用nodelet. 下面的例子中先建立乙個名為standalone_nodelet的manager,然後向其中載入plus和plus2這兩個nodelet節點:
"nodelet" type=
"nodelet" name=
"standalone_nodelet" args=
"manager" output=
"screen"
/>
"nodelet" type=
"nodelet" name=
"plus" args=
"load nodelet_tutorial_math/plus standalone_nodelet" output=
"screen"
>
"/plus/out" to=
"plus2/in"
/>
<
/node>
"plus2" file=
"$(find nodelet_tutorial_math)/plus_default.yaml"
/>
"nodelet" type=
"nodelet" name=
"plus2" args=
"load nodelet_tutorial_math/plus standalone_nodelet" output=
"screen"
>
"$(find nodelet_tutorial_math)/plus_default.yaml"
/>
<
/node>
"nodelet" type=
"nodelet" name=
"plus3" args=
"standalone nodelet_tutorial_math/plus" output=
"screen"
>
"value" type=
"double" value=
"2.5"
/>
"plus3/in" to=
"plus2/out"
/>
<
/node>
<
/launch>
四、 程式編寫
nodelet外掛程式主要編寫的就是函式oninit(繼承自nodelet),做一些ros node基本初始化。
#include
#include
#include
#include
#include
#include
//fabs
namespace test_nodelet
private
:virtual
void
oninit()
void
callback
(const std_msgs::float64::constptr& input)
ros::publisher pub;
ros::subscriber sub;
double value_;};
pluginlib_declare_class
(test_nodelet, plus, test_nodelet::plus, nodelet::nodelet)
;}
注意為了允許類被動態載入,它必須被標記為匯出類。這通過特殊巨集pluginlib_export_class/pluginlib_declare_class來完成,通常放在匯出類的.cpp檔案的末尾。 巨集的引數分別為:pkg, class_name, class_type, base_class_type.
為了讓pluginlib查詢ros系統上的所有可用外掛程式,每個包必須顯式指定它匯出的外掛程式。相應的package.xml中要加入下面內容:
...
nodelet<
/build_depend>
nodelet<
/run_depend>
<
export
>
"$/nodelet_math.xml"
/>
<
/export
>..
.
外掛程式描述檔案是乙個xml檔案,用於儲存有關外掛程式的所有重要資訊。 它包含有關外掛程式所在的庫的資訊,外掛程式的名稱,外掛程式的型別等 。nodelet_math.xml如下:
"lib/libnodelet_math"
>
<
class
name
="nodelet_tutorial_math/plus" type=
"nodelet_tutorial_math::plus" base_class_type=
"nodelet::nodelet"
>
a node to add a value and republish.
<
/description>
<
/class
>
<
/library>
參考: ROS學習 ROS Nodelet學習
ros學習 十一 ros nodelet學習 2017 08 02 10 26 41 背景介紹 ros是一種基於訊息傳遞的分布式多程序框架。ros node之間的通訊,是基於tcp ip協議,在傳遞message或service時,都需要先打包,後解包。對資源有較大浪費,在實時性上也表現不佳。在需要...
epoll使用介紹
linux下的epoll較之傳統的select函式比較其優點 突破了單程序開啟socket描述符最大數目的限制,select單程序開啟fd的資料是有限制的,由fd setsize設定,預設值是2048,而這在那此需要支援上萬連線數目的網路伺服器來說是不能忍受的,雖然這個限制可以通過修改巨集重編譯核心...
ethereal使用介紹
使用windows 程式,使用很簡單。啟動ethereal 以後,選擇選單capature start 就ok 了。當你不想抓的時候,按一下stop,抓的包就會顯示在面板中,並且已經分析好了。下面是乙個截圖 ethereal使用 capture選項 nte ce 指定在哪個介面 網絡卡 上抓包。一般...