ROS:nodelet

目录

  • 一、前言
  • 二、概念
  • 三、作用
  • 四、使用演示
    • 4.1案例简介
    • 4.2nodelet 基本使用语法
    • 4.3内置案例调用
  • 五、nodelet实现
    • 5.1需求
    • 5.2流程
    • 5.3准备
    • 5.4创建插件类并注册插件
    • 5.5构建插件库
    • 5.6使插件可用于ROS工具链
      • 5.6.1配置xml
      • 5.6.2导出插件
    • 5.7执行

一、前言

ROS通信是基于Node(节点)的,Node使用方便、易于扩展,可以满足ROS中大多数应用场景,但是也存在一些局限性,由于一个Node启动之后独占一根进程,不同Node之间数据交互其实是不同进程之间的数据交互,当传输类似于图片、点云的大容量数据时,会出现延时与阻塞的情况,比如:
现在需要编写一个相机驱动,在该驱动中有两个节点实现:其中节点A负责发布原始图像数据,节点B订阅原始图像数据并在图像上标注人脸。如果节点A与节点B仍按照之前实现,两个节点分别对应不同的进程,在两个进程之间传递容量可观图像数据,可能就会出现延时的情况,那么该如何优化呢?

ROS中给出的解决方案是:Nodelet,通过Nodelet可以将多个节点集成进一个进程。

二、概念

nodelet软件包旨在提供在同一进程中运行多个算法(节点)的方式,不同算法之间通过传递指向数据的指针来代替了数据本身的传输(类似于编程传值与传址的区别),从而实现零成本的数据拷贝。

nodelet功能包的核心实现也是插件,是对插件的进一步封装:
不同算法被封装进插件类,可以像单独的节点一样运行;
在该功能包中提供插件类实现的基类:Nodelet;
并且提供了加载插件类的类加载器:NodeletLoader。

三、作用

应用于大容量数据传输的场景,提高节点间的数据交互效率,避免延时与阻塞。

四、使用演示

在ROS中内置了nodelet案例,先以该案例演示nodelet的基本使用语法。

4.1案例简介

以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,nodelet默认被安装,如未安装,请调用如下命令自行安装:

sudo apt install ros-<<ROS_DISTRO>>-nodelet-tutorial-math

在该案例中,定义了一个Nodelet插件类:Plus,这个节点可以订阅一个数字,并将订阅到的数字与参数服务器中的 value 参数相加后再发布。

需求:再同一线程中启动两个Plus节点A与B,向A发布一个数字,然后经A处理后,再发布并作为B的输入,最后打印B的输出。

4.2nodelet 基本使用语法

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

4.3内置案例调用

1.启动roscore
2.启动manager

rosrun nodelet nodelet manager __name:=mymanager

注:__name:= 用于设置管理器名称。
3.添加nodelet节点
添加第一个节点:

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n1 _value:=100

添加第二个节点:

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n2 _value:=-50 /n2/in:=/n1/out

解释:

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n1 _value:=100rosnode list 查看,nodelet 的节点名称是: /n1;
rostopic list 查看,订阅的话题是: /n1/in,发布的话题是: /n1/out;
rosparam list查看,参数名称是: /n1/value。
rosrun nodelet nodelet standalone nodelet_tutorial_math/Plus mymanager __name:=n2 _value:=-50 /n2/in:=/n1/out第二个nodelet 与第一个同理;
第二个nodelet 订阅的话题由 /n2/in 重映射为 /n1/out。

优化:也可以将上述实现集成进launch文件:

<launch><!-- 设置nodelet管理器 --><node pkg="nodelet" type="nodelet" name="mymanager" args="manager" output="screen" /><!-- 启动节点1,名称为 n1, 参数 /n1/value 为100 --><node pkg="nodelet" type="nodelet" name="n1" args="load nodelet_tutorial_math/Plus mymanager" output="screen" ><param name="value" value="100" /></node><!-- 启动节点2,名称为 n2, 参数 /n2/value 为-50 --><node pkg="nodelet" type="nodelet" name="n2" args="load nodelet_tutorial_math/Plus mymanager" output="screen" ><param name="value" value="-50" /><remap from="/n2/in" to="/n1/out" /></node></launch>

4.执行
向节点n1发布消息:

rostopic pub -r 10 /n1/in std_msgs/Float64 "data: 50.0"

打印节点n2发布的消息:

rostopic echo /n2/out

最终输出结果应该是:100。

五、nodelet实现

nodelet本质也是插件,实现流程与插件实现流程类似,并且更为简单,不需要自定义接口,也不需要使用类加载器加载插件类。

