ROS nodelet 使用详解

本文以nodelet_tutorial_math为例来了解nodelet的原理及使用方法,理论知识参考http://blog.csdn.net/zyh821351004/article/details/52143309
代码地址:https://github.com/ros/common_tutorials/tree/hydro-devel/nodelet_tutorial_math
nodelet是什么?

1 ROS的数据通信在graph结构中以topic,service和param的方式传输数据,天生的数据交互存在一定的延时和阻塞。Nodelet 包就是改善这一状况设计的, 使得多个算法运行在同一个过程中,并且算法间数据传输无需拷贝就可实现。 详见http://wiki.ros.org/nodelet。 简单的讲就是可以将以前启动的多个node捆绑在一起manager,使得同一个manager里面的topic的数据传输更快。即同一个manager过程的nodelet数据传输zero copy 。

2 nodelet的manager可以加载多个的nodelets,nodelets间数据传输zero copy,有效避免数据copy和网络传输代价
3 支持pulgin的方式动态加载,基类nodelet::Nodelet, 任何nodelet继承自它可以使用plugin的方式动态加载。

nodelet命令

nodelet load pkg/Type manager //向manager中loader nodelet
nodelet standalone pkg/Type //程序复用,相当启动一个普通node
nodelet unload name manager //从manager移除nodelet
nodelet manager //创建mananger

实例:
rosrun nodelet nodelet manager __name:=nodelet_manager
创建mananger ,名字为nodelet_manager
rosrun nodelet nodelet load nodelet_tutorial_math/Plus nodelet_manager (人工空格) __name:=nodelet1 (人工空格) nodelet1/in:=foo (人工空格) _value:=1.1
使用nodelet_manager 加载nodelet_tutorial_math/Plus ,并且实例化
namespace 重命名为nodelet1。
nodelet1/in 重映射为foo,value的值为1.1

执行完上述两条命令后,可以查看当前的node ,topic列表

$rostopic list
$rosnode list

现在向节点发送topic

$rostopic pub /foo std_msgs/Float64 5.0 -r 10 

查看输出结果

$rostopic echo /nodelet1/out

这里写图片描述

nodelet在launch文件中的使用

//创建manger,名字为standalone_nodelet

使用 standalone_nodelet 加载nodelet_tutorial_math/Plus ,命名空间为Plus,topic可以remap


<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="remapped_output"/>
  </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"/>
    <remap from="Plus2/in" to="remapped_output"/>
  </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"/><!--这里将plus2的输出重定向到plus3的输入-->
  </node>
</launch>

运行launch文件

$roslaunch nodelet_tutorial_math plus.launch
$rosnode list 

这里写图片描述
可以看到会启动3个Plus 节点:Plus,Plus2,Plus3

$rostopic list 

这里写图片描述

向节点发送topic
rostopic pub /Plus/in std_msgs/Float64 1.0
结果如下
这里写图片描述

$rqt_graph ,可以直观的看出数据交互的方式
这里写图片描述

关于Pluginlib,
可以参考http://blog.csdn.net/zyh821351004/article/details/52143309,基本就那几点。

1.为了允许类被动态加载,它必须被标记为导出类。 这通过特殊宏PLUGINLIB_EXPORT_CLASS/PLUGINLIB_DECLARE_CLASS来完成。 这个宏可以放在构成插件库的任何源(.cpp)文件中,但通常放在导出类的.cpp文件的末尾。
PLUGINLIB_DECLARE_CLASS(turtlebot_follower, TurtlebotFollower, turtlebot_follower::TurtlebotFollower, nodelet::Nodelet);
参数:pkg, class_name, class_type, base_class_type
详见plus.cpp,代码很简单就是两个数相加。

2.描述文件
插件描述文件是一个XML文件,用于以机器可读格式存储有关插件的所有重要信息。 它包含有关插件所在的库的信息,插件的名称,插件的类型等
libary path :动态库的相对路径
class 标签描述了由库提供的类。
name:类的查找名称。 由pluginlib工具用作插件的标识符。此字段在pluginlib 1.9和更高版本(ROS Groovy或更高版本)中是可选的
type:类型
base_class_type:基类的类型
description 标签:类的描述和它能做什么

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>

3.为了让pluginlib查询跨所有ROS包的系统上的所有可用插件,每个包必须显式指定它导出的插件,以及哪些包库包含这些插件。 插件提供程序必须在其导出标记块中的package.xml中指向其插件描述文件。

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

详见package.xml

可用的插件查询:rospack plugins –attrib=plugin nav_core //This will return all plugins exported from the nav_core package.
以上就是通过nodelet_tutorial_math 学习nodelet的过程。

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值