【ros2】ROS2 C++参数设置指南(含跨节点修改方法)
文章目录
- ROS2 C++参数设置指南(含跨节点修改方法)
-
- 一、核心概念:参数的定义与作用
- 二、C++参数设置核心步骤(基于书中第4章)
-
- 1. 前置准备:创建功能包
- 2. 节点中声明与使用参数
-
- (1)声明参数
- (2)获取参数值
- (3)主动修改参数值
- 3. 配置参数回调(监听参数变化)
- 4. 编译与运行配置
-
- (1)修改CMakeLists.txt
- (2)编译并运行
- 三、参数高级用法(书外拓展)
-
- 1. 命令行参数操作
- 2. 启动时加载参数文件
-
- (1)创建参数文件(`params.yaml`)
- (2)启动节点时加载
- 3. 参数约束与元数据
- 4. 持久化参数
- 四、跨节点修改参数的方法
-
- 1. 核心原理
- 2. 实现步骤
-
- (1)角色定义
- (2)控制节点(客户端)实现
- (3)目标节点配置
- (4)编译与运行
- 3. 跨节点参数查询
- 五、常见问题与解决方案
- 六、总结
ROS2 C++参数设置指南(含跨节点修改方法)
一、核心概念:参数的定义与作用
参数(Parameter)是ROS2中用于动态配置节点行为的键值对(Key-Value),支持运行时修改,无需重新编译代码。其核心特点包括:
- 动态性:可在节点运行时查询、修改,实时生效。
- 类型安全:支持整数、浮点数、布尔值、字符串、数组等类型。
- 节点私有性:默认归属于某个节点,通过命名空间隔离。
- 持久性:可配置为持久化存储,节点重启后保留参数值。
参数广泛应用于机器人系统的动态配置,如调整PID控制器参数、设置传感器采样频率、配置路径规划阈值等。
二、C++参数设置核心步骤(基于书中第4章)
1. 前置准备:创建功能包
参数操作依赖ROS2 C++核心库rclcpp和参数接口库rclcpp_components,创建功能包:
ros2 pkg create cpp_parameter_demo --build-type ament_cmake --dependencies rclcpp rclcpp_components
2. 节点中声明与使用参数
(1)声明参数
在节点构造函数中,通过declare_parameter方法声明参数(指定名称、默认值和类型):
#include "rclcpp/rclcpp.hpp"class ParamDemoNode : public rclcpp::Node {
public:ParamDemoNode() : Node("param_demo_node") {// 声明参数:名称、默认值(自动推断类型)this->declare_parameter("max_speed", 0.5); // 浮点型(m/s)this->declare_parameter("use_safety_mode", true); // 布尔型this->declare_parameter("robot_name", "turtlebot3"); // 字符串this->declare_parameter("target_positions", std::vector<double>{1.0, 2.0, 3.0}); // 浮点数组RCLCPP_INFO(this->get_logger(), "参数节点初始化完成");}
(2)获取参数值
通过get_parameter方法获取参数当前值,支持显式类型转换:
private:void print_parameters() {// 方法1:通过get_parameter获取Parameter对象rclcpp::Parameter max_speed_param = this->get_parameter("max_speed");double max_speed = max_speed_param.as_double(); // 显式转换类型// 方法2:直接获取值(推荐,简洁)bool use_safety = this->get_parameter("use_safety_mode").as_bool();std::string robot_name = this->get_parameter("robot_name").as_string();std::vector<double> targets = this->get_parameter("target_positions").as_double_array();// 打印参数值RCLCPP_INFO(this->get_logger(), "当前参数:");RCLCPP_INFO(this->get_logger(), "max_speed: %.2f m/s", max_speed);RCLCPP_INFO(this->get_logger(), "use_safety_mode: %s", use_safety ? "true" : "false");RCLCPP_INFO(this->get_logger(), "robot_name: %s", robot_name.c_str());RCLCPP_INFO(this->get_logger(