单级和串级pid原理分析以及pid应用与小车的技巧

2023-11-20

这篇文章主要是帮助理解和使用pid,不会讲复杂的代码公式。

重点在最后,一定要看到最后

   pid可以看作是一种控制器,用来控制某个变量达到你想要的地步。

单级pid

这里我举个例子来理解一下:

假设有一个水缸,最终的控制目的是要保证水缸里的水位永远的维持在1米的高度。假设初试时刻,水缸里的水位是0.2米,那么当前时刻的水位和目标水位之间是存在一个误差的error,且error为0.8.这个时候,假设旁边站着一个人,这个人通过往缸里加水的方式来控制水位。

如果单纯的用比例控制算法,就是指加入的水量u和误差error是成正比的。即
u=kp*error
假设kp取0.5,
那么t=1时(表示第1次加水,也就是第一次对系统施加控制),那么u=0.5*0.8=0.4,所以这一次加入的水量会使水位在0.2的基础上上升0.4,达到0.6.
接着,t=2时刻(第2次施加控制),当前水位是0.6,所以error是0.4。u=0.5*0.4=0.2,会使水位再次上升0.2,达到0.8.
如此这么循环下去,就是比例控制算法的运行方法。
可以看到,最终水位会达到我们需要的1米。
但是,单单的比例控制存在着一些不足,其中一点就是 –稳态误差!
像上述的例子,根据kp取值不同,系统最后都会达到1米,不会有稳态误差。但是,考虑另外一种情况,假设这个水缸在加水的过程中,存在漏水的情况(可以看作是一些其他外界因素的影响),假设每次加水的过程,都会漏掉0.1米高度的水。仍然假设kp取0.5,那么会存在着某种情况,假设经过几次加水,水缸中的水位到0.8时,水位将不会再变换!!!因为,水位为0.8,则误差error=0.2. 所以每次往水缸中加水的量为u=0.5*0.2=0.1.同时,每次加水缸里又会流出去0.1米的水!!!加入的水和流出的水相抵消,水位将不再变化!!
也就是说,我的目标是1米,但是最后系统达到0.8米的水位就不在变化了,且系统已经达到稳定。由此产生的误差就是稳态误差了。

如果仅仅用比例,可以发现存在暂态误差,最后的水位就卡在0.8了。于是,在控制中,我们再引入一个分量,该分量和误差的积分是正比关系。所以,比例+积分控制算法为:
u=kp*error+ kierror
还是用上面的例子来说明,第一次的误差error是0.8,第二次的误差是0.4,至此,误差的积分(离散情况下积分其实就是做累加),error=0.8+0.4=1.2. 这个时候的控制量,除了比例的那一部分,还有一部分就是一个系数ki乘以这个积分项。由于这个积分项会将前面若干次的误差进行累计,所以可以很好的消除稳态误差(假设在仅有比例项的情况下,系统卡在稳态误差了,即上例中的0.8,由于加入了积分项的存在,会让输入增大,从而使得水缸的水位可以大于0.8,渐渐到达目标的1.0.)这就是积分项的作用。

当水位接近10m时,error会很小,但是由于Kp很大,就会使水位超过10m,系统出现超调。此时就需要引入微分控制(Kd)

u=kd*(error(t)-error(t-1))

在离散情况下,就是error的差值,就是t时刻和t-1时刻error的差。在水位上升过程中,因为error是越来越小的,所以这个微分控制项一定是负数,在控制中加入一个负数项,他存在的作用就是为了防止注入的水太多而导致超过设定水位。

串级pid和并联pid

刚开始我一直以为串级pid就是把两个不相干的控制量串联起来,一起控制某个东西。这里拿小车举例,就是把前进环pid和转向环pid串联起来。后来学习后我才发现这种想法是完全错误的,你如果想让小车同时拥有前进环和转向环(用的是差速转向),让这两个环共同控制小车,这里其实要用到并联pid,就是把两个pid的输出量叠加起来的值赋给电机。

这里我附上了代码展示

82b6c34cc45a4932ad82615e4eb91488.png

 继续说咋们的串级pid,串级pid的目的是更精细化的控制你想要控制的那个量。因此它的外环和内环是有物理联系的,这也是你写串级pid的依据或者说是原理。

假设我们需要解决这样一个问题:

控制小车从当走到红色标签位置,设小车实时位置为x0(t)eb0808dbb2fc45c497e6d02eea50205f.png

 如果我们使用单级PID,运动框图应该如下图所示:

8ea78afaf08143c484cc75d7291ef2d2.png

如果你按照图中的思路设计控制器,那就说明你只对位置有期望,这意味着你对加速度没有期望,也就意味着加速度是什么都无所谓。 

所以实际效果变成什么呢?你会以一个你无所谓的加速度到达你的期望位置。

这时候奇怪的事情发生了,到达你的期望位置时有加速度和速度,那这个就不是到达期望位置了,这叫经过期望位置。你会发现小车在期望位置附近“反复横跳”,超过后,又退回去,退过了,又超过去。

