Unity PID控制算法可视化学习

引言

最近研究单片机时,偶然间对PID算法进行了点研究,PID真可谓是一个很优雅的算法。用它可以搞平衡车平衡、无人机飞行控制、温度控制。。等等,用处很多,很强大。于是打算用Unity写个小程序,来模拟pid的调参过程。

想法,需求

设有1000m³的水池,供某小区用水,该小区用水量随着时间变化而变化(消耗水池中的水),即负载是时刻变化的;另外,有一个注水开关,可以往水池中注水,现要求写一个控制算法,控制注水开关的开合度,以尽量保持水池中的水位在500m³。

出水、注水最大速度均为100m³/秒
水位传感器读取频率为1次/秒

思路

一 消耗水

水的消耗速度,随机进行变化,但这个指标,就像温度一样,它不能突变,所以写了个小算法,模拟水的消耗速度:

private bool bGrow = true;
public float CurrValue { get; private set; }
private void MakeData()
{float mid = ( maxValue - minValue ) * 0.5f + minValue;float g;if (bGrow)g = CurrValue > mid ? Mathf.InverseLerp(mid*1.2f, maxValue, CurrValue) : 0.1f;elseg = CurrValue < mid ? Mathf.InverseLerp(mid*0.8f, minValue, CurrValue) : 0.1f;// g为概率if (RandomBool(g))bGrow = !bGrow;if( bGrow )CurrValue += Random.Range(0f, 5f);elseCurrValue -= Random.Range(0f, 5f);
}

注:
实际上这里更优雅的做法是使用柏林噪声来模拟消耗速度的变化,但是写这篇文章时,我还没有了解到柏林噪声这个神奇的玩意,所以自己写了个比较笨拙的算法去模拟的:

网上搜了很久,没找到更优雅的算法,这是自己写的,大体意思就是:用个bool值表示现在的速度趋势是趋于上升还是下降,然后每次更新数据时,计算一个概率去反转这个方向,如果当前值越接近最大值或者接近最小值,反转的概率就越大,反之,值越靠近中间,反转的概率就越小,然后每次根据这个趋势增加或减少一个随机值。这样,就能大体模拟用水的速度曲线,而且大致上在大周期内往复,正好符合用水高峰的设定。

控制算法

当前误差=目标水位−当前水位累计误差=累计误差+当前误差∗ΔTime误差变化率=(当前误差−上次误差)/ΔTime期望注水速度=当前误差∗Kp+累计误差∗Ki+误差变化率∗Kd注水速度=Mathf.Clamp(期望注水速度,0,最大注水速度)当前误差 = 目标水位 - 当前水位\\ 累计误差 = 累计误差 + 当前误差 * ΔTime\\ 误差变化率 = (当前误差-上次误差) / ΔTime\\ 期望注水速度 = 当前误差 * K_p + 累计误差 * K_i + 误差变化率 * K_d\\ 注水速度=Mathf.Clamp( 期望注水速度, 0, 最大注水速度 ) 当前误差=目标水位−当前水位累计误差=累计误差+当前误差∗ΔTime误差变化率=(当前误差−上次误差)/ΔTime期望注水速度=当前误差∗Kp​+累计误差∗Ki​+误差变化率∗Kd​注水速度=Mathf.Clamp(期望注水速度,0,最大注水速度)

// 每1秒读取一次水位传感器
private IEnumerator PIDController()
{while (gameObject.activeSelf){float err = targetPool - waterLeft;totalErr += err * controlTime;float de = (err - lastError) / controlTime;lastError = err;pidText.text = $"Kp={kp:0.0} Ki={ki:0.0} Kd={kd:0.0} Err={err:#00.00} TotalErr:{totalErr:00.00} deltaErr:{de:00.00}";productionSpeed = Mathf.Clamp(err * kp + totalErr * ki + de * kd, 0f, 200f);inSpeedTex.text = productionSpeed.ToString("000");yield return new WaitForSeconds(controlTime);}
}
更新水位
private void Update()
{waterLeft = Mathf.Clamp(waterLeft + (productionSpeed - CurrValue) * Time.deltaTime, 0f, 1000f);
}

效果图

上面的折线图是消耗水的速度数据;下面的折线图是水池水位历史数据,左边的柱状图是当前水位。

调参过程

先将KI、KD置零,首先调整KP,KP其实就是比例因子,起主导作用,逐渐调大KP,使得控制曲线刚刚上下震动时,往下调一点;
然后调KD,KD是抑制因子,表示误差的趋势,用于减弱当前的调整趋势,KD过大会高频振荡,过小起不到抑制KP震动的效果。
最后调KI,KI是增益因子,误差积分而来,用于补充长期以来的误差。
当KP=1.5-2,KI=0.1-0.2,KD=0.1-0.2时,效果很好。基本上控制曲线是一条稳定的直线,无论消耗速度如何变化,水位始终保持在500m³(50%)。

