ROS2 lifecycle node生命周期节点 官方例程文档翻译

news2024/11/15 18:13:39

0 官方例程文档

ros2 humble lifecycle demo github repo

1 引言

ROS2引入了受管理节点的概念,受管理的节点又被称为是生命周期节点(LifecycleNode)。在接下来的教程中,我们会解释这些节点的作用,是什么使得它们和普通节点不一样,以及它们是怎样受到生命周期的管理的。受管理的节点内有一个状态机,状态机里有一系列预定义的状态。这些状态可以通过调用transition id改变,从transition id可以知道接下来的状态。这个状态机的实现可以参见受管理的节点-ROS2设计文档。

主要状态(Primary States)也即稳定状态,在这一状态下任何节点都可以执行相应的任务。而转换状态(Transition States)是瞬间存在的中间状态,只在切换时存在。这些状态的结果被用于显示转换是否成功。这样,任何一个受管理的节点可以处于如下状态之一:

主要状态(稳定状态):

  • Unconfigured
  • Inactive
  • active
  • Shutdown(Finalized)

转换状态(中间状态):

  • Configuring
  • Activating
  • Deactivating
  • Cleaningup
  • Shuttingdown

Transition id:

  • Configure
  • Activate
  • Deactivate
  • Cleanup(可以理解为清除配置configuration)
  • Shutdown

在这里插入图片描述

更详细的信息可参见受管理的节点-ROS2设计文档。

2 The demo

本demo可分为三个application:

  • lifecycle_talker
  • lifecycle_listener
  • lifecycle_service_client

lifecycle_talker代表一个受管理的节点,并且会根据所处的状态有不同的发布行为。我们将talker node的任务分解成如下几个部分:

  1. configure:初始化publisher和timer
  2. activate:激活publisher和定时器,从而使能发布
  3. deactivate:停止publisher和timer
  4. cleanup:销毁publisher和timer

本demo展示了一对典型的talker/listener节点。然而,可以想象这样一个场景:你所用的硬件也许会有一段相当长时间的启动阶段(booting phase),比如laser和camera。我们或许可以在configurating state 中 bring up 设备驱动,在active/deactive state中仅开启或停止节点的发布行为,并且仅在clearn up/shutdown状态来shutdown 设备。
lifecycle_listener是一个简单的listener,用于展示lifecycle talker的特性。因为talker仅仅在active state的时候才会发布消息,所以listener只能在talker处于active state的时候接收到消息。
lifecycle_service_client是一个脚本,会调用不同的transition,这个可以被当作是外部用户在控制节点的生命周期。

3 运行demo

因为ROS2自带了lifecycle这个package,然后如果已经将ROS2环境变量加入bashrc的话,这里就不用再配置了,如果没有,则需要source一下。
两种方式:

  • 一种是在三个终端里分别启动三个节点:

    ros2 run lifecycle lifecycle_talker
    
    ros2 run lifecycle lifecycle_listener
    
    ros2 run lifecycle lifecycle_service_client
    
  • 另一种是通过launch文件同时启动

    ros2 launch lifecycle lifecycle_demo.launch.py
    

在第三个service节点启动之前,talker节点是没有发布任何消息的,因为它还处于unconfigured的状态。

3 The demo code

我们看了代码就会发现,相比于普通的talker节点,生命周期talker有一个明显的不同,那就是:我们的节点并不继承自常规的rclcpp::node::Node,而是rclcpp_lifecycle::LifesycleNode

class LifecycleTalker : public rclcpp_lifecycle::LifecycleNode

每个继承自LifecycleNode的子类都有一套回调函数。这些回调函数对应了生命周期节点的状态机。

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_configure(const rclcpp_lifecycle::State & previous_state)

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_activate(const rclcpp_lifecycle::State & previous_state)

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_deactivate(const rclcpp_lifecycle::State & previous_state)

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_cleanup(const rclcpp_lifecycle::State & previous_state)

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_shutdown(const rclcpp_lifecycle::State & previous_state)

4 命令行控制

