ROS学习记录–动态调参

80
0
2020年11月17日 12时06分

最近做项目需要用到动态配置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参数发送给下位机实现动态调参

发表评论

后才能评论