第十九课 pluginlib&Nodelet

把rgb摄像头的数据转换为laser的时候使用了Nodelet.

pluginlib(插件库)

在ros中有一个plugin的包,下面是一个ROS Plugin Registration的例子

上面包含一个polygon_interface多边形接口,它包含了两个插件,第一个插件是rectangle_plugin(矩形),第二个插件是triangle_plugin(三角形),他们都是通过class list export导出到Polygon_interface中,然后在Polygon plugins list中就有了rectangle以及triangle;使用rospack plugins --attrib=plugin polygin_interface就可以找到polygon_interface里面的插件.

导出插件

注册插件

example_pkg/src/class_list.cpp

首先要包含几个头文件

#include<pluginlib/class_list_macros.h>//注册插件

#include<polygon_interface_package/polygon.h>//包含基类的头文件

#include<rectangle_package/rectangle.h>//插件的头文件

//Declare the Rectangle as a Polygon class

PLUGINLIB_EXPORT_CLASS(rectangle_namespace::Rectangle,polygon_namespace::Polygon)//第一个参数为用于导出的类型,第二个参数为基类的类型,插件的参数类型包括命名空间以及类名,以及基类的命名空间和类型.

如何添加到ROS工具链

example_pkg/rectangle_plugin.xml

<library path="lib/librectangle">//首先指定了库的路径

<class type="rectangle_namespace::Rectangle" base_class_type="polygon_namespace::Polygon">//包含一个class参数,类型为插件类型和基类类型

<description>

this is a rectangle plugin

</description>

</class>

</library>

如何导出插件

上面是在基类的包里面.

如何使用插件

ClassLoader,包含了四个参数,一个是基类的包,基类类型,属性的名字,插件xml的路径

下面是一个实例createInstance(const std::string &lookup_name)

.....

Nodelet

nodelet对于提高ROS性能有着重要的地位,特别是在视觉,控制,高频和高带宽程序中.

nodelet的优势:

在一个线程上运行多个算法

nodelet之间传输数据无需拷贝(在一个nodelet管理器下,使用boost共享指针)

作为插件动态载入

和节点相似性高

基本用法

在manager上启动pkg/Type类型的nodelet

在一个单独的节点上启动pkt/Type类型的nodelet

从manager上卸载名字为name的nodelet

启动一个nodeletmanager节点

它的API

公有成员参数

上面是一个初始化函数规定了nodelet该如何启动,

下面是构造函数和析构函数

保护成员函数

下面是它的实例

首先去启动一下它里面的launch文件,

roslaunch nodelet_tutorial_math plus.launch

时间: 2024-10-15 11:34:33

第十九课 pluginlib&Nodelet的相关文章

NeHe OpenGL教程 第二十九课:Blt函数

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有Andreas Lffler所写的,它写了一份原始的教

NeHe OpenGL教程 第三十九课:物理模拟

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇文章很适合你. 在这篇教程里,你会创建一个非常简单的物理引

KALI LINUX WEB 渗透测试视频教程—第十九课-METASPLOIT基础

原文链接:Kali Linux Web渗透测试视频教程—第十九课-metasploit基础 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第十九课-metasploit基础...................... 1 metasploit..................................................................................................... 1 基本体系结构..........

第十九课预习任务

第十九课预习任务 11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch11.28 限定某个目录禁止解析php11.29 限制user_agent11.30/11.31 php相关配置11.32 php扩展模块装安扩展几种限制ip的方法 http://ask.apelearn.com/question/6519apache 自定义header http://ask.apelearn.com/question/830apache的keepalive和k

第十九课(二)

-中 外国語を勉強している学生は20人中.18人が女性である AB型の血液は十人のうち一人が二人くらいしかない 自由职业者 フリーターと言われる若者のうち.半数近くは週五日間働いている -ひびが入る -ようにしてください 明日の会議には遅れないようにしてください 今日.お風呂に入ってもいいですか いいえ.入らないようにしてください インフルエンザの防止ため.これから.外出する時はマスクをするようにしてください -次第 準備ができ次第.ご案内いたします 中井さんから連絡があり次第.私に電話してくだ

JAVA学习第十九课(java程序的异常处理 (二))

异常处理的捕捉形式: 这是可以对异常进行针对性处理的方式 六.try.catch的理解 具体格式: try { //需要被检测异常的代码 } catch(异常类 变量)//改变量用于接受发生异常的对象 { //处理异常的代码 } finally { //一定会被执行的代码 } 这三个代码块是一个整体. try是尝试,catch捕捉,finally最终化   什么时候用try&catch,什么时候用抛? 在定义功能时,如果这个问题你可以处理的了,那么就用try&&catch,处理不了

斯坦福第十九课:总结(Conclusion)

19.1  总结和致谢 欢迎来到<机器学习>课的最后一段视频.我们已经一起学习很长一段时间了.在最后视频中,我想快速地回顾一下这门课的主要内容,然后简单说几句想说的话. 作为这门课的结束时间,那么我们学到了些什么呢?在这门课中,我们花了大量的时间介绍了诸如线性回归.逻辑回归.神经网络.支持向量机等等一些监督学习算法,这类算法 具有带标签的数据和样本,比如 x(i).y(i). 然后我们也花了很多时间介绍无监督学习.例如 K-均值聚类.用于降维的主成分分析, 以及当你只有一系列无标签数据 x(i

第二十九课:javascript异步处理

大家知道javascript中有多少方法能够实现异步处理吗?setTimeout(),setInterval()是最常用的两个.XMLHttpRequest对象,进行ajax请求时.postMessage()进行跨域操作时.WebWorker创建新的线程时.setImmediate方法(新的setTimeout方法).requestAnimationFrame进行动画操作时.这些东西都有一个共同的特点,就是拥有一个回调函数.有的异步API还提供了相对应的中断API,比如:clearTimeout

Python第十九课(封装)

Python第19课(封装)    >>>思维导图>>>中二青年 封装 什么是封装? 就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口 对外隐藏内部实现细节,并提供访问的接口 什么时候应该封装? 当有一些数据不希望外界可以直接修改时 当有一些函数不希望给外界使用时 为什么需要封装 ? 1.为了保证 关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 语法 class Person: def __init__(self,id_number,name,ag