介绍如何将节点封装为Nodelet
处理过程
- 添加必要的#includes
#include <nodelet/nodelet.h>
#include <pluginlib/class_list_macros.h>
- 去掉int main()
- 继承子类 nodelet::Nodelet
namespace systemExample {
class SystemNodelet : public nodelet::Nodelet {
public:
SystemNodelet() { return; }
~SystemNodelet() {
// debug log
std::cout << "in ~SystemNodelet()" << std::endl;
return; }
private:
virtual void onInit();
};
}
- 将代码从构造函数移动到onInit()
namespace systemExample {
void SystemNodelet::onInit() {
NODELET_DEBUG("Initializing nodelet...");
ROS_INFO("Nodelet is Ok for test!!");
return;
}
}
- 添加PLUGINLIB_EXPORT_CLASS宏或PLUGINLIB_DECLARE_CLASS宏
PLUGINLIB_EXPORT_CLASS(systemExample::SystemNodelet, nodelet::Nodelet);
- 在包manifest.xml或package.xml中对nodelet添加<build_depend> 和
<run_depend>依赖项。
<depend>nodelet</depend>
- 创建.xml文件以将nodelet定义为插件
- 请在包manifest.xml或package.xml部分中添加项
<export>
<nodelet plugin="${prefix}/nodelets.xml"/>
</export>
- 对CMakeLists.txt进行必要的更改(注释掉一个rosbuild_add_executable,添加一个rosbuild_add_library)
# System Manager nodelet
add_library(system_manager_nodelet
src/System_nodelet.cpp
)
add_dependencies(system_manager_nodelet
${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS}
)
target_link_libraries(system_manager_nodelet
${catkin_LIBRARIES}
)