我们想要的期望的是停在期望位置上。什么叫停在期望位置上?就是到达期望位置的同时加速度与速度都为0。

现在我们想控制位置,类似于控制车,你只能踩油门加速,或者刹车进行减速,你只能通过速度控制间接控制位置。

开车的时候是怎么控制位置的呢?你想停在指定位置的时候,你先以一定的速度前往指定位置,快到的时候,通过刹车不断减速,直到速度为0,停到期望的位置。

这时我们发现,我们可以通过控制加速度来控制速度,从而控制我们的位置。所以串级pid就诞生了。

我们重新设计一下控制器,也就是再加一个环控制我们的加速度。

3c88213598c540e59e83a23ad8172608.png

现在我们来重新复盘一下我们的控制器,当小车距离期望位置很远时,位置环输出就很大,因此速度环的期望值就很大,所以速度环输出(加速度)就很大,可以使小车很快到达期望位置。当小车靠近期望位置时,位置环输出很小,因此速度环的期望值就小,速度环输出就很小(加速度接近于0),因此小车在期望位置速度和加速度都为0,小车精准停在期望位置。

  pid在循迹小车上应用

 刚接触pid我一直纠结为什么输入和输出的完全使两种变量可以达到控制的效果,这其中涉及到数学和物理知识的推到。

我们其实只需要会用这个pid控制器就可以了,你只需要知道你输出什么量他就会控制什么量就欧克了。输入位置(循迹模块)他就会控制位置,输入速度(编码器值)就会控制速度。

对于循迹小车来说,一般只使用pd控制器。

一般来说pid的输入必须使线性的,但一般小车上都是用的数字灰度传感器,为了能够使用pid控制器就需要给每一路灰度赋予不同的权值,就比如5路灰度循迹(传感器越多肯定控制的越丝滑,如果要使用pid的话,最少应该有5路,不然pid毫无意义),左边第一个赋予权重是10,左边第二个权重是5,相对应的右边传感器的权值就应该为负,权重越大,输出的pwm值就越大,所以当小车偏移角度比较大时,也能摆回来。

使用数字量循迹对参数的配置要求比较高,但是更适合于那种复杂赛道,比如直角,岔路,十字路口等。模拟量灰度(一般三路就ok了,但是需要对adc采集到的数据进行处理才可以使用pid)更适合与那种简单赛道基本都是直线的那种。

模拟量灰度数据融合的两种方法:

第一种:将三个灰度的adc值整合成一条线性的直线代入pid计算,这种方法处理过程较为复杂,当你想把三个灰度扩展到5个的时候非常有难度。

这篇文章详细讲解了处理方法:http://t.csdn.cn/gFUBq

第二种:adc读取5个灰度的值,找到adc数值最小和第二小的传感器,那么黑线此时肯定在这两个传感器中间,通过比例求出两点之间的具体位置,然后根据传感器的距离算出距离黑线的位置,代入pid控制。这种方法处理过程简单,并且线性度也高。

无论是那种循迹模块在测试时都会出现小车频繁左右摇摆的情况(即使加入了积分控制也不行),此时就需要用到pid死区

 当小车偏差非常小的适合不做处理,会有效解决掉小车摇摆的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单级和串级pid原理分析以及pid应用与小车的技巧 的相关文章

  • WPS Office 漏洞复现

    前言 此文章仅用于技术交流 严禁用于对外发起恶意攻击 一 产品简介 WPS Office是金山软件公司开发的 中国领先的办公软件套件 包含文字 表格和演示三个组件 支持创建 编辑各种文档 并具有强大的数据计算 统计和分析功能 其特点包括全面
  • Git提交代码步骤

    目录 1 Git提交代码步骤 1 1 第1步 同步远程仓库代码 git pull 1 2 第1步 查看当前状态 git status 1 3 第2步 提交代码到本地git缓存区 git add 1 4 第3步 推送代码到本地git库 git
  • 让csdn中的静态图动起(firemonkey)

    缘起 错过了登月50周年的日子 7 20 看到了如下卡通图童心大发 让它动起来 https blog csdn net csdnnews article details 96403350 代码下载 链接 https pan baidu co
  • CI/CD

    CICD 是 持续集成 Continuous Integration 持续交付和持续部署 Continuous Deployment 简称 指在开发过程中自动执行一系列从开发到部署的过程中 尽量减少人工的介入 CI CD AND CD CI

