在ROS 2中,参数(Parameters)系统相比于ROS 1有了较大的改进。主要区别:
rosparam
工具来设置和获取的,并且它们通常存储在一个中心化的服务器上,即rosparam
服务器。rosparam load_file
命令加载到系统中。rclcpp::Node::declare_parameter()
来声明一个参数,并使用get_parameter()
或get_parameter_or()
来获取它的值。set_parameters
或set_parameters_atomically
可以修改参数值,并且有机制确保原子性操作。在ROS 2中,参数(Parameters)的操作接口主要通过rclcpp
库中的Node
类和其他相关的类来实现。以下是一些关键的接口函数,用于创建、查询、更新和删除参数:
declare_parameter
: 声明一个参数,并可指定默认值。
this->declare_parameter("example_param", 10);
获取单个参数:
get_parameter
: 获取指定名称的参数对象。
get_parameter_or
: 获取指定名称的参数,如果不存在则返回默认值。
auto param = this->get_parameter("example_param");
int value = this->get_parameter_or("example_param", 10).as_int();
批量获取参数:
get_parameters
: 同时获取多个参数。
std::vector params = this->get_parameters({"param1", "param2"});
设置单个参数:
set_parameters
: 设置一个或多个参数。
std::vector new_params = {
rclcpp::Parameter("example_param", 20)
};
auto result = this->set_parameters(new_params);
设置参数原子操作:
set_parameters_atomically
: 设置一个或多个参数,并保证操作的原子性。
auto result = this->set_parameters_atomically(new_params);
监听参数变更:
add_on_set_parameter_callback
: 添加一个回调函数,当参数值发生变化时触发。
auto cb = [this](std::shared_ptr event) {
RCLCPP_INFO(this->get_logger(), "Parameter changed: %s", event->name.c_str());
};
this->add_on_set_parameter_callback(cb);
删除参数:
remove_parameter
: 删除指定名称的参数。
this->remove_parameter("example_param");
列出所有参数:
list_parameters
: 列出节点的所有参数。
std::vector param_names = this->list_parameters({"*"}, 10);
ROS2中的参数操作是基于服务通信实现的,每个节点进程在node创建过程时,需要建立如下六个和参数管理相关的基础服务:
/get_parameters
rcl_interfaces/srv/GetParameters
rclcpp::Parameter
对象,每个对象对应一个请求的参数及其值。/set_parameters
rcl_interfaces/srv/SetParameters
rclcpp::Parameter
对象,每个对象包含一个参数名称及其新值。rcl_interfaces/msg/SetParametersResult
对象,每个对象对应一个设置的结果(成功或失败)。/set_parameters_atomically
rcl_interfaces/srv/SetParametersAtomically
SetParameters
类似,但强调原子性。/list_parameters
rcl_interfaces/srv/ListParameters
/describe_parameters
rcl_interfaces/srv/DescribeParameters
rcl_interfaces/msg/ParameterDescriptor
对象,每个对象描述一个参数的信息。/get_parameter_types
rcl_interfaces/srv/GetParameterTypes
创建流程图如下所示: