开环仿真

  • 开环仿真是一种在基于模型设计领域分析算法性能的十分有效的方法。Mlog 模块记录必要的模型输入数据,其功能类似于“黑匣子”。只需要记录少量的模型输入数据,通过开环仿真即可获得模型所有的数据信息(包括输出和内部数据)。

    自动代码生产能极大提高开发的效率,并应用于实际的产品中,因此生产代码的运行结果与模型仿真结果的一致性变得极为重要。基于FMT可以做到开环仿真的结构跟真实的结构几乎完全重合。

开环仿真步骤

  1. 首先第一步需要记录测试或仿真飞行的开机日志,因为模型是从开机后即开始运行的,所以为了获得完整的数据,我们需要记录从模型第一次运行起的所有数据。记录开机日志的方法为将MLOG_MODE参数设置为2或者3,其参数含义如下所示:

    /* define parameters */
    static param_t __param_list[] = {
       /* Determines when to start and stop logging.
        0: disabled
       1: when armed until disarm
       2: from boot until disarm
       3: from boot until shutdown  */
       PARAM_INT32(MLOG_MODE, 0),
    };
    PARAM_GROUP_DEFINE(SYSTEM, __param_list);
    

    我们可以通过地面站设置MLOG_MODE参数的值,也可以在控制台中通过param指令来修改。记得修改完成后需要输入param save来保存参数

    重新开机后,我们在控制台输入mlog status可以看到当前正在记录的日志信息。如下所示,当前记录的日志文件为/log/session_5/mlog1.bin。最左边一列表示当前记录的所有日志的bus数据名称,record表示对应bus记录的日志条数,lost为丢失的条数。

    提示:

    如果lost值不为0,表示对应的日志bus数据有丢失,这将导致我们开环仿真的结果和实际结果不一致的情况。导致日志丢失的原因有很多,一般是因为记录的日志数据量过大,而SD卡的写入速度不够,导致缓存区存满而造成数据丢失。解决办法可以是替换写入速度更快的SD卡或者加大Mlog模块的缓存大小。

    当飞机Disarm(MLOG_MODE=2)或者我们手动输入mlog stop时,将停止日志记录,并打印记录的日志状态,如下所示:

    然后我们可以通过QGC的Onboard Files页面下载日志

  2. 在得到日志以后,我们需要对日志进行解析。打开MATLAB并进入到FMT-Model目录,确保运行过FMT_Model.prj对工程进行初始化。运行FMT-Model/utils/log_parser/parse_mlog.m脚本并选中要解析的日志文件。解析完成后将在日志文件相同的目录输出解析后的**.mat*文件,如下所示

  3. 将所有的 .mat文件拖拽到MATLAB窗口以加载到MATLAB中,然后运行FMT-Model/utils/log_parser/load_parameter.mFMT-Model/utils/mission_data_preprocess.m

    提示:

    加载后的*.mat文件将出现在MATLAB的WorkSpace中,我们可以通过MATLAB直接查看数据或者将其导入到Simulation Data Inspector中查看。
  4. 双击打开开环仿真模型FMT-Model/simulation/OpenLoopSIM.slx

  5. 点击上方的Run按钮运行仿真。

  6. 待仿真结束后可以点击右上方的蓝色按钮CompareModeOut,将绘制数据图形比较开环仿真的输出(红色)和记录的真实运行结果(蓝色)。两者应几乎完全重合,如不重合,则可能是日志数据有“丢包”现象或者记录的不是开机日志,或者仿真的模型版本跟飞控上的模型版本不一致所致。

  7. 也可以通过Simulink上端的Simulation Data Inspector来查看记录的仿真数据。