文档

跟踪对象使用MATLAB代码

学习目标

在本教程中,您将学习如何:

  • 使用MATLAB函数块添加MATLAB®Simulink的功能万博1manbetx®用于对嵌入式处理器进行建模、仿真和部署的模型。

    这种能力对于用MATLAB的文本语言比用Simulink的图形语言更好地表述算法的编码是有用的。万博1manbetx

  • 使用coder.extrinsic调用MATLAB代码MATLAB函数块。

    此功能允许您进行快速原型设计。您可以从Simulink调用现有的MATLAB代码,而不必使此代码适合代码生成万博1manbetx。

  • 在生成代码之前,检查现有的MATLAB代码是否适合生成代码。

    您必须在生成代码之前准备好代码。

  • 在生成代码时指定可变大小的输入。

教程的先决条件

你需要知道的

要完成本教程,您应该对MATLAB软件有基本的了解。您还应该了解如何创建和模拟基本的Simulink模型。万博1manbetx

所需的产品s manbetx 845

要完成本教程,您必须安装以下产品:s manbetx 845

  • MATLAB

  • MATLAB编码器™

  • 万博1manbetx

  • 万博1manbetx仿真软件编码器

  • C编译器

有关支持的编译器列表,请参见万博1manbetx万博1manbetx支持编译器

在生成C代码之前,必须设置C编译器。看到设置C编译器

有关安装MathWorks的说明®s manbetx 845产品,请参阅针对您的平台的MATLAB安装文档。如果您已经安装了MATLAB,并希望检查安装了哪些其他MathWorks产品,请输入s manbetx 845版本在MATLAB命令窗口中。

示例:卡尔曼滤波

描述

本节描述本教程使用的示例。您不必熟悉该算法来完成本教程。

本教程的示例使用卡尔曼滤波器从基于过去位置的一系列噪声输入中估计在二维空间中移动的物体的位置。位置向量有两个分量,xy,表示其水平和垂直坐标。

卡尔曼滤波器具有广泛的应用,包括控制、信号和图像处理;雷达和声纳;还有金融建模。它们是递归滤波器,从一系列不完整或有噪声的测量中估计线性动态系统的状态。卡尔曼滤波算法依赖于滤波器的状态空间表示,并使用存储在状态向量中的一组变量来完整地表征系统的行为。它使用状态转移矩阵和过程噪声估计线性和递归地更新状态向量。

算法

本节描述卡尔曼滤波器的算法,并在本教程提供的滤波器的MATLAB版本中实现。

该算法利用卡尔曼滤波估计器根据运动物体的过去位置预测其位置。它通过更新卡尔曼状态向量来估计当前位置,其中包括位置(xy),速度(Vxv)和加速度(斧头)的运动物体。卡尔曼状态向量,间的,是一个持久变量。

%初始条件persistent x_est p_est if isempty(x_est) x_est = 0 (6,1);P_est = 0 (6,6);结束
间的初始化为空6 x1列向量,并在每次使用过滤器时更新。

卡尔曼滤波器使用运动定律来估计新状态:

X X 0 + V x d t Y Y 0 + V y d t V x V x 0 + 一个 x d t V y V y 0 + 一个 y d t

这些运动定律被捕获在状态转移矩阵中一个,它是一个包含的系数值的矩阵xyVxVy一个x,一个y
%初始化状态转移矩阵dt=1;A=[1 0 dt 0 0 0;…]0 0 0 dt 0 0;0 0 1 0 dt 0;0 0 0 1 0 dt;…0 0 0 0 1 0;…0 0 0 0 0 1];

过滤过程

过滤过程分为两个阶段:

  • 预测状态和协方差

    卡尔曼滤波器使用之前估计的状态,间的,来预测当前的状态,x_prd.预测状态和协方差计算公式为:

    %预测状态和协方差x_prd = A * x_est;p_prd = A * p_est * A' + Q;

  • 估计

    滤波器也使用电流测量,z,以及预测状态,x_prd,以更准确地估计当前状态的近似值。估计状态和协方差计算公式为:

    %测量矩阵H = [1 0 0 0 0 0 0;0 1 0 0 0 0 0];Q =眼(6);R = 1000 *眼(2);
    %估计S = H * p_prd' * H' + R;B = H * p_prd';klm_gain = (S \ B)';%估计状态和协方差x_est = x_prd + klm_gain * (z - H * x_prd);p_est = p_prd - klm_gain * H * p_prd;%计算估计的测量值y = H * x_est;

