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>