ROS使用nodelet还是node

知乎-为什么使用nodelet
在这里插入图片描述

Regular nodes use TCP. This works fine for a lot of things. But if you have multiple processes that need to use messages that contain large amounts of data (like images or point clouds), packaging the message, sending it, then unpacking it can take a bit of time. If the two processes are on the same computer, it is quicker to just send a pointer to that data rather than sending the data itself over TCP.This only works for processes (aka nodelets) on the same computer though since a pointer for one computer doesn’t make sense for another computer. Nodes on the other hand can work over networked computers since you’re sending the actual data.So nodelets don’t make the processes quicker, but it is a quicker way to get information from one process to another. A good rule of thumb would be to always use nodes (because they are easier to use, and more flexible) unless you get in a situation where the message passing is too slow for your application and causing problems, then you would consider using nodelets.

那篇文章的核心内容基本都在这张图片上与上面这段话。下面进行简单的概括。
ROS::Node提供了类似于DNS的一个访问机制,常用的一个机制就是TCP/IP协议。也就是说,Node之间的通信必须经过握手等处理。这就意味着无意义的订阅最好取消掉,以节省内存。但Node的优势在于使用简单,极易扩展,并且可以作用在不同的终端上。比如某些进程在工控机运行,有些则在个人终端运行。
ROS::Nodelet是为了解决传递图片,点云这种大容量数据做的解决方案。其本质就是使用了C++的智能指针,用传递指向数据块的指针,来代替Node中对数据的传输。也就是说,其实是C++编程中传值与传址的差别。不过,这种方法显然只能用于一台机子的情况,因为指针只对其所在的机子内存有意义。
关于如何去选择,ROS给的建议是,经验告诉我们,通常使用node,除非你发现制约你应用的主要是在于传输数据上的耗时。
并且如果想要使用零拷贝技术,则必须发布的是信息的ptr类型,参考链接为:http://wiki.ros.org/nodelet。
显然,对于单机而言,共享内存是最快的方式了。
nodelet和node是可以互相转换的。但某些情况下可能会引入多重继承的困境。不考虑多重继承的情况下,nodelet转node,需要添加ros::init,ros::spin等,使进程运行。

私货:
在任乾的开源算法中,使用了node,应该是出于简单考虑。为了解决大城市环境中点云需要占据大量的内存的问题,他在后端将关键帧点云(点云直接来自预处理阶段,即未下采样)存入到硬盘里,(闭环检测时的局部地图就是从硬盘里读取关键帧得来的,前端滑窗配准用的局部地图是用一个deque来存储的,即在内存中随着新关键帧的到来刷新)。不过加上了地板检测以后,相当于前端,后端,地板检测,闭环检测都订阅了预处理的点云,可能会对通信速度有影响吧。目前,还能忍受。
在koide的开源算法hdl中,使用了nodelet,因此肆无忌惮的设置订阅与发布,不过这也意味着只要还有一个订阅者存在,那么点云就必须存储在内存中供其使用。如果想要引入硬盘存储,则应该独立出一个管理点云信息的nodelet,由他去读取和存储。即便如此,显然依然得保证只有这个nodelet自己在引用点云数据。这说明得动态的去绑定和解绑,我觉得反而显得繁琐了。
因此,在自己的实现里依然应当选择node,直到实时性成为瓶颈,再考虑优化事宜。

补充:https://www.cnblogs.com/21207-iHome/p/8213411.html
在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的数据传输更快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值