参考

微积分,西蒙。自适应滤波理论.《上马鞍河》,新泽西州:普伦蒂斯-霍尔出版社,1996年。

本教程的文件

关于教程文件

本教程使用以下文件:

  • 万博1manbetx本教程每个步骤的Simulink模型文件。

  • 示例MATLAB代码文件为教程的每一步。

    在本教程中,您将使用调用包含卡尔曼滤波算法的MATLAB文件的Simulink模万博1manbetx型。

  • 包含示例输入数据的mat文件。

  • 绘图的MATLAB文件。

文件位置

教程文件可在以下文件夹中获得:docroot \工具箱\仿真软万博1manbetx件\ \卡尔曼例子.要运行本教程,必须将这些文件复制到本地文件夹中。有关说明,请参阅本地复制文件

文件的名称和描述

类型 名字 描述
MATLAB函数文件 ex_kalman01 基线MATLAB实现的一个标量卡尔曼滤波器。
ex_kalman02 原算法版本,适合代码生成。
ex_kalman03 卡尔曼滤波器的版本适合于代码生成和使用基于帧和基于包的输入。
ex_kalman04 禁用代码生成的内联。
万博1manbetxSimulink模型文件 ex_kalman00 万博1manbetx没有Simulink模型MATLAB函数块。
ex_kalman11 用a完成Simul万博1manbetxink模型MATLAB函数块为标量卡尔曼滤波器。
ex_kalman22 万博1manbetxSimulink模型与aMATLAB函数用于接受固定大小(基于帧)输入的卡尔曼滤波器的块。
ex_kalman33 万博1manbetxSimulink模型与aMATLAB函数用于接受可变大小(基于包的)输入的卡尔曼滤波器的块。
ex_kalman44 万博1manbetxSimulink模型调用ex_kalman04.m,它禁用了内联。
MATLAB数据文件 位置 包含算法使用的输入数据。
图文件 plot_trajectory 绘制目标的轨迹和卡尔曼滤波估计的位置。

教程的步骤

本地复制文件

将教程文件复制到本地工作文件夹:

  1. 创建本地万博 尤文图斯比如文件夹,c: 万博1manbetx\模型、卡尔曼滤波、解决方案万博 尤文图斯

  2. 切换到docroot \工具箱\仿真软万博1manbetx件\例子文件夹中。在MATLAB命令行输入:

    Cd(完整文件(doroot, 'toolbox', 'simul万博1manbetxink', 'examples'))

  3. 的内容卡尔曼子文件夹到本地万博 尤文图斯文件夹的完整路径名万博 尤文图斯文件夹:

    拷贝文件(“卡尔曼”、“万博 尤文图斯”)

    例如:

    拷贝文件(“卡尔曼”、“c: \仿真软件\卡尔万博1manbetx曼\解决方案”)万博 尤文图斯

    你的万博 尤文图斯文件夹现在包含本教程的完整解决方案集。万博 尤文图斯如果您不想执行本教程中每个任务的步骤,可以查看解决方案以了解代码的外观。万博 尤文图斯

  4. 创建本地工作比如文件夹,c: 万博1manbetx\模型、卡尔曼滤波、工作

  5. 从您的万博 尤文图斯文件夹到你的工作文件夹中。

    • ex_kalman01

    • ex_kalman00

    • 位置

    • plot_trajectory

    你的工作文件夹现在包含了开始学习教程所需的所有文件。

设置C编译器

建立你的MATLAB函数块需要一个受支持的编译器。万博1manbetxMATLAB自动选择一个作为默认编译器。如果您的系统上安装了多个支持matlab的编译器,则可以万博1manbetx使用墨西哥人设置命令。看到更改默认编译器(MATLAB)。

