首页 > 其他分享 >ROS2中通过launch读取.yaml配置文件启动节点

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

时间:2024-12-24 20:56:03浏览次数:6  
标签:node 配置文件 bag image launch yaml import config

环境: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 Node

def 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 os

def 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_node
    PUBLIC ${PCL_INCLUDE_DIRS}
)

# ROS2中指定节点或库的依赖项
ament_target_dependencies(bag_to_image_node rclcpp) 

install(TARGETS
    bag_to_image_node
    DESTINATION 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 os

def 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

标签:node,配置文件,bag,image,launch,yaml,import,config
From: https://blog.csdn.net/qq_45445740/article/details/144596999

相关文章

  • Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + xlaunch桌面 )
    安装WSL1安装WSL1(1)启用“适用于Linux的Windows子系统”可选功能需要先启用“适用于Linux的Windows子系统”可选功能,然后才能在Windows上安装Linux分发。可以使用命令行的方式,也可以使用图形界面的方式。图形界面方式在【设置->更新与安全->开发者选项】中开......
  • WSL2 ubuntu18.04 使用xfce4时Xlaunch黑屏问题以及解决,X server already running on d
    显示xfce4启动成功却没有画面显示在Ubuntu终端输入startxfce4启动X服务时,显示:/usr/bin/startxfce4:Xserveralreadyrunningondisplay10.255.255.254:0,且Xlaunch黑屏无输入。如图所示:分析原因:出现Xserveralreadyrunningondisplay10.255.255.254:0说明X服务......
  • 为什么推荐在 .NET 中使用 YAML 配置文件
    在现代应用开发中,配置管理是一个非常重要的部分。随着微服务、容器化和云原生架构的流行,使用简单、易读的配置格式变得尤为重要。在.NET开发中,虽然JSON是默认的配置文件格式,但YAML("YAMLAin'tMarkupLanguage")正越来越受到开发者的青睐。YAML是什么?YAML是一种人类可读的......
  • flink-配置文件
    packagecom.ecarx.sumatra.data.tab.conf;importorg.apache.flink.api.java.utils.ParameterTool;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.util.Optional;publicclassConfigManager{privatestat......
  • Maven 构建配置文件
    构建配置文件是一系列的配置项的值,可以用来设置或者覆盖Maven构建默认值。使用构建配置文件,你可以为不同的环境,比如说生产环境(Production)和开发(Development)环境,定制构建方式。配置文件在pom.xml文件中使用activeProfiles或者profiles元素指定,并且可以通过各种方式触......
  • YAML文件介绍
    YAML是一种人类可读的数据序列化标准,广泛用于配置文件和数据交换。它的设计目标是使文件易于阅读和编写,同时保持足够的表达力以满足大多数应用的需求,YAML文件通常以.yaml或.yml为扩展名。YAML的特点简洁性:YAML使用缩进来表示层次结构,避免了XML和JSON中常见的大量括号和引号......
  • golang:第三方库:用vipper解析yaml配置文件
    一,安装第三方库$gogetgithub.com/spf13/viper二,代码1,配置文件Database:DBType:mysqlUserName:dbusernamePassword:dbpasswordHost:127.0.0.1:3306DBName:dbnameCharset:utf8ParseTime:TrueMaxIdleConns:10MaxOpenConns:30 2,代码:......
  • vue3.5.13 + vite6.0.1搭建前端项目的配置文件
    main.js//vue版本为3.5.13import{createApp}from'vue'import'./style.css'importAppfrom'./App.vue'import'element-plus/dist/index.css'importrouterfrom'./router/index'constapp=createApp(App)......
  • 「C/C++」C/C++ 之 用头文件作为程序的配置文件
    ✨博客主页何曾参静谧的博客(✅关注、......
  • yaml to properties failed, reason: Parse yaml file content failed for namespace:
    背景springboot2.2.x升级到是springboot2.7.x,apollo-client也跟着升级到了2.0.1,配置中心使用.properties的应用启动正常,使用.yml报了上面的错误解决方案版本降级到1.33解决下面是ai回答的结果让我们尝试几个可能的解决方案:检查你的SpringBoot版本和SnakeYAML版......