ROS nodelet初探

1. 簡介

nodelet是為了減少ros node之間的消息傳輸(進程間通訊), 將多個算法"結點(nodelet)"跑到一個進程中, 這樣避免了數據傳輸, (因為進程內部內存是共享的, 傳數據的話傳個指針就行了), 從而實現的零拷貝(zero copy).

nodelet和node很大程度上保持一致, 對外來說, nodelet幾乎可以視為node, nodelet之間仍然是消息傳輸(只是內部實現由原始數據的傳輸改成了指針傳輸), 將node轉換為nodelet只需要少量的改動.

2. 編寫nodelet

nodelet的pkg組織架構和node有點相似, 包括: include, src, package.xml, CMakeLists.txt, 和 nodelet_plugins.xml.

  1. 創(chuàng)建pkg: catkin_create_pkg sample_nodelet nodelet roscpp rospy. 注意要依賴nodelet包.
  2. 在include, src中創(chuàng)建一個類, 該類繼承nodelet::Nodelet, 最好在類的外面加一個namespace, 可以以package名字做namespace. 類中有一個onInit()函數, 相當于main()函數.
//sample_nodelet.h
#ifndef __SAMPLE_NODELET_H__
#define __SAMPLE_NODELET_H__
#include <nodelet/nodelet.h>
namespace example_pkg
{
    class SampleNodelet: public nodelet::Nodelet
    {
    public:
        virtual void onInit();
    };
}
#endif //__SAMPLE_NODELET_H__
  1. 在cpp中實現onInit()函數, 編寫自己的代碼. 有個特別的地方是 cpp中還需要加一行
  • PLUGINLIB_EXPORT_CLASS(example_pkg::SampleNodelet, nodelet::Nodelet)
//sample_nodelet.cpp
#include <pluginlib/class_list_macros.h>
#include <ros/ros.h>
#include <sample_nodelet.h>

PLUGINLIB_EXPORT_CLASS(example_pkg::SampleNodelet, nodelet::Nodelet)

namespace example_pkg
{
    void SampleNodelet::onInit()
    {
        NODELET_DEBUG("Initializing nodelet...");
        ROS_INFO("Nodelet is Ok for test!!");
    }
}
  1. CMakelist中添加library. 這里我們發(fā)現, nodelet的pkg中沒有main()沒有可執(zhí)行程序, 而是生成一個lib, 讓ros調用.
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(sample_nodelet)

find_package(catkin REQUIRED COMPONENTS
  nodelet
  roscpp
  rospy
)

catkin_package(
 INCLUDE_DIRS include
 LIBRARIES ${PROJECT_NAME}
 CATKIN_DEPENDS nodelet roscpp rospy
 # DEPENDS system_lib
)

include_directories(
    include
    ${catkin_INCLUDE_DIRS}
)

add_library(${PROJECT_NAME} src/sample_nodelet.cpp)

add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
  1. nodelet_plugins.xml是nodelet特有的, 文件名可以自己定, 最好用這個名字. xml文件里面指定nodelet的lib的路徑, 以及nodelet類的名字.
<library path="lib/libsample_nodelet">
  <class name="example_pkg/SampleNodelet" type="example_pkg::SampleNodelet" base_class_type="nodelet::Nodelet">
  <description>
  This is my nodelet.
  </description>
  </class>
</library>
  1. package.xml中增加export項, 把上一個xml文件的位置配置進去.
<?xml version="1.0"?>
<package>
  <name>sample_nodelet</name>
  <version>0.0.0</version>
  <description>The sample_nodelet package</description>
  <maintainer email="symao@todo.todo">symao</maintainer>
  <license>TODO</license>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>nodelet</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <run_depend>nodelet</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>

  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <nodelet plugin="${prefix}/nodelet_plugins.xml" />
  </export>
</package>

至此, nodelet pkg的編寫就基本完成. 可以用catkin_make直接編譯

3. 運行nodelet

3.1 以launch文件運行

編寫launch文件, 如下. 該launch打開兩個nodelet, 更改第二個nodelet的name和args.

<launch>
  <node pkg="nodelet" type="nodelet" name="standalone_nodelet"  args="manager" output="screen"/>
  <node pkg="nodelet" type="nodelet" name="SampleNodelet" args="load example_pkg/SampleNodelet standalone_nodelet" output="screen">
  </node>
</launch>

3.2 命令行運行

#啟動nodelet管理器
roscore
rosrun nodelet nodelet manager __name:=nodelet_manager
#啟動自己的nodelet
rosrun nodelet nodelet load nodelet_tutorial_math/Plus nodelet_manager __name:=nodelet1 nodelet1/in:=foo _value:=1.1

這里(http://www.ncnynl.com/archives/201702/1325.html)有一個簡單的實例, 可以看一下.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末入蛆,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子硕勿,更是在濱河造成了極大的恐慌哨毁,老刑警劉巖源武,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼褪,死亡現場離奇詭異,居然都是意外死亡粱栖,警方通過查閱死者的電腦和手機话浇,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹究,“玉大人幔崖,你說我怎么就攤上這事≡伲” “怎么了赏寇?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長价认。 經常有香客問我蹋订,道長,這世上最難降的妖魔是什么刻伊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任露戒,我火速辦了婚禮椒功,結果婚禮上,老公的妹妹穿的比我還像新娘智什。我一直安慰自己动漾,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布荠锭。 她就那樣靜靜地躺著旱眯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪证九。 梳的紋絲不亂的頭發(fā)上删豺,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音愧怜,去河邊找鬼呀页。 笑死,一個胖子當著我的面吹牛拥坛,可吹牛的內容都是我干的蓬蝶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼猜惋,長吁一口氣:“原來是場噩夢啊……” “哼丸氛!你這毒婦竟也來了?” 一聲冷哼從身側響起著摔,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤缓窜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谍咆,有當地人在樹林里發(fā)現了一具尸體禾锤,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年卧波,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇茫。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡港粱,死狀恐怖,靈堂內的尸體忽然破棺而出旦签,到底是詐尸還是另有隱情查坪,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布宁炫,位于F島的核電站偿曙,受9級特大地震影響,放射性物質發(fā)生泄漏羔巢。R本人自食惡果不足惜望忆,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一罩阵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧启摄,春花似錦稿壁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕾羊,卻和暖如春喧笔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背龟再。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工书闸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吸申。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓梗劫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親截碴。 傳聞我的和親對象是個殘疾皇子梳侨,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容