✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
如果只引用一路PID对角度进行控制的时候,我们会发现,参数调节,角度是可以控制好的,但是位置项却控制不好的。这是为什么呢,因为输出里之和角度有关,没有位置的信息。就好像一个演员,在顶杆的时候,如果只盯着杆看,不注意脚下,是很容易走出舞台的,那时就没工资了。这里角度信息不包含位置信息的意思,假设解读为θ,角速度为Ω,此时坐标可以为任何值,而不是一个确定的值。这个角度来说倒立摆是欠驱动系统。
后来查文献,就看到双路PD控制了。对于这个为什么可以,在实验后再看看原因。
当使用PID控制的时候,我们需要建立一个测量系统。这也是为什么强调上面的正方向是模型本身的。于是,假设力向右为正的话:假设角度为5°的话,此时,从物理角度来说,我们需要施加一个向右的力,才能使倒立摆的角度变成参考值0°,而根据负反馈来看,误差=参考值-观测值。那么这个观测值就需要是负值,才能使得误差为正值,乘以相应的系数得到的力才能为正。因此,对于测量角度的正方向为逆时针。同理,可以得到对位置想的观测正方向为向右为正。但是,经过试验发现,对于位置的观测得向左为正。
对于双路PD控制,控制周期为0.025s,结构为:
对于参数的选择,自己设置不好,于是采用遗传算法的方式进行参数优化。适应度函数使用的是ISTE准则,也就是误差的绝对值和时间的乘积之和。如果这个值越小,说明该去曲线和目标值越近,说明控制曲线越好。对于一组参数的好坏,首先使用该参数进行一次控制模拟,控制周期为0.01s,控制时长20s,控制初始位置1m处和倒立摆角度为30度开始。
优化结果:最开始优化时使用的控制的初始位置为1m,倒立摆角度30度。初始种群为46个,迭代参数设置下限为0,上限位250,迭代365次,最后得到最优的适应度函数值为3890.12,最后得到的最优个体参数为,角度通道参数Kp=45.12,Kd=215.2,位置通道参数:Kp=1.134,Kd=58.45。
⛄ 部分代码
<span style="color:#333333"><span style="background-color:#fafafa"><code>%% 双回路PID控制倒立摆</code><code>% </code><code>% 最大外力10N</code><code>% 模型里角度顺时针为正,但是控制里,需要逆时针为正,故需要取反。</code><code>clc;</code><code>clear;</code><code>close all</code><code>%% PID控制,双回路,位置角度PD求和</code><code>tStep = 0.025; %采样时间0.025s</code><code>tFinal = 30; %控制时长</code><code></code><code>Kpa = 45;</code><code>Kda = 0.2;</code><code>Kpx = 1.8;</code><code>Kdx = 1.2;</code><code></code><code>temp=[0,0,15*pi/180,0,0];</code><code>Ea=temp(3);</code><code>Ea1=0;</code><code>Ex=temp(1);</code><code>Ex1=0;</code><code></code><code>tt = (0:tStep:tFinal);</code><code>wx = (0:tStep:tFinal);</code><code>wc = (0:tStep:tFinal);</code><code>out= (0:tStep:tFinal);</code><code></code><code>wc(1)=temp(3)*180/pi;</code><code>wx(1)=temp(1);</code><code></code><code>am = 0;</code><code>an = 0;</code><code></code><code>xm = 0;</code><code>x = 0;</code><code>fitness = 0;</code><code>for tp = tStep:tStep:tFinal</code><code> [t,y]=ode45(@DaoliBai,[tp-tStep,tp],temp);</code><code> </code><code> xm = y(end,1);</code><code> if(y(end,3)>pi) %角度转化到[-pi,pi],wm为模型角度</code><code> am = y(end,3) - 2*pi;</code><code> elseif(y(end,3) < -pi)</code><code> am = y(end,3) + 2*pi;</code><code> <span style="color:#ca7d37">else</span></code><code> am = y(end,3);</code><code> end</code><code> </code><code> an = -am; %控制的角度</code><code> x = -xm;</code><code> </code><code> Ea = 0 - an; %计算当前误差</code><code> Ex = 0 - x;</code><code> </code><code> outw = Kpa*(Ea+Kda*(Ea-Ea1)/tStep) ;</code><code> outx = Kpx*(Ex+Kdx*(Ex-Ex1)/tStep) ;</code><code> </code><code> temp(5)=outw + outx; %PID计算输出</code><code> </code><code> if(temp(5)>20) %最大外力10N</code><code> temp(5) = 20;</code><code> elseif(temp(5)<-20)</code><code> temp(5) = -20;</code><code> end</code><code> </code><code> temp(1) = y(end,1);</code><code> temp(2) = y(end,2);</code><code> temp(3) = am;</code><code> temp(4) = y(end,4);</code><code> </code><code> Ea1=Ea; %更新误差</code><code> Ex1=Ex;</code><code> </code><code> wc(int32(tp/tStep)+1) = am*180/pi; %画图数据</code><code> wx(int32(tp/tStep)+1) = xm;</code><code> out(int32(tp/tStep)+1) = temp(5);</code><code> </code><code> fitness = fitness + 0.5*abs(Ea) + 0.5*abs(Ex);</code><code>end</code><code>fitness</code><code>figure(1)</code><code>plot(tt,wc,'r-');</code><code>title('角度');</code><code></code><code>figure(2)</code><code>plot(tt,wx,'b-');</code><code>title('位置');</code><code></code><code>figure(3)</code><code>plot(tt,out,'r');</code><code>title('输出')</code></span></span>
⛄ 运行结果
⛄ 参考文献
[1] 李明,郭焕银.基于MATLAB的倒立摆系统PID控制[J].宿州学院学报, 2010, 25(2):3.DOI:10.3969/j.issn.1673-2006.2010.02.019.
[2] 刘珺蕙,张杰.基于Matlab的倒立摆PID控制系统的设计[J].西安交通工程学院学术研究, 2021, 6(1):4.
[3] 王美刚白建云.基于遗传算法优化的双回路模糊控制倒立摆系统[J].科学技术与工程, 2018, 018(013):92-97.