ROS2中通过launch读取.yaml配置文件启动节点

环境:Ubuntu22.04,ROS2-humble
通过修改.yaml配置文件中的参数,可以不用重新编译源代码进行软件调试。

1.yaml文件格式

bag_to_image_node:运行的ROS2节点名称
参数格式参考如下:

bag_to_image_node:ros__parameters:greeting: "Hello"name: "BUDING DUODUO"ExposureTime: 8888

2.launch文件

  • launch中要找到YAML文件,可以使用绝对路径
import launch
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, LogInfo
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Nodedef generate_launch_description():current_dir = os.getcwd()  # 获取当前工作目录print(f"Current directory: {current_dir}")  # 打印当前目录# 声明参数文件路径的启动参数return LaunchDescription([# 声明一个启动参数,指定参数文件的路径DeclareLaunchArgument('config_file',default_value='/home/boss-dog/001_test/bag_to_image/src/bag_to_image/config/params.yaml',description='Path to the YAML parameter file'),# 启动节点并加载参数文件Node(package='bag_to_image',  # 你的包名executable='bag_to_image_node',  # 你的可执行文件名name='bag_to_image_node',  # 节点名称output='screen',parameters=[LaunchConfiguration('config_file')],  # 加载指定的 YAML 配置文件),# 打印日志确认节点启动LogInfo(condition=launch.conditions.LaunchConfigurationEquals('config_file', ''),msg="Starting with default parameter file")])
  • launch使用相对路径
import launch
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, LogInfo
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
import osdef generate_launch_description():current_dir = os.getcwd()  # 获取当前工作目录print(f"Current directory: {current_dir}")  # 打印当前目录# 拼接文件路径config_file_path = os.path.join(current_dir, 'install', 'bag_to_image', 'share', 'bag_to_image', 'config', 'params.yaml')# 声明参数文件路径的启动参数return LaunchDescription([# 启动节点并加载参数文件Node(package='bag_to_image',  # 你的包名executable='bag_to_image_node',  # 你的可执行文件名name='bag_to_image_node',  # 节点名称output='screen',parameters=[config_file_path],  # 加载指定的 YAML 配置文件),# 打印日志确认节点启动LogInfo(condition=launch.conditions.LaunchConfigurationEquals('config_file', ''),msg="Starting with default parameter file")])

3.CMakeList中需要将配置文件和launch文件拷贝到install下

# 复制launch文件
install(DIRECTORY launch/DESTINATION share/${PROJECT_NAME}/launch
)# Install config files
install(DIRECTORY config/DESTINATION share/${PROJECT_NAME}/config
)

在这里插入图片描述

4.源码

项目结构

