ROS2 节点可以声明多个参数,其它节点可以查看或修改参数,参数的设置和获取实际是通过服务实现的,只是 ROS2 提供了针对参数提供了更加方便的 API

C++ 节点声明参数

  1. 创建一个功能包

    1
    
    ros2 pkg create  cpp_param_declare_demo --destination-directory src --build-type ament_cmake --dependencies rclcpp --license Apache-2.0
  2. 声明参数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    #include "rclcpp/executors.hpp"
    
    class ParamNode : public rclcpp::Node {
    public:
        ParamNode() : Node("param_node") {
            // 声明参数
            declare_parameter("int_param", 10086);
            // 获取参数默认值
            get_parameter("int_param", int_param_);
    
            RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "int param default value is : %ld", int_param_);
        }
    
    private:
        int64_t int_param_;
    };
    
    int main(int argc, char* argv[]) {
        rclcpp::init(argc, argv);
    
        auto node = std::make_shared<ParamNode>();
        rclcpp::spin(node);
    
        rclcpp::shutdown();
        return 0;
    }

可以通过 ros2 param get param_node int_param 命令获取节点的参数

监听节点参数被修改的事件

通过节点的 add_on_set_parameters_callback API 添加参数改变的回调函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
auto paramCb = [this](const std::vector<rclcpp::Parameter>& parameters) -> auto {
    rcl_interfaces::msg::SetParametersResult result;
    result.successful = true;
    for (const auto& parameter : parameters) {
        int_param_ = parameter.as_int();
        RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "param changed to : %ld", int_param_);
    }
    return result;
};
handle_ = add_on_set_parameters_callback(paramCb);

使用 ros2 param set param_node int_param 11111 可以看到参数修改为指定的值,输出下面日志:

1
[INFO] [1766931105.659879840] [rclcpp]: param changed to : 111111

获取和设置其它节点的参数

节点自动提供了以下服务用于操作参数:

1
2
3
4
5
6
7
/param_node/describe_parameters: rcl_interfaces/srv/DescribeParameters
/param_node/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/param_node/get_parameters: rcl_interfaces/srv/GetParameters
/param_node/get_type_description: type_description_interfaces/srv/GetTypeDescription
/param_node/list_parameters: rcl_interfaces/srv/ListParameters
/param_node/set_parameters: rcl_interfaces/srv/SetParameters
/param_node/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically

所以设置或获取其它节点可以用调用服务的方式,具体参考 [[Denote query for ‘20251228T140129’]]

启动时修改参数

使用 ros2 run 启动节点时可以设置参数的值

1
ros2 run cpp_param_declare_demo cpp_param_declare_demo --ros-args -p int_param:=12345

启动后可以看到参数为设置的值,而不是代码中的默认值

1
[INFO] [1766934109.576643905] [rclcpp]: int param default value is : 12345