今天基于simscape建立的机械臂模型搭建PID控制器,并使用matlab looptuning实现PID参数的自动调节。
本节所采用的模型基于simscape搭建的ABB 120六轴机械臂模型,其模型细节如下,模型输入为关节力矩,输出为关节位置。
01
—
PID控制器
本文中的控制结构如下:
Plant即为上述提到的六轴机器人模型,本章介绍PID控制器及其具体实现。
PID控制器是工业控制系统中最常用的一种控制器。PID控制器通过比例(P)、积分(I)和微分(D)三个控制参数来调节控制对象的输出,以达到预期的控制目标。
PID控制器由比例控制(Proportional)、积分控制(Integral)和微分控制(Derivative)三个部分组成。其控制输出可以表示为:
u(t)=Kpe(t)+Ki∫e(t)dt+Kdde(t)dt
其中:
-
u(t)是控制器的输出
-
e(t)是控制误差,即参考值与实际值之间的差异
-
Kp是比例增益
-
Ki是积分增益
-
Kd是微分增益
在matlab simulink中,有集成的PID模块,此处我们直接使用simulink的二自由度PID。该模块基于参考信号与测得的系统输出之间的差异来生成输出信号。此模块根据您指定的设定点权重(b 和 c)来计算比例和导数动作的加权差异信号。模块输出等于对各差异信号进行的比例、积分和导数动作的总和,其中的每个动作根据增益参数 P、I 和 D 进行加权。导数动作通过一阶极点进行滤波。双击模块进行设置,此处对于六轴机器人来说,我们使用PD控制器:
此外,还需为PID控制器添加输出限制。在仿真时,如果不限制输出,那么控制器可能会产生非常大的输出来使控制器有很好的性能,但是在实际的机械系统中,关节所使用的驱动器如电机的输出是有力矩限制的,没有办法产生非常大的力矩来驱动机构运动。因此为了尽可能模拟真实物理系统,限制控制器输出是非常有必要的。
给各个关节均添加PID控制器,并给各个关节添加输入(本例中,J1/J2为阶跃信号,其余为0),模型如下:
至此,我们的simulink模型已经搭建完成,此时若直接运行系统,会发现机器人的实际位置与期望值相差甚远,原因在于控制器的参数并不匹配当前系统,因此需要调节控制器参数来使控制器性能表现较好。
参数整定可以基于经验手动调整,也可以用如Ziegler-Nichols方法调整,此处我们使用matlab中的looptuning方法来实现PID参数的自动调节
02
—
PID自动调节-loop tune
looptune 是 MATLAB 控制系统工具箱中的一个函数,专门用于自动调节控制器参数。它能够处理单输入单输出 (SISO) 系统和多输入多输出 (MIMO) 系统。通过指定一些性能目标和约束,looptune 可以自动优化控制器参数,以实现期望的系统行为。
looptune 基于频域优化技术,利用传递函数模型和频率响应数据来优化控制器参数。其基本步骤如下:
-
模型建立:首先,需要建立系统的数学模型,包括传递函数或状态空间表示。
-
定义控制器结构:确定控制器的类型(如 PID 控制器)及其参数。
-
指定性能目标:设定系统的性能目标,例如阶跃响应时间、超调量和稳态误差等。
-
执行优化:调用
looptune
函数,根据设定的目标和约束,自动调节控制器参数。 -
验证和调整:对优化结果进行验证,必要时可以进一步调整参数。
我们已经建立了仿真模型,接下来我们来定义控制器结构。首先确定控制器的类型(如PID控制器)及其参数,并定义了六个PID控制器块作为要调谐的控制器结构。
% Create sluner interface
TunedBlocks = {'PD1','PD2','PD3','PD4','PD5','PD6'};
ST0 = slTuner('sm_abbIrb120_PID',TunedBlocks);
% Mark outputs of PID blocks as plant inputs
addPoint(ST0,TunedBlocks);
随后设定系统的性能目标,例如阶跃响应时间、超调量和稳态误差等。我们需要定义参考信号和测量信号,并设定调谐目标。
% Mark joint angles as plant outputs
addPoint(ST0,'Robot/qm');
% Mark reference signals
RefSignals = {...
'sm_abbIrb120_PID/q1r','sm_abbIrb120_PID/q2r','sm_abbIrb120_PID/q3r',...
'sm_abbIrb120_PID/q4r','sm_abbIrb120_PID/q5r','sm_abbIrb120_PID/q6r'};
addPoint(ST0,RefSignals);
%% defining Input and Outputs and Tuning the systems
Controls = TunedBlocks; % actuator commands
Measurements = 'sm_abbIrb120_PID/Robot/1';
options = looptuneOptions('RandomStart',80,'UseParallel',false);
TR = TuningGoal.StepTracking(RefSignals,Measurements,0.05,0);
最后执行优化,并将参数更新到模型中:
% execute optimization
ST1 = looptune(ST0,Controls,Measurements,TR,options);
%% Update PID Block
writeBlockValue(ST1);
运行上述代码,则会进行自动优化过程,最终有最低峰值增益的迭代组对应的参数即为优化后参数,优化后的参数会更新到simulink模块中。
执行simulink模块,观测J1/J2位置,可以看到反馈位置最后稳定在期望值处。
最后来看一下仿真运动效果吧!
欢迎关注获取代码。