关于ex_kalman00模型

首先,检查ex_kalman00模型,以理解您试图使用卡尔曼滤波器解决的问题。

  1. 打开ex_kalman00模型:万博1manbetx

    1. 将MATLAB当前文件夹设置为包含本教程工作文件的文件夹。在MATLAB命令行输入:

      cd工作
      在哪里工作包含文件的文件夹的完整路径名。

    2. 在MATLAB命令行输入:

      ex_kalman00

      该模型是一个不完整的模型,用于演示如何将MATLAB代码与Simulink集成。万博1manbetx完整的模型如下ex_kalman11,本教程也提供了。

InitFcn模型回调函数。模型使用这个回调函数:

  • 从mat文件加载位置数据。

  • 设置Index生成器块使用的数据,该生成器块为控件提供第二个输入选择器块。

要查看这个回调:

  1. 选择文件>模型属性>模型属性

  2. 选择回调选项卡。

  3. 选择InitFcn模型的回调窗格。

    回调出现。

    加载position.mat;[R、C] =大小(位置);idx = (1: C) ';t = idx-1;

源块。该模型使用两个块来提供位置数据和a的标量索引选择器块。

选择器。该模型使用选择器块,该块选择其输入信号的元素,并根据其索引输入和索引输入生成输出信号指数的选择设置。通过改变该块的配置,可以生成不同大小的信号。

要查看选择器块设置,双击选择器Block查看功能块参数。

在这个模型中,指数的选择对于第一个端口是选择所有第二个端口是索引向量(端口).因为输入是a2 × 310位置矩阵,索引数据增量从1310,选择器Block只输出12 x1每个采样时间的输出。

MATLAB函数块。该模型使用MATLAB函数块来绘制目标的轨迹并通过卡尔曼滤波估计位置。这个函数:

  • 首先声明数字持有,plot_trajectory函数作为外部函数,因为这些MATLAB可视化函数不支持代码生成。万博1manbetx当你调用一个不支持的MATLAB函数时万博1manbetx,你必须声明它是外在的,这样MATLAB就可以执行它,但不会尝试为它生成代码。

  • 创建一个图形窗口,并在模拟过程中保持它。否则,每个采样时间都会出现一个新的图形窗口。

  • 调用plot_trajectory函数,该函数绘制目标的轨迹和卡尔曼滤波估计的位置。

模拟停止时间。模拟停止时间为309,因为过滤器的输入是一个包含310元素和Simulink使用万博1manbetx从零开始的索引。

将MATLAB函数块添加到模型中

要自己修改模型和代码,请完成本节中的练习。否则,打开提供的模型ex_kalman11在你的万博 尤文图斯子文件夹查看修改后的模型。

在本教程中,您将添加MATLAB函数Block to theex_kalman00.mdl本教程提供的模型。您必须从一个空的Simulink模型开始开发自己的测试台。万博1manbetx

添加MATLAB函数块。添加一个MATLAB函数Block to theex_kalman00模型:

  1. 开放ex_kalman00在仿真万博1manbetx软件。

    ex_kalman00

  2. 添加一个MATLAB函数块到模型:

    1. 在MATLAB命令行中输入slLibraryBrowser打开Simulink库浏万博1manbetx览器。

    2. 从Simulink库列表中选择万博1manbetx用户定义函数图书馆。

    3. 单击MATLAB函数把它拖到ex_kalman00模型。将该块放置在红色文本注释的正上方将MATLAB函数块放在这里。

    4. 从模型中删除红色文本注释。

    5. 将模型保存在当前文件夹中ex_kalman11

      最佳实践-保存增量代码更新

打电话给你的MATLAB来自MATLAB函数块的代码。调用您的MATLAB代码MATLAB函数布洛克:

  1. 双击MATLAB函数块打开MATLAB函数块编辑器。

  2. 删除编辑器中显示的默认代码。

  3. 将以下代码复制到MATLAB函数块。

    函数y = kalman(u) %#codegen y = ex_kalman01(u);

  4. 保存模型。

连接MATLAB函数块输入输出

  1. 连接MATLAB函数阻塞输入和输出,使您的模型看起来像这样。

  2. 保存模型。

