最近在调试移动机器人的PID参数,我在想如果像以前那样调参的话,每次都要反反复复重新下载代码更新参数,如果有一种可以直接可视化修改参数,并且能实时更新底层控制,那该多好啊!其实这个问题ROS已经为你想好了!那就是非常好用的功能包——dynamic_reconfigure!!!
开始搞起来!
目录
2、创建一个新的功能包(名为dynamic_reconfigure_test)
三、配置CMakeList文件以及package.xml文件
一、创建功能包
1、进入工作空间
cd robot_ws/src
2、创建一个新的功能包(名为dynamic_reconfigure_test)
注:后面是需要的依赖功能包
catkin_create_pkg dynamic_reconfigure_test rospy roscpp dynamic_reconfigure
二、编写配置文件
1、新建一个cfg文件夹
mkdir cfg
2、新建一个cfg文件(我们的可视化界面内容)
touch pid.cfg
3、编写cfg文件(我创建了一个名为pid.cfg)
#!/usr/bin/env python
PACKAGE = "dynamic_reconfigure_test"
# 导入dynamic_reconfigure功能包提供的参数生成器(parameter generator)
from dynamic_reconfigure.parameter_generator_catkin import *
# 创建一个参数生成器
gen = ParameterGenerator()
# 定义动态配置的参数
gen.add("KP", double_t, 0, "KP_param", 0.0, 0, 500)
gen.add("KI", double_t, 0, "KI_param", 0.0, 0, 500)
gen.add("KD", double_t, 0, "KD_param", 0.0, 0, 500)
# 退出
exit(gen.generate(PACKAGE, "dynamic_PID", "pid"))
add(name,type,level,description,default,min,max)
- name:参数名,用字符串表示
- type:数据类型,(int_t,double_t,str_t,bool_t)
- level:掩码(可用于查看参数是否修改)默认写0就行
- description:描述,用于描述该参数的作用,简单明了即可~
- default:默认值,设置参数的默认值
- min:参数的最小值
- max:参数的最大值
4、给配置文件设置权限
我们先查看当前文件的权限:
ll
我们可以发现该文件其实没有可执行的功能!
故我们给它添加可执行的功能!
chmod a+x pid.cfg
a+x:表示给所有用户添加可执行功能
三、配置CMakeList文件以及package.xml文件
1、CMakeList文件
因为我们一开始创建新的功能包就包含了dynamic_reconfigure 这个功能包,所以已经有了!
如果是后面在自己的原有基础上加功能的话,记得写上!
往下查找可以看到这个,修改成自己的cfg文件名
继续往下查找,将这一行取消注释即可
如果是后面在自己的原有基础上加功能的话,记得写上!
2、package.xml文件
因为我们一开始创建新的功能包就包含了dynamic_reconfigure 这个功能包,所以已经有了!
如果是后面在自己的原有基础上加功能的话,记得写上!
四、先进行编译!
先进行编译的目的是生成需要的头文件
我们只对该功能包编译,可以这样写:
catkin_make -DCATKIN_WHITELIST_PACKAGES="dynamic_reconfigure_test"
我们可以看到生成的一个名为pidConfig.h的头文件!后面的文件我们需要包含它!
这样的话我们的配置文件就初步完成了!接下来编写服务器节点!
五、创建服务器节点
1、创建一个cpp文件(名dynamic_test.cpp)
dynamic_test.cpp
#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <dynamic_reconfigure_test/pidConfig.h>
float KP = 0.0;
float KI = 0.0;
float KD = 0.0;
//回调函数
void Callback(dynamic_reconfigure_test::pidConfig &config)
{
KP = config.KP;
KI = config.KI;
KD = config.KD;
ROS_INFO("KP KI KD = [%f %f %f]",KP,KI,KD);
}
int main(int argc,char **argv)
{
//初始化,创建节点
ros::init(argc,argv,"dynamic_test");
//创建一个参数动态配置的服务器实例
dynamic_reconfigure::Server<dynamic_reconfigure_test::pidConfig> server;
//定义回调函数
dynamic_reconfigure::Server<dynamic_reconfigure_test::pidConfig>::CallbackType f;
//将回调函数和服务端绑定,当客户端请求修改参数时,服务器跳转到回调函数进行处理
f = boost::bind(&Callback,_1);
server.setCallback(f);
ros::spin();
return 0;
}
六、配置CMakeList文件
开始编译!!
七、运行~!~
roscore
rosrun dynamic_reconfigure_test dynamic_test
rosrun rqt_reconfigure rqt_reconfigure
这样的话动态调参就OK啦!如果后续想实现远程调参,这可以将数据下发到底层,而底层将数据上报,实现双向数据互换~就可以远程调参啦!