ROS nodelet相关

nodelet是ROS用来实现零拷贝的机制,实现原理是基于ROS的另一个概念pluginlib,也就是ROS的插件,所以这篇文章分成两个部分,第一部分结合ROS 的插件的教程,第二部分结合简单的nodelet教程

一.pluginlib 

将主要结合ROS pluginlib的教程

一个插件就相当与一个ros的package,文件结构大概如下,,下面将按步骤进行分步构建

plugtest/
├── CMakeLists.txt
├── include
│   └── plugtest
│       ├── base.h
│       └── plugin.h
├── package.xml
├── plugins.xml
└── src
    └── plugin.cpp

1.base.h 

在这个头文件中创建一个基类,其中函数都是虚函数

  class RegularPolygon
  {
    public:
      virtual void initialize(double side_length) = 0;
      virtual double area() = 0;
      virtual ~RegularPolygon(){}

    protected:
      RegularPolygon(){}
  };

2. plugin.h

在这个文件中引入基类所在的头文件,然后创建插件类继承基类,并且实现基类中定义的虚函数

#include <base.h>

3.plugin.cpp

将基类,插件类所在的头文件以及头文件<pluginlib/class_list_macros.h> include,然后在文件的最后使用PLUGINLIB_EXPORT_CLASS注册

#include <pluginlib/class_list_macros.h>
#include <pluginlib_tutorials_/polygon_base.h>
#include <pluginlib_tutorials_/polygon_plugins.h>

PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)

4.CmakeList.txt文件中

将include文件加入, 然后声明创建一个library

include_directories(include)
add_library(polygon_plugins src/polygon_plugins.cpp)

5.plugin.xml

这个文件要和CmakeList以及package.xml 同级

<library path="lib/libpolygon_plugins">
  <class type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
    <description>This is a triangle plugin.</description>
  </class>
</library>

6. package.xml

pluginlib_tutorials_ 指的是插件基类所在的包

<export>
  <pluginlib_tutorials_ plugin="${prefix}/polygon_plugins.xml" />
</export>

使用

1.和正常的库相同,在camkelist文件中添加 target_link_libraries( XXX  ${catkin_LIBRARIES})

add_executable(polygon_loader src/polygon_loader.cpp)
target_link_libraries(polygon_loader ${catkin_LIBRARIES})

2.在具体的文件中引入两个头文件

一个是固定的,一个是你要用的lib的基类的头文件

#include <pluginlib/class_loader.h>
#include <pluginlib_tutorials_/polygon_base.h>

二. Nodelet

下面介绍如何创建和使用NodeLet ,具体请参考 这篇文章

扫描二维码关注公众号,回复: 11579215 查看本文章

1. 创建nodelet的插件类

在这里Nodelet就相当于上面的基类

#include <nodelet/nodelet.h>

namespace example_pkg
{
    class MyNodeletClass : public nodelet::Nodelet
    {
        public:
            virtual void onInit();
    };
}

2. cpp文件

ROS的教程里面在头文件中实现,这里在cpp文件中实现,同样的,实现基类的虚函数,然后PLUGINLIB_EXPORT_CLASS

#include <pluginlib/class_list_macros.h>

// watch the capitalization carefully

namespace example_pkg
{
    void MyNodeletClass::onInit()
    {
        NODELET_DEBUG("Initializing nodelet...");
    }
}

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

3. pluging.xml

名称,类型,基类

<library path="lib/libMyNodeletClass">
  <class name="example_pkg/MyNodeletClass" type="example_pkg::MyNodeletClass" base_class_type="nodelet::Nodelet">
  </class>
</library>

4.package.xml

前面讲了,export中前面的名字是基类所在的名字,而这里基类是nodelet,所以就是<nodelet />

<build_depend>nodelet</build_depend>
<run_depend>nodelet</run_depend>
<export>
  <nodelet plugin="${prefix}/nodelet_plugins.xml" />
</export>

5. cmakelist.txt

add_library(nodelet_math src/plus.cpp)
target_link_libraries(nodelet_math ${catkin_LIBRARIES})

使用

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

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

猜你喜欢

转载自blog.csdn.net/explorer9607/article/details/105254742
ROS