在本教程中,您将学习如何:
使用MATLAB函数块添加MATLAB®功能仿真软件万博1manbetx®模型的建模、仿真和部署嵌入式处理器。
此功能用于编码算法更好地表示文本语言MATLAB仿真软件的图形语言。万博1manbetx
使用coder.extrinsic
从一个调用MATLAB代码MATLAB函数块。
此功能允许您快速原型。你可以叫现有仿真软件MATLAB代码而无需使这段代码适合代码生成。万博1manbetx
检查现有的MATLAB代码生成代码之前适用于代码生成。
你必须准备你的代码生成代码。
指定生成代码时适应输入。
完成本教程之后,您应该熟悉MATLAB软件基础。你也应该知道如何创建基本模型和模拟模型。万博1manbetx
要完成本教程,您必须安装以下产品:s manbetx 845
MATLAB
MATLAB编码器™
万博1manbetx
万博1manbetx仿真软件编码器
C编译器
编译器支持的列表,请参阅万博1manbetx万博1manbetx支持编译器。
之前,您必须设置C编译器生成C代码。看到设置你的C编译器。
安装MathWorks指令®s manbetx 845产品,看到MATLAB平台安装文档。如果你已经安装了MATLAB和要检查哪些其他MathWorks产品安装,进入s manbetx 845版本
在MATLAB命令窗口。
本节描述的示例所使用的教程。你不需要熟悉算法完成本教程。
本教程的示例使用卡尔曼滤波器来估计物体的位置在一个二维空间,从一系列的噪声输入基于过去的职位。这个位置向量有两个组件,x
和y
,说明其水平和垂直坐标。
卡尔曼滤波器广泛应用,包括控制、信号和图像处理、雷达和声纳;和金融建模。他们是递归滤波器的线性动态系统的状态估计的一系列不完整或噪声测量。卡尔曼滤波算法依赖于整数阶的过滤器,并使用一组变量存储在状态向量完全描述系统的行为。它更新状态向量线性递归地使用状态转移矩阵和噪声估计过程。
本节描述卡尔曼滤波器的算法,并在MATLAB中实现本教程提供的过滤器。
算法预测的位置移动物体根据其过去的位置使用卡尔曼滤波器的估计量。估计目前的位置更新卡尔曼状态向量,其中包括位置(x和y)、速度(Vx和v)和加速度(斧头和唉移动物体的)。卡尔曼滤波的状态向量,间的
,是一个持久的变量。
%初始条件持续间p_est如果isempty(间)间= 0 (6,1);p_est = 0 (6,6);结束
间的
被初始化为一个空6 x1
列向量和更新每次使用过滤器。
使用运动定律的卡尔曼滤波器来估计新状态:
这些法律的运动捕获的状态转移矩阵一个
,这是一个矩阵,其中包含的系数值x
,y
,Vx
,Vy
,一个x
,一个y
。
%初始化状态转移矩阵dt = 1;= (1 0 dt 0 0 0;…0 1 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 = *间;p_prd = * p_est *“+ Q;
估计
过滤器还使用当前的测量,z
,预测状态,x_prd
,当前状态的估计更准确的近似值。状态估计和协方差计算:
%测量矩阵H = [1 0 0 0 0 0;0 1 0 0 0 0);Q =眼(6);R = 1000 *眼(2);
%估计S = H * p_prd ' * H ' + R;B = H * p_prd ';klm_gain = (S \ B) ';%状态估计和协方差间= x_prd + klm_gain * (z - H * x_prd);p_est = p_prd - klm_gain * H * p_prd;%计算估计测量y = H *间;
微积分,西蒙。自适应滤波器理论。上台北:新世纪,Inc ., 1996年。
本教程使用以下文件:
万博1manbetx仿真软件模型文件为每个步骤的教程。
例子MATLAB代码文件教程的每一步。
在本教程中,您将使用仿真软件模型,调用MATLAB文件包含一个卡尔曼滤波器算法。万博1manbetx
一个包含示例MAT-file输入数据。
MATLAB文件策划。
本教程文件中可用以下文件夹:docroot \工具箱\仿真软万博1manbetx件\ \卡尔曼例子
。运行本教程中,您必须将这些文件复制到本地文件夹中。说明,请参阅在本地复制文件。
类型 | 的名字 | 描述 |
---|---|---|
MATLAB函数文件 | ex_kalman01 |
基线的MATLAB实现标量卡尔曼滤波器。 |
ex_kalman02 |
原始版本的算法适用于代码生成。 | |
ex_kalman03 |
版本的卡尔曼滤波器适用于代码生成和使用框架和基于输入。 | |
ex_kalman04 |
禁用内联代码生成。 | |
万博1manbetx仿真软件模型文件 | ex_kalman00 |
万博1manbetx仿真软件模型没有MATLAB函数块。 |
ex_kalman11 |
完成仿真软件模型万博1manbetxMATLAB函数块为标量卡尔曼滤波器。 | |
ex_kalman22 |
万博1manbetx仿真软件模型与一个MATLAB函数接受固定大小的块的卡尔曼滤波器(框架)的输入。 | |
ex_kalman33 |
万博1manbetx仿真软件模型与一个MATLAB函数块接受适应的卡尔曼滤波器(分组)输入。 | |
ex_kalman44 |
万博1manbetx仿真软件模型调用ex_kalman04.m 内联禁用。 |
|
MATLAB数据文件 | 位置 |
包含输入数据所使用的算法。 |
图文件 | plot_trajectory |
块对象的轨迹和卡尔曼滤波器的估计位置。 |
本教程文件复制到本地工作目录:
创建一个本地万博 尤文图斯
例如,文件夹c: 万博1manbetx\模型、卡尔曼滤波、解决方案万博 尤文图斯
。
改变docroot \工具箱\仿真软万博1manbetx件\例子
文件夹中。在MATLAB命令行,输入:
cd (fullfile (docroot,“工具箱”,“模型”,万博1manbetx“示例”))
复制的内容卡尔曼
子文件夹到你当地的万博 尤文图斯
文件夹中,指定的完整路径名万博 尤文图斯
文件夹:
拷贝文件(“卡尔曼”、“万博 尤文图斯”)
例如:
拷贝文件(“卡尔曼”、“c: \仿真软件\卡尔万博1manbetx曼\解决方案”)万博 尤文图斯
你的万博 尤文图斯
现在文件夹包含教程一套完整的解决方案。万博 尤文图斯如果你不想执行每个任务的步骤在本教程中,您可以查看代码应该如何解决方案。万博 尤文图斯
创建一个本地工作
例如,文件夹c: 万博1manbetx\模型、卡尔曼滤波、工作
。
以下文件从你的副本万博 尤文图斯
文件夹给你工作
文件夹中。
ex_kalman01
ex_kalman00
位置
plot_trajectory
你的工作
现在文件夹中包含的所有文件,你需要开始使用教程。
建立你的MATLAB函数块需要编译器的支持。万博1manbetxMATLAB自动选择一个作为默认的编译器。如果您有多个MATLAB-supported编译器安装在万博1manbetx您的系统,您可以更改默认使用墨西哥人设置
命令。看到改变默认的编译器。
首先,检查ex_kalman00
模型提供的教程来理解你正试图解决的问题使用卡尔曼滤波器。
打开ex_kalman00
模型在仿真软件:万博1manbetx
设置你的MATLAB当前文件夹的文件夹,其中包含你的工作文件对于本教程。在MATLAB命令行,输入:
cd工作
工作
是包含文件的文件夹的完整路径名。在MATLAB命令行,输入:
ex_kalman00
这个模型是一个不完整的模型与仿真软件MATLAB代码演示如何集成。万博1manbetx完整的模型ex_kalman11
本教程也提供。
InitFcn回调函数模型。该模型使用这个回调函数:
从MAT-file加载位置数据。
设置数据索引生成器使用的块,它提供了第二个输入选择器块。
查看这个回调:
在建模选项卡上,选择模型设置>模型属性。
选择回调选项卡。
选择InitFcn
在模型的回调窗格。
出现回调。
加载position.mat;[R、C] =大小(位置);idx = (1: C) ';t = idx-1;
源块。该模型使用了两个源提供位置数据块和一个标量指数选择器块。
选择器。该模型使用一个选择器块,选择元素的输入信号并生成一个基于其索引输入和输出信号指数的选择设置。通过改变物体的配置,您可以生成不同大小的信号。
查看选择器块设置,双击选择器块查看功能块参数。
在这个模型中,指数的选择第一端口选择所有
和第二个端口索引向量(港口)
。因为输入2 x 310
位置矩阵,和索引数据的增量1
来310年
,选择器块只输出一2 x1
在每个样本时间输出。
MATLAB功能块。该模型使用一个MATLAB函数块绘制物体的轨迹和卡尔曼滤波器的估计位置。这个函数:
首先声明图
,持有
,plot_trajectory
函数作为外在因为这些MATLAB可视化功能不支持代码生成。万博1manbetx当你调用一个不受支持的MATLAB函数万博1manbetx时,你必须声明这是外在所以MATLAB可以执行,但不尝试生成代码。
图窗口,它创建了一个模拟的持续时间。否则一个新的图窗口为每个示例。
调用plot_trajectory
函数,该块对象的轨迹和卡尔曼滤波器的估计位置。
仿真停止时间。仿真停止时间309年
,因为过滤器的输入是一个向量包含310年
元素和仿真软件使用从零开始万博1manbetx的索引。
自己修改模型和代码,通过这部分的练习。否则,开放提供的模型ex_kalman11
在你的万博 尤文图斯
子文件夹看到修改后的模型。
对于本教程中,您将添加MATLAB函数块的ex_kalman00.mdl
模型提供的教程。你必须开始开发自己的测试台上一个空模型模型。万博1manbetx
添加块的MATLAB函数。添加一个MATLAB函数块的ex_kalman00
模型:
开放ex_kalman00
在仿真万博1manbetx软件。
ex_kalman00
添加一个MATLAB函数块的模型:
在MATLAB命令行中,键入slLibraryBrowser
打开模型库浏览器。万博1manbetx
从模型库列表中,选择万博1manbetx用户定义函数
图书馆。
单击MATLAB函数块,并将其拖动到ex_kalman00
模型。把块上方的红色文本注释,读起来MATLAB函数块
。
从模型中删除红色文本注释。
保存模型在当前文件夹ex_kalman11
。
打电话给你的MATLAB代码块的MATLAB函数。调用MATLAB代码的MATLAB函数布洛克:
双击MATLAB函数块打开MATLAB函数块编辑器。
删除默认的代码显示在编辑器中。
将下面的代码复制到MATLAB函数块。
函数y =卡尔曼(u) % # codegen y = ex_kalman01 (u);
保存模型。
MATLAB功能块连接输入和输出
连接MATLAB函数块的输入和输出,这样您的模型看起来是这样的。
保存模型。
模拟模型:
在仿真软件模型万博1manbetx窗口中,点击运行。
作为仿万博1manbetx真软件运行模型,它情节对象的轨迹在蓝色和绿色的卡尔曼滤波器的估计位置。最初,你看,有一段很短的收敛估计位置与实际位置的对象。三突然转变立场occur-each卡尔曼滤波器正在调整和跟踪对象经过一系列的迭代。
仿真停止。
你已经证明你在仿真软件MATLAB算法。万博1manbetx现在可以修改过滤器接受一个固定大小的输入,如前所述修改过滤器接受一个固定大小的输入。
过滤器有工作到目前为止在本教程中使用一个简单的批处理过程,接受一个输入一次,所以你必须为每个输入反复调用该函数。在这部分的教程中,您将了解如何修改算法来接受一个固定大小的输入,使得该算法适用于框架处理。然后修改模型提供输入固定大小的数据帧,称为过滤传入的数据一帧。
修改你的MATLAB代码。自己修改代码,通过这部分的练习。否则,打开提供的文件ex_kalman03.m
在你的万博 尤文图斯
子文件夹看到修改后的算法。
您现在可以修改算法处理包含多个输入向量。你需要找到向量的长度和调用向量中每个元素的过滤器代码。这可以通过调用的滤波算法为
循环。
开放ex_kalman02.m
在MATLAB编辑器。在MATLAB命令行,输入:
编辑ex_kalman02.m
添加一个为
周围循环过滤的代码。
之前的评论:
%预测状态和协方差
我= 1:尺寸(z, 2)
后:
%计算估计测量y = H *间;
结束
选择之间的代码为
声明和声明,右键单击上下文菜单并选择打开智能缩进缩进代码。
过滤器代码现在看起来应该像这样:
我= 1:尺寸(z, 2)%状态和预测协方差x_prd = *间;p_prd = * p_est *“+ Q;%估计S = H * p_prd ' * H ' + R;B = H * p_prd ';klm_gain = (S \ B) ';%状态估计和协方差间= x_prd + klm_gain * (z - H * x_prd);p_est = p_prd - klm_gain * H * p_prd;%计算估计测量y = H *间;结束
修改线计算协方差估计的状态和使用我th
元素的输入z
。
变化:
间= x_prd + klm_gain * (z - H * x_prd);
间= x_prd + klm_gain * (z(1:2)- H * x_prd);
修改线计算估计测量附加的结果我th
元素的输出y
。
变化:
y = H *间;
y(我):= H *间;
右上角的代码分析器消息指示器变成橙色,表明代码分析器发现警告。代码分析器突显出出错的代码在橙色和地方橙色标记。
移动你的指针在橙色标记以查看错误信息。
分析仪检测到的代码y
必须完全定义在sub-scripting之前,你不能增长变量通过索引生成的代码。
为了解决这个警告,preallocate内存输出y
,也就是大小作为输入z
。添加这个代码之前为
循环。
%预先分配输出信号:y = 0(大小(z));
橙色标记消失和代码分析器消息指示器在前右边缘的代码变成绿色,这表明你有固定的所有错误和警告分析仪检测到的代码。
改变的函数名ex_kalman03
并保存文件ex_kalman03.m
在当前文件夹。
你准备好开始下一个任务在本教程中,修改您的模型更新算法。
修改您的模型更新算法。你自己修改模型,通过这部分的练习。否则,开放提供的模型ex_kalman22.mdl
在你的万博 尤文图斯
子文件夹看到修改后的模型。
接下来,更新你的模型提供输入固定大小的数据帧和电话ex_kalman03
传入一个帧的数据。
开放ex_kalman11
在仿真软件模型。万博1manbetx
ex_kalman11
双击MATLAB函数块打开MATLAB函数块编辑器。
替换的代码调用ex_kalman02
与调用ex_kalman03
。
函数y = % # codegen卡尔曼(u)y = ex_kalman03 (u);
关闭编辑器。
修改InitFcn
回调函数:
在建模选项卡上,选择模型设置>模型属性。
模型属性对话框打开。
在这个对话框中,选择回调选项卡。
选择InitFcn
在模型的回调窗格。
取代现有的回调:
加载position.mat;[R、C] =大小(位置);FRAME_SIZE = 5;idx = (1: FRAME_SIZE: C) ';LEN =长度(idx);t = (1: LEN) 1;
5
,该指数增加5
。点击应用并关闭模型属性对话框。
更新选择器使用正确的索引块。
双击选择器块查看功能块参数。
功能块参数对话框打开。
设置第二个指数的选择来开始指数(港口)
。
设置输出的大小第二个输入FRAME_SIZE
,点击应用并关闭对话框。
现在,指数的选择第一端口选择所有
和第二个端口开始指数(港口)
。因为指数增加5
每个样本时间和输出大小5
,选择器块输出2 x5
在每个样本时间输出。
改变模型仿真停止时间61年
。现在的帧大小5
,所以仿真完成样品时间的五分之一。
在仿真软件模型万博1manbetx窗口,在建模选项卡上,单击模型设置。
在左窗格的配置参数对话框中,选择解算器。
在右窗格中,集停止时间来61年
。
点击应用并关闭对话框。
保存模型ex_kalman22.mdl
。
测试您的修改算法。模拟模型:
在仿真软件模型万博1manbetx窗口中,点击运行。
仿真软万博1manbetx件运行模型,它情节对象的轨迹在蓝色和绿色的卡尔曼滤波器的估计位置和以前一样当你使用批处理过滤器。
仿真停止。
你已经证明算法接受一个固定大小的信号。你现在准备好下一个任务,使用过滤器接受适应输入。
在本教程的一部分,您将了解如何指定适应仿真软件中数据模型。万博1manbetx然后你测试你的卡尔曼滤波算法以适应输入和看到算法适用于处理不同大小的数据包。在仿真软件中使用适应可变数据的更多信息,见万博1manbetx适应信号基础知识。
更新模型以适应输入使用。你自己修改模型,通过这部分的练习。否则,开放提供的模型ex_kalman33.mdl
在你的万博 尤文图斯
子文件夹看到修改后的模型。
开放ex_kalman22.mdl
在仿真万博1manbetx软件。
ex_kalman22
修改InitFcn
回调函数:
在建模选项卡上,选择模型设置>模型属性。
模型属性对话框打开。
选择回调选项卡。
选择InitFcn
在模型的回调窗格。
取代现有的回调:
加载position.mat;idx = [1 1; 2 3; 4 6, 7 10; 11 15; 16 30;31 71 100;70;101;200 201 250;251 310);LEN =长度(idx);t = (0:1: LEN-1)”;
101年
来200年
,包含100个元素。点击应用并关闭模型属性对话框。
更新选择器使用正确的索引块。
双击选择器块查看功能块参数。
功能块参数对话框打开。
设置第二个指数的选择来开始和结束指数(港口)
,然后单击应用并关闭对话框。
这种设置意味着指数的输入端口指定了开始和结束指数每个样本的输入时间。因为索引输入指定不同的起点和终点的指数在每个样本时间选择器块输出适应信号作为模拟的进展。
使用的端口和数据管理器设置MATLAB函数输入x
和输出y
为适应可变数据。
双击MATLAB函数块打开MATLAB函数块编辑器。
在编辑菜单中,选择编辑数据。
在左窗格端口和数据管理器,选择输入u
。
港口和数据管理器显示信息u
在右窗格中。
在一般选项卡中,选择变量的大小复选框,然后单击应用。
在左侧窗格中,选择输出y
。
在一般标签:
设置大小的y
来[100]
指定一个二维矩阵的上界2
第一维度和One hundred.
第二,输入指定的最大大小InitFcn
回调。
选择变量的大小复选框。
点击应用。
关闭端口和数据管理器。
现在做同样的事情MATLAB函数块。使用端口和数据管理器设置可视化块输入y
和z
为适应可变数据。
双击打开MATLAB可视化块功能块编辑器。
在编辑菜单中,选择编辑数据。
在左窗格端口和数据管理器,选择输入y
。
在一般选项卡中,选择变量的大小复选框,然后单击应用。
在左侧窗格中,选择输入z
。
在一般选项卡中,选择变量的大小复选框,然后单击应用。
关闭端口和数据管理器。
改变模型仿真停止时间10
。这一次,过滤过程的十一个不同大小输入每个样品时间。
保存模型ex_kalman33.mdl
。
测试您的修改模型。模拟模型:
在仿真软件模型万博1manbetx窗口中,点击运行。
作为仿万博1manbetx真软件运行模型,它情节对象的轨迹在蓝色和绿色的卡尔曼滤波器的估计位置。
注意,信号之间的界线选择器块和跟踪和可视化块表明这些信号是适应变化。
仿真停止。
您已经成功地创建了一个算法,接受适应输入。接下来,您将学习如何调试MATLAB函数块,所述调试MATLAB功能块。
你可以调试MATLAB函数块就像你可以调试在MATLAB函数。
双击MATLAB函数块调用卡尔曼滤波器打开MATLAB函数块编辑器。
在编辑器中,单击破折号(-)的字符的左边缘线:
y = kalman03 (u);
一个小红球出现在这条线的边缘,表明你有设置一个断点。
在仿真软件模型万博1manbetx窗口中,点击运行。
仿真时暂停执行到断点和一个绿色的小箭头出现在左边框。
位置的指针变量u
。
的价值u
似乎相邻的指针。
从MATLAB功能块编辑器菜单中,选择一步。
的kalman03.m
文件在编辑器中打开,您现在可以通过这段代码使用步骤一步,一步,走出。
选择走出。
的kalman03.m
文件关闭和MATLAB函数块代码编辑器中重新出现。
输出变量的指针y
。
你现在可以看到的价值y
。
单击红色的球清除断点。
从MATLAB功能块编辑器菜单中,选择退出调试。
关闭编辑器。
关闭图窗口。
现在你准备好下一个任务,生成C代码。
你已经证明你的算法在仿真软件工作。万博1manbetx接下来,您为您的模型生成C / c++代码。代码生成需要万博1manbetx仿真软件编码器。
请注意
在生成代码之前,您必须检查您的MATLAB代码适用于代码生成。如果你调用MATLAB代码作为一个外在功能,您必须删除之前外部调用生成代码。
重命名MATLAB函数块跟踪
。重命名,双击注释MATLAB函数
以下MATLAB函数块和替换文本跟踪
。
当您生成代码MATLAB函数块,万博1manbetx仿真软件编码器使用生成的代码块的名称。是一种很好的做法使用有意义的名称。
在生成代码之前,确保万博1manbetx仿真软件编码器创建一个代码生成报告。这个HTML报告提供方便地访问生成的文件的列表总结用于生成代码的配置设置。
在仿真软件模型万博1manbetx窗口,在建模选项卡上,单击模型设置。
配置参数对话框打开。
在左窗格的配置参数对话框中,选择报告下代码生成。
在右窗格中,选择创建代码生成报告和自动打开报告。
点击应用并关闭配置参数对话框。
保存您的模型。
跟踪生成代码块:
右键单击跟踪块和选择C / c++代码>构建选择子系统。
在为子系统构建代码窗口中,单击构建。有关更多信息,请参见为各个子系统生成的代码和可执行文件(万博1manbetx仿真软件编码器)。
仿真软件万博1manbetx的软件生成一个错误通知您不能记录适应信号数组。您需要更改数据的格式保存到MATLAB工作区。改变这种格式:
在仿真软件模型万博1manbetx窗口,在建模选项卡上,单击模型设置。
配置参数对话框打开。
在左窗格的配置参数对话框中,选择数据导入/导出并设置格式来结构随着时间的推移
。
记录的数据现在是一个结构,它有两个领域:一个时间字段和一个信号,使仿真软件日志适应信号。万博1manbetx
点击应用并关闭配置参数对话框。
保存您的模型。
重复步骤3
生成的代码跟踪。
的万博1manbetx仿真软件编码器软件生成C代码块和启动代码生成报告。
使用代码生成报告的更多信息,参见报告生成代码(万博1manbetx仿真软件编码器)。
在左窗格中代码生成的报告,单击Tracking.c
链接查看生成的C代码。请注意,在生成的代码MATLAB函数块,跟踪
,可能是没有单独的函数代码ex_kalman03
内联函数因为功能是默认启用。
修改您禁用内联滤波算法:
在ex_kalman03.m
函数声明后,添加:
coder.inline('永远');
改变的函数名ex_kalman04
并保存文件ex_kalman04.m
在当前文件夹。
在你的ex_kalman33
模型中,双击跟踪。
MATLAB功能块编辑器打开。
修改调用要调用的滤波算法ex_kalman04
。
函数y = % # codegen卡尔曼(u)y = ex_kalman04 (u);
保存模型ex_kalman44.mdl
。
生成和检查C代码。
重复步骤3。
在左窗格中代码生成的报告,单击Tracking.c
链接查看生成的C代码。
检查生成的C代码ex_kalman04
函数。
为当地的函数* / / *前置声明静态孔隙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 / *函数功能块:“< Root > /跟踪”* /静态孔隙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代码之前,你修改它。
决定你的文件命名约定和经常保存临时版本。例如,本教程使用一个两位数后缀区分各种版本的滤波算法。
为了模拟,生成代码之前,调用MATLAB代码使用coder.extrinsic
检查你的算法适用于仿真软件。万博1manbetx这种做法提供这些好处:
你不需要使MATLAB代码适合代码生成。
你可以调试从仿真软件MATLAB代码在MATLAB调用它。万博1manbetx
创建一个万博1manbetx仿真软件编码器代码生成报告。这个HTML报告提供方便地访问生成的文件的列表总结用于生成代码的配置设置。