在ROS中使用nodelet

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

发布了57 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_38258767/article/details/103768931