nodelet的理解
1.介绍
nodelet包可以为在相同进程中的多个算法之间实现零拷贝的传输方式。
这个包也提供了实现一个nodelet所需的nodelet基类以及用于实例化nodelet的NodeletLoader类。
Source: git https://github.com/ros/nodelet_core.git (branch: indigo-devel)
Nodelets旨在提供一种在单机器单进程运行多个算法而不会在进程中传递消息时产生复制成本的方法。
roscpp具有在同一节点内的发布和订阅调用之间进行零拷贝指针传递的优化。
为了做到这一点,nodelet允许将类动态加载到同一个节点,然而它们提供了简单的单独命名空间,使得尽管nodelet在同一个进程中,它仍然像一个独立的节点
这进一步扩展了,它在运行时使用pluginlib是动态可加载的。
2.应用
高吞吐量的数据流可以由许多节点组成,然后加载到同一进程,以避免复制和网络流量。
3.设计目标
- 使用现有的C++ ROS接口。
- 允许节点之间的数据的零拷贝传递
- 动态加载为插件以打破构建时间依赖性
- 位置透明,除了性能改进
- 节点或节点中编写代码将有最小差异。
4.技术
- 定义将用于动态加载的基类nodelet :: Nodelet。
- 所有nodelet都将继承这个基类,并且可以使用pluginlib进行动态加载。
- 它将提供命名空间,自动重映射参数和参数,就像它们是第一个类节点一样。
- 将有一个nodelet_manager进程,一个或多个nodelet可以加载到其中。
- 它们之间的任何通信都可以使用带有boost共享指针的零拷贝roscpp发布调用。
5.基本用法
nodelet usage:
API
nodelet load pkg/Type manager - Launch a nodelet of type pkg/Type on manager manager
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
nodelet manager - Launch a nodelet manager node
对于命令行和启动文件示例,请参阅本教程运行节点
6.
1)Nodelet基类
参考API
公共方法://动态加载时使用的默认构造函数
Nodelet()
//这个方法是一个描述nodelet如何启动。
//参数是管理器启动本节点所需的参数。这将初始化nodelet基类,然后调用子类的onInit()方法。
void init (const std::string& name, const ros::M_string& remapping_args, const std::vector<std::string>& my_argv);
子类中使用的受保护成员和方法:
std::string getName() //Get the name of the nodelet
ros::NodeHandle& getNodeHandle () // Get the node handle (provides this nodelets custom remappings and name)
ros::NodeHandle& getPrivateNodeHandle () // Get the private node handle (provides this nodelets custom remappings in its private namespace)
ros::NodeHandle& getMTNodeHandle () // Get the node handle with the Multi Threaded callback queue. (provides this nodelets custom remappings and name)
ros::NodeHandle& getMTPrivateNodeHandle () // Get the private node handle with the Multi Threaded callback queue. (provides this nodelets custom remappings in its private namespace)
ros::CallbackQueue& getMTCallbackQueue () // Get the callback queue (threadpool available from the manager)
std::vector<std::string> getMyArgv() // Get command line arguments to the nodelet stripped of ROS and nodelet specific args.
用于在子类中启动ROS API的初始化方法:
virtual void onInit () = 0 //Virtual and must be overridden by subclass. All initialization of the ROS infrastructure must be put into this function.
7.NODELET ROSCONSOLE宏
- 这些Nodelet封装是rosconsole宏。
- 它们包括详细程度级别DEBUG,INFO,WARN,ERROR和FATAL。
- 这些宏只会在nodelet方法中编译。
- 它们通过在运行的nodelet名称中设置命名的日志记录器来操作,以便您可以区分在运行的同一管理器下的两个相同类型的节点的输出。
- 他们也有优势,你可以转一个具体nodelet进入调试,而不是所有特定类型的节点。
示例代码
#include "nodelet/nodelet.h"
//... inside a nodelet method
NODELET_DEBUG("My debug statement")
NODELET_DEBUG_STREAM("my debug statement " << (double) 1.0)
NODELET_DEBUG_COND( 1 == 1, "my debug_statement")
NODELET_DEBUG_STREAM_COND( 1 == 1, "my debug statement " << (double) 1.0)
8.
从Nodelet发布
- 如果希望no-copy pub/sub工作,您必须将消息发布为shared_ptr。
- 有关更多详细信息,请参阅进程内发布和订阅。
9.线程模型
- 节点管理器具有线程池,该线程池在管理器内运行的所有节点之间共享,这由参数“num_worker_threads”设置。
- 在nodelet中运行的代码中有两种可能的线程API。默认线程模型有一个线程用于所有回调。还有一个多线程API。
1)onInit,这个方法在init上调用,不应该阻塞或做重要的工作。
2)Single Threaded API单线程API,使用方法getNodeHandle()和getPrivateNodeHandle()将保证所有回调都并行到达。
3)Multi Threaded API多线程API,使用方法getMTNodeHandle()和getMTPrivateNodeHandle()回调将分布在管理器线程池。
4)Additional Threads其他线程,它是节点创建自己的线程进行操作的有效操作。这些线程应该在析构函数中正确清理。
5)Thread Sharing线程共享,所有nodelet共享管理器的线程池。如果nodelet阻塞线程,它们可能会阻止其他nodelet获得回调。确保管理器配置了足够的线程以防止阻塞。
注意:即使单个线程的节点句柄也可以每个节点使用池的1个线程。
nodelet的理解的更多相关文章
- ROS nodelet 理解记录
发现网上许多的例子都是基于官网的例子,还需要做进一步的说明. 1. NODELET_DEBUG 是无法打印的信息的,需要使用NODELET_INFO NODELET_DEBUG("Addin ...
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
随机推荐
- Spring中类型自动装配--byType
在Spring中,“类型自动装配”的意思是如果一个bean的数据类型与其它bean属性的数据类型相同,将自动兼容装配它. 例如,一个“persion” bean 公开以“ability”类数据类型作为 ...
- yum 报错
Loaded plugins: fastestmirror, prestoLoading mirror speeds from cached hostfileCould not retrieve mi ...
- cpu 核数及逻辑数统计
查看逻辑CPU个数:cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 查看物理CPU个数:grep "physica ...
- easyui-combotree 只能选叶子未级
easyui-combotree 只能选叶子未级 function edit_dg() { //选中一行,获取这一行的属性的值 var selected = $('#tbClientListBrows ...
- Python模块详解以及import本质,获得文件当前路径os.path.abspath,获得文件的父目录os.path.dirname,放到系统变量的第一位sys.path.insert(0,x)
模块介绍 1.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻 ...
- 装饰器1、无参数的装饰器 2、有参数的装饰器 3、装饰器本身带参数的以及如果函数带return结果的情况
装饰器分成三种: 1.无参数的: 2.有参数的: 3.装饰器本身带参数的. 装饰器decorator又叫语法糖 定义:本质是函数,器就是函数的意思.装饰其他函数.就是为其他函数添加附加功能. 原则: ...
- 一个简单的Python多线程
首先对一段普通的代码进行测试 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import time def RunThrea ...
- php代码执行漏洞
php代码执行的两个函数eval(),assert() <?php $i = $_GET['x']; eval($i); ?> eval()函数将以php类型执行传入的参数x的值 给x传入 ...
- 使用JAVA实现模拟登陆并发送新浪微博(非调用新浪API)
没有调用新浪的API,在程序中加入自己的帐号和密码就能发送微博,代码完全在后台运行,不用打开浏览器. 用了HtmlUnit这个库来模拟登录还有发送微博. 先上效果图: 这个是刚登陆上获取第一页的信息. ...
- SqlConnection 无法设置连接超时
1.最有效的方法:对表格建立索引 2 在连接字符串中设置 Connection Timeout (默认15秒)3 设置 SqlCommand.CommandTimeout(默认是 30 秒)