小车 - 摆杆模型如图 1 所示,使用 Simscape™ Multibody™ 在 Simulink® 中建模。
该系统通过对小车施加可变力 进行控制。控制器需要在将小车移动到新位置或摆锤被推向前方(脉冲干扰 )时保持摆锤直立。
竖直位置是倒立摆的不稳定平衡点。被控对象的不稳定性使控制任务更具挑战性。在本例中,您将使用以下双回路控制结构:
open_system('rct_pendulum.slx')
set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','off');
内环使用二阶状态空间控制器将摆稳定在竖直位置( 控制),而外环使用比例-微分 (PD) 控制器控制小车位置。使用 PD 控制器而不是 PID 控制器,是因为被控对象已经提供了一些积分动作。
使用 TuningGoal 要求指定所需的闭环行为。指定跟踪小车位置 设定点变化的响应时间为 3 秒。
% Tracking of x command
req1 = TuningGoal.Tracking('xref','x',3);
为充分抑制摆尖上的脉冲干扰 ,可使用以下形式的 LQR 惩罚
强调较小的角度偏差 ,并限制控制力度 。
% Rejection of impulse disturbance dF
Qxu = diag([16 1 0.01]);
req2 = TuningGoal.LQG('dF',{'Theta','x','F'},1,Qxu);
为确保稳健性,要求设备输入端至少有 6 分贝的增益裕度和 40 度的相位裕度。
% Stability margins
req3 = TuningGoal.Margins('F',6,40);
最后,对闭环极点的阻尼和固有频率进行限制,以防止出现抖动或欠阻尼的瞬态。
% Pole locations
MinDamping = 0.5;
MaxFrequency = 45;
req4 = TuningGoal.Poles(0,MinDamping,MaxFrequency);
闭环系统在 PD 控制器和状态空间控制器的初始值(分别为 1 和 2/s)下是不稳定的。您可以使用 systune 对这两个控制器进行联合调整。使用 slTuner 界面指定可调块,并将工厂输入 F 注册为分析点,以测量稳定裕度。
ST0 = slTuner('rct_pendulum',{'Position Controller','Angle Controller'});
addPoint(ST0,'F');
接下来,根据上述性能要求,使用 systune 调整 PD 和状态空间控制器。优化跟踪和干扰抑制性能(软要求),但必须符合稳定性裕度和极点位置约束条件(硬要求)。
rng(0)
Options = systuneOptions('RandomStart',5);
[ST, fSoft] = systune(ST0,[req1,req2],[req3,req4],Options);
Final: Soft = 1.37, Hard = 0.99968, Iterations = 320
Final: Soft = 1.44, Hard = 0.99917, Iterations = 266
Final: Soft = 1.26, Hard = 0.99907, Iterations = 351
Final: Soft = 1.37, Hard = 0.99934, Iterations = 311
Final: Soft = 1.27, Hard = 0.99903, Iterations = 281
Final: Soft = 1.37, Hard = 0.99911, Iterations = 274
最佳设计的软要求值接近 1,同时满足硬要求 (硬<1)。这意味着调整后的控制系统几乎达到了跟踪和干扰抑制的目标性能,同时满足了稳定性裕度和极点位置约束。
使用 viewGoal 进一步分析最佳设计如何满足各项要求。
figure('Position',[100 100 575 660])
viewGoal([req1,req3,req4],ST)
这些曲线图证实,前两个要求几乎得到了满足,而后两个要求则得到了严格执行。接下来,绘制小车对位置阶跃变化和力脉冲的响应图。
T = getIOTransfer(ST,{'xref','dF'},{'x','Theta'});
figure('Position',[100 100 650 420]);
subplot(121), step(T(:,1),10)
title('Tracking of set point change in position')
subplot(122), impulse(T(:,2),10)
title('Rejection of impulse disturbance')
响应平稳,达到预期的稳定时间。检查控制器的调整值。
C1 = getBlockValue(ST,'Position Controller')
C1 =
s
Kp + Kd * --------
Tf*s+1
with Kp = 5.74, Kd = 1.77, Tf = 0.0495
Name: Position_Controller
Continuous-time PDF controller in parallel form.
C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 =
-1600.6 (s+13.05) (s+4.14)
--------------------------
(s+134.7) (s-14.2)
Name: Angle_Controller
Continuous-time zero/pole/gain model.
请注意,角度控制器有一个不稳定极点,它与被控对象的不稳定极点配对,以稳定倒立摆。要了解这一点,请获取被控对象输入端的开环传递并绘制根位置图。
L = getLoopTransfer(ST,'F',-1);
figure
rlocus(L)
set(gca,'XLim',[-25 20],'YLim',[-20 20])
为完成验证,将调整值上传到 Simulink,并模拟小车/摆锤组件的非线性响应。下面是模拟结果的视频。
writeBlockValue(ST)
模拟结束后关闭模型。
set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','on');
close_system('rct_pendulum',0);