模拟ex_kalman11模型

模拟模型:

  1. 在Simuli万博1manbetxnk模型窗口中,选择模拟>运行

    当Si万博1manbetxmulink运行模型时,它用蓝色绘制目标的轨迹,用绿色表示卡尔曼滤波估计的位置。最初,你会看到估计的位置与物体的实际位置收敛需要很短的时间。然后发生三次突然的位置移动——每次卡尔曼滤波器都在几次迭代后重新调整并跟踪目标。

  2. 模拟停止。

您已经证明了您的MATLAB算法在Simulink中工作。万博1manbetx现在可以修改过滤器以接受固定大小的输入,如修改过滤器以接受固定大小的输入

修改过滤器以接受固定大小的输入

到目前为止,您在本教程中使用的过滤器使用一个简单的批处理过程,每次只接受一个输入,因此您必须为每个输入重复调用该函数。在本教程的这一部分中,您将学习如何修改算法以接受固定大小的输入,从而使该算法适合于基于帧的处理。然后修改模型,将输入作为固定大小的数据帧提供,并调用过滤器,每次传递一帧数据。

修改你的MATLAB代码。要自己修改代码,请完成本节中的练习。否则,打开提供的文件ex_kalman03.m在你的万博 尤文图斯子文件夹查看修改后的算法。

现在可以修改算法来处理包含多个输入的向量。您需要找到向量的长度,并依次为向量中的每个元素调用过滤器代码。通过调用a中的过滤器算法来实现循环。

  1. 开放ex_kalman02.m在MATLAB编辑器中。在MATLAB命令行输入:

    编辑ex_kalman02.m

  2. 添加一个循环过滤代码。

    1. 在评论之前:

      %预测状态和协方差
      插入:
      我= 1:尺寸(z, 2)

    2. 后:

      %计算估计的测量值y = H * x_est;
      插入:
      结束

    3. 之间的代码语句和结束语句,右键单击打开上下文菜单并选择智能缩进缩进代码。

    你的过滤器代码现在看起来像这样:

    我= 1:尺寸(z, 2)%预测状态和协方差x_prd = A * x_est;p_prd = A * p_est * A' + Q;%估计S = H * p_prd' * H' + R;B = H * p_prd';klm_gain = (S \ B)';%估计状态和协方差x_est = x_prd + klm_gain * (z - H * x_prd);p_est = p_prd - klm_gain * H * p_prd;%计算估计的测量值y = H * x_est;结束

  3. 修改计算估计状态和协方差的行,以使用th输入要素z

    变化:

    x_est = x_prd + klm_gain * (z - H * x_prd);
    :
    X_est = x_prd + klm_gain * (z(1:2)- H * x_prd);

  4. 修改计算估计测量值的行,以便将结果追加到th输出元素y

    变化:

    y = H * x_est;
    :
    y(我):= H * x_est;

    右上方的代码分析器消息指示器变为橙色,表示代码分析器检测到警告。代码分析器用橙色在违规代码下划线,并在右侧放置一个橙色标记。

  5. 将指针移到橙色标记上以查看错误信息。

    代码分析器检测到这一点y必须在编写子脚本之前完全定义,并且不能通过在生成的代码中建立索引来增长变量。

  6. 要解决此警告,请为输出预先分配内存y,它与输入的大小相同z.将此代码添加到循环。

    %预分配输出信号:y= 0 (size(z));

    橙色标记消失,代码右上方的代码分析器消息指示器变为绿色,这表明您已经修复了代码分析器检测到的所有错误和警告。

    为什么要预先分配输出?

  7. 将函数名称更改为ex_kalman03并将文件保存为ex_kalman03.m在当前文件夹中。

ex_kalman03.m .目录

您已经准备好开始本教程中的下一个任务,修改你的模型来调用更新后的算法

修改你的模型来调用更新后的算法。要自己修改模型,请完成本节中的练习。否则,打开提供的模型ex_kalman22.mdl在你的万博 尤文图斯子文件夹查看修改后的模型。

