最近做项目需要用到动态配置PID参数,于是将dynamic_reconfigure
学了一下,在此开个博文记录一下过程,同时也希望对有需要的同学能起到一些帮助。
1. 新建功能包
cd catkin_ws/src
catkin_create_pkg pid roscpp rospy rosmsg std_msgs dynamic_reconfigure
2. 创建cfg文件
新建一个cfg文件夹,在里面新建一个.cfg
文件
mkdir cfg
cd cfg
touch PID.cfg
动态调参的核心API:
gen.add(name,type, level,description, default, min,max)
参数说明:
- name:变量名称
- type:类型名称,常用类型有: int_t、double_t、 str_t、bool_t
- level:一个标记位,只要参数被修改了,就会改为这个值
- description:参数的描述
- default:默认值
- min:可选, 参数最小值
- max:可选, 参数最大值
例,动态调整PID参数的内容如下:
#! /usr/bin/env python
# coding=utf-8
import roslib
from dynamic_reconfigure.parameter_generator_catkin import *
PACKAGE = "pid"
roslib.load_manifest(PACKAGE)
# 创建一个参数生成器
gen = ParameterGenerator()
# 添加参数说明,便于后续生成界面
# 参数名 类型 等级 参数描述 默认值 最小值 最大值
gen.add("p", double_t, 0, "KP param.", 0.0, -100.00, 100.00)
gen.add("i", double_t, 0, "KI param.", 0.0, -100.00, 100.00)
gen.add("d", double_t, 0, "KD param.", 0.0, -100.00, 100.00)
# 调用生成器生成config配置文件
# 包名 节点名称 生成文件名
exit(gen.generate(PACKAGE, PACKAGE, "PID"))
之后将PID.cfg设置为可执行文件,可以右键属性设置,也可以通过命令行设置:
chmod a+x PID.cfg
还要在CMakelist.txt中将下列注释打开:
## Generate dynamic reconfigure parameters in the 'cfg' folder
generate_dynamic_reconfigure_options(
cfg/PID.cfg # 注意这里要填自己的路径
)
3. 节点文件
和正常新建py节点文件步骤一样,这里就不再赘述了 这里的案例写了一个PID动态调参的,这里直接代码和注释放上:
# 导入依赖
from pid.cfg import PIDConfig
from dynamic_reconfigure.server import Server
from std_msgs.msg import Float32MultiArray
import rospy
class UpdatePID():
def __init__(self):
rospy.init_node("update_pid")
rospy.on_shutdown(self.shutdown)
# 执行频率
rate = rospy.Rate(20)
# 声明一个消息发布者, 将消息发布到driver
self.publisher_pid = rospy.Publisher("/pid", Float32MultiArray, queue_size=100)
# 启动参数配置服务器 当参数变化时的回调
Server(PIDConfig, self.dynamic_callback)
# 打印一个启动成功的日志
rospy.loginfo("updatePID_node start success! Bring up rqt_reconfigure to control the pid ...")
# 让ros节点跑起来
while not rospy.is_shutdown():
rate.sleep()
# 通过回调函数中获取rqt界面上的数值
def dynamic_callback(self, config, level):
"""
当参数发生变化时的回调函数
:param config: 配置文件
:param level: 修改的状态
:return:
"""
# 封装消息
kp = config["p"]
ki = config["i"]
kd = config["d"]
pid_msg = Float32MultiArray()
pid_msg.data.append(kp)
pid_msg.data.append(ki)
pid_msg.data.append(kd)
# 将消息发布出去
self.publisher_pid.publish(pid_msg)
print (config, level)
return config
def shutdown(self):
print ("stop robot ...")
if __name__ == '__main__':
UpdatePID()
之后记得给予py文件可执行权限
chmod a+x updatePID_node.py
4. 启动配置
运行roscore
roscore
catkin_make
一下
cd ~/catkin_ws
catkin_make
启动节点文件
source devel/setup.bash
rosrun pid UpdatePIDNode.py
此时,记得打开rqt_reconfigure
进行动态调参
rosrun rqt_reconfigure rqt_reconfigure
此时也可以在rqt_topic
中查看节点是否正常运行
之后根据实际需求将pid参数发送给下位机实现动态调参