ROS 2 — 托管(生命周期)节点简介

一、说明

这篇文章是关于理解ROS 2中托管(生命周期)节点的概念。我们描述了概念性的想法以及我们为什么需要它所以让我们开始吧!

二、托管式节点 — 什么和为什么?

        为了理解托管式节点,让我们从一个简单的问题陈述开始。

        假设您正在处理一个具有 5 个节点的 ROS 项目,其中一个节点用于从相机获取图像。

        我们通常做的是,我们用发布者为相机创建一个普通节点。一旦此节点启动,它将加载设备驱动程序,配置相机并开始发布图像。

        但是,如果我们想对这个节点有更多的控制呢?

        假设节点已启动,但我们希望确定何时加载设备驱动程序、何时启动相机、何时开始和结束发布、何时取消配置相机。我们甚至希望控制发布 — 我们选择在运行时暂停和恢复发布。

        一个普通的ROS节点在这里不足(至少没有我们在内部保存状态)。

        但是看哪!这就是托管(生命周期)节点所启用的 — 它抽象了此控件,我们需要做的就是向它发送一个信号,说明我们希望节点在运行过程中的任何时候执行的操作。

        怎么会这样?
        让我们用一些例子来回答这个问题——

三、示例一 — 通常的听众-说话者

        这是我们在学习 ROS 1/ROS 2 基础知识时看到的常见听众-说话者示例。

  • 谈话者节点 — 具有发布者以发布有关主题的消息的节点
  • 侦听器节点 — 具有订阅者的节点,用于从发布者获取有关同一主题的消息

        一旦这些节点启动,说话者节点将发布消息,侦听器节点将接收它们。

        但请注意,默认情况下,我们对说话者节点没有运行时控制。一旦它开始发布,它就是一匹野生种马 😉

        现在让我们看看基于托管节点的谈话者如何为我们提供更多控制权,这就是我们在 ROS 2 中使用托管节点的原因。

四、示例二 — 基于托管节点的侦听者-说话者

        这是我们基于托管节点的侦听者-说话者示例,其中说话者发布,听众接收消息。像往常一样,对吧?

        但这里有一个问题 — 我们可以在运行时使用服务客户端节点控制说话者节点(或者我们现在称之为生命周期说话者节点)。让我们更深入地了解——

  • 谈话者节点 — 实际继承自生命周期节点的节点,而不是 ROS 2 中的“普通节点”。此节点现在通过其内部的服务公开控制,可以使用您希望节点转到的状态调用该服务。每个状态都映射到此节点中的服务回调。
    例如,假设此节点已启动。现在,如果要在其中配置实际的发布者(或者可能是我们前面示例中的相机),则可以使用服务客户端,要求节点进入“配置”状态。这将导致“on_configure()”方法执行。在编写此节点时,您可以覆盖此方法或决定其中实际发生的情况。很酷,不是吗?
  • 侦听器节点 — 具有订阅者的节点,用于从发布者获取有关同一主题的消息。因此,它像以前一样继承了我们的“正常节点”。
    但我们也在这里看到了一个新的订阅 - 通知订阅。这只是意味着侦听器节点可以订阅生命周期说话者在转换期间不断更新其内部状态的主题。就是这样
  • 服务客户端节点 — 具有 2 个服务客户端的节点,一个用于更改生命周期发布者的状态,另一个用于询问其当前状态。
    如前所述,生命周期节点使用服务公开其控制。因此,我们需要一个服务客户端来请求生命周期节点的转换。
  • 被调用方脚本 — 使用服务客户端节点和请求状态转换的脚本。好吧,这个只是在代码中演示概念。因此,如果您只是对概念感兴趣,则可以忽略这一点。

五、构建基于托管(生命周期)节点的演示 —

          我们脑子里有这个概念。现在怎么办?

        我们将在 ROS 2 中从头开始编写上面显示C++的示例。理想情况下,我们会在这里这样做。但那将是一个冗长的帖子,解释不理想。所以我用实时编码在托管节点上制作了一个 2 小时的视频。 

机器人
罗斯2
罗斯
机器人操

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

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

相关文章

Python并发程序

大贤者福尔的在计算机方面的研究也取得了极大的成绩,他的研究主要集中在并行计算方面,通过锁机制保障程序的并行执行。为此,他设计了一个非常简单的原型系统,系统中程序最多不超过100条语句,分为以下几种类型: var = another_var or constant(变量赋值) var += another_…

串口通讯接口类型:TTL、RS232和RS485(电平标准)

串口通讯接口类型:TTL、RS232和RS485 在串口通信中,常用的接口类型包括TTL、RS-232和RS-485,TTL、RS-232、RS422、RS-485是指的电平标准(电信号)。 通信协议规定了数据传输的规则和格式,包括数据的起始位、停止位、数据位数、校…

内网穿透远程查看内网监控摄像头

内网穿透远程查看内网监控摄像头 在现代社会中,大家总是奔波于家和公司之间。大部分时间用于工作中,也就很难及时知晓家中的动态情况,对于家中有老人、小孩或宠物的(甚至对居住环境安全不放心的),这已然是…

Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读

论文信息 题目:Retrospectives on the Embodied AI Workshop 作者:Matt Deitke, Dhruv Batra, Yonatan Bisk 来源:arXiv 论文地址:https://arxiv.org/pdf/2210.06849 Abstract 我们的分析重点关注 CVPR Embodied AI Workshop 上…