接下来,更新您的模型,以提供固定大小的数据帧和调用的输入ex_kalman03每次传递一帧数据。

  1. 开放ex_kalman11模型在Simuli万博1manbetxnk。

    ex_kalman11

  2. 双击MATLAB函数块打开MATLAB函数块编辑器。

  3. 替换调用的代码ex_kalman02呼唤着ex_kalman03

    函数y = kalman(u) %#codegenY = ex_kalman03(u);

  4. 关闭编辑器。

  5. 修改InitFcn回调函数:

    1. 选择文件>模型属性>模型属性

      打开模型属性对话框。

    2. 在此对话框中,选择回调选项卡。

    3. 选择InitFcn模型的回调窗格。

    4. 将现有的回调替换为:

      加载position.mat;[R、C] =大小(位置);FRAME_SIZE = 5;idx = (1: FRAME_SIZE: C) ';LEN =长度(idx);t = (1: LEN) 1;
      这个回调函数将帧大小设置为5,以及要递增的索引5

    5. 点击应用并关闭模型属性对话框。

  6. 更新选择器块以使用正确的索引。

    1. 双击选择器Block查看功能块参数。

      打开“功能块参数”对话框。

    2. 设置第二个指数的选择起始索引(端口)

    3. 设置输出的大小对于第二个输入FRAME_SIZE,点击应用然后关闭对话框。

    现在,指数的选择对于第一个端口是选择所有第二个端口是起始索引(端口).因为索引的增量是5每次采样时间,输出大小为5,选择器块输出a2 x5每个采样时间的输出。

  7. 将模型模拟停止时间更改为61.现在帧的大小是5,因此模拟在五分之一的样本时间内完成。

    1. 在Simuli万博1manbetxnk模型窗口中,选择模拟>型号配置参数

    2. 在“配置参数”对话框的左侧窗格中选择解算器

    3. 在右侧窗格中,设置停止时间61

    4. 点击应用然后关闭对话框。

  8. 将模型保存为ex_kalman22.mdl

测试修改后的算法。模拟模型:

  1. 在Simuli万博1manbetxnk模型窗口中,选择模拟>运行

    当Si万博1manbetxmulink运行模型时,它以蓝色绘制对象的轨迹,卡尔曼滤波器估计的位置为绿色,就像以前使用批处理滤波器时一样。

  2. 模拟停止。

你已经证明了你的算法接受固定大小的信号。你现在已经为下一个任务做好了准备,使用过滤器接受可变大小的输入

使用过滤器接受可变大小的输入

在本教程的这一部分中,您将学习如何在Simulink模型中指定可变大小的数据。万博1manbetx然后你用可变大小的输入测试你的卡尔曼滤波算法,看看算法适合处理不同大小的数据包。有关在Simulink中使用可变大小数据的详细信息,请参见万博1manbetx可变大小信号基础

