数据驱动建模和控制系统设计案例研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据驱动建模和控制系统设计案例研究
数据驱动建模和控制系统设计案例研究
Motor Control Case Study in Data-Driven Modeling and Control Design 迈斯沃克软件公司作者:PravallikaVinnakota
摘要:本⽂以简单的直流电机控制系统为例,介绍如何从输⼊输出数据辨识对象模型,使⽤辨识的模型来设计控制器并予以实
施。
⼯作流程包括以下步骤:采集数据,辨识线性和⾮线性对象模型,设计和仿真反馈控制器以及在嵌⼊式微处理器上实施这些控制器以便实时测试。
在物理原型或对象硬件上调节控制器可能造成不安全运⾏状态甚⾄损坏硬件。
⼀种更可靠的⽅法是构建⼀个对象模型并进⾏仿真,在不同的运⾏条件下验证控制器,以便⽆风险地运⾏假设情景。
当机理建模不可⾏时,备选⽅法是通过对象的输⼊输出数据来开发模型。
⼀个低阶的线性模型可能⾜以⽤来设计基本控制器。
但较⾼性能的控制器的详细分析和设计需要⼀个具有较⾼精度的模型,且可能是⾮线性模型。
直流电机:控制设计⽬标
物理系统是通过电机驱动连接到Arduino Uno 板卡上的⼀台直流电机(图 1)。
我们想为这台电机设计⼀个⽤于跟踪参考位置的反馈控制器。
该控制器将基于电机位置参考数据⽣成合适的电压命令。
此电压作⽤于电机时,会促使电机产⽣扭转电机轴的扭矩。
我们将使⽤电位计测量电机轴旋转的⾓度,然后将此⾓度反馈给控制器。
电机驱动集成电路 (IC) 增加了驱动电流并能够双向驱动电机。
我们通过Arduino 板卡上的“模拟输⼊”引脚接收电机位置数据,然后计算参考位置与实际位置(控制器输⼊)之间的误差。
我们将⼀个电压命令(控制器输出)发送到板卡上的两个“模拟输出”引脚,为 PWM 信号。
这些信号连接到驱动电路,为电机提供适当的驱动电流。
控制器必须保持系统稳定,并以最⼩的稳态误差和超调量提供快速参考跟踪。
图 1. 连接直流电机的Arduino 板卡
采集和处理数据
我们使⽤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. 将要在主机上运⾏的模型
我们发送不同的电压来激励系统,然后记录相应的位置数据。
仿真结束时,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
>> 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 个数据集。
选择这些数据集⽤来确保充分激励系统并为模型验证提供充⾜数据。
从实验数据开发对象模型
使⽤系统辨识技术开发对象模型涉及模型精度和建模投⼊之间的权衡。
模型越精确,投⼊的成本越⾼,计算的时间越长。
⽬标是要找到能充分捕获系统动态的最简单的模型。
我们遵循系统辨识的典型⼯作流程:⾸先估计⼀个简单线性系统,然后估计⼀个可以更精确表⽰电机和捕获⾮线性⾏为的更详细的⾮线性模型。
尽管线性模型可能⾜以满⾜⼤多数控制器设计的需要,但⾮线性模型使⼀系列⼯作点上的系统⾏为和控制器设计的仿真更精确。
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)
图7.辨识模型响应与辨识数据的⽐较图
为确保辨识的传递函数代表电机动态,我们必须对照⼀个独⽴的数据集进⾏验证。
为进⾏验证,我们选择数据集12,其中电机的线性运⾏作为我们的验证数据。
我们获得了⼀个相当理想的拟合度(图8)
图8. 估算模型响应与验证数据的⽐较图
尽管不是完美拟合,但我们辨识的传递函数在捕获系统动态⽅⾯做得⾮常好。
我们可以使⽤此传递函数设计系统的控制器。
此外,我们还可以分析对象不确定性的影响。
使⽤System Identification Toolbox 获取的模型不仅包含参数值,还包含表⽰参数不确定性的协⽅差矩阵。
作为对模型可靠性的⼀种测量,计算的不确定性受影响系统的外部⼲扰、未建模动态和采集的数据量的影响。
我们可以通过在模型响应上绘制不确定性的影响来形象地表现不确定性。
例如,我们可以⽣成辨识传递函数的波特图,显⽰围绕额定响应的⼀个标准偏差置信(图9)。
⾮线性系统辨识
使⽤从电机运⾏的线性区域收集的数据创建的电机动态线性模型对于设计有效的控制器⼗分有⽤。
但是,此对象模型⽆法捕获电机呈现的⾮线性⾏为。
例如,数据集 2显⽰电机在⼤约 100°时响应饱和,数据集 3 显⽰电机对于⼩的电压没有响应,可能是由于存在⼲摩擦的原因。
在本步骤中,我们将创建⼀个具有较⾼精度的直流电机模型。
为此,我们为直流电机辨识⼀个⾮线性模型。
仔细观察数据之后发现,响应的斜率改变与电压的改变并没有线性关系。
这种趋势体现了⾮线性、磁滞的⾏为。
⾮线性 ARX (NLARX) 模型提供了相当⼤的灵活性,使我们能够使⽤丰富的⾮线性函数(如⼩波⽹络和 S 型⽹络)捕获此类⾏为。
另外,这些模型允许我们整合使⽤⾃定义回归发现的系统⾮线性。
图 9. 显⽰模型不确定性的辨识模型的波特图
为了有效地构建NLARX 模型,我们需要包含丰富的⾮线性信息的数据。
我们合并了三个数据集来创建辨识数据,合并了其他五个数据集来创建较⼤的、多实验的验证数据集。
>>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);
⾮线性模型具有多个可调整的组分。
我们已在⾮线性函数中调整了模型阶次、延迟、⾮线性函数类型和单位,添加了代表饱和
及死区⾏为的回归量。
数次迭代之后,我们选择⼀个采⽤带有并⾏线性函数的S 型⽹络的模型结构,并使⽤回归量的⼀个⼦集作为其输⼊。
此模型的参数经过估算,实现了可能最佳的仿真结果(图10)。
最终模型与辨识数据和验证数据出⾊拟合,拟合度>90%。
此模型可以⽤于控制器设计以及分析和预测。
设计控制器
我们现在可以为较⾼精度的⾮线性模型设计⼀个 PID 控制器。
我们⾸先在⼀个感兴趣的⼯作点对辨识的⾮线性模型进⾏线性化,然后为此线性化模型设计控制器。
整定PID 控制器,然后选择其参数(图 11)。
图 11. PID 整定界⾯
我们还要查看此控制器在⾮线性模型上运⾏情况。
图 12 显⽰我们⽤来获取⾮线性
ARX 模型的仿真响应的 Simulink 模型。
图 10. ⾮线性 ARX 模型估计GUI
图 12. ⽤于在辨识的⾮线性模型上测试控制器的 Simulink 模型
然后,我们⽐较60°设定位置处的线性和⾮线性模型的闭环阶跃响应(图 13)。
在硬件上测试控制器
我们创建⼀个带有控制器的 Simulink 模型,然后利⽤ Simulink 对于部署模型⾄⽬标硬件的内在⽀持,将该模型运⾏在Arduino 板卡上(图 14)。
我们通过在某个特定⼯作点对辨识的⾮线性 ARX 模型进⾏线性化来设计控制器。
此控制器的结果显⽰,硬件响应与仿真结果⼗分接近(图 15)。
图 13. ⾮线性模型和线性模型阶跃响应的仿真⽐较图
图 14. 在Arduino 板卡上实施的带有控制器的模型。
⼦系统 Get Angle 从串⾏端⼝接收参考信号并将其转换为电机的⽬标⾓度。
直流电机⼦系统配置Arduino 变卡与电机实体的接⼝
此外,我们还对控制器跟踪随机参考命令的性能进⾏测试。
我们发现,硬件跟踪性能同样⼗分接近于仿真期间获得的性能(图 16)。
本⽰例虽然⼗分简单,但是抓住了数据驱动控制系统设计的基本步骤。
我们从给定的⽬标硬件收集输⼊/输出数据,然后使⽤System Identification
Toolbox 构建系统模型。
我们介绍了如何创建较低和较⾼精度的模型,以及如何使⽤这些辨识模型设计控制器。
然后,我们在实际硬件上验证了控制器的性能。
QQ :联系⼈:李潇⽂
图 15. 对使⽤线性化模型设计的控制器的阶跃仿真响应和硬件响应⽐较图
图 16. 对使⽤估计的⾮线性模型设计的控制器,在仿真和硬件上的跟踪性能⽐较图
使⽤到的产品了解更多
MATLAB 在⽬标硬件上运⾏Simulink 模型
Simulink 数据驱动控制:对象模型不可⽤时如何设计控制器
Simulink Control Design 让PID 控制变得轻松
System Identification Toolbox 视频:数据驱动控制:数据采集(4:30)视频:数据驱动控制:系统识别(4:13)
视频:数据驱动控制:控制器设计和实施(6:06)
请在/doc/953724175.html
/newsletters上查看和订阅更多⽂章。
2013 年发布92066v00。