ROS2 launch文件同时引入yaml文件参数和自定义变量参数

news2024/11/24 19:58:39

0 背景

在ROS中,launch工具可以帮助用户同时启动多个节点,以及引入多种设置如参数导入、节点名重映射等。在ROS1中,launch文件通过xml语言编写,后缀名为.launch;而ROS2在xml的基础上(后缀名为.xml),新增加了两种launch文件的编写方式——python(后缀名为.launch.py)和yaml(后缀名为.yaml)。尽管如此,官方demo以及一些比较受欢迎的ROS2项目,使用的launch文件的编写方式基本为python,而python的灵活性之大与受众之广也是得到众多开发者的认可的。

关于ROS2 launch文件的更多详细资料,笔者把一些常用链接整理如下:

  • 一个很棒的github项目,对比了ROS1和ROS2的launch文件写法,提供了上手demo
  • ROS2 humble版本 launch 教程
  • ROS2 launch的设计文档

1 问题的提出

铺垫结束,回到本文关注的问题!
如何在ROS2 launch.py文件中,同时引入yaml和自定义变量参数?

之所以会提出这个问题,是因为在实际工程中,笔者发现当进行团队协作或者程序在不同平台上移植的时候,经常会遇到目录不统一的问题,而这些目录是作为参数存放在yaml中的。比如,某个文件存放在张三的/home/zhangsan/resource下面,而李四要将yaml文件中的该路径修改为/home/lisi/resource。又比如,某个文件存放在张三的/home/zhangsan/folder_A/folder_B,而李四习惯将其存放在/home/lisi/folder_C。如果每次从GitHub或者GitLab pull下他人的代码,都需要修改 ,显然不是长久之际。于是自然地想到,有没有这样一种方式,能够避免路径修改,使代码即拿即用呢?

2 问题的解决

通过阅读官方文档,可以知道,在launch文件中启动节点,可以直接定义ros参数:
在这里插入图片描述

也可以通过下面这种方式导入yaml文件:
在这里插入图片描述

一般我们使用yaml文件时,都是因为参数数量比较大。用yaml整理,更加简洁直观。但是,对于上述情况,笔者还是推荐将涉及路径的参数写在launch文件里,毕竟ROS2已经支持python了,使用python的优势马上就会介绍到。

  • 第一个,只需知道yaml文件相对路径

    from ament_index_python.packages import get_package_share_directory
    config = os.path.join(
      get_package_share_directory('launch_tutorial'),
      'config',
      'turtlesim.yaml'
      )
    

    这个get_package_share_memory会获取功能包所在的路径(在install文件夹内,而不是源代码文件夹),而yaml文件在功能包内部,只需知道相对路径即可,从而避免对yaml绝对路径的编辑与修改。

  • 第二个,其他资源文件可以用~代替主目录

    import os
    resource_path = os.path.expanduser('~/demo/resource/dataset') # 在.launch.py中可以使用~表示主目录,从而提高程序的可移植性
    
  • 第三个,yaml文件可以和自定义参数同时使用,从而实现一般参数和特殊参数(如路径)的统一
    见下面的例程,这里使用的是composable node,但是对于一般的node也是可以的,可以看上面的两个代码截图,有parameter项。

    import launch
    from launch_ros.actions import ComposableNodeContainer
    from launch_ros.descriptions import ComposableNode
    
    # 以下两个包是额外import进来的,用于处理目录和字符串
    import os
    from ament_index_python.packages import get_package_share_directory
    
    
    def generate_launch_description():
        """Generate launch description with multiple components."""
    
        yaml_file = os.path.join(get_package_share_directory("onboard_pkg"), "config", "onboard_pkg.yaml")
        # yaml文件在config目录下,记得在CMakeLists.txt中写install相关内容(config目录需要加入到install目录中去)
    
        resource_path = os.path.expanduser('~/demo/resource/dataset') # 在.launch.py中可以使用~表示主目录,从而提高程序的可移植性
        # 建议涉及到目录的参数都在launch文件中写,以提高程序的可移植性
        individual_params = {"resource_path": resource_path} # 用字典自定义参数,key为resource_path,值为路径
        lidar_node_params = [individual_params,yaml_file] # 列表元素可以是自定义参数,也可以是yaml文件的路径
        
        container = ComposableNodeContainer(
                name='my_container',
                namespace='',
                package='rclcpp_components',
                executable='component_container',
                composable_node_descriptions=[ # 多个节点的情况,可以在List中写多个ComposableNode
                    ComposableNode( # 只需要修改这个实例的内容
                        package='onboard_pkg',
                        plugin='onboard_pkg::Lidar',
                        name='lidar_node', 
                        parameters=lidar_node_params)
                ],
                output='screen',
        )
    
        return launch.LaunchDescription([container])
    

3 多问一句为什么

为什么可以把launch文件中自定义的参数和yaml中给的参数同时传给节点?
选中Node中的parameter跳转到其定义,再在类的初始化函数中找到parameter相关的函数normalize_parameters函数进行跳转,会发现parameter list支持三种类型,并且会根据元素的类型,进行相应的处理,从而可以支持同时传入yaml和自定义参数
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【Servlet学习四】实现一个内存版本的表白墙~

目录 一、前端代码 二、后端代码实现 🌈1、全局类定义AppVar 🌈2、实体类定义Message 🌈3、获取所有信息:getMessageServlet实现前后端的交互 🌈4、添加数据:addMessageServlet,实现前后端…

notepad++去除换行符和空格

