ROS nodelet 使用介紹

2021-10-21 20:18:03 字數 3407 閱讀 7718

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 指定在哪個介面 網絡卡 上抓包。一般...