yaml配置文件

yaml配置文件

rm_bringup/config/xxx.yaml
通过参数通信的方式进行调参,
直接在yaml文件里调各参数
->可以不用去源代码里改了(好耶

demo解析

CMakeList.txt注册节点

# 找库
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

# 构建exe文件
add_executable(bag_to_image_node src/bag_to_image_node.cpp)
ament_target_dependencies(bag_to_image_node rclcpp)
=target_include_directories(cpp_node PUBLIC${rclcpp_INCLUDE_DIRS})+target_link_libraries(cpp_node ${rclcpp_LIBRARIES})

# 将可执行文件拉到lib内
install(TARGETS
  bag_to_image_node
  DESTINATION lib/${PROJECT_NAME}
)

【如果想要在工作空间内读】
# 添加launch文件
install(
  DIRECTORY launch/
  DESTINATION share/${PROJECT_NAME}/launch
)

# 添加config文件
install(
  DIRECTORY config/
  DESTINATION share/${PROJECT_NAME}/config
)

【如果想要直接加到ros空间下】(操作简单 推荐!)
find_package(ament_cmake_auto REQUIRED)
# CMakeList.txt
ament_auto_package(
  INSTALL_TO_SHARE
  launch
  config
)

image

.cpp代码文件

(1)声明参数:
this->declare_parameter<变量类型>("参数名",默认值)
(2)读取参数: 对应变量类型赋进去
变量类型 变量名=this->get_parameter("参数名称").强制类型转换(as_string())

#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文件写法

键值对的形式
注意缩进!严格空两格

package_name:(可用/**代替)
  ros__parameters:(ros2空间)
    param:(可以有多级目录)
	  key:value

->若采用多级目录,则调用时需要加点往下找 (类似于struct)
eg "tracker.max_match_distance"

/**:
  ros__parameters:
    greeting: "aaaaaaa"
    name: "skjhdgfhskalsjdfk"
    ExposureTime: 3432234

launch.py文件写法

注意检查所有包名!

import launch
import os
from launch import LaunchDescription
from launch.actions import LogInfo
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    current_dir = os.getcwd()  # 获取当前工作目录
    print(f"Current directory: {current_dir}")  # 打印当前目录
    
     # 拼接文件路径:相对路径
    config_file_path = os.path.join(get_package_share_directory('config_learn'), 'config', 'params.yaml')
    
	"""
	如果launch和config被拉到了ros下:
		get_package_share_directory('config_learn')
	否则需要从该级目录下一层一层往下找:
		config_file_path = os.path.join(current_dir, 'install', 'bag_to_image', 'share', 'bag_to_image', 'config', 'params.yaml')
	"""
	
    # 声明参数文件路径的启动参数
    return LaunchDescription([
        
        # 启动节点并加载参数文件
        Node(
            package='config_learn',  # 你的包名
            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"
        )
    ])

注意启动时一定要通过launch启动才能读取config内的参数!

posted @ 2025-04-01 21:13  White_ink  阅读(49)  评论(0)    收藏  举报