ROS nodelet初探

1. 簡介

nodelet是為了減少ros node之間的消息傳輸(進(jìn)程間通訊), 將多個(gè)算法"結(jié)點(diǎn)(nodelet)"跑到一個(gè)進(jìn)程中, 這樣避免了數(shù)據(jù)傳輸, (因?yàn)檫M(jìn)程內(nèi)部內(nèi)存是共享的, 傳數(shù)據(jù)的話傳個(gè)指針就行了), 從而實(shí)現(xiàn)的零拷貝(zero copy).

nodelet和node很大程度上保持一致, 對(duì)外來說, nodelet幾乎可以視為node, nodelet之間仍然是消息傳輸(只是內(nèi)部實(shí)現(xiàn)由原始數(shù)據(jù)的傳輸改成了指針傳輸), 將node轉(zhuǎn)換為nodelet只需要少量的改動(dòng).

2. 編寫nodelet

nodelet的pkg組織架構(gòu)和node有點(diǎn)相似, 包括: 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)建一個(gè)類, 該類繼承nodelet::Nodelet, 最好在類的外面加一個(gè)namespace, 可以以package名字做namespace. 類中有一個(gè)onInit()函數(shù), 相當(dāng)于main()函數(shù).
//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中實(shí)現(xiàn)onInit()函數(shù), 編寫自己的代碼. 有個(gè)特別的地方是 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ā)現(xiàn), nodelet的pkg中沒有main()沒有可執(zhí)行程序, 而是生成一個(gè)lib, 讓ros調(diào)用.
# 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特有的, 文件名可以自己定, 最好用這個(gè)名字. 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項(xiàng), 把上一個(gè)xml文件的位置配置進(jìn)去.
<?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. 運(yùn)行nodelet

3.1 以launch文件運(yùn)行

編寫launch文件, 如下. 該launch打開兩個(gè)nodelet, 更改第二個(gè)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 命令行運(yùn)行

#啟動(dòng)nodelet管理器
roscore
rosrun nodelet nodelet manager __name:=nodelet_manager
#啟動(dòng)自己的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)有一個(gè)簡單的實(shí)例, 可以看一下.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容