建模并验证系统
您可以对系统结构中的每个组件进行建模,以表示该组件的物理行为或功能行为。通过使用测试数据对组件进行仿真,以验证它们的基本行为。
打开系统布局
对各个组件进行建模时,需要从大局上把握整个系统布局。首先加载布局模型。在 MATLAB® 命令行中,输入:
open_system('system_layout.slx')
对组件进行建模
包含一个组件的 Simulink® 模型基于以下几点:
物理组件的输出和输入之间的显式数学关系 - 您可以根据组件的输入通过代数计算和微分方程积分,直接或间接计算出组件的输出。例如,按照给定的进水速率计算水箱中的水位就是一种显式关系。每个 Simulink 模块基于从输入到输出的计算定义来执行。
物理组件的模型变量之间的隐式数学关系 - 由于变量之间相互依赖,因此为组件指定输入和输出并不容易。例如,电路中连接的电机的
+
极电压和-
极电压之间就存在一种隐式关系。要在 Simulink 中对这种关系进行建模,您可以使用 Simscape™ 等物理建模工具,也可以将这些变量建模为允许定义输入/输出的更大组件的一部分。有时候,更仔细地审视建模目的和组件定义有助于定义输入/输出关系。从实际系统获得的数据 - 您已经测得实际组件的输入/输出数据,但不存在完全定义的数学关系。许多设备具有符合此描述的未建模组件。例如,电视机散发的热量。您可以使用 System Identification Toolbox™ 来定义此类系统的输入/输出关系。
显式功能定义 - 您可以根据功能组件的输入通过代数计算和逻辑计算来定义功能组件的输出。例如,调温器的开关逻辑。您可以将大多数功能关系建模为 Simulink 模块和子系统。
本教程对具有显式输入/输出关系的物理组件和功能组件进行建模。在本教程中,您将:
使用系统方程创建一个 Simulink 模型。
在 Simulink 编辑器中添加并连接 Simulink 模块。模块代表方程中的系数和变量。
分别为每个组件构建模型。构建系统模型最有效的方法是首先独立地考虑各个组件。
首先,使用接近于系统的模型构建简单的模型。找出可能会影响模型准确性的假设条件。以迭代方式添加细节,直到复杂度满足建模和准确性要求。
对物理组件进行建模
描述组件之间的关系,例如数据、能量和力的传递。在 Simulink 中使用系统方程构建系统的图形化模型。
为组件建模之前,需要思考以下问题:
每个组件的常量是什么?什么值不会更改,除非您更改它们?
每个组件的变量是什么?什么值会随着时间而更改?
一个组件有多少个状态变量?
根据科学原理推导出每个组件的方程。许多系统方程不外乎以下三种类别:
对于连续系统,微分方程描述变量的变化率,为所有时间值都定义方程。例如,一阶微分方程给出车速:
对于离散系统,差分方程描述变量的变化率,但只在特定时间定义方程。例如,来自离散比例微分控制器的控制信号:
没有导数的方程是代数方程。例如,用代数方程表示包含两个组件的并联电路中的总电流:
轮子和线性运动. 作用在轮子上的力有两个:
电机施加的力 - 此力 F 作用在速度变化的方向上,是轮子子系统的输入。
阻力 - 此力 Fdrag 作用在速度变化的相反方向上,是速度的函数。
加速度与这两个力之和成正比:
其中 kdrag 是阻力系数,m 是机器人的质量。每个轮子承载机器人一半的质量。
构建轮子模型:
在
system_layout
模型中,双击名为Right Wheel
的子系统以显示空子系统。要对速度和加速度进行建模,请添加一个 Integrator 模块。将初始条件设置保留为
0
。此模块的输入是加速度 Vdot,输出是速度 V。要对阻力进行建模,请从用户定义的函数库中添加一个 MATLAB Function 模块。MATLAB Function 模块提供一种在模型中实现数学表达式的快速方法。要编辑函数,请双击该模块以打开 MATLAB Function 模块编辑器。
在 MATLAB Function 模块编辑器中,输入 MATLAB® 代码以计算阻力。
function Fdrag=get_fdrag(V,k_drag) Fdrag=k_drag*V*abs(V);
定义 MATLAB Function 模块的参量。在 MATLAB Function 模块编辑器中,点击“编辑数据”。点击 k_drag,将作用域设置为参数并点击应用。
使用 Subtract 模块从电机的作用力中减去阻力。通过使用 Gain 模块并将增益参数指定为
1/(m/2)
,完成力-加速度方程。要反转 MATLAB Function 模块的方向,请选择该模块。然后,在 Simulink 工具条中的格式选项卡上,点击“左右翻转”。连接这些模块。
这两个轮子的动态特性相同。复制刚刚创建的名为
Right Wheel
的子系统,并将其粘贴到名为Left Wheel
的子系统中。要查看模型的顶层,请点击“向上导航到父级”。
旋转运动. 当两个轮子沿相反方向转动时,它们沿半径为 r 的圆周运动,从而产生机器人的旋转运动。当这些轮子向相同方向转动时,没有旋转。假设轮子的速度大小始终相等,则可将旋转运动视为两个轮子速度 VR 与 VL 之差的因变量来对其进行建模:
构建 Rotation Dynamics 模型:
在
system_layout
模型的顶层,双击名为Rotation
的子系统以显示空子系统。删除 Inport 和 Outport 模块之间的连接。要对角速度和位置进行建模,请添加一个 Integrator 模块。将初始条件设置保留为
0
。此模块的输出是旋转位置 theta,输入是角速度 theta_dot。根据切向速度计算角速度。添加一个 Gain 模块,并将该模块的增益参数设置为
1/(2*r)
。连接这些模块。
要查看模型的顶层,请点击“向上导航到父级”。
对功能组件进行建模
通过一个函数从输入到输出的整个过程来描述功能。此描述可以包含代数方程和逻辑构造,您可以使用它们在 Simulink 中构建系统的图形化模型。
坐标变换. 机器人在 x 和 y 坐标上的速度 VX 和 VY 与线性速度 VN 和角度 theta 相关:
构建坐标变换模型:
在
system_layout
模型的顶层,双击名为Coordinate Transform
的子系统以显示空子系统。要对三角函数进行建模,请从 Math Operations 库中添加一个 SinCos 模块。
要对乘法进行建模,请从 Math Operations 库中添加两个 Product 模块。
连接这些模块。
要查看模型的顶层,请点击“向上导航到父级”。
设置模型参数
您可以使用多个源来确定模型中参数的适当值,包括:
书面规范,如标准属性表或制造商的数据表
直接测量现有系统所得的测量值
基于系统输入/输出的估计值
此模型使用以下参数:
参数 | 符号 | 值 |
---|---|---|
质量 | m | 2.5 kg |
滚阻 | k_drag | 30 Ns2/m |
机器人半径 | r | 0.15 m |
Simulink 模型可以访问使用 MATLAB 工作区中的变量定义的参数值。通过在 MATLAB 命令行窗口中输入命令来定义以下变量。
m = 2.5; k_drag = 30; r = 0.15;
通过仿真来验证组件
通过提供输入并观察输出来验证组件。即使这样简单的验证也能指出改进模型的直接方法。此示例验证以下行为:
当向轮子连续施加力时,速度会增加,直到达到稳定状态的速度为止。
当两个轮子向相反方向转动时,旋转角度以恒定速率增加。
验证轮子组件
为轮子组件创建并运行测试模型:
创建一个新模型。在仿真选项卡中,点击新建 。将名为
Right Wheel
的 Subsystem 模块复制到新模型中。要创建一个测试输入,请从源代码库中添加一个 Step 模块,并将其连接到名为
Right Wheel
的子系统的输入。将步长时间参数设置保留为1
。为输出添加一个波形查看器。右键点击名为
Right Wheel
的 Subsystem 模块的输出端口,然后选择创建并连接查看器 > Simulink > Scope。对模型进行仿真。在仿真选项卡中,点击运行 。
仿真结果表明,该模型表现出的行为与预期大致相符。在步长时间处施加力之前,不会发生运动。施加力后,速度开始增加,当施加的力和阻力达到平衡后,速度将保持稳定。除验证外,此仿真还显示在给定的作用力下轮子的最大速度。
验证旋转组件
为旋转组件创建并运行测试模型:
要创建新模型,请点击“新建”。将名为
Rotation
的子系统模块复制到新模型中。要在新模型中创建一个测试输入,请从 Sources 库中添加一个 Step 模块。将步长时间参数设置保留为
1
。将 Step 模块的输出连接到名为Rotation
的子系统的输入。此输入表示当两个轮子沿相反方向旋转时的轮子速度之差。将波形查看器添加到名为
Rotation
的子系统的输出中。右键点击子系统的输出端口,然后选择创建并连接查看器 > Simulink > Scope。对模型进行仿真。在仿真选项卡中,点击运行 。
此仿真显示,当两个轮子以相同速度向相反方向转动时,角度会稳定增加。您可以改进模型,使角度输出更容易解释。例如,您可以:
通过添加增益为
180/pi
的 Gain 模块,将输出信号单位从弧度转换为角度。通过添加具有函数
mod
的 Math Function 模块,以 360 度为周期显示输出值。
MATLAB 三角函数采用弧度输入。
验证模型
验证单个组件后,您可以对整个模型进行类似的验证。此示例验证以下行为:
当沿相同方向对两个轮子施加相同的力时,机器人沿直线运动。
当沿相反方向对两个轮子施加相同的力时,机器人原地旋转。
在
system_layout
模型中,双击名为Inputs
的子系统以显示空子系统。通过添加 Step 模块创建测试输入。将步长时间参数设置保留为
1
。将 Step 模块输出连接到两个 Outport 模块。在模型的顶层,将两个输出信号连接到同一个波形查看器。
对模型进行仿真。
波形查看器中的黄线是 X 方向,蓝线是 Y 方向。由于角度为零并且保持不变,因此机器人只在 X 方向上移动,跟预期一样。
双击名为
Inputs
的子系统。要反转左轮的方向,请在源和第二个输出之间添加一个 Gain 模块,并将增益参数设置为-1
。为角度输出添加一个波形查看器。
对模型进行仿真。
连接到 x 和 y 速度信号的波形查看器显示 X-Y 平面上没有发生运动。
连接到角度信号的波形查看器显示稳定的角运动。
通过更改输入,您可以使用这个最终模型来回答有关模型的许多问题。
当初始角度非零时会发生什么?
当作用力下降到零时,运动需要多长时间才能停止?
当机器人更重时会发生什么?
当机器人在阻力系数更小的更平滑曲面上移动时会发生什么?