bag_to_image
├── CMakeLists.txt
├── config
│   └── params.yaml
├── include
│   └── bag_to_image
├── launch
│   └── start_node.launch.py
├── package.xml
└── src└── bag_to_image_node.cpp
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(bag_to_image)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)add_executable(bag_to_image_node src/bag_to_image_node.cpp)target_include_directories(bag_to_image_nodePUBLIC ${PCL_INCLUDE_DIRS}
)# ROS2中指定节点或库的依赖项
ament_target_dependencies(bag_to_image_node rclcpp) install(TARGETSbag_to_image_nodeDESTINATION lib/${PROJECT_NAME})# 复制launch文件
install(DIRECTORY launch/DESTINATION share/${PROJECT_NAME}/launch
)# Install config files
install(DIRECTORY config/DESTINATION share/${PROJECT_NAME}/config
)if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)set(ament_cmake_copyright_FOUND TRUE)set(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()
  • params.yaml
bag_to_image_node:ros__parameters:greeting: "Hello"name: "BUDING DUODUO"ExposureTime: 12345
  • start_node.launch.py
import launch
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, LogInfo
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
import osdef generate_launch_description():current_dir = os.getcwd()  # 获取当前工作目录print(f"Current directory: {current_dir}")  # 打印当前目录# 拼接文件路径config_file_path = os.path.join(current_dir, 'install', 'bag_to_image', 'share', 'bag_to_image', 'config', 'params.yaml')# 声明参数文件路径的启动参数return LaunchDescription([# 启动节点并加载参数文件Node(package='bag_to_image',  # 你的包名executable='bag_to_image_node',  # 你的可执行文件名name='bag_to_image_node',  # 节点名称output='screen',parameters=[config_file_path],  # 加载指定的 YAML 配置文件),# 打印日志确认节点启动LogInfo(condition=launch.conditions.LaunchConfigurationEquals('config_file', ''),msg="Starting with default parameter file")])
  • package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>bag_to_image</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="boss_dog@qq.cn">qq</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>
  • bag_to_image_node.cpp
#include <rclcpp/rclcpp.hpp>
#include <iostream>class ImageSaverNode : public rclcpp::Node
{
public:ImageSaverNode() : Node("image_saver_node"){std::cout << "node..." << std::endl;// 获取参数this->declare_parameter<std::string>("greeting", "Hello");this->declare_parameter<std::string>("name", "ROS2");this->declare_parameter<int>("ExposureTime", 50000);// 读取参数std::string greeting = this->get_parameter("greeting").as_string();std::string name     = this->get_parameter("name").as_string();int ExposureTime     = this->get_parameter("ExposureTime").as_int();// 打印信息std::cout << greeting << ", " << name << std::endl;std::cout << "ExposureTime: " << ExposureTime << std::endl;}~ImageSaverNode() {}
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<ImageSaverNode>());rclcpp::shutdown();std::cout << "run ..." << std::endl;return 0;
}

运行结果

在这里插入图片描述

  • 不通过读取.yaml文件直接启动节点
$ source install/setup.bash
$ ros2 run bag_to_image bag_to_image_node node...
Hello, ROS2
ExposureTime: 50000
  • 通过launch读取.yaml文件启动节点
$ source install/setup.bash
$ ros2 launch bag_to_image start_node.launch.py [INFO] [launch]: All log files can be found below /home/boss-dog/.ros/log/2024-12-24-20-34-00-600200-boss-dog-106611
[INFO] [launch]: Default logging verbosity is set to INFO
Current directory: /home/boss-dog/001_test/bag_to_image
[INFO] [bag_to_image_node-1]: process started with pid [106612]
[bag_to_image_node-1] node...
[bag_to_image_node-1] Hello, BUDING DUODUO
[bag_to_image_node-1] ExposureTime: 12345

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

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

相关文章

链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 场景

在 12 月 4 日&#xff0c;链原生的 Web3 AI 数据网络 Chainbase 正式启动了 Chainbase AVS 主网&#xff0c;同时发布了首批 20 个 AVS 节点运营商名单。Chainbase AVS 是 EigenLayer AVS 中首个以数据智能为应用导向的主网 AVS&#xff0c;其采用四层网络架构&#xff0c;其中…

【文档搜索引擎】搜索模块的完整实现

调用索引模块&#xff0c;来完成搜索的核心过程 主要步骤 简化版本的逻辑&#xff1a; 分词&#xff1a;针对用户输入的查询词进行分词&#xff08;用户输入的查询词&#xff0c;可能不是一个词&#xff0c;而是一句话&#xff09;触发&#xff1a;拿着每个分词结果&#xf…

MySQL 数据库优化详解【Java数据库调优】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

ensp 关于acl的运用和讲解

ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种常用于网络设备&#xff08;如路由器、交换机&#xff09;上的安全机制&#xff0c;用于控制数据包的流动与访问权限。ACL 可以指定哪些数据包允许进入或离开某个网络接口&#xff0c;基于不同的…

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…

知识中台与人工智能:融合赋能企业智能化知识服务与决策

在数字化、智能化的时代背景下&#xff0c;企业面临着前所未有的机遇与挑战。为了提升知识管理与服务的能力&#xff0c;推动企业的智能化转型与发展&#xff0c;知识中台与人工智能的融合应用正成为新的趋势。知识中台作为连接数据、知识与业务的核心平台&#xff0c;能够为企…

《Web 项目开发之旅》

一、项目简介 介绍项目的背景与目标&#xff0c;说明为什么要开展这个 Web 项目。展示项目最终完成后的整体页面截图&#xff0c;让读者对项目外观有初步印象。 二、技术选型 阐述在项目中使用的前端技术&#xff08;如 HTML、CSS、JavaScript 框架等&#xff09;、后端技术…

VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Java开发环境搭建二、VScode下载及安装三、VSCode配置Java环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…

【GIS教程】使用GDAL实现栅格转矢量(GeoJSON、Shapefile)- 附完整代码

文章目录 一、 应用场景1、GeoJSON2、ESRI Shapefile3、GDAL 二、基本思路1、数据准备2、重投影&#xff08;可选&#xff09;3、创建空的矢量图层4、栅格转矢量 三、完整代码四、总结五、拓展&#xff08;使用ArcGIS工具进行栅格转矢量&#xff09; 一、 应用场景 TIFF格式的…

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1&#xff09;导出数据到本地目录 2&#xff09;导出到hdfs的目录下 3&#xff09;直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程

之前文章有提到“YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪”,通过裁剪后得到的onnx能够顺利的进行rknn转换,本文将对转rnkk过程,以及相应的后处理进行阐述。并在文末附上全部源码、数据、模型的百度云盘链…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

继承详细总结

一.继承的定义与概念 1.定义&#xff1a;继承是一种is-a的关系&#xff0c;例如&#xff0c;哺乳动物是动物&#xff0c;狗是哺乳动物&#xff0c;因此&#xff0c;狗是动物&#xff0c;等等。 2.允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加方法(成员函数) 和 属…

批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片

给蜘蛛访问的网站文章插入相关图片&#xff0c;可以带来以下好处&#xff1a; ‌1、提升用户体验‌&#xff1a;图片能够直观地展示文章内容&#xff0c;帮助用户更好地理解和消化信息。对于阅读者来说&#xff0c;图文并茂的内容往往更具吸引力&#xff0c;也能提高他们的阅读…

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及&#xff0c;现代青年的社交圈层加速扩大&#xff0c;他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余&#xff0c;人们希望能够找到一种既高效又真诚的交友方式。于是&#xff0c;线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程&#xff0c;需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢&#xff1f;使用SysTick&#xff0c;那么怎么使用SysTick来模拟多线程呢&#xff1f;前面我们知道SysTick就是一个定时器&#xff0c;它不是在主函数的while循…

麒麟信安受邀出席开放原子园区行暨供需对接活动,分享基于关基领域打造的行业解决方案

12月17日&#xff0c;武汉市经信局和开放原子开源基金会共同主办开放原子园区行暨供需对接活动&#xff0c;旨在推进武汉市开源体系建设&#xff0c;推动开源技术赋能千行百业。活动吸引了武汉市委金融办、市卫健委、疾控中心、医保局、信息中心(大数据中心)、市红十字会、银行…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…