1.首先,介绍一下matlab/simulink中把模块封装为库函数

通过以下建立Library

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习

如下是我的库内容,保存库名字为mathlib:

matlab 无人机强化学习 无人机matlab建模_c代码_02

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_03

 

然后建立一个模型,打开mathlib.slx模块,把这个模块加入模型中,建立如下模型,仿真即可。

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_04

如果想改这个模型,打开拖动会出现:Attempt to modify link 'untitled1/Subsystem'. Disable this link to make changes locally in the model or open the library to make the changes directly in the library block.这怎么办呢?其实这个是可以改的,只要在模块上使用Ctrl+L就会调用库函数:

matlab 无人机强化学习 无人机matlab建模_c代码_05

然后右键Open in New Tab,修改保存即可,我这里把里面的k=1修改为4保存,运行结果如下:

matlab 无人机强化学习 无人机matlab建模_c代码_06

matlab 无人机强化学习 无人机matlab建模_右键_07

 

如果想把库函数添加到simulink库中,只需要建立文件

matlab 无人机强化学习 无人机matlab建模_c代码_08

function blkStruct=slblocks
Browser.Library='mathlib';
Browser.Name='mathlib';
blkStruct.Browser=Browser;

然后通关过设置路径把刚才的路径的文件包含进去。

matlab 无人机强化学习 无人机matlab建模_c代码_09

然后将此文件夹添加进MATLAB路径并刷新Library,即可看到自定义模块库,如下,我的mathlib

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_10

到这里,关于库的应用就讲解完了。

现在讲解一下matlab2014年才加入的simulink function 函数的应用,相信大家对这个模块应用的比较少,其实这个模型用的好可以为我们搭建复杂的模型时简化线路有好处,在User-Defined Functions中

 

matlab 无人机强化学习 无人机matlab建模_c代码_11

新建simulink模型如下,我只是在simulink function乘以gain=4,这就通过caller 调用函数即可(通过函数名称):

matlab 无人机强化学习 无人机matlab建模_库函数_12

到这里,可能有的问不在同一级怎么调,这个很好办,这里只给出搭建的模型,细节不详细说了。

matlab 无人机强化学习 无人机matlab建模_右键_13

matlab 无人机强化学习 无人机matlab建模_库函数_14

同时这个也可以用function函数中调用

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_15

matlab 无人机强化学习 无人机matlab建模_库函数_16

到这里simulink function 函数就讲完了。

这里讲一下stateflow怎么嵌入已有的c代码运行

首先建立一个fun.m函数转换为c代码

 

matlab 无人机强化学习 无人机matlab建模_c代码_17

然后命令中coder:

matlab 无人机强化学习 无人机matlab建模_库函数_18

 

这里转换代码过程不多讲,自己搜索一下就有很多文档,最后就是到这里:

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_19

然后保存代码,出现包:

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_20

 

解压这个fun_pkg包:

matlab 无人机强化学习 无人机matlab建模_c代码_21

 

这里,也给出我自己总结的simulink生成代码的注意细节,怎么能够生成简洁的代码以及占用RAM最小:

Matlab/Simulink生成代码注意事项

  1. Solver的设置为Type:fixed-step、Solver:discrete、fixed-step size:0.01s
  2. Code Generation:(1):Report中两个勾选,生成代码可以看。
  3. :快速原型代码(grt.tlc) simulinnk coder生成的代码,产品代码 (ert.tlc) Embedded coder,选择ert.tlc代码就简洁了。

3.数据管理生成代码:通过在Model Explore的Base Workspace中设置信号线,并且设置store class:ExportedGlobal,

4.捆绑信号,在线上点击Properties中signal name打勾:

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_22

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_23

 

  1. k也改掉,

 

代码即可以出

matlab 无人机强化学习 无人机matlab建模_matlab 无人机强化学习_24

现我们这种形式:

matlab 无人机强化学习 无人机matlab建模_右键_25

 

 

保存数据指令:save('caokaifa.mat')

保存为.m文件:Simulink.saveVars('caokaifa.m')

 

现在点击模块右键Model Advisor

 

  1. 默认函数是模块名字_step,如下:

 

更改模块名字:

右键,Block Parameters中勾选Treat as atomic unit:

 

matlab 无人机强化学习 无人机matlab建模_c代码_26

 

 

 

然后再里面设置函数名和保存到那里:

 

matlab 无人机强化学习 无人机matlab建模_库函数_27

 

引用不同的参数使用Variant Model

matlab 无人机强化学习 无人机matlab建模_c代码_28

 

  1. Software in the loop,等效性测试

生成代码封装成function函数,然后通过software in the loop测试,测试样本足够多。

首先,在配置里面Verification中Advanced parameters中选择Create block:SIL

matlab 无人机强化学习 无人机matlab建模_右键_29

  1. 先打开命令窗口打开模型,然后用slvnvmakeharness('test')打开测试环境
  2. 代码code generation /interface中库的替换也会提高效率
  3. 代码的定点化
  4. 重用数据,可以使用Analysis/Refactor Model/Identify Modeling Clones