更新模型以使用可变大小的输入。要自己修改模型,请完成本节中的练习。否则,打开提供的模型ex_kalman33.mdl在你的万博 尤文图斯子文件夹查看修改后的模型。

  1. 开放ex_kalman22.mdl在仿真万博1manbetx软件。

    ex_kalman22

  2. 修改InitFcn回调函数:

    1. 选择文件>模型属性>模型属性

      打开模型属性对话框。

    2. 选择回调选项卡。

    3. 选择InitFcn模型的回调窗格。

    4. 将现有的回调替换为:

      加载position.mat;Idx =[11;2 3;4 6;7 10;31 70;71 100;101 200;201 250;251 310];LEN =长度(idx);t = (0:1: LEN-1)”;
      这个回调设置索引以生成11个不同大小的输入。它指定每个采样时间的开始和结束索引。第一个采样时间只使用第一个元素,第二个采样时间使用第二个和第三个元素,依此类推。最大的样本,101200,包含100个元素。

    5. 点击应用然后关闭模型属性对话框。

  3. 更新选择器块以使用正确的索引。

    1. 双击选择器Block查看功能块参数。

      打开“功能块参数”对话框。

    2. 设置第二个指数的选择起始和结束索引(端口),然后点击应用然后关闭对话框。

      此设置意味着索引端口的输入在每个采样时间指定输入的开始和结束索引。因为索引输入在每个采样时间指定不同的起始和结束索引,所以选择器随着仿真的进行,Block输出一个可变大小的信号。

  4. 使用端口和数据管理器设置MATLAB函数输入x和输出y可变大小的数据。

    1. 双击MATLAB函数块打开MATLAB函数块编辑器。

    2. 从编辑器菜单中选择编辑数据

    3. 在Ports and Data Manager左窗格中,选择输入u

      端口和数据管理器显示有关的信息u在右窗格中。

    4. 一般选项卡,选择变量的大小复选框,然后单击应用

    5. 在左窗格中,选择输出y

    6. 一般标签:

      1. 设置大小y[100]来指定一个二维矩阵的上界2对于第一维和One hundred.类型中指定的最大输入大小InitFcn回调。

      2. 选择变量的大小复选框。

      3. 点击应用

    7. 关闭端口和数据管理器。

  5. 现在对另一个做同样的操作MATLAB函数块。使用端口和数据管理器来设置可视化块输入yz可变大小的数据。

    1. 双击可视化块打开MATLAB函数块编辑器。

    2. 从编辑器菜单中选择编辑数据

    3. 在Ports and Data Manager左窗格中,选择输入y

    4. 一般选项卡,选择变量的大小复选框,然后单击应用

    5. 在左窗格中,选择输入z

    6. 一般选项卡,选择变量的大小复选框,然后单击应用

    7. 关闭端口和数据管理器。

  6. 将模型模拟停止时间更改为10.这一次,过滤器在每个采样时间处理11个不同大小的输入中的一个。

  7. 将模型保存为ex_kalman33.mdl

测试修改后的模型。模拟模型:

  1. 在Simuli万博1manbetxnk模型窗口中,选择模拟>运行

    当Si万博1manbetxmulink运行模型时,它用蓝色绘制目标的轨迹,用绿色表示卡尔曼滤波估计的位置。

    注意,信号线之间选择器块和跟踪和可视化块的变化,以显示这些信号是可变大小的。

  2. 模拟停止。

您已经成功创建了一个接受可变大小输入的算法。接下来,您将学习如何调试您的MATLAB函数块,如中所述调试MATLAB函数块

调试MATLAB函数块

您可以调试MATLAB函数块,就像在MATLAB中调试函数一样。

  1. 双击MATLAB函数块,调用卡尔曼滤波器打开MATLAB函数块编辑器。

  2. 在编辑器中,单击行左距的破折号(-)字符:

    Y = kalman03(u);

    一行的边缘出现一个红色小球,表示您设置了一个断点。

  3. 在Simuli万博1manbetxnk模型窗口中,选择模拟>运行

    当执行到达断点时,模拟将暂停,并在左侧空白处出现一个绿色的小箭头。

  4. 将指针放在变量上u

    的价值u显示在指针旁边。

  5. 从MATLAB函数块编辑器菜单中选择一步

    kalman03.m文件在编辑器中打开,现在可以使用一步一步,走出

  6. 选择走出

    kalman03.m文件关闭,然后MATLAB函数块代码重新出现在编辑器中。

  7. 将指针放在输出变量上y

    现在可以看到的值y

  8. 单击红球以删除断点。

  9. 从MATLAB函数块编辑器菜单中选择退出调试

  10. 关闭编辑器。

  11. 关闭图形窗口。

    现在你可以开始下一个任务了,生成C代码

生成C代码

你已经证明了你的算法在Simulink中工作。万博1manbetx接下来为您的模型生成代码。

请注意

