http://bbs.cmnxt.com/thread-8619-1-1.html
第一类是首要原则法,就是根据系统的物理意义构造微分方程,得到状态方程后,利用Simulink里自带的乘法和加法器进行模块构建,或者直接用状态方程模块分别写入A,B,C,D四个矩阵得到系统。还有一种方法是利用Simulink里面自带的Simscape物理建模平台,里面有基本的建立机械系统,动力传动系统和机械和电子系统的模块搭建系统。最后一种就是搭建CAD模型,利用SimMechanics把CAD模型转换成MATLAB模块进行系统的搭建。
所以这种方法需要玩家的数学功底比较强,知识面广阔。
第二类是数据驱动法,利用MAtLAB系统辨识工具箱,根据实测数据反推系统的方程,从而达到建模目的。
这种方法的首要前提是要有搭建好的物理模型进行测试。
还有一个工具叫SimulinkDesign Optimization,根据实测数据调节首要原则法建立的模型中不准确的参数。
从这里我们很快就能发现LEGO最大的优点就是很快的建立好物理模型,利用蓝牙传送被测的物理量。所以利用系统辨识工具箱可以很快建立出模型。下面我对系统辨识工具箱的应用进行讲解。在讲解之前,首先我们对这次建模利用的Simulink模块进行介绍。
首先是SignalBuilder模块,如图1所示。打开模块的设置界面,可以方便地通过GUI(用户交互式)界面画出任意需要的波形,如图2所示。波形的输入可以通过手动的修改波形,也可以通过Excel导入的形式输入到模块内。这个模块的意义就是写入测试数据,这个就是数据驱动法的首要条件。当然在以后的设计中,当我们得到了系统,建立模型进行测试的时候不是通过上NXT进行测试,而是经过Simulink仿真,所以我们经常要写一些测试数据,所以这个模块的意义也变得十分重要。在MATLAB帮助文件里面也经常会看见这个模块的出现。
然后是LEGO MINDSTORMSNXT模块,如图3所示。中两个指轮状的就是电机模型,一个是角度传感器,返回的是电机转动的角度,一个是电机模块,输入是电机的速度[-100,100]之间。
接着是差分模块,如图4所示。顾名思义通过模块得到上一次的值与这一次值的差值,例如角度传感器输入进去后,输出的就是角速度。
最后是输出模块,如图5所示。这个模块可以把输出结果,放入MATLAB的工作空间中,以便进行数据处理。举个例子说明工作空间的意思,你在写C语言的时候如果想看某些变量数值的时候是比较麻烦的,但是在MATLAB把变量的数值放在工作空间中,能像Excel一样的观看数值,而且可以画出图像等等,十分方便。
下面开始建立Simulink模型如图6所示。输入是角速度,输出是反馈回来的角速度,也可以反馈是角度值。
其中SignalBuilder如图7所示。我是利用Excel导入进Signal Builder中的,如图8所示。
这样我们就可以点Tool->Runon Target HardWare->Run就可以编译下载到NXT中了
最后得到一个结构体,数据经过提取Time和得到的角速度建立矩阵out,再把输入值建立矩阵in,格式是第一列是时间,第二列是角速度。在MATLAB中输入Ident打开系统辨识工具箱。点Importdata,如图9所示,选择Time-Domain Signals时域信号,并填入图10所示的参数。
点击Estimate选择Quick Start。如图11所示。我们发现arxqs拟合度为91.82比较好。吧arxqs拖动到ToWorkspace中,这样我们的系统就建立完毕了。
下面开始讲如何应用系统,建立如图12所示的模型。其中LTISystem模块参数修改为arxqs,就可以把模型输入到系统中了。
可能大家还会对PID算法中系数的选取有些迷茫,即使是图形化界面也会因为种种原因选择不好最佳的参数,在下一次体验中我会介绍MATLAB最令人振奋的工具箱,可以自动帮你选定PID参数。