查看当前的生命周期节点:ros2 lifecycle nodes
查看某个生命周期节点所处的状态:ros2 lifecycle get <lifecycle_node>
列出某个生命周期节点仍可切换的状态:ros2 lifecycle list <lifecycle_node>
切换某个生命周期节点的状态:
ros2 lifecycle set <lifecycle_node> configure/activate/cleanup/deactivate/shutdown
(切换成功会显示transition successful字样)

在这里插入图片描述

其他部分暂时没时间写了,未完待续。

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

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

相关文章

【Linux 驱动篇(三)】新字符设备驱动

文章目录 一、新字符设备驱动原理1. 分配和释放设备号2. 新的字符设备注册方法2.1 字符设备结构2.2 cdev_init 函数2.3 cdev_add 函数2.4 cdev_del 函数 二、自动创建设备节点1. mdev 机制2. 创建和删除类3. 创建设备4. 参考示例5. 设置文件私有数据 三、LED 灯驱动程序编写四、…

Q-Learning 原理干货讲解

强化学习 本文是强化学习和Q-Learning算法的概念及原理 项目实战案例可查看下一篇文章&#xff1a;Q-Learning 单路径吃宝箱问题–棋盘格吃宝箱问题–拓扑节点较优路径问题 一. 强化学习概述 1.1 什么是强化学习 基于环境的反馈而行动&#xff0c;通过不断与环境的交互、试错&…

AR急诊急救大平台远程专家会诊方案

随着AR技术的完善&#xff0c;在医院急救中&#xff0c;需要及时把各方面专家汇在一起会诊&#xff0c;在AR这方面有数据采集清晰&#xff0c;资料呈现方便便捷&#xff0c;针对客户需要&#xff0c;我们对业务需求分析&#xff0c;比较市面多种产品&#xff0c;把会议&#xf…

Spring Boot 中的 @Cacheable 注解

Spring Boot 中的 Cacheable 注解 在 Spring Boot 中&#xff0c;缓存是一个非常重要的话题。当我们需要频繁读取一些数据时&#xff0c;为了提高性能&#xff0c;可以将这些数据缓存起来&#xff0c;避免每次都从数据库中读取。为了实现缓存&#xff0c;Spring Boot 提供了一…

Apikit 自学日记:发起文档测试-TCP/UDP

进入某个TCP/UDP协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的求头部、Query参数、请求体自动生成测试界面并且填充测试数据。 填写/修改请求参数 1.1设置请求参数 与发起HTTP协议测试类似&am…

Django Vue corsheaders跨域问题

跨域问题 记录一下在我自己的django-vue项目里面出现的跨域问题 我的项目之前一直是在本地跑的&#xff0c;因为需要上线测试&#xff0c;所以我就运行在同一个vlan里面 ip段&#xff1a;192.168.1.0/24 突然发现存在跨域问题&#xff0c;我django的接口访问被拦截了。 检查…

Web服务器群集:Nginx+Tomcat实现负载均衡与动静分离集群

目录 一、理论 1.多实例 2.Nginx负载均衡 3.Nginx动静分离 4.配置NginxTomcat负载均衡 5.配置NginxTomcat动静分离集群 6.Nginx 四层代理配置 二、实验 1.配置NginxTomcat负载均衡 2.、配置NginxTomcat动静分离集群 三、问题 1.服务器群集与集群的区别 四、总结 一…

十分钟实现 Android Camera2 视频录制

1. 前言 因为工作中要使用Android Camera2 API&#xff0c;但因为Camera2比较复杂&#xff0c;网上资料也比较乱&#xff0c;有一定入门门槛&#xff0c;所以花了几天时间系统研究了下&#xff0c;并在CSDN上记录了下&#xff0c;希望能帮助到更多的小伙伴。 上两篇文章们使用…

Python主动抛出Warning的艺术:一种提醒用户的优雅方式