在生成代码之前,您必须检查您的MATLAB代码是否适合代码生成。如果您将MATLAB代码作为外部函数调用,则必须在生成代码之前删除外部调用。

  1. 重命名MATLAB函数跟踪.要重命名块,双击注释MATLAB函数以下MATLAB函数Block并将文本替换为跟踪

    生成代码时MATLAB函数块,万博1manbetx仿真软件编码器使用生成代码中块的名称。使用有意义的名称是一个很好的做法。

  2. 在生成代码之前,请确保以下几点万博1manbetx仿真软件编码器创建代码生成报告。这个HTML报告提供了对生成文件列表的简单访问,其中包含用于生成代码的配置设置的摘要。

    1. 在Simuli万博1manbetxnk模型窗口中,选择模拟>型号配置参数

      打开“配置参数”对话框。

    2. 在“配置参数”对话框的左侧窗格中选择报告代码生成

    3. 在右侧窗格中选择创建代码生成报告

      自动打开报告选项也被选中。

    4. 点击应用,关闭“配置参数”对话框。

    5. 保存您的模型。

  3. 为跟踪块生成代码:

    1. 在您的模型中,选择Tracking块。

    2. 在Simuli万博1manbetxnk模型窗口中,选择代码>C / c++代码>构建选定的子系统

  4. Simu万博1manbetxlink软件生成一个错误,通知您它不能将可变大小的信号记录为数组。您需要更改保存到MATLAB工作空间的数据格式。要更改此格式:

    • 在Simuli万博1manbetxnk模型窗口中,选择模拟>型号配置参数

      打开“配置参数”对话框。

    • 在“配置参数”对话框的左侧窗格中选择数据导入/导出然后设置格式结构随时间变化

      记录的数据现在是一个有两个字段的结构:一个时间字段和一个信号字段,使Simulink能够记录可变大小的信号。万博1manbetx

    • 点击应用,关闭“配置参数”对话框。

    • 保存您的模型。

  5. 重复步骤3.为跟踪块生成代码。

    万博1manbetx仿真软件编码器软件为块生成C代码并启动代码生成报告。

    有关使用代码生成报告的详细信息,请参见代码生成报告(万博1manbetx仿真软件编码器)。

  6. 在代码生成报告的左侧窗格中,单击Tracking.c链接查看生成的C代码。请注意,在为MATLAB函数块,跟踪,没有代码ex_kalman03函数,因为内联是默认启用的。

  7. 修改你的过滤算法来禁用内联:

    1. ex_kalman03.m,在函数声明后添加:

      coder.inline('永远');

    2. 将函数名称更改为ex_kalman04并将文件保存为ex_kalman04.m在当前文件夹中。

    3. 在你的ex_kalman33模型,双击跟踪块。

      打开MATLAB函数块编辑器。

    4. 修改要调用的筛选算法的调用ex_kalman04

      函数y = kalman(u) %#codegenY = ex_kalman04(u);

    5. 将模型保存为ex_kalman44.mdl

  8. 为更新的模型生成代码。

    1. 选择跟踪块。

    2. 在模型窗口中,选择代码>C / c++代码>构建选定的子系统

      为子系统构建代码对话框。

    3. 单击构建按钮。

      万博1manbetx仿真软件编码器软件为块生成C代码并启动代码生成报告。

    4. 在代码生成报告的左侧窗格中,单击Tracking.c链接查看生成的C代码。

      这一次ex_kalman04函数有代码,因为您禁用了内联。

      */ static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T z_sizes[2], real_T y_data[620], int32_T y_sizes[2]);/* MATLAB函数块的函数:'/Tracking' */ static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T 48 z_sizes[2], real_T y_data[620], int32_T y_sizes[2])

本教程中使用的最佳实践

最佳实践-保存增量代码更新

记住要点

  • 在修改MATLAB代码之前备份它。

  • 为您的文件确定一个命名约定,并经常保存临时版本。例如,本教程使用两位数后缀来区分不同版本的过滤器算法。

  • 为了进行仿真,在生成代码之前,请使用coder.extrinsic检查你的算法是否适合在Simulink中使用。万博1manbetx这种做法提供了以下好处:

    • 您不必使MATLAB代码适合于代码生成。

    • 您可以在MATLAB中调试MATLAB代码,同时从Simulink调用它。万博1manbetx

  • 创建一个万博1manbetx仿真软件编码器代码生成报告。这个HTML报告提供了对生成文件列表的简单访问,其中包含用于生成代码的配置设置的摘要。

另请参阅

相关的例子

更多关于

这个话题有帮助吗?