动态配置参数

  • 1. 新建功能包
  • 2. 创建cfg文件
  • 3. 节点文件
  • 4. 启动配置

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参数发送给下位机实现动态调参