ROS 2 参数使用
介绍
ROS 2 (Robot Operating System 2) 是一个为机器人开发提供支持的开源框架。它继承了 ROS 1 的优点,并且在架构上做了许多改进以支持分布式系统、实时性、安全性等要求。ROS 2 中的参数是用于配置节点行为的关键部分,允许我们动态调整和控制机器人系统的运行方式。
在这篇文章中,我们将探讨如何在 ROS 2 中使用 C++ 处理参数,详细讲解参数的声明、获取、设置以及使用场景。
ROS 2 参数概述
ROS 2 参数是一种键值对,键是参数的名称,值是对应的数据。参数的主要功能包括:
- 配置节点行为:通过调整参数,可以改变节点的运行模式或行为。
- 持久性:参数可以在节点运行期间被动态修改,而不会重启节点。
- 类型支持:ROS 2 支持多种数据类型作为参数,例如
int
,float
,bool
,string
, 以及数组类型。
参数声明与获取
在 ROS 2 中,参数是在节点内声明的。每个参数都有一个名称和类型,并且可以指定一个默认值。参数的声明和获取通常在节点的构造函数或 onInit
方法中完成。
#include "rclcpp/rclcpp.hpp"
class MyNode : public rclcpp::Node {
public:
MyNode() : Node("param_static_node") {
// 声明参数
this->declare_parameter<int>("param_int", 42);
this->declare_parameter<std::string>("param_str", "default_value");
// 获取参数
int param_int;
std::string param_str;
this->get_parameter("param_int", param_int);
this->get_parameter("param_str", param_str);
RCLCPP_INFO(this->get_logger(), "param_int: %d", param_int);
RCLCPP_INFO(this->get_logger(), "param_str: %s", param_str.c_str());
}
};
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MyNode>());
rclcpp::shutdown();
return 0;
}
ros2 run <my_package> <my_node> --ros-args -p param_int:=100 -p param_str:="new_value"
在上面的示例中,我们声明了两个参数 param_int
和 param_str
,并分别为它们指定了值 100 和 “new_value”。然后,我们使用 get_parameter
方法获取这些参数的值。
动态参数更新
在某些情况下,我们希望能够在节点运行时动态地更新参数值,而不需要重启节点。ROS 2 提供了参数事件回调机制,可以检测到参数的变化并做出相应的处理。
#include "rclcpp/rclcpp.hpp"
#include "rcl_interfaces/msg/set_parameters_result.hpp"
class MyDynamicNode : public rclcpp::Node {
public:
MyDynamicNode() : Node("param_dynamic_node") {
// 声明参数
this->declare_parameter<int>("dynamic_param", 10);
// 添加参数更改回调
parameter_callback_handle_ = this->add_on_set_parameters_callback(
[this](const std::vector<rclcpp::Parameter> ¶ms) {
rcl_interfaces::msg::SetParametersResult result;
result.successful = true;
for (const auto ¶m : params) {
if (param.get_name() == "dynamic_param") {
RCLCPP_INFO(this->get_logger(), "dynamic_param updated: %d", param.as_int());
}
}
return result;
}
);
}
private:
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr parameter_callback_handle_;
};
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MyDynamicNode>());
rclcpp::shutdown();
return 0;
}
ros2 run param <my_package> <my_node>
ros2 param set /<my_node> dynamic_param 60
在这个示例中,我们使用 add_on_set_parameters_callback
方法来添加参数更新的回调函数。每当 dynamic_param
参数被更新时,节点会通过日志输出新参数的值。
参数服务
ROS 2 中的每个节点都可以通过参数服务来获取、设置和列出参数。默认情况下,ROS 2 提供了三个服务:
get_parameters
set_parameters
list_parameters
这些服务可以通过命令行工具或其他节点进行调用。例如,使用 ros2 param
命令行工具,我们可以获取和设置节点参数:
ros2 param set /my_node param_int 100
ros2 param get /my_node param_int
参数的实际应用场景
在实际应用中,参数通常用于配置机器人系统的各种行为。以下是一些常见的使用场景:
- 传感器配置:例如设置激光雷达的扫描频率或分辨率。
- 控制算法:调整控制算法的增益或阈值。
- 通信配置:设置节点间的通信频率或数据传输格式。
结论
在 ROS 2 中使用参数可以使节点的配置更加灵活和动态,避免了硬编码和频繁重启带来的不便。通过 C++,我们可以轻松地声明、获取、更新参数,并利用参数事件回调机制处理参数的动态变化。
希望这篇文章能帮助你更好地理解和使用 ROS 2 参数。如果你正在开发一个 ROS 2 项目,尝试将参数集成到你的节点中,来提高系统的灵活性和可维护性。