Unity PID 控制算法可视化学习相关推荐

  1. PID控制算法学习笔记——算法入门

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.PID的工作原理 二.控制策略 1.比例控制 2.积分控制 3.微分控制 总结 参考文章 前言 PID,就是比例( ...

  2. PID控制算法学习与实现总结(二)位置式PID控制算法

    PID算法数字化 在上一节中讨论了连续PID控制的原理,但是计算机没有办法直接处理连续信号,只能根据采样时刻对连续信号进行采样,将采样之后的信号送给计算机处理. 按模拟PID控制算法,以一系列的采样时 ...

  3. PID控制算法学习与Matlab仿真

    文章目录 起因 算法原理 算法解析 调参小技巧 Matlab仿真 起因 PID控制算法应该是包括工业机器人等各种行业和领域中非常常用的一种控制算法了.了解这个算法的起因是在稚晖君开发的自行车项目中见到 ...

  4. 四轴PID控制算法详解(单环PID、串级PID)

    正文开始:这篇文章分为三个部分: PID原理普及 常用四轴的两种PID算法讲解(单环PID.串级PID) 如何做到垂直起飞.四轴飞行时为何会飘.如何做到脱控? PID原理普及 1.  对自动控制系统的 ...

  5. 【原创】PID控制算法模拟器

    先发几个测试图,目前可以实现几类PID控制算法的模拟.参数整定和数据记录,并结合office自动完成数据的整理和分析. 随后的版本将结合下位机进行联调,实现控制的可视化. 软件需要NET3.0支持,打 ...

  6. 浅谈单神经元网络PID控制算法及MATLAB仿真

    本文仅用作记录学习单神经元网络PID控制算法过程的心得体会及个人理解,若有错误,欢迎指正! 传送门 神经网络 神经网络的三个主要构成 神经元 单神经元网络PID控制算法 增量式 位置式 神经元的输入 ...

  7. 数字PID控制算法原理及Matlab仿真

    引言 最近碰到一个项目需要用到PID控制算法,于是在网上找了一些资料学习了一下,发现网上对于PID算法的Matlab仿真方面的内容比较少,所以我就把我自己所学习到的内容分享给大家.本次博文主要介绍了位 ...

  8. 温控中使用PID控制算法

    本文主要介绍各种PID控制算法的调节器在温度控制中控制特性.功能及主要应用场合,对大家合理选用用于温度控制提供方向. 对于温度控制算法包括常规PID.模糊控制.神经网络.Fuzzy_PID.神经网络P ...

  9. 自动驾驶车辆运动控制过程中,对PID控制参数的优化和整定。 传统PID控制算法

    自动驾驶车辆运动控制过程中,对PID控制参数的优化和整定. 传统PID控制算法,由于参数固定,在道路曲率较大和车速变化情况下难以满足控制需求,采用RL强化学习算法(DDPG算法,Actor-Criti ...

  10. Unity优化手机游戏学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.69 GB |时长:6h 44m 创 ...

最新文章

  1. android studio jni路径配置
  2. 五天带你学完《计算机网络》·第一天·物理层
  3. 『ES6』ES6 - 学习笔记
  4. P3244-[HNOI2015]落忆枫音【dp】
  5. Python编程从入门到实践~文件读取
  6. VMware vCenter Server 的内部版本号和版本 (2143838)--2020-10-27 更新
  7. 国美在线php面试题,国美销售专员的面试考题
  8. 曙光超级计算机用的芯片是国产吗,真正中国芯片龙头是中科曙光
  9. 智课雅思短语---一、be no exception
  10. python3__机器学习__神经网络基础算法__偏执项b
  11. SCC(五):ACT
  12. 2022牛客多校J题 Serval and Essay
  13. 阿里面试必备:100个高频Spring面试题,助你一臂之力!
  14. 主流视频会议租用产品对比
  15. mac和window电脑 解决github打不开问题
  16. 真机电脑使用 HTTPS 方式登录ensp防火墙USG6000
  17. 近视200度能学计算机吗,近视200度大概是4.几,4.6的视力相当于近视多少度。很多人不知道...
  18. ssm项目模板_基于SSM的论坛系统发布可商业、学习、毕设
  19. 测试wifi 的手机软件,WiFi性能测试
  20. 力扣LeetCode算法题第2题-两数之和(二)

热门文章

  1. mysql 间隙锁 作用_关于Mysql 间隙锁的理解
  2. Filter(过滤器)Listene(监听器)笔记
  3. vue 响应式布局组件_今天如何使用响应式Web组件
  4. HTML分页插件功能实现
  5. 3D打印无人机等无人设备4——solidworks逆向建模编辑stl打印文件
  6. 无熟人难办事?- 闲聊设计模式-迪米特法则
  7. Python爬取淘宝商品附加cookie修改
  8. Unity SRP初识笔记
  9. 项目管理九大知识领域过程逻辑关系图
  10. 手机群控还有这种事半功倍的操作?快来看强大的Rest API脚本功能