5.1需求

参考 nodelet 案例,编写 nodelet 插件类,可以订阅输入数据,设置参数,发布订阅数据与参数相加的结果。

5.2流程

1.准备;
2.创建插件类并注册插件;
3.构建插件库;
4.使插件可用于ROS工具链;
5.执行。

5.3准备

新建功能包,导入依赖: roscpp、nodelet;

5.4创建插件类并注册插件

#include "nodelet/nodelet.h"
#include "pluginlib/class_list_macros.h"
#include "ros/ros.h"
#include "std_msgs/Float64.h"namespace nodelet_demo_ns {
class MyPlus: public nodelet::Nodelet {public:MyPlus(){value = 0.0;}void onInit(){//获取 NodeHandleros::NodeHandle& nh = getPrivateNodeHandle();//从参数服务器获取参数nh.getParam("value",value);//创建发布与订阅对象pub = nh.advertise<std_msgs::Float64>("out",100);sub = nh.subscribe<std_msgs::Float64>("in",100,&MyPlus::doCb,this);}//回调函数void doCb(const std_msgs::Float64::ConstPtr& p){double num = p->data;//数据处理double result = num + value;std_msgs::Float64 r;r.data = result;//发布pub.publish(r);}private:ros::Publisher pub;ros::Subscriber sub;double value;};
}
PLUGINLIB_EXPORT_CLASS(nodelet_demo_ns::MyPlus,nodelet::Nodelet)

5.5构建插件库

CMakeLists.txt配置如下:

...
add_library(mynodeletlibsrc/myplus.cpp
)
...
target_link_libraries(mynodeletlib${catkin_LIBRARIES}
)

编译后,会在 工作空间/devel/lib/先生成文件: libmynodeletlib.so。

5.6使插件可用于ROS工具链

5.6.1配置xml

新建 xml 文件,名称自定义(比如:my_plus.xml),内容如下:

<library path="lib/libmynodeletlib"><class name="demo04_nodelet/MyPlus" type="nodelet_demo_ns::MyPlus" base_class_type="nodelet::Nodelet" ><description>hello</description></class>
</library>

5.6.2导出插件

<export><!-- Other tools can request additional information be placed here --><nodelet plugin="${prefix}/my_plus.xml" />
</export>

5.7执行

可以通过launch文件执行nodelet,示例内容如下:

<launch><node pkg="nodelet" type="nodelet" name="my" args="manager" output="screen" /><node pkg="nodelet" type="nodelet" name="p1" args="load demo04_nodelet/MyPlus my" output="screen"><param name="value" value="100" /><remap from="/p1/out" to="con" /></node><node pkg="nodelet" type="nodelet" name="p2" args="load demo04_nodelet/MyPlus my" output="screen"><param name="value" value="-50" /><remap from="/p2/in" to="con" /></node></launch>

运行launch文件,可以参考上一节方式向 p1发布数据,并订阅p2输出的数据。

参考视屏:赵虚左ros入门
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频&#xff1a;含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记&#xff1a;含并行连结的网络&#xff08;GoogLeNet&#xff09; 1.…

Appium-Python-Client 源码剖析 (一) driver 的元素查找方法

目录 前言 源码版本:0.9 结构图&#xff1a; mobileby.py appium 的 webdriver.py selenium 的 webdriver.py seleniumdriver appiumdriver 前言 Appium-Python-Client是一个用于Python语言的Appium客户端库&#xff0c;它提供了丰富的API和功能&#xff0c;用于编写和…

【LeetCode】594. 最长和谐子序列

594. 最长和谐子序列&#xff08;简单&#xff09; 方法&#xff1a;哈希表计数 思路 题目规定的「和谐子序列」中的最值差值正好为 1&#xff0c;因而子序列排序后必然符合[a,a,.., a 1,a1]形式&#xff0c;即符合条件的和谐子序列长度为相邻两数(差值为 1)的出现次数之和。…

国产单片机(沁恒微WCH)CH32V307评估板初探

国产单片机(沁恒微WCH)CH32V307评估板初探 关于沁恒微&#xff1a;国产芯厂家、官网链接 公司简介 - 南京沁恒微电子股份有限公司 (wch.cn) 开发板资源&#xff1a; 评估板应用于 CH32V307 芯片的开发&#xff0c;IDE 使用 MounRiver 编译器&#xff0c;可选择使用板载或独…

为何异地销号这么难?这些注意事项要熟记!

最近有不少小伙伴私信小编&#xff0c;他们在网上办理的大流量手机号卡&#xff0c;用了一段时间之后想换其他的卡&#xff0c;所以想注销当前用的卡&#xff0c;但是注销的时候确实屡屡碰壁&#xff0c;程序还比较繁琐&#xff0c;有的甚至申请注销了几个月还注销不掉&#xf…

面向对象Java基础

前言 看大话设计模式的时候&#xff0c;发现自己的基础不是很扎实&#xff0c;重新回顾一些存在有点点不确定的内容&#xff0c;并从书中截取下来&#xff0c;做成笔记快速复习。 1、字段和属性 字段&#xff1a;用private修饰&#xff0c;也叫私有变量。属性&#xff1a;字…

Microsoft Outlook 共享收发邮件的权限给其他人

点击File 点击Account Settings→DelegateAccess 点击Add

[java安全]CommonsCollections1(LazyMap)

文章目录 【java安全】CommonsCollections1(LazyMap)前言LazyMap如何创建LazyMap对象&#xff1f;如何调用LazyMap的get()方法&#xff1f;如何触发AnnotationInvocationHandler#invoke()方法&#xff1f;POC总结参考 【java安全】CommonsCollections1(LazyMap) 前言 前面我们…

Hadoop: High Available

序言 在Hadoop 2.X以前的版本&#xff0c;NameNode面临单点故障风险&#xff08;SPOF&#xff09;&#xff0c;也就是说&#xff0c;一旦NameNode节点挂了&#xff0c;整个集群就不可用了&#xff0c;而且需要借助辅助NameNode来手工干预重启集群&#xff0c;这将延长集群的停…

Python学习笔记-Windows下VirtualEnv+VSCode中虚拟环境配置

1 VirtualEnv简介 VirtualEnv是一个虚拟化环境&#xff0c;是独立开的开发环境&#xff0c;在一个文件夹中创建的独立虚拟环境&#xff0c;可以分隔开不同项目&#xff0c;开发互不影响。 优点如下&#xff1a; 使不同的应用开发环境独立&#xff0c;避免互相干扰环境升级不…

RxSwift 使用方式

背景 最近项目业务&#xff0c;所有模块已经支持Swift混编开发&#xff0c;正在逐步使用Swift 方式进行开发新业务&#xff0c;以及逐步替换老业务方式进行发展&#xff0c;所以使用一些较为成熟的Swift 的三方库&#xff0c;成为必要性&#xff0c;经过调研发现RxSwift 在使用…

lvs使用

1.前言 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于 Linux 内核的负载均衡器&#xff0c;用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式&#xff0c;以满足不同场景和需求的负载均衡需求&#xff0c;在LVS中定义虚拟服务的…

制作Visual Studio离线安装包

vs2015之后官网就不提供离线安装包了&#xff0c;使用离线安装包就需要自己手动制作一个&#xff1b; 以vs2019为例&#xff1a; 先去官网下载在线安装器 官网下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 展开2019的标签…

【C语言】深剖数据在内存中的存储

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

初识react

初识react 第一步就给我出个问题版本太低 https://www.cnblogs.com/gslgb/p/16585233.html https://blog.csdn.net/xiangshiyufengzhong/article/details/124193898 第二个问题 便利生成dom 需要绑定key 不要总想着加冒号这不是vue 第三个问题 我p标签包裹 MapList组件 MapLis…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

创意网页模板免费下载,让你的网站与众不同!

今天给大家带来的网站模板素材&#xff0c;网站类型丰富&#xff0c;包含户外旅行、餐饮、个人网站等等&#xff0c;可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源 https://js.design/community?categorydesign&sourcecsdn&planbbqcsdn772 1、设…

【1++的C++初阶】之vector

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是vector?二&#xff0c;构造与析构三&#xff0c;vector迭代器的实现四&#xff0c;vector部分重要接口的实现 一&#xff0c;什么是vector? vector…

使用NVIDIA FX Composer验证多纹理合成效果

最近项目上有一个需求&#xff0c;需要将4张带透明通道纹理合成为一张&#xff0c;并且每张纹理指定一个全局透明度。由于纹理过多&#xff0c;合成效果无法保证&#xff0c;为了减少项目的风险&#xff0c;领导希望我先快速验证一下我们讨论的方法是否能完成项目的要求。因此我…

销售易的12年与七个瞬间

导读&#xff1a;企业级没有捷径 12年对一家企业意味着什么&#xff1f; 在消费互联网领域&#xff0c;12年足够长&#xff0c;短短几年内上市的故事过去屡见不鲜。在企业服务的toB领域&#xff0c;产业成熟和企业发展的时间维度被拉长&#xff0c;但故事同样精彩。 2023年7月1…