nodelet的作用: 减少在ROS中传递数据的延迟。在同一个进程内,运行多个node,通过指针传递数据,使得进程内消息传递时不产生复制成本。
下面是一个使用nodelet源文件的例子:
namespace nodelet_tutorial_math
{
class Plus : public nodelet::Nodelet
{
public:
Plus()
: value_(0)
{}
private:
virtual void onInit()
{
ros::NodeHandle& private_nh = getPrivateNodeHandle();
private_nh.getParam("value", value_);
pub = private_nh.advertise<std_msgs::Float64>("out", 10);
sub = private_nh.subscribe("in", 10, &Plus::callback, this);
}
void callback(const std_msgs::Float64::ConstPtr& input)
{
std_msgs::Float64Ptr output(new std_msgs::Float64());
output->data = input->data + value_;
NODELET_DEBUG("Adding %f to get %f", value_, output->data);
pub.publish(output);
}
ros::Publisher pub;
ros::Subscriber sub;
double value_;
};
PLUGINLIB_EXPORT_CLASS(nodelet_tutorial_math::Plus, nodelet::Nodelet)
}
自定义nodelet::Nodelet的子类,并实现void onInit()
函数取代main
函数。最后为了允许类被动态加载,使用宏PLUGINLIB_EXPORT_CLASS(nodelet_tutorial_math::Plus, nodelet::Nodelet)
将该类标记为导出类。
与普通的package相比,使用nodelet还需要添加一个插件描述文件:
<library path="lib/libnodelet_math">
<class name="nodelet_tutorial_math/Plus" type="nodelet_tutorial_math::Plus" base_class_type="nodelet::Nodelet">
<description>
A node to add a value and republish.
</description>
</class>
</library>
因为使用nodelet生成的不是可执行文件,所以在CMakeLists.txt
文件中不需要add_executable()
cmake_minimum_required(VERSION 2.8.3)
project(nodelet_tutorial_math)
find_package(catkin REQUIRED COMPONENTS nodelet roscpp std_msgs)
## Setup include directories
include_directories(${catkin_INCLUDE_DIRS})
catkin_package(
LIBRARIES nodelet_math
CATKIN_DEPENDS nodelet roscpp std_msgs
)
## Create the nodelet tutorial library
add_library(nodelet_math src/plus.cpp)
target_link_libraries(nodelet_math ${catkin_LIBRARIES})
如果是通过roslaunch启动,则launch文件的示例如下:
<launch>
<node pkg="nodelet" type="nodelet" name="manager1" args="manager" output="screen"/>
<node pkg="nodelet" type="nodelet" name="Plus" args="load nodelet_tutorial_math/Plus manager1" output="screen">
</node>
<node pkg="nodelet" type="nodelet" name="Plus2" args="load nodelet_tutorial_math/Plus manager1" output="screen">
</node>
<node pkg="nodelet" type="nodelet" name="Plus3" args="standalone nodelet_tutorial_math/Plus" output="screen">
</node>
</launch>
其中,Plus和Plus2节点均与manager1相关连,而Plus3则为普通node。
参考链接:https://zhuanlan.zhihu.com/p/37537823
完整代码链接:https://github.com/hujun1413/nodelet_tutorial