ROS nodelet 使用介绍

本文是参考了文件末尾参考文件中的东西做的一个小笔记:

一、nodelet的来源:

ROS的底层通信都是基于XML-RPC协议实现的,以XML-RPC的方式传输数据存在一定的延时和阻塞。在数据量小、频率低的情况下,传输耗费的时间可以忽略不计。但当传输图像流,点云等数据量较大的消息,或者执行有一定的实时性要求的任务时,因传输而耗费的时间就不得不考虑。Nodelet包就是为改善这一状况设计的,它提供一种方法,可以让多个算法程序在一个进程中用 shared_ptr 实现零拷贝通信(zero copy transport),以降低因为传输大数据而损耗的时间。简单讲就是可以将多个node捆绑在一起管理,使得同一个manager里面的topic的数据传输更快。

二、nodelet用法:

nodelet manager               - Launch a nodelet manager node.  启动一个manager
nodelet load pkg/Type manager - Launch a nodelet of type pkg/Type on manager manager. 向manager中加载nodelet
nodelet standalone pkg/Type   - Launch a nodelet of type pkg/Type in a standalone node. 
nodelet unload name manager   - Unload a nodelet a nodelet by name from manager. 从manager中移除nodelet

三、nodelet launch编写示例

在roslaunch文件中使用nodelet. 下面的例子中先创建一个名为standalone_nodelet的manager,然后向其中加载Plus和Plus2这两个nodelet节点:

<launch>
    <node pkg="nodelet" type="nodelet" name="standalone_nodelet"  args="manager" output="screen"/>

    <node pkg="nodelet" type="nodelet" name="Plus" args="load nodelet_tutorial_math/Plus standalone_nodelet" output="screen">
        <remap from="/Plus/out" to="Plus2/in"/>
    </node>          

    <rosparam param="Plus2" file="$(find nodelet_tutorial_math)/plus_default.yaml"/>
    <node pkg="nodelet" type="nodelet" name="Plus2" args="load nodelet_tutorial_math/Plus standalone_nodelet" output="screen">
        <rosparam file="$(find nodelet_tutorial_math)/plus_default.yaml"/>
    </node>

    <node pkg="nodelet" type="nodelet" name="Plus3" args="standalone nodelet_tutorial_math/Plus" output="screen">
        <param name="value" type="double" value="2.5"/>
        <remap from="Plus3/in" to="Plus2/out"/>
    </node>
</launch>

四、 程序编写

nodelet插件主要编写的就是函数OnInit(继承自Nodelet),做一些ROS node基本初始化。

#include <pluginlib/class_list_macros.h>
#include <nodelet/nodelet.h>
#include <ros/ros.h>
#include <std_msgs/Float64.h>
#include <stdio.h>
 
 
#include <math.h> //fabs
 
namespace test_nodelet
{
 
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_DECLARE_CLASS(test_nodelet, Plus, test_nodelet::Plus, nodelet::Nodelet);
}

注意为了允许类被动态加载,它必须被标记为导出类。这通过特殊宏PLUGINLIB_EXPORT_CLASS/PLUGINLIB_DECLARE_CLASS来完成,通常放在导出类的.cpp文件的末尾。 宏的参数分别为:pkg, class_name, class_type, base_class_type.

为了让pluginlib查询ROS系统上的所有可用插件,每个包必须显式指定它导出的插件。相应的package.xml中要加入下面内容:

...
<build_depend>nodelet</build_depend>
<run_depend>nodelet</run_depend>

<export>
  <nodelet plugin="${prefix}/nodelet_math.xml" />
</export>
...

插件描述文件是一个XML文件,用于存储有关插件的所有重要信息。 它包含有关插件所在的库的信息,插件的名称,插件的类型等 。nodelet_math.xml如下:

<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>

参考:
https://www.cnblogs.com/21207-iHome/p/8213411.html
https://blog.csdn.net/x_r_su/article/details/53141328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值