建模并验证系统
对机器人系统中的每个组件进行建模以反映其物理或功能性行为。然后,通过使用测试数据进行仿真来验证模型。包含一个组件的 Simulink® 模型基于以下几点:
物理组件的输出和输入之间的显式数学关系 - 您可以根据组件的输入通过代数计算和微分方程积分,直接或间接计算出组件的输出。例如,按照给定的进水速率计算水箱中的水位就是一种显式关系。每个 Simulink 模块基于从输入到输出的计算定义来执行。
物理组件的模型变量之间的隐式数学关系 - 由于变量之间相互依赖,因此为组件指定输入和输出并不容易。例如,电路中连接的电机的正 (
+
) 极电压和负 (-
) 极电压之间就存在一种隐式关系。要在 Simulink 中对这种关系进行建模,您可以使用 Simscape™ 等物理建模工具,也可以将这些变量建模为允许定义输入/输出的更大组件的一部分。有时候,更仔细地审视建模目的和组件定义有助于定义输入/输出关系。从实际系统获得的数据 - 您已经测得实际组件的输入/输出数据,但不存在完全定义的数学关系。许多设备具有符合此描述的未建模组件,例如电视耗散的热量。您可以使用 System Identification Toolbox™ 来定义此类系统的输入/输出关系。
显式功能定义 - 您可以根据功能组件的输入通过代数计算和逻辑计算来定义功能组件的输出,例如调温器的切换逻辑。您可以将大多数功能关系建模为 Simulink 模块和子系统。
本教程对具有显式输入/输出关系的物理组件和功能组件进行建模。在本教程中,您将:
使用系统方程创建一个 Simulink 模型。
在 Simulink 编辑器中添加并连接 Simulink 模块。模块代表方程中的系数和变量。
分别为每个组件构建模型。构建系统模型最有效的方法是首先独立地考虑各个组件。
首先,使用接近于系统的模型构建简单的模型。找出可能会影响模型准确性的假设条件。以迭代方式添加细节,直到复杂度满足建模和准确性要求。
通过提供输入并观察输出来验证组件。
打开系统布局
对各个组件进行建模时,需要从大局上把握整个系统布局。此模型展示各个组件如何相互关联。首先加载 system_layout
模型。
对物理组件进行建模
描述组件之间的关系,例如数据、能量和力的传递。在 Simulink 中使用系统方程构建机器人系统的图形化模型。
为组件建模之前,需要思考以下问题:
每个组件的常量是什么?什么值不会更改,除非您更改它们?
每个组件的变量是什么?什么值会随着时间而更改?
一个组件有多少个状态变量?
根据科学原理推导出每个组件的方程。许多系统方程不外乎以下三种类别:
对于连续系统,微分方程描述变量的变化率,为所有时间值都定义方程。例如,一阶微分方程给出车速:
其中:
v(t) 是在时间 t 处的汽车速度。
b 是阻尼系数。
m 是汽车的质量。
u(t) 是在时间 t 处作用在汽车上的外力。
对于离散系统,差分方程描述变量的变化率,但只在特定时间定义方程。例如,此方程描述来自离散比例微分控制器的控制信号:
其中:
u[n] 是在离散时间步 n 处的控制信号。
e[n] 是在离散时间步 n 处的误差。
e[n-1] 是在前一离散时间步 n-1 处的误差。
Kp 是比例增益。
Kd 是导数增益。
Ts 是采样时间。
没有导数的方程是代数方程。例如,用代数方程表示包含两个组件的并联电路中的总电流:
其中:
It 是流过电路的总电流。
Ia 是流过并联电路的分支 a 的电流。
Ib 是流过并联电路的分支 b 的电流。
对车轮的线性运动进行建模
作用在车轮上的力有两个:
电机施加的力 - 此力 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
。此模块的输出是旋转位置 ,输入是角速度 。根据切向速度计算角速度。添加一个 Gain 模块,并将该模块的增益参数设置为
1/(2*r)
。连接这些模块。
要查看父模型,请点击“向上到父级”。
对功能组件进行建模
通过一个函数从输入到输出的整个过程来描述功能。此描述可以包含代数方程和逻辑构造,您可以使用它们在 Simulink 中构建系统的图形化模型。
对坐标变换进行建模
机器人在 x 和 y 坐标上的速度 VX 和 VY 与线性速度 VN 和角度 相关:
构建坐标变换模型:
在
system_layout
模型的顶层,双击名为Coordinate Transform
的子系统以显示空子系统。要对三角函数进行建模,请从 Math Operations 库中添加一个 SinCos 模块。
要对乘法进行建模,请从 Math Operations 库中添加两个 Product 模块。
连接这些模块。
要查看父模型,请点击“向上到父级”。
设置模型参数
您可以使用多个源来确定模型中参数的适当值,包括:
书面规范,如标准属性表或制造商的数据表
直接测量现有系统所得的测量值
基于系统输入/输出的估计值
system_layout
模型使用以下参数。
参数 | 符号 | 值 |
---|---|---|
质量 | 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;
验证组件
通过提供输入并观察输出来验证组件。即使这样简单的验证也能指出改进模型的直接方法。此示例验证以下行为:
当向轮子连续施加力时,速度会增加,直到达到稳定状态的速度为止。
当两个轮子向相反方向转动时,旋转角度以恒定速率增加。
此示例使用 Outport 模块将输出数据记录到工作区和仿真数据检查器。有关记录数据和其他记录方法的详细信息,请参阅保存仿真数据。
验证轮子组件
为轮子组件创建并运行测试模型:
创建一个新模型。在仿真选项卡中,点击新建
。将名为
Right Wheel
的 Subsystem 模块复制到新模型中。要创建一个测试输入,请从源代码库中添加一个 Step 模块,并将其连接到名为
Right Wheel
的子系统的输入。将步长时间参数设置保留为1
。要记录输出,请将子系统连接到 Outport 模块。
对模型进行仿真。在仿真选项卡中,点击运行
。
要在仿真数据检查器中查看结果,请点击数据检查器
。要绘制数据,请选中
Speed:1
信号旁边的复选框。
仿真结果表明,该模型表现出的行为与预期大致相符。在步长时间处施加力之前,不会发生运动。施加力后,速度开始增加,当施加的力和阻力达到平衡后,速度将保持稳定。除验证外,此仿真还显示在给定的作用力下轮子的最大速度。
验证旋转组件
为旋转组件创建并运行测试模型:
要创建新模型,请点击“新建”
。将名为
Rotation
的子系统模块复制到新模型中。要在新模型中创建一个测试输入,请从 Sources 库中添加一个 Step 模块。将步长时间参数设置保留为
1
。将 Step 模块的输出连接到名为Rotation
的子系统的输入。此输入表示当两个轮子沿相反方向旋转时的轮子速度之差。要记录输出,请将子系统连接到 Outport 模块。
对模型进行仿真。在仿真选项卡中,点击运行
。
要在仿真数据检查器中查看结果,请点击数据检查器
。要绘制数据,请选中
Angle:1
信号旁边的复选框。
此仿真显示,当两个轮子以相同速度向相反方向转动时,角度会稳定增加。您可以改进模型,使角度输出更容易解释。例如,您可以:
通过添加增益为
180/pi
的 Gain 模块,将输出信号单位从弧度转换为角度。通过添加具有函数
mod
的 Math Function 模块,以 360 度为周期显示输出值。
MATLAB 三角函数采用弧度输入。
验证模型
验证单个组件后,您可以对整个模型进行类似的验证。此示例验证以下行为:
当沿相同方向对两个轮子施加相同的力时,机器人沿直线运动。
当沿相反方向对两个轮子施加相同的力时,机器人原地旋转。
测试车轮同向旋转
当两个车轮同向旋转时,机器人应沿直线移动。
在
system_layout
模型中,双击名为Inputs
的子系统以显示空子系统。通过添加 Step 模块创建测试输入。将步长时间参数设置保留为
1
。将 Step 模块输出连接到两个 Outport 模块。在模型的顶层,将两个 Integrator 模块连接到 Outport 模块以记录数据。对信号
X position
和Y position
加标签。对模型进行仿真。
在仿真数据检查器中,选择
X position
和Y position
信号以查看结果。
由于角度为零且不变,车辆按预期仅在 x 方向移动。
测试车轮反向旋转
当车轮反向旋转时,机器人应原地旋转。
双击名为
Inputs
的子系统。要反转左轮的方向,请在源和第二个输出之间添加一个 Gain 模块,并将增益参数设置为-1
。标记角度输出以进行信号记录。右键点击名为
Rotation
的子系统模块的输出信号,然后点击记录所选信号。对模型进行仿真。
使用两个垂直对齐的子图在仿真数据检查器中查看信号。点击“可视化和布局”
。然后,在基本布局下,选择
2
×1
布局。在上部子图中,绘制X position
和Y position
信号。在下部子图中,绘制Rotation:1
信号。
上部子图显示在 X-Y 平面中无运动发生。下部子图显示稳定的角运动。
您可以通过更改输入使用此最终模型探索不同场景:
观察将初始角度设置为非零值时会发生什么。
注意当作用力下降到零时,运动需要多长时间才能停止。
增加机器人的重量。观测当机器人更重时会发生什么。
观察机器人在阻力系数更小的更平滑曲面上如何移动。
另请参阅
模块
- Pulse Generator | Gain | Integrator | Sum | Constant | Zero-Order Hold | Subsystem | MATLAB Function