ROS2 C++ 调参——( 2 ) 使用 rqt 插件 Dynamic Reconfigure 及 动态参数

如若有错,请多指教,哪里有疑惑也可以联系我,看到我会回复的



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> &parameters); //回调函数
定义

需要在构造函数里面定义 OnSetParametersCallbackHandle 变量

parameter_event_subscriber_ = add_on_set_parameters_callback(
[this](const std::vector<rclcpp::Parameter> &parameters) -> rcl_interfaces::msg::SetParametersResult
{
	parameterCallback(parameters);
	return rcl_interfaces::msg::SetParametersResult();
});
编写回调函数

我提供了 一个按参数名字响应的 和 一个按参数类型响应的

void Template::parameterCallback(const std::vector<rclcpp::Parameter> &parameters)
{
	for (const auto &parameter : 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🤧

  1. [未解决] 那个回调函数导致 Dynamic Reconfigure 不能修改参数值,只能进入回调函数,还有 ros2 param set 命令不能修改参数值
  2. [未解决] Dynamic Reconfigure 和 rqt 的另一个插件 Plot 一起用导致 Plot 无法使用
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值