• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

ROS学习记录–动态调参

人工智能 小黑鸭 1296次浏览 0个评论

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


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ROS学习记录–动态调参
喜欢 (0)

您必须 登录 才能发表评论!

加载中……