ROS nodelet的使用

1. nodelet简介

ROS是一种基于分布式网络通讯的操作系统,整个机器人控制系统是由一个Master主节点和若干个功能相对独立的Node子节点组成,这也是ROS系统最主要的特点就是分布式以及模块化的设计。在ROS通讯过程中Master节点存储着各个子节点的topics和services的注册信息,每个功能节点在请求服务之前先向主节点进行注册,然后节点之间就可以直接进行信息传递。ROS的底层通信都是基于XML-RPC协议实现的。    

XML-RPC协议是XML Remote Prodecure Call的简称,是一种远程过程调用的分布式网络协议。它允许跨平台的软件间通过发送和接收XML格式的消息进行远程调用,即允许不同的操作系统、不同环境中的程序实现基于Internet过程调用的规范和一系列方法的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。

XML-RPC的远程调用过程为:首先客户端发起请求后需要按照协议格式对请求信息进行填充;填充完毕以后XML格式的信息会被转化为数据流,通过传输层进行传输。服务端收到客户端发出来的数据流,会将其再转化为XML格式的信息,然后按照XML-RPC协议获取客户端的请求信息,并对请求信息进行处理,处理完毕以后将反馈信息发送给客户端。

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

2. 运行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

3. 示例

这里将简单运行ROS中的一个tutorial(nodelet_tutorial_math),需要提前安装。

3.1. 启动nodelet manager

一般nodelet manager是用C++实现的一段程序,用以监听ROS service,nodelet可以动态加载进来运行。本例子将运行一个standalone manager,但通常manager是被嵌入到node中使用的。

rosrun nodelet nodelet manager __name:=nodelet_manager  

3.2. 启动nodelet

rosrun nodelet nodelet manager __name:=nodelet_manager  

为了运行nodelet,该命令指示nodelet_magager实例化nodelet_tutorial_math/Plus描述的nodelet,并将name和remapping传递到了nodelet中。

3.3. 简单测试

3.3.1. 命令行测试

一个终端运行:

rostopic pub /foo std_msgs/Float64 5.0 -r 10

另一终端可查看topic,查看node list和topic list

rosnode list

/nodelet1
/nodelet_manager
/rosout

rostopic echo /nodelet1/out

data: 6.1
---
data: 6.1
---
data: 6.1
---

rosrun rqt_graph rqt_graph

3.3.2. 启动文件测试

<launch>  
  <node pkg="nodelet" type="nodelet" name="standalone_nodelet"  args="manager"/>  
  
  <node pkg="nodelet" type="nodelet" name="Plus"  
        args="load nodelet_tutorial_math/Plus standalone_nodelet">  
    <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">  
    <rosparam file="$(find nodelet_tutorial_math)/plus_default.yaml"/>  
  </node>  
  <node pkg="nodelet" type="nodelet" name="Plus3" args="standalone nodelet_tutorial_math/Plus">  
    <param name="value" type="double" value="2.5"/>  
    <remap from="Plus3/in" to="Plus2/out"/>  
  </node>  
</launch> 
rosrun rqt_graph rqt_graph

参考文献

ROS nodelet的使用 - XXX已失联 - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值