随机推荐

  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • Kubernetes APIServer,Etcd,controller manager,scheduler 高可用原理

    高可用背后的原理 这两个月和博云合作的项目是要用于客户生产环境的 这个和我以前做的东西有很大的不同 所有基础架构必须给出高可用的解决方案 在这之前我只做过一些流量较小的用户产品或者一些原型项目 一开始基础架构都只给出了单节点的解决方案 结果
  • 微信小程序--给头像添加logo(生成海报同理)

    实现给图片添加logo或者生成海报 其原理是使用canvas 用canvas绘制出想要的图片进行保存 1 在wxml文件中添加canvas canvs层级太高 所以将它定位到屏幕外 不影响页面
  • 嵌入式资源网站

    原题地址 http blog csdn net ce123 article details 6724127 一 MailList 1 MailList大全 网址 http news gmane org 描述 可以查到绝大部分开源项目的Mai
  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • VScode 怎么设置成中文

    1 打开 vscode 2 按快捷键 Ctrl Shift P 3 在 vscode 顶部会出现一个搜索框 4 在搜索栏输入 Configure Display Language 然后回车 5 vscode 里面就会打开一个语言配置文件 6
  • // SPDX-License-Identifier: MIT

    上述声明是指明你写的智能合约采用什么样的对外开放标准 该标准规定了别人是否拥有各种使用权利 其中 MIT 标准说明其他人可以随便用该源码 但出问题不负责
  • SQL各种日期转换代码大全

    select CONVERT varchar getdate 120 2004 09 12 11 06 08 select replace replace replace CONVERT varchar getdate 120 200409
  • html5 亲子模板,亲子阅读手抄报精美模板

    陪着孩子一起读 这点至关重要 不要丢下孩子一人读书 这样孩子很快就会失去读书的兴趣 今天学习啦小编给大家带来了亲子阅读手抄报精美模板 供大家阅读和参考 亲子阅读手抄报图片欣赏 亲子阅读手抄报图片1 亲子阅读手抄报图片2 亲子阅读手抄报图片3
  • 4、动态代理的缓存机制

    1 背景 上一节大致介绍了Proxy动态代理的原理 从几个疑问上面分析 这一节介绍一下动态代理的缓存机制 网上的资源比较少 可以怀着下面几个问题阅读源码 为什么要缓存 缓存的内容是什么 哪里调用的缓存 缓存的实现机制 缓存的过期机制 2 属
  • PTP/IP协议

    PTP IP PTP over IP 是一个通过IP连接 建立在 Picture Transfer Protocol PTP 上的传输层 我之所以在了解这个东西是因为有一台 Nikon 相机支持 WLAN 和手机传输相片 但是APP设计得极
  • 读取Properties配置文件

    读取Properties文件 File ReadHttpUrlProperties java User jiangefng li Date 2015年5月22日10 30 56 public class ReadHttpUrlPropert
  • R语言与多元线性回归方程及各种检验

    R语言与多元线性回归方程及各种检验 文章目录 R语言与多元线性回归方程及各种检验 一 模型建立 二 多重共线性 1 产生的背景 2 多重共线性的检验 1 简单相关系数法 2 方差膨胀因子 vif 法 3 矩阵 X T X
  • 一、eladmin学习笔记之common层相关注解上

    文章目录 eladmin使用的相关注解 1 Inherited 2 Documnet 3 Target 用来表示注解的作用范围 4 Retention 5 Component 6 RequestMapping 8 AliasFor 9 Ma
  • C#学习笔记 控制流

    C 是一门命令式的语言 默认语句以顺序方式执行 利用控制流语句可以改变程序的执行流程 以实现复杂的算法 条件语句 if语句 如果如果是单条件判断 可以使用if语句 if语句的执行体 既可以是单条语句也可以是由 花括号括起来的语句块 bool
  • SQLite解决插入特殊字符导致插入失败的问题

    SQLite解决插入特殊字符导致插入失败的问题 背景 在使用SQLite数据库时 我们经常会遇到插入的数据里面有单引号之类的特殊字符 如果不能正确处理 会导致插入数据失败 解决方法 方法一 对特殊字符进行转义 INSERT INTO tim
  • Java并发基础--CPU性能优化与内存屏障

    为了提高程序运行的性能 现代CPU在很多方面对程序进行了优化 1 CPU高速缓存 尽可能地避免处理器访问主内存的时间开销 处理器大多会利用高速缓存以提高性能 CPU缓存分为多几缓存 如图 L1 Cache 一级缓存 是CPU第一层高速缓存
  • 以太网详解(三)-PHY Transceiver硬件设计注意事项

    以太网接口硬件设计中 现在CPU集成度越来越高 都会集成MAC 而对于硬件设计来说 只需要外接PHY Transceiver IC即可实现以太网通信 而PHY芯片 以百兆为例 外围电路基本如下所示 RJ45连接器 ESD保护芯片 网络变压器
  • 记录我的第一个MyBatis-Plus例子

    第一个MyBatis Plus例子 灰常简单 特此记录 第一步 数据库表 第二步 pom引入jar包 第三步 启动类 实体类 application properties 在编写一个mapper接口 第四步 编写测试类 执行结果如下图所示代
  • 单级和串级pid原理分析以及pid应用与小车的技巧

    这篇文章主要是帮助理解和使用pid 不会讲复杂的代码公式 重点在最后 一定要看到最后 pid可以看作是一种控制器 用来控制某个变量达到你想要的地步 单级pid 这里我举个例子来理解一下 假设有一个水缸 最终的控制目的是要保证水缸里的水位永远