1 数据驱动建模和控制系统设计案例研究 Motor Control Case Study in Data-Driven Modeling and Control Design 迈斯沃克软件公司 作者:PravallikaVinnakota
摘要:本文以简单的直流电机控制系统为例,介绍如何从输入输出数据辨识对象模型,使用辨识的模型来设计控制器并予以实施。工作流程包括以下步骤:采集数据,辨识线性和非线性对象模型,设计和仿真反馈控制器以及在嵌入式微处理器上实施这些控制器以便实时测试。在物理原型或对象硬件上调节控制器可能造成不安全运行状态甚至损坏硬件。一种更可靠的方法是构建一个对象模型并进行仿真,在不同的运行条件下验证控制器,以便无风险地运行假设情景。当机理建模不可行时,备选方法是通过对象的输入输出数据来开发模型。一个低阶的线性模型可能足以用来设计基本控制器。但较高性能的控制器的详细分析和设计需要一个具有较高精度的模型,且可能是非线性模型。
直流电机:控制设计目标 物理系统是通过电机驱动连接到Arduino Uno板卡上的一台直流电机(图 1)。我们想为这台电机设计一个用于跟踪参考位置的反馈控制器。该控制器将基于电机位置参考数据生成合适的电压命令。此电压作用于电机时,会促使电机产生扭转电机轴的扭矩。我们将使用电位计测量电机轴旋转的角度,然后将此角度反馈给控制器。
电机驱动集成电路 (IC) 增加了驱动电流并能够双向驱动电机。我们通过Arduino板卡上的“模拟输入”引脚接收电机位置数据,然后计算参考位置与实际位置(控制器输入)之间的误差。我们将一个电压命令(控制器输出)发送到板卡上的两个“模拟输出”引脚,为 PWM 信号。这些信号连接到驱动电路,为电机提供适当的驱动电流。
控制器必须保持系统稳定,并以最小的稳态误差和超调量提供快速参考跟踪。
图 1. 连接直流电机的Arduino板卡 2
采集和处理数据 我们使用Simulink的一项功能将PC与Arduino板卡连接,该功能允许您生成一个可执行文件并在选定的硬件上运行。图 2 为与Arduino硬件结合使用的 Simulink 库。
要收集数据,Arduino板卡会向电机发送电压命令并测量产生的电机角度。我们创建一个 Simulink 模型来进行数据收集。 PC机必须与Arduino板卡通信,发送电压命令并接收返回的角度数据。我们创建第二个模型来启用此通信。
将要在Arduino Uno 板卡上运行的模型中(图 3),MATLAB函数“Voltage Command To Pins”从串行端口读取电压命令,并将命令传送给相应的引脚。我们使用串行通信协议来保证主机与Arduino面板的通信。在CreateMessage子系统中,将从板卡上其中一个模拟输入引脚中获取的电机位置数据生成完整的串行消息。
图 3. 将要在Arduino板卡上运行的Simulink 模型 我们通过选择“Tools”>“Run on Target Hardware”>“Run”从模型创建实时应用程序。然后可以使用将要在主机上运行的模型(图 4)采集输入/输出数据。
图 2. Simulink 模块库:与Arduino目标硬件结合使用
图 4. 将要在主机上运行的模型 3
我们发送不同的电压来激励系统,然后记录相应的位置数据。仿真结束时,Simulink 中的信号记录功能将在工作间内创建Simulink数据集,这个时间序列对象包含了记录的所有信号。
接下来,我们为估计和验证准备收集到的数据。通过以下命令,我们将数据转换为iddata对象,以便导入到 System Identification Toolbox 中的 System Identification Tool。
>>logsout
logsout = Simulink.SimulationData.Dataset Package: Simulink.SimulationData Characteristics: Name: 'logsout' Total Elements: 2 Elements: 1: 'Voltage' 2: 'Angle' -Use getElement to access elements by index or name. -Use addElement or setElement to add or modify elements. Methods, Superclasses 4
>> u = logsout.getElement(1).Values.Data; >> y = logsout.getElement(2).Values.Data; >> bounds1 = iddata(y,u,0.01,'InputName','Voltage','OutputName','Angle',... ...'InputUnit','V','OutputUnit','deg') Time domain data set with 1001 samples. Sample time: 0.01 seconds Outputs Unit (if specified) Angle deg Inputs Unit (if specified) Voltage V
我们将使用 12 个数据集。选择这些数据集用来确保充分激励系统并为模型验证提供充足数据。 从实验数据开发对象模型 使用系统辨识技术开发对象模型涉及模型精度和建模投入之间的权衡。模型越精确,投入的成本越高,计算的时间越长。目标是要找到能充分捕获系统动态的最简单的模型。
我们遵循系统辨识的典型工作流程:首先估计一个简单线性系统,然后估计一个可以更精确表示电机和捕获非线性行为的更详细的非线性模型。尽管线性模型可能足以满足大多数控制器设计的需要,但非线性模型使一系列工作点上的系统行为和控制器设计的仿真更精确。 5
I II ^ I 1 I
线性系统辨识 首先,我们使用iddata对象将对象的线性动态模型估为连续的传递函数。我们要为此次估计指定极点和零点的个数。System Identification Toolbox 随后自动确定它们的位置,以最大限度地拟合选定的数据集。
执行以下命令来启动 System Identification Tool >>ident 我们可以使用“Import Data”下拉菜单(图 5)将数据集从基本工作区导入到工具中。还可以对已导入的数据进行预处理。要启动估计,我们选择将用于辨识模型的工作数据和用来对照测试辨识模型的验证数据。开始时,我们可以使用相同的数据集进行辨识和验证,然后使用其他数据集确认结果。图 5 显示已导入数据集的 System Identification Tool。用于辨识的数据集,即数据集 11,来自于为避免激励系统中的非线性而设计的实验。
图 5. 已导入数据的 System identification Tool
现在我们可以辨识此数据的连续传递函数。在我们的示例中,我们辨识了一个 2 个极点、无零点连续传递函数(图 6)
图 6. 连续传递函数估算 GUI
我们通过选中 System Identification Tool 中的Model Output 框将辨识模型的仿真响应与实际测量的数据进行比较。辨识的线性模型的响应与辨识数据之间的拟合度达到 93.62%(图 7) 6
为确保辨识的传递函数代表电机动态,我们必须对照一个独立的数据集进行验证。为进行验证,我们选择数据集 12,其中电机的线性运行作为我们的验证数据。我们获得了一个相当理想的拟合度(图 8)
尽管不是完美拟合,但我们辨识的传递函数在捕获系统动态方面做得非常好。我们可以使用此传递函数设计系统的控制器。
此外,我们还可以分析对象不确定性的影响。使用 System Identification Toolbox 获取的模型不仅包含参数值,还包含表示参数不确定性的协方差矩阵。作为对模型可靠性的一种测量,计算的不确定性受影响系统的外部干扰、未建模动态和采集的数据量的影响。我们可以通过在模型响应上绘制不确定性的影响来形象地表现不确定性。例如,我们可以生成辨识传递函数的波特图,显示围绕额定响应的一个标准偏差置信(图 9)。
图 7.辨识模型响应与辨识数据的比较图 图 8. 估算模型响应与验证数据的比较图 7 非线性系统辨识
使用从电机运行的线性区域收集的数据创建的电机动态线性模型对于设计有效的控制器十分有用。但是,此对象模型无法捕获电机呈现的非线性行为。例如,数据集 2显示电机在大约 100°时响应饱和,数据集 3 显示电机对于小的电压没有响应,可能是由于存在干摩擦的原因。
在本步骤中,我们将创建一个具有较高精度的直流电机模型。为此,我们为直流电机辨识一个非线性模型。仔细观察数据之后发现,响应的斜率改变与电压的改变并没有线性关系。这种趋势体现了非线性、磁滞的行为。非线性 ARX (NLARX) 模型提供了相当大的灵活性,使我们能够使用丰富的非线性函数(如小波网络和 S 型网络)捕获此类行为。另外,这些模型允许我们整合使用自定义回归发现的系统非线性。
图 9. 显示模型不确定性的辨识模型的波特图 8
为了有效地构建 NLARX 模型,我们需要包含丰富的非线性信息的数据。我们合并了三个数据集来创建辨识数据,合并了其他五个数据集来创建较大的、多实验的验证数据集。
非线性模型具有多个可调整的组分。我们已在非线性函数中调整了模型阶次、延迟、非线性函数类型和单位,添加了代表饱和及死区行为的回归量。数次迭代之后,我们选择一个采用带有并行线性函数的 S 型网络的模型结构,并使用回归量的一个子集作为其输入。此模型的参数经过估算,实现了可能最佳的仿真结果(图 10)。
>>mergedD = merge(z7,z3,z6) Time domain data set containing 3 experiments.
Experiment Samples Sample Time Exp1 5480 0.01 Exp2 980 0.01 Exp3 980 0.01
Outputs Unit (if specified) Angle deg
Inputs Unit (if specified) Voltage V
>>mergedV = merge(z1,z2,z4,z5,z8);