<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>算法 on RinChord的小本本</title>
        <link>https://blog.rinchord.top/tags/%E7%AE%97%E6%B3%95/</link>
        <description>Recent content in 算法 on RinChord的小本本</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sun, 10 Nov 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.rinchord.top/tags/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>简单了解PID</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/</link>
        <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1G9zdYQEr3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/video/BV1G9zdYQEr3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e7%a9%8d%e5%88%86%e9%a3%bd%e5%92%8c&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;积分饱和 - 维基百科，自由的百科全书&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  &lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;PID基本理论公式&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(t)+K_i*\int^{t}_{0}error(t)dt+K_d*\frac{derror(t)}{dt}
$$&lt;p&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/Y6dedMEd0zuAkJbBigXtDrCY.png&#34;
	width=&#34;1290&#34;
	height=&#34;447&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010195316893&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;288&#34;
		data-flex-basis=&#34;692px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;比例项&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;比例项的输出仅取决于当前时刻的误差，$K_p$越大，第一部分的值越大，系统响应越快，==稳态误差==越小，但==超调==也会增加。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稳态误差&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一种处于非理想情况下会出现的外部因素，如：电机的摩擦力，加热板的自然散热等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;纯比例项控制时，如果误差为0，则$K_p$比例也是0，给被控对象的输入就是0，此时，被控对象可能会自发地向一个方向偏移而产生误差&lt;/p&gt;
&lt;p&gt;这个误差会让$K_p$开始负反馈调控，当调控输出力度与自发偏移力度一致时，系统将达到稳态 (如：电机的输出与电机的摩擦达到一致)。&lt;/p&gt;



  &lt;blockquote class=&#34;alert alert-tip&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      💡
      
        Tip
      
    &lt;/p&gt;
    &lt;p&gt;思考： 系统认为当前的输出可以让被控设备达到稳态，但实际上被控设备存在一些未知的阻力。&lt;/p&gt;
&lt;p&gt;系统想要设备更靠近目标状态一些，但问题是设备上有阻力，当前误差所带来的驱动力太小的话是没办法克服阻力的。&lt;/p&gt;
&lt;p&gt;所以，当驱动力=阻力时，设备就没办法继续向目标状态靠近，而是进入稳态了  在这种情况下的K_p提供了对抗摩擦力的输出&lt;/p&gt;
  &lt;/blockquote&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;给系统输入0，系统自发偏移的方向就是稳态误差的方向。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/WMWg2ngpJclG8QNZOczFKRs-.png&#34;
	width=&#34;889&#34;
	height=&#34;580&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010202023517&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;153&#34;
		data-flex-basis=&#34;367px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;积分项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;积分的本质是&lt;code&gt;累加&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$K_i$会不断累加过去的误差（包括正误差和负误差),将之作为当前的输出。&lt;/p&gt;
&lt;p&gt;这意味着$K_i$的输出是具有滞后性的，在系统输入目标改变一段时间后，输出才会到达目标值。（图一）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$K_i$会消除稳态误差的原因是：如果系统无法达到目标值，它所提供的输出会越来越大，&lt;strong&gt;直到&lt;/strong&gt;系统达到目标值为止。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在$K_p$和$K_i$联合运作时，先是$K_p$快速地提高输出，然后在稳态误差的作用下停止输出，此后$K_i$再依靠不断累计的输出将被控设备运动到位。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/SnCMU5iqa1h0L8iPRP2htmkF.png&#34;
	width=&#34;1271&#34;
	height=&#34;512&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010203557427&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;248&#34;
		data-flex-basis=&#34;595px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;微分项&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;微分的本质是求误差变化的斜率，而斜率和当前时刻附近误差变化的趋势有关系&lt;/li&gt;
&lt;li&gt;误差变化的越大，误差变化率的斜率就越大根据斜率来输出阻力，就可以阻碍误差的急剧变化。
&lt;ul&gt;
&lt;li&gt;当误差急剧升高时，对误差求导得到的斜率就会变大&lt;/li&gt;
&lt;li&gt;当误差急剧降低时，对误差求导得到的斜率就会变小&lt;/li&gt;
&lt;li&gt;直接使用这个斜率作为参数再乘以一个常量就可以给系统引入阻尼了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果$K_d$给的过大，阻尼就会过大，此时系统会表现得“卡卡的”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/5oFtDv1jHaDqZh4MuBJhYurV.png&#34;
	width=&#34;574&#34;
	height=&#34;249&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010205004615&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;230&#34;
		data-flex-basis=&#34;553px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;倒立摆电机编码器在不同$K_d$时的输出值拟合曲线。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;将PID离散化&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/8TfW2X9exXHWmlapGSKkBoNw.png&#34;
	width=&#34;266&#34;
	height=&#34;216&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010232522266&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;123&#34;
		data-flex-basis=&#34;295px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;原有的pid公式是一个线性过程，适用于模拟电路。但是在数字电路中并不适用，所以需要进行离散化&lt;/p&gt;
&lt;p&gt;原有公式$out(t)=K_p&lt;em&gt;error(t)+K_i&lt;/em&gt;\int^{t}_{0}error(t)dt+K_d*\frac{derror(t)}{dt}$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过面积法，可以把$K_i$转换为$K_i*T\sum^t_{j=0}error(j)$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其中$T$为单个步长，即“所有矩形面积相加之和”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过中值定理，可以把$K_d$转换为$K_d*\frac{error(k)-error(k-1)}{T}$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式中分数的含义即对应“矩形的中值”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终得到公式&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(k)+K_i*T\sum^t_{j=0}error(j)+K_d*\frac{error(k)-error(k-1)}{T}
$$&lt;p&gt;&lt;br&gt;
当然我们也可以把T并入到$K_i$和$K_d$中，也就是&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(k)+K_i*\sum^t_{j=0}error(j)+K_d*error(k)-error(k-1)
$$&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;全量式PID和增量式PID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;全量式PID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;即传统式PID&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;可以直接输出给目标设备&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;增量式PID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;即输出为上一次的增量(或负增量)&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;计算方便：只需要得到&lt;code&gt;out(k)&lt;/code&gt; &lt;code&gt;out(k-1)&lt;/code&gt; &lt;code&gt;out(k-2)&lt;/code&gt;这三个值就可以计算增量了&lt;/li&gt;
&lt;li&gt;限幅更方便（防止积分饱和&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;与过摆）&lt;/li&gt;
&lt;li&gt;因为会持续存储控制状态，在手动切换到自动的过渡中会更平缓(全量式pid需要一定的时间来进行适应)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算公式：$\Delta out(k)=out(k)-out(k-1)$&lt;/li&gt;
&lt;/ul&gt;
$$
\Delta out(k)=[K_p*(error(k)-error(k-1))]+[K_i*error(k)]+[K_d*(error(k)-2error(k-1)+error(k-2)])
$$&lt;hr&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;更高级的PID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;积分限幅&lt;/p&gt;
&lt;p&gt;积分分离(线性&amp;amp;非线性)&lt;/p&gt;
&lt;p&gt;【待补充】&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;积分饱和是指&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/PID%e6%8e%a7%e5%88%b6%e5%99%a8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PID控制器&lt;/a&gt;或是其他有&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e7%a9%8d%e5%88%86%e5%99%a8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;积分器&lt;/a&gt;的控制器中的现象，是指误差有大幅变化（例如大幅增加），积分器因为误差的大幅增加有很大的累计量，因此造成&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e8%bf%87%e5%86%b2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;过冲&lt;/a&gt;，而且当误差变为负时，其过冲仍维持一段时间之后才恢复正常的情形&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
