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
)

.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"
)
])

浙公网安备 33010602011771号