使用Simulink基于模型设计(三):建模并验证系统

  1. 可以对系统结构中的每个组件进行建模,以表示该组件的物理行为或功能行为。通过使用测试数据对组件进行仿真,以验证它们的基本行为。

打开系统布局

对各个组件进行建模时,需要从大局上把握整个系统布局。首先加载布局模型。这里以simulink自带的示例模型为例,在 MATLAB命令行中,输入:

open_system('system_layout.slx')

打开模型。

对组件进行建模

包含一个组件的 Simulink模型基于以下几点:

  • 物理组件的输出和输入之间的显式数学关系 - 您可以根据组件的输入通过代数计算和微分方程积分,直接或间接计算出组件的输出。例如,按照给定的进水速率计算水箱中的水位就是一种显式关系。每个 Simulink 模块基于从输入到输出的计算定义来执行。
  • 物理组件的模型变量之间的隐式数学关系 - 由于变量之间相互依赖,因此为组件指定输入和输出并不容易。例如,电路中连接的电机的 + 极电压和 - 极电压之间就存在一种隐式关系。要在 Simulink 中对这种关系进行建模,您可以使用 Simscape 等物理建模工具,也可以将这些变量建模为允许定义输入/输出的更大组件的一部分。有时候,更仔细地审视建模目的和组件定义有助于定义输入/输出关系。
  • 从实际系统获得的数据 - 您已经测得实际组件的输入/输出数据,但不存在完全定义的数学关系。许多设备具有符合此描述的未建模组件。例如,电视机散发的热量。
  • 显式功能定义 - 您可以根据功能组件的输入通过代数计算和逻辑计算来定义功能组件的输出。例如,调温器的开关逻辑。您可以将大多数功能关系建模为 Simulink 模块和子系统。
对物理组件进行建模

描述组件之间的关系,例如数据、能量和力的传递。在 Simulink 中使用系统方程构建系统的图形化模型。

为组件建模之前,需要思考以下问题:

  • 每个组件的常量是什么?什么值不会更改,除非您更改它们?
  • 每个组件的变量是什么?什么值会随着时间而更改?
  • 一个组件有多少个状态变量?

根据科学原理推导出每个组件的方程。许多系统方程不外乎以下三种类别:

  • 对于连续系统,微分方程描述变量的变化率,为所有时间值都定义方程。例如,一阶微分方程给出车速:

dv(t)dt=−bmv(t)+u(t)

  • 对于离散系统,差分方程描述变量的变化率,但只在特定时间定义方程。例如,来自离散比例微分控制器的控制信号:

pd[n]=(e[n]−e[n−1])Kd+e[n]Kp

  • 没有导数的方程是代数方程。例如,用代数方程表示包含两个组件的并联电路中的总电流:

It=Ia+Ib

轮子和线性运动.  作用在轮子上的力有两个:

  • 电机施加的力 - 此力 F 作用在速度变化的方向上,是轮子子系统的输入。
  • 阻力 - 此力 Fdrag 作用在速度变化的相反方向上,是速度的函数。

Fdrag=kdragVV

加速度与这两个力之和成正比:

(m/2)˙V(m/2)˙V˙V=FFdrag=FkdragVV∣=FkdragVV∣(m/2)

其中 kdrag 是阻力系数,m 是机器人的质量。每个轮子承载机器人一半的质量。

构建轮子模型:

  1. 在 system_layout 模型中,双击 Right Wheel 子系统以显示空子系统。
  2. 对速度和加速度进行建模。添加一个 Integrator 模块。将初始条件设置保留为 0。此模块的输入是加速度 Vdot,输出是速度 V。
  3. 对阻力进行建模。从 User-Defined Functions 库中添加一个 MATLAB Function 模块。MATLAB Function 模块提供一种在模型中实现数学表达式的快速方法。要编辑函数,请双击该模块以打开 MATLAB® Function 编辑器。
  4. 在函数编辑器中,输入以下内容:

function Fdrag=get_fdrag(V,k_drag)

Fdrag=k_drag*V*abs(V);

5. 定义 MATLAB Function 模块的参数。在 MATLAB Function 模块编辑器中,点击编辑数据 

 按钮。点击 k_drag,将作用域设置为参数并点击应用

6. 用 Subtract 模块从电机的作用力中减去阻力。使用带有参数 1/(m/2) 的 Gain 模块完成力-加速度方程。

7. 要反转 MATLAB Function 模块的方向,请选择该模块。在工具条的格式选项卡上,点击左右翻转 。连接这些模块。

10. 这两个轮子的动态特性相同。复制您刚刚建模的 Right Wheel 子系统,并将其粘贴到 Left Wheel 子系统中。

11. 查看模型的顶层。点击向上导航到父级按钮 

旋转运动.   当两个轮子沿相反方向转动时,它们沿半径为 r 的圆周运动,从而产生机器人的旋转运动。当这些轮子向相同方向转动时,没有旋转。假设轮子的速度大小始终相等,则可将旋转运动视为两个轮子速度 VR 与 VL 之差的因变量来对其进行建模:

˙θ=VRVL2r

构建 Rotation Dynamics 模型:

  1. 在 system_layout 模型的顶层,双击 Rotation 子系统以显示空子系统。删除 Inport 和 Outport 模块之间的连接。
  2. 对角速度和角度进行建模。添加一个 Integrator 模块。将初始条件设置保留为 0。此模块的输出是角度 theta,输入是角速度 theta_dot。
  3. 根据切向速度计算角速度。添加带有参数 1/(2*r) 的 Gain 模块。
  4. 连接这些模块。

   5. 查看模型的顶层。点击向上导航到父级按钮 