JiaYu说:如何做好IT类的技术面试?

IT类的技术面试 面试IT公司的小技巧IT技术面试常见的问题嵌入式技术面试嵌入式技术面试常见的问题嵌入式软件/硬件面试题 JiaYu归属嵌入式行业,所以这里只是以普通程序员的角度去分析技术面试的技巧 当然,也对嵌入式技术面试做了小总结,友友们…

vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量

每日鸡汤:每个你想要学习的瞬间,都是未来的你向自己求救 首先可以看一下我的这篇文章了解一下关于 process.env 的环境变量。 对于vite项目,在我们初始化项目之后,在浏览器中打印 process.env,只有 NODE_ENV这个变量&…

【组内工作】木马回联

文章目录 C2服务器安装和运行方法CrossC2运行方法sliver运行方法empire安装方法DeimosC2安装教程TrevorC2安装教程: C2服务器的流量特征CrossC21. 心跳包2. 命令3. ja3/ja3s Sliver1. http2. https empirehttphttps DeimosC2https TrevorC2 C2服务器安装和运行方法 …

Python - 嵌入式数据库Sqlite3的基本使用

SQLite是一种轻量级的嵌入式关系型数据库管理系统,而Python标准库中提供了与SQLite交互的模块,sqlite3。下面是一个Python 3中使用sqlite3模块的详细示例与解析。 import sqlite3 # 创建或连接数据库 conn sqlite3.connect(example.db) # 创建一个…

iperf3 编译安装及网讯WX1860千兆网口测试

iperf3 编译安装及网讯1860千兆网口测试 编译安装 安装包下载地址:https://github.com/esnet/iperf/archive/refs/tags/3.8.tar.gz 将安装包iperf-3.8.tar.gz拷贝测试系统盘桌面,使用如下命令进行编译安装: tar zxvf iperf-3.8.tar.gz cd iperf-3.8 ./configure make s…

48,排序算法merge

功能描述: 两个容器元素合并,并储存到另一容器中 函数原型: merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest); //容器元素合并,并存储到另一个容器中 //注意:两个容器必须是有序的…

vue : 无法加载文件 C:\Users\jianfei\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。...

背景 在新电脑上配置vue环境 PS E:\CODE_PROJ\myvue\vue23\P61_使用脚手架\vue_test> npm install -g vue/cli npm WARN deprecated source-map-url0.4.1: See https://github.com/lydell/source-map-url#deprecated npm WARN deprecated urix0.1.0: Please see https://git…

Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用 1. 什么是PhysicsRaycaster组件? PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给…

【btoa()方法在linux系统中,出现报错】

问题1:为什么在linux系统中,var sendEncoded btoa(deviceData);这里会出现下面的报错? UnhandledPromiseRejectionWarning: ReferenceError: btoa is not defined 分析如下:在Linux系统中,Node.js默认情况下不支持b…

HDFS基本操作命令

这里写目录标题 HDFS Shell CLI客户端说明常用命令hadoop fs -mkdir [-p] <path>hadoop fs -ls [-h] [-R] [<path>...]上传文件到指定目录下方法一:hadoop fs -put [-f] [-p] <localsrc>.....<dst>方法二&#xff1a;hadoop fs -moveFromLocal <loc…

设计模式系列:经典的单例模式

单例模式,是设计模式当中非常重要的一种,在面试中也常常被考察到。 正文如下: 一、什么时候使用单例模式? 单例模式可谓是23种设计模式中最简单、最常见的设计模式了,它可以保证一个类只有一个实例。我们平时网购时用的购物车,就是单例模式的一个例子。想一想,如果购物…

docker基于centos7镜像安装python3.7.9

下载centos7镜像 docker pull centos&#xff1a;centos7 启动容器centos-python-3.7 docker run -itd --name centos-python-3.7 -p 60021:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it centos-python-3.7 /bin/bash centos7环境下安装python3.7.…

vue2企业级项目(四)

vue2企业级项目&#xff08;四&#xff09; 路由设计&#xff0c;过场动画设计 1、router 项目下载依赖 npm install --save vue-router3.5.3src目录下创建router/index.js import Vue from "vue"; import Router from "vue-router";Vue.use(Router);con…

Java那些“锁”事 - 可重入锁(递归锁)

可重入锁是一种线程同步的机制&#xff0c;它允许线程多次获取同一个锁&#xff0c;而不会产生死锁。可重入锁的特点是在持有锁的情况下可以再次进入同步代码块或方法&#xff0c;而不会被阻塞。ReentrantLock和synchronized都是可重入锁。ReentrantLock属于显式可重入锁&#…

Vue源码学习 - 异步更新队列 和 nextTick原理

目录 前言一、Vue异步更新队列二、nextTick 用法三、原理分析四、nextTick 源码解析1&#xff09;环境判断2&#xff09;nextTick() 五、补充 前言 在我们使用Vue的过程中&#xff0c;基本大部分的 watcher 更新都需要经过 异步更新 的处理。而 nextTick 则是异步更新的核心。…

MacOS本地安装Hadoop3

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 本文密钥&#xff1a;338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程&#xff0c;也可以作为在任何类linux平台上安装hadoop3借鉴。 …