PID控制---基于python模拟

news2025/1/19 11:30:31

    PID是控制中非常经典的一个模型,利用P(比例)、I(微分)、D(积分)三者相互合作来实现对一个信号的闭环控制,同时可以让信号波形平滑变化而不是突变。以下主要是结合一个python实现的控制速度的程序来模拟PID的过程。

参考博客:电机控制进阶——PID速度控制_pid速度控制算法_码农爱学习的博客-CSDN博客 

目录

简述 

P(比例)

I(微分)

D(积分)

基于Python的速度调整

Kp=0.01,Ki=0,Kd=0

Kp=0.01,Ki=0.01,Kd=0

Kp=0.01,Ki=0.01,Kd=0.01


简述 

    PID控制分为增量式和位置式两种控制方式,因为位置式用的比较多,因此我就以位置式的为主展开(增量式我参考的博客中有,如果有兴趣可以自行了解)。

    位置式PID控制主要由P(比例)、I(微分)、D(积分)三个部分组成,下面是一个简单的结构框图。

     假设当前设定的是速度,可以看到利用目标速度-实际速度,可以得到一个误差,根据这个误差经过P、I、D三种量的运算求和得到当前需要的修正量对实际值修正,然后使得最终实际值不断接近目标值。

下面是对PID单独的解释:

P(比例)

    P大致反映的改变量大小,与当前值和目标值的差距大小有关,差距越大,那么这个量也越大。      就拿推箱子举例,离目的地越远,那么你用的力也就越大,这样才能更快达到目的地,相反,要是距离目的地很近了,这时候就需要少点用力,不然就就会偏离目标更远。

I(微分)

    I大致反映的是阻力的大小,在连续情况中反映为导数,而在一般工程学的离散情况中就是两次测量误差的差值,也就是此次误差和上一次误差的差分。 

    这其实就是相当于阻力的作用, 无论你怎么调整,我都反向变化,这在最后平衡附近震荡时是很有效的,能够显著降低震荡幅度。

D(积分)

    D大致是针对不同阶段的调整做法,与调整的误差和有关。

    这个量主要是解决静态平衡的问题,假如有一个池子,有一个预期水位,有放水有漏水,一次调整周期内,放水为u,漏水为u,那么调整后水位依旧如此,下一个状态和上一个状态完全一致,那么P和I也是和上一个状态完全一致,那么调整后还是这个状态,就陷入了死循环,此时就需要D这个量,由于这个量是和误差和直接相关,那么每次调整,误差都会增加,那么下次调整的量就会和这次的不一样,就可以打破这个死循环。

基于Python的速度调整

下面主要是针对PID模型建立速度调整的模型,就以将速度从60调整至100为例,最终的精度要求是0.001,可以感受一下各个量的作用。

为了稳定的效果,我将几个系数都设置的比较小,大了很有可能就最终直接NaN了,可以自行调参设置。

代码如下:

from matplotlib import pyplot as plt

def PID(now_v,expc_v):
    Kp = 0.01
    Ki = 0
    Kd = 0
    sum_err = 0
    v_list = []
    err = expc_v - now_v
    err_last = err  # 上一次的输出,先初始化为一致
    cnt = 0
    while abs(err) > 0.001:  # 误差还在范围外
        err = expc_v - now_v
        sum_err += err
        uk = Kp*err + Ki * sum_err + Kd * (err-err_last) # 确定本次输出
        # now_v = now_v + uk + random.uniform(0,0)  # 更新当前速度,加入一个扰动
        now_v = now_v + uk
        err_last = err
        v_list.append(now_v)
        cnt += 1
    print(cnt)
    plt.plot(v_list)
    plt.show()

if __name__ == '__main__':
    PID(60,100)

Kp=0.01,Ki=0,Kd=0

此时表示的是仅利用P来控制,运行后发现下面的调整过程

看上去非常理想,因为这种情况本身就比较理想, 如果我加入了一个扰动项,那么就会变成下面这样,将速度加入随机扰动项。

now_v = now_v + uk + random.uniform(-0.1,0.1)  # 更新当前速度,加入一个扰动

 经过测试,比较小的扰动还是可以很快收敛,但是如果扰动比较大,比如为(-2,2),那么就会像下面这样

 到了五千轮左右才收敛,随着误差的增大,这个此时会变得更多,因此仅仅靠P来控制仅适用于理想情况。

Kp=0.01,Ki=0.01,Kd=0

此时加入了I这个量,这个量在前面说主要是为了消除震荡,可以很好消除外部的一些影响,同样设置(-2,2)的随机扰动,如下:

 发现在2500轮左右就实现了精度的要求,不过从实验来看,效果并不是很明显,可能是因为参数还没有调好。

Kp=0.01,Ki=0.01,Kd=0.01

这种情况下就是加入了累积误差项的调整,就是完整的PID过程。

还是在(-2,2)的随机误差情况下,这种组合的相对调整次数确实会少一点。

 以上就是关于PID的一些个人理解,就是简单调试,没有真正调参,就当是做个记录了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOA与中间件、基础件的发展

应运而生的SOA   美国著名的IT市场研究和顾问咨询公司Gartner预测:到2006年,采用面向服务的企业级应用将占全球销售出的所有商业应用产品的80 以上到2008年,SOA将成为绝对主流的软件工程实践方法。近几年全球各大IT巨头纷纷推出自己的面向服务的应用平…

WordPress切换为经典编辑器可视化/文本切换不显示解决方法

