如若有错,请多指教,哪里有疑惑也可以联系我,看到我会回复的
1 效果图
Dynamic Reconfigure 插件页面
并且每次更改参数时候代码可以响应
2 如何打开 Dynamic Reconfigure
运行节点后打开 Dynamic Reconfigure 后如果没有你的节点就点下面的 Refresh 刷新一下
2.1 命令行打开
启动节点后,终端输入 rqt 打开 rqt
rqt
- 选择 Plugins -> Configuration -> Dynamic Reconfigure 即可打开插件
2.2 命令行打开(2)
ros2 run rqt_reconfigure rqt_reconfigure
2.3 Launch 文件打开
- 用命令行的方法打开有点麻烦,所以 ROS2 支持 Launch 文件打开,只需在 Launch 文件中插入以下代码就可以了
Node(
package='rqt_gui',
executable='rqt_gui',
output='screen',
arguments=['--standalone', # 让 rqt 独立于 ROS2 启动,ChatGPT 如此解释,我把这行参数注释了反倒开始报错了,没有弄得很懂
'rqt_reconfigure.param_plugin.ParamPlugin' # 插件名称,换成其他名称就可以打开其他插件了
],
),
3 动态参数
3.1 导包
CMakeLists.txt
find_package(rcl_interfaces REQUIRED)
hpp
#include <rcl_interfaces/msg/parameter_descriptor.hpp>
#include "rcl_interfaces/msg/integer_range.hpp"
#include "rcl_interfaces/msg/set_parameters_result.hpp"
3.2 定义参数
bool string
这两个变量就直接正常定义就可以
declare_parameter<bool>("param_bool", true);
declare_parameter<string>("param_string", "ICE1");
int
定义 ParameterDescriptor 变量 和 IntegerRange 变量
auto pd_int = std::make_shared<rcl_interfaces::msg::ParameterDescriptor>();
auto pd_int_range = std::make_shared<rcl_interfaces::msg::IntegerRange>();
pd_int_range->from_value = 1; //范围起始值
pd_int_range->to_value = 24; //范围终止值
pd_int_range->step = 1; //步长
pd_int-integer_range.emplace_back(*pd_int_range);
pd_int->description = "ICE: this is a int param "; //这个是在 Dynamic Reconfigure 中把鼠标放到那个参数上会显示这么一句话
定义参数
declare_parameter<int>("param_int", 15, *pd_int);
double
定义ParameterDescriptor 变量 和 FloatingPointRange 变量
auto pd_double = std::make_shared<rcl_interfaces::msg::ParameterDescriptor>();
auto pd_double_range = std::make_shared<rcl_interfaces::msg::FloatingPointRange>();
pd_double_range->from_value = 1.3; //范围起始值
pd_double_range->to_value = 24.6; //范围终止值
pd_double_range->step = 1; //步长
pd_double>floating_point_range.emplace_back(*pd_double_range);
pd_double->description = "ICE: this is a double param "; //这个是在 Dynamic Reconfigure 中把鼠标放到那个参数上会显示这么一句话
定义参数
declare_parameter<double>("param_double", 10.3, *pd_double);
这里一定要注意一点就是定义参数默认值的时候,默认值为范围起始值 加上 n个步长,比如上面的 范围起始值是 1.3,步长是 1,那默认值只能是1.3 2.3 3.3 4.3 ,不然运行的时候代码会报错,但是在 Dynamic Reconfigure 中设置参数值的时候没有这个奇怪的要求,定义 double 需要留意这个问题,定义 int 没什#么事,毕竟定义 int 的时候就默认遵守了这个规则
3.3 设置动态调参回调函数
可以动态调参了,当然也需要动态的知晓变动
声明
需要声明两个东西,分别是 OnSetParametersCallbackHandle 变量 和 回调函数,这两个按自己的代码习惯放置
rclcpp::Node::OnSetParametersCallbackHandle::SharedPtr parameter_event_subscriber_; //OnSetParametersCallbackHandle 变量
void parameterCallback(const std::vector<rclcpp::Parameter> ¶meters); //回调函数
定义
需要在构造函数里面定义 OnSetParametersCallbackHandle 变量
parameter_event_subscriber_ = add_on_set_parameters_callback(
[this](const std::vector<rclcpp::Parameter> ¶meters) -> rcl_interfaces::msg::SetParametersResult
{
parameterCallback(parameters);
return rcl_interfaces::msg::SetParametersResult();
});
编写回调函数
我提供了 一个按参数名字响应的 和 一个按参数类型响应的
void Template::parameterCallback(const std::vector<rclcpp::Parameter> ¶meters)
{
for (const auto ¶meter : parameters) //遍历数组
{
static int num = 1;
cout << RED << " 第 " << num++ << " 次 : " << RESET; //这里是一个计数器,是我个人的一个编程习惯
// if(parameter.get_name()=="param_int")
// cout <<BLUE<<"ICE : param_int : "<< parameter.as_int()<<RESET<<endl;
// if (parameter.get_name() == "param_double")
// cout << BLUE << "ICE : param_double : " << parameter.as_double() << RESET << endl;
// if (parameter.get_name() == "param_bool")
// cout << BLUE << "ICE : param_bool : " << parameter.as_bool() << RESET << endl;
// if (parameter.get_name() == "param_string")
// cout << BLUE << "ICE : param_string : " << parameter.as_string() << RESET << endl;
switch (parameter.get_type())
{
case rclcpp::ParameterType::PARAMETER_INTEGER:
cout << BLUE << "ICE : param_int : " << parameter.as_int() << RESET << endl;
break;
case rclcpp::ParameterType::PARAMETER_DOUBLE:
cout << BLUE << "ICE : param_double : " << parameter.as_double() << RESET << endl;
break;
case rclcpp::ParameterType::PARAMETER_BOOL:
cout << BLUE << "ICE : param_bool : " << parameter.as_bool() << RESET << endl;
break;
case rclcpp::ParameterType::PARAMETER_STRING:
cout << BLUE << "ICE : param_string : " << parameter.as_string() << RESET << endl;
break;
}
}
}
4 参考文章
5 Bug🤧
- [未解决] 那个回调函数导致 Dynamic Reconfigure 不能修改参数值,只能进入回调函数,还有
ros2 param set
命令不能修改参数值 - [未解决] Dynamic Reconfigure 和 rqt 的另一个插件 Plot 一起用导致 Plot 无法使用