简介&#xff1a;Python提供了一个内置的warnings模块&#xff0c;使得开发者可以在代码中主动地发出警告。这对于告知用户某些问题或者对某些即将废弃的特性进行提示尤其有用。本文将重点介绍如何在Python代码中主动抛出警告&#xff0c;并探讨其使用场景和优势。 历史攻略&a…

设计模式3:单例模式:volatile关键字能不能解决多线程计数问题?

先说结论不能&#xff1a; 代码实测下&#xff1a; public class Counter {public volatile static int count 0;public static void inc() {//这里延迟1毫秒&#xff0c;使得结果明显try {Thread.sleep(1);} catch (InterruptedException e) {}count;}public static void ma…

Win10安装CUDA

一、安装Nvidia显卡驱动 安装Nvidia显卡驱动前可以先检查Nvidia显卡驱动是否已安装。搜索 Nvidia控制面板 或 Nvidia Control Panel可以看到当前已经安装的显卡驱动及版本。 如需安装显卡驱动&#xff0c;在官方驱动下载网站找到自己的显卡型号对应的驱动下载并安装:官方驱动…

行业分析| 无人机电力巡检技术的应用

随着现代生活水平的不断提升&#xff0c;人们对各行各业的发展都提出了更高的品质要求&#xff0c;对于电力的需求不断上涨&#xff0c;因此也加速了电力行业的转型升级。基于这一发展状况&#xff0c;我国电力行业逐渐开始选择应用无人机电力巡检等现代高科技技术。 无人机电…

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGAPISDK进行定序器…

Keep上市,打响健身科技第一炮?

近些年&#xff0c;大众对于身体健康和审美的需求越来越旺盛&#xff0c;因此也引发了一场无形的健身革命。无论是线下动辄大几千的健身房&#xff0c;还是线上的健身直播经济都受到了不小的关注&#xff0c;在疫情刚开始的那段时间&#xff0c;各地的封控让在线健身成为了一种…

修改滚动条样式 和 那些高度

一、滚动条样式 二、那些高度 网页可见区域宽&#xff1a; document .body.clientWidth; 网页可见区域高&#xff1a; document .body.clientHeight; 网页可见区域宽&#xff1a; document .body.offsetWidth (包括边线的宽); 网页可见区域高&#xff1a; document .body.of…

亚马逊实践 | 构建可持续发展的架构模型

可持续发展概念源于对系统性文明危机和世界问题的科学和社会意识形态研究。世界级的进步学术社群和政治精英在二十世纪末就认识到了这些问题的存在。他们将即将到来的二十一世纪视为充满不确定性、全球灾难进程逐步升级的时代。可持续发展对多个领域产生影响&#xff0c;目前已…

Sudo堆溢出漏洞(CVE-2021-3156)复现

背景介绍 2021 年 1 月 26 日&#xff0c;Qualys Research Labs在 sudo 发现了一个缺陷。sudo 解析命令行参数的方式时&#xff0c;错误的判断了截断符&#xff0c;从而导致攻击者可以恶意构造载荷&#xff0c;使得sudo发生堆溢出&#xff0c;该漏洞在配合环境变量等分配堆以及…

在Mac上安装Aspectj1.9.8(用于Java17)+IDEA

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. AspectJ测试-简单终端测试 6. AspectJ测试-通过IDEA敲代码测试 ---------------------------------------详细教程-------------------------------------…

【深度学习】7-0 自制框架实现DeZero - 自动微分

介绍下处理深度学习的框架DeZero&#xff0c;通过这个框架来了解自动微分是如何实现的 自动微分指的是自动求出导数的做法(技术)。“自动求出导数”是指由计算机(而非人)求出导数。具体来说&#xff0c;它是指在对某个计算(函数)编码后计算机会自动求出该计算的导数的系统。 自…

flexible.js适配pc端、移动端并自动将px转换rem

首先在assets中创建一个flexible.js文件 ;(function(win, lib) {let doc win.document;let docEl doc.documentElement;let metaEl doc.querySelector(meta[name"viewport"]);let flexibleEl doc.querySelector(meta[name"flexible"]);let dpr 0;let…