作者: Sam (甄峰) sam_code@hotmail.com
0. 背景介绍:
ROS是一种基于消息传递的分布式多进程框架。ROS
Node之间的通讯,是基于TCP/IP协议,在传递Message或Service时,都需要先打包,后解包。对资源有较大浪费,在实时性上也表现不佳。
在需要传递的数据附载小,频率低时,这样的资源和时间消耗还可以接受。但当传递的是图像,点云等数量巨大的数据时,或实时性要求较高时,传输问题则必需要考虑。nodelet的出现,就是为解决此类问题。
1. ROS Nodelet简介:
Nodelet用来提供一种方式,让多个算法运行在同一个进程内,他们之间数据实现zero
copy 传输。
使用shared_ptr实现零copy传输(Zero Copy Transport).
它使用插件机制。
简单的说:Nodelet即为将之前启动的多个Node捆绑到一起,由一个Manager管理。在同一个Manager内,
Topic数据更快,zero Copy.
nodelet package既提供用来实现Nodelet的nodelet base class。
又提供NodeletLoader class用来实例化Nodelet。
设计目标:
1. 使用现有的ROS C++ 接口。
2. 在Nodelet之间,实现零copy数据传输。
3. 动态加载插件, 以打破构建时间的依赖性。
4. 写Node或nodelet代码,差距最小化。
2.技术概要和Nodelet使用:
所有Nodelet代码继承base
calss nodelet::Nodelet ,Nodelet代码将作为pluginlib 被动态load.
将提供namespace, 自动remapping arguments and
parameter。
一个nodelet_manager可以管理一个或多个Nodelet。
用法:
nodelet usage:
nodelet load pkg/Type manager - Launch a nodelet of type pkg/Type on manager manager
在Manager内,载入一个Nodelet。pkg为包名,Type为Class名(或库名)
nodelet standalone pkg/Type - Launch a nodelet of type pkg/Type in a standalone node
以standalone模式Load和启动一个Nodelet
nodelet unload name manager - Unload a nodelet a nodelet by name from manager 从Manager内卸载一个Nodelet。
nodelet manager - Launch a nodelet manager node
启动一个Nodelet Manager
可以在字符界面使用如:
rosrun nodelet nodelet manager