WordPress文章编辑器切换为经典编辑器可视化/文本状态无法切换消失的问题有用户遇到过,出现这样的问题时,我们首先应该回忆一下,之前自己进行了哪些操作导致这种情况的出现,比如: 更换了新主题? 安装了新插…

软考高项 - 计算公式汇总整理

大家好,我是陈哈哈,我准备参加23年5月份的软考信息项目管理师考试,学习之余还是习惯做一些重点、考点的记录,用于自己复习,以及分享给日后考试的考友,啥都不说了,祝通过🌹&#x1f3…

【设计模式】UML类图与软件设计原则

1,设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(Christopher Alexand…

Docker基础学习1

Docker 1 Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来&…

数字温度传感器-DS18B20

文章目录 一、DS18B20器件图二、DS18B20特点三、DS18B20内部结构内部构成 四、工作时序1.初始化时序2.ReadOneChar2.WriteOneChar 一、DS18B20器件图 DS18B20的管脚排列: GND为电源地;DQ为数字信号输入/输出端;VDD为外接供电电源…

【车载助手形象系列二】---车载助手数智人形象制作可以使用AI绘图替代?

上期分享了《车载助手形象系列:数智人入门级介绍》,本期主要讲解下数智人形象制作过程 数字人形象 数智人覆盖了卡通、二次元、写实等多元化风格的虚拟形象,可高精度还原表情和躯干动作,提供涵盖人物设计、3D制作、内容制作、IP运…

深度学习之torchvision、多层感知器与激活函数

文章目录 1 torchvision库与加载内置图片数据集2 多层感知器3 激活函数3.1 ReLU激活函数3.2 Sigmoid激活函数3.3 Tanh激活函数3.4 LeakyReLU激活函数 学习笔记 1 torchvision库与加载内置图片数据集 torchvision库是PyTorch中用来处理图像和视频的一个辅助库,提供了…

Docker部署文本语义检索系统

Docker 部署 pipelines服务 需求:基于docker部署百度飞桨公开项目pipelines服务之 端到端文本语义检索系统 项目链接:https://aistudio.baidu.com/aistudio/projectdetail/3351784?channelType0&channel0 代码地址:https://gitee.com/pa…

03 Kubernetes 系统快速入门

课件 Kubernetes 中的 ownerReference 字段用于建立资源之间的所有者关系,即父子关系。这个字段可以用来指定一个资源是另一个资源的所有者。例如,一个 Deployment 可以拥有多个 Pod,这些 Pod 就可以通过 ownerReference 字段引用到对应的 De…

D. Maximum Distance(最小生成树)

Problem - D - Codeforces Chouti已经厌倦了乏味的作业,于是他打开了数年前创建的一个旧编程问题。 给定一个具有n个节点和m条加权边的连通无向图。其中有k个特殊节点:x1,x2,...,xk。 现在定义路径的成本为其边权的最大值。两个顶点之间的距离定义为连…

从C出发 29 --- 指针与函数

只有知道具体位置,才有可能跳到那个位置去执行,如果不知道在哪里,怎么跳? 函数是什么? 函数就是一片连续的内存 数组是什么? 数组就是一片连续的内存 很显然,这一片连续的内存当中&#xff0c…

百度智能云六大产品系列将率先基于大模型升级,加速全面智能化

百度智能云在上海召开文心一言技术交流会。百度集团副总裁袁佛玉表示,大模型的技术突破,使得全球性的“AI再造”已经拉开序幕。在技术底座层面,百度智能云拥有全栈自研的AI大底座;在大模型平台层面,拥有全球首个一站式…

OSGI详解

最近项目用到了OSGI,第一反应就是什么是OSGI? OSGI是一个为Java提供动态模块化的系统; 准确的说,OSGI是一个标准,一个框架,也可以理解为一个容器,具体的实现有Eclipse下的Equinox和Appach下的Fe…

18. Unity - 2D游戏开发小记01 --- 瓦片地图搭建基本操作

1. 瓦片地图创建(Tilemap) 在2D游戏开发中,瓦片地图就是游戏中的场景或者说游戏背景,可以使用把图片资源制作成Tiles,然后在游戏场景中搭建2D游戏的背景即可。 效果展示: 规则瓦片制作 首先在 Hierarchy层级窗口中右键鼠标,依次选择 2D Object → Tilemap → Rectan…

SpirngMVC的创建和使用

SpirngMVC的创建 SpringMVC的创建很容易。 步骤:创建SpringBoot项目,并在添加依赖时,添加Spring Web。 SpringMVC的创建就完成了。 创建SpringBoot项目详情:SpringBoot项目创建和使用_追梦不止~的博客-CSDN博客 S…

lua元表、元方法

lua元表、元方法 lua官方参考手册:https://www.runoob.com/manual/lua53doc/manual.html#2.4 一、总结: ☺ 1、普通的表,找不到了,或者无法进行运算的时候,考虑设置到它身上的元表的元方法 2、元表的本质&#xff1a…

JavaWeb03(域对象EL表达式JSTL标签)

目录 一.jsp内置对象之域对象 1.1 什么是jsp的内置对象? JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。一共有9个: 分别为request、response、session、application、out、pageContext、confi…

netfilter filter表(三)

修改《netfilter filter表(二)》的hello_open函数,将ipt_entry的信息打印处理,代码如下: char* get_verdict(int verdict) {verdict -(verdict 1);char* p "";switch (verdict){case NF_DROP:p "NF_DROP";break;cas…

【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206

💌 博客内容:LeetCode 训练营 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这…