在notepad中按Ctrlh 1.去除换行符 输入如图所示的查找内容为\r\n,【替换为】不填写,勾选底部的【正则表达式】,然后点击【全部替换】 2. 按照逗号换行 输入如图所示的查找内容为,,【替换为】\r\n,勾选底部的【正则…

C# WinForm 选择打开文件和保存文件

做 winform 项目的时候正好遇到了记录一下: 打开文件 我们使用 OpenFileDialog 控件来打开文件选择框: 通过 Title 属性可以设置选择框的标题而 Filter 属性可以设置选中的文件类型,这个属性由两个部分组成 SVG files (*.svg)|*.svg &am…

九、云尚办公系统-管理端-审批管理

云尚办公系统:管理端-审批管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!…

Unity导出到AS中真机测试apk没有问题,aab提交到GooglePlay审核通过,但是从Google Play下载的应用闪退问题

从Google Play下载的应用报错如下: backtrace: #00 pc 0x0000000000050748 /data/app/~~x94h_Fmdoj4Vj1NVQcL7sQ/com.id.hhhuhi-LpC7BJqILn3X29R8TffhuA/split_config.arm64_v8a.apk!libpairipcore.so (ExecuteProgram196) 06-26 20:39:40.526 13936 13936 F l…

基于Java+Vue前后端分离宠物领养系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

ML@集成学习@摘要

文章目录 集成学习refs摘要Note准确性和多样性 集成学习方法分类BoostingAdaBoost伪代码Adaboost小结 补充补充1补充2 BaggingBagging伪代码 特点算法效率直接应用于多分类 自助采样和包外估计随机森林 Stackingsklearn中的Stacking🎈构造初级学习器构造次级学习器 …

Ubuntu18.04 系统设置修改物理内存-迅为RK3568开发板

打开虚拟机,如下图。单击红色框中的“虚拟机”。如下图所示: 然后点击“设置”弹出虚拟机的设置界面,如下图所示: 更多教程B站搜:迅为3568开发板

RHEL8.2安装QEMU及KVM虚拟化

一、环境 操作系统:CentOS8.2CPU:4C内存:16G磁盘:250G,其中180G分配给/data,用于存储数据及kvm存储池。 二、安装步骤 dnf module install virt dnf install virt-install virt-viewer virt-manager -y三…

【Redis二】Redis优化之持久化

Redis优化之持久化 1.Redis高可用2.Redis持久化2.1 RDB 持久化2.1.1 触发条件2.1.2 执行流程2.1.3 启动时加载 2.2 AOF 持久化2.2.1 开启AOF2.2.2 执行流程2.2.3 文件重写触发方式2.2.4 文件重写的流程2.2.5 启动时加载 2.3 RDB和AOF的优缺点2.4 RDB AOF持久化的区别 3.Redis性…

如何理解 Istio Ingress, 它与 API Gateway 有什么区别?东西流量?南北流量?

文章目录 背景k8s的内部服务如何被外部访问东西流量南北流量流量管理的比较 IngressAPI GatewayIstio参考 背景 这三者都和流量治理密切相关,那么流量治理在过去和现在有什么区别呢?都是如何做的呢? 在学习istio的时候对流量管理加深了理解。…

学编程c++有什么好处?有什么作用?

C是一种跨平台、高效且广泛应用的编程语言,具有许多优势和应用领域。本文将深入探讨学习C编程的好处,包括跨平台性、高效性、对系统资源的控制能力以及面向对象编程的优势。此外,我们还将介绍C在不同领域的应用,如桌面应用程序、嵌…

记录好项目D17

记录好项目 你好呀,这里是我专门记录一下从某些地方收集起来的项目,对项目修改,进行添砖加瓦,变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个SpringBoot网上商城 一、系统介绍 前台功能 商品分类查询&#xff…

【微服务架构】微服务安全 - 如何保护您的微服务基础架构?

在当今行业使用各种软件架构和应用程序的市场中,几乎不可能感觉到您的数据是完全安全的。因此,在使用微服务架构构建应用程序时,安全问题变得更加重要,因为各个服务相互之间以及客户端之间进行通信。因此,在这篇关于微…

STM32F407实现NEC协议红外线解码

【1】NEC红外线协议介绍 NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。 下面是NEC红外线协议的详细…

Linux下用who命令查看当前登录用户

文章目录 1 查看当前登录用户(w 和 who)2 who命令查看某一时刻登录的用户3 查看当前登录用户的账户名(whoami)4 关于linux下who指令的总结介绍 1 查看当前登录用户(w 和 who) w命令可以查看某一时刻登录该…

《深入浅出SSD:固态存储核心技术、原理与实战》----学习记录(二)

第2章 SSD主控和全闪存阵列 SSD主要由两大模块构成——主控和闪存介质。其实除了上述两大模块外,可选的还有缓存单元。主控是SSD的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二…

短视频seo矩阵+抖音小程序SaaS源码开发部署

短视频seo矩阵开发者综述 短视频seo主要基于抖音短视频平台,为企业实现多账号管理,视频分发,视频批量剪辑,抖音小程序搭建,企业私域转化等,本文主要介绍短视频矩阵系统抖音小程序开发详细及注意事项 抖音小…

VC++6.0实现MFC单文档模拟交通灯

要求: 模拟交通灯: (1)建立一个单文档应用项目(项目名称为学生姓名拼音首字母缩写)。 (2)修改它的图标和版本信息。 (3)为该应用项目添加两个按钮到工具…

uniapp如何使用canvas绘制海报,自适应屏幕尺寸,并且下载本地?

组件目录 /share-canvas.vue <template><u-popup :show"visiable" closeable close"hiddenCanvas" zIndex"999999"><view class"shareModel" touchstart"" touchmove"" touchend"">…