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. 创建pkg: catkin_create_pkg sample_nodelet nodelet roscpp rospy. 注意要依赖nodelet包.
2. 在include, src中创建一个类, 该类继承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__
- 在cpp中实现onInit()函数, 编写自己的代码. 有个特别的地方是 cpp中还需要加一行
- PLUGINLIB_EXPORT_CLASS(example_pkg::SampleNodelet, nodelet::Nodelet)