对功能组件进行建模

通过一个函数从输入到输出的整个过程来描述功能。此描述可以包含代数方程和逻辑构造,您可以使用它们在 Simulink 中构建系统的图形化模型。

坐标变换.  机器人在 X 坐标和 Y 坐标上的速度 VX 和 VY 与线性速度 VN 和角度 theta 相关:

VX=VNcos(θ)VY=VNsin(θ)

构建坐标变换模型:

  1. 在 system_layout 模型的顶层,双击 Coordinate Transform 子系统以显示空子系统。
  2. 对三角函数进行建模。从 Math Operations 库中添加一个 SinCos 模块。
  3. 对乘法进行建模。从 Math Operations 库中添加两个 Product 模块。
  4. 连接这些模块。

5. 查看模型的顶层。点击向上导航到父级按钮 

设置模型参数

模型参数值的来源可以是:

  • 书面规范,如标准属性表或制造商的数据表
  • 直接测量现有系统所得的测量值
  • 基于系统输入/输出的估计值

此模型使用以下参数:

参数

符号

质量

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;

通过仿真来验证组件

通过提供输入并观察输出来验证组件。即使这样简单的验证也能指出改进模型的直接方法。此示例验证以下行为:

  • 当向轮子连续施加力时,速度会增加,直到达到稳定状态的速度为止。
  • 当两个轮子向相反方向转动时,旋转角度以恒定速率增加。
验证轮子组件

为轮子组件创建并运行测试模型:

  1. 创建一个新模型。在仿真选项卡中,点击新建 ​​​​​​​。将 Right Wheel 模块复制到新模型中。
  2. 创建一个测试输入。从 Sources 库中添加一个 Step 模块,并将其连接到 Right Wheel 模块的输入端口。将步长时间参数设置保留为 1
  3. 在输出端口添加一个查看器。右键点击 Right Wheel 模块的输出端口,然后选择创建并连接查看器 > Simulink > Scope

5. 运行仿真。在仿真选项卡中,点击运行 ​​​​​​​

仿真结果表现出大致的预期行为。在步长时间处施加力之前,没有运动。施加力后,速度开始增加,当施加的力和阻力达到平衡后,速度将保持稳定。除验证外,此仿真还提供了在给定的作用力下轮子的最大速度信息。

验证旋转组件

为旋转组件创建并运行测试模型:

  1. 创建一个新模型。点击 ​​​​​​​,将 Rotation 模块复制到新模型中。
  2. 在新模型中创建测试输入。从 Sources 库中添加一个 Step 模块。将步长时间参数设置保留为 1。将其连接到 Rotation 模块的输入端口。此输入表示当两个轮子沿相反方向旋转时的轮子速度之差。
  3. 在输出端口添加一个查看器。右键点击 Rotation 模块的输出端口,然后选择创建并连接查看器 > Simulink > Scope

4. 运行仿真。在仿真选项卡中,点击运行 ​​​​​​​

此仿真显示,当两个轮子以相同速度向相反方向转动时,角度会稳定增加。您可以对模型进行一些改进,以便更容易解释角度输出,例如:

  • 您可以将弧度输出转换为角度。添加增益为 180/pi 的 Gain 模块。
  • 您可以按 360 度为一圈显示角度输出。添加带有函数 mod 的 Math Function 模块。

MATLAB 三角函数采用弧度输入。

验证模型

验证单个组件后,您可以对整个模型进行类似的验证。此示例验证以下行为:

  • 当沿相同方向对两个轮子施加相同的力时,机器人沿直线运动。
  • 当沿相反方向对两个轮子施加相同的力时,机器人原地旋转。
  1. 在 system_layout 模型中,双击 Inputs 子系统以显示空子系统。
  2. 通过添加 Step 模块创建测试输入。将步长时间参数设置保留为 1。将其连接到两个 Outport 模块上。

3. 在模型的顶层,将两个输出信号连接到同一个波形查看器:

4. 运行模型。

在上图中,黄线是 X 方向,蓝线是 Y 方向。由于角度为零并且保持不变,因此机器人只在 X 方向上移动,跟预期一样。

5. 双击 Inputs 子系统,在信源和第二个输出之间添加具有参数 -1 的 Gain 模块。这将反转左轮的方向。

6. 为角度输出添加一个示波器。

7. 运行模型。

第一个视图显示 X-Y 平面上没有运动。第二个视图显示有稳定旋转。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 20:40:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 20:40:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 20:40:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 20:40:03       69 阅读

热门阅读

  1. vue2 使用 Socket.io 实现 WebSocket

    2024-07-11 20:40:03       24 阅读
  2. flink 大数据处理资源分配

    2024-07-11 20:40:03       19 阅读
  3. LiteOS GPIO中断处理

    2024-07-11 20:40:03       20 阅读
  4. python如何与前端交互

    2024-07-11 20:40:03       16 阅读
  5. 模型需要从txt中长文本中精准提炼出来文字

    2024-07-11 20:40:03       22 阅读
  6. vue3 学习笔记04 -- axios的使用及封装

    2024-07-11 20:40:03       24 阅读
  7. 大模型融入云平台,信息化走向数智化

    2024-07-11 20:40:03       20 阅读
  8. 开源项目有哪些机遇与挑战?

    2024-07-11 20:40:03       22 阅读
  9. 精通 mysqldumpslow:深度分析 MySQL 慢查询日志

    2024-07-11 20:40:03       22 阅读
  10. 定个小目标之刷LeetCode热题(41)

    2024-07-11 20:40:03       19 阅读