主要内容

在MATLAB函数块中调用MATLAB函数文件

示例模型使用MATLAB函数通过调用路径上的MATLAB函数文件来估计移动对象的位置。然后,模型用另一个MATLAB函数块根据对象的实际位置绘制预测数据。然后,该示例允许您从调用MATLAB函数文件的MATLAB Function块生成代码。

模拟模型

该模型获取存储在mat文件中的对象位置数据,并通过跟踪算法运行该数据。MATLAB函数块标记跟踪调用一个单独的MATLAB函数文件,ex_kalman_f.m,执行跟踪算法。在模型中,双击跟踪块查看调用的代码ex_kalman_f.m

函数Y = kalman(u) Y = ex_kalman_f(u);结束

开放ex_kalman_f.m查看算法。ex_kalman_f.m使用卡尔曼滤波算法来跟踪目标的位置。该算法使用两个持久变量。间的存储时间步长和之间的状态p_ext存储协方差。该算法使用这些持久变量来计算目标在每个时间步的估计位置作为输出y

函数Y = ex_kalman_f(z)% # codegen
初始化状态转换矩阵Dt = 1;A = [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];
测量矩阵H = [1 0 0 0 0 0 0;0 1 0 0 0 0];Q =眼睛(6);R = 1000 *眼(2);
初始条件持续的间p_est如果Isempty (x_est) x_est = 0 (6,1);P_est = 0 (6,6);结束预测状态和协方差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;结束

MATLAB函数块代码,以及块调用的函数文件,必须支持代码生成。金宝app与MATLAB函数块不同,由MATLAB函数块调用的MATLAB文件需要% # codegen指令,以查找在代码生成期间可能导致错误的代码违反。在这个例子中,ex_kalman_f.m没有任何违规。

在Simul金宝appink计算出对象的估计位置后,可视化用MATLAB绘制出物体的实际位置和估计位置情节函数。

函数plot_me (y, z)
持续的h如果Isempty (h) h = figure;持有;结束
N = size(z,2);标题(“目标轨迹(蓝色),卡尔曼估计(绿色)”);包含(“水平位置”);ylabel (“垂直位置”);
N plot(y(1,i), y(2,i),“bx - - - - - -”);情节(z(我)、z(我),“去,”);轴([-1.1,1.1,-1.1,1.1]);暂停(0.02);结束结束

运行模型,在模拟过程中观察数据。

生成C代码

如果您拥有嵌入式Coder或Simulink Coder许可证,则可以从不包括外部函数的金宝appMATLAB函数块生成C代码。在本例中,不能从可视化块,因为它包含情节而且数字, MATLAB将其视为外部函数。有关更多信息,请参见使用MATLAB引擎在生成的代码中执行函数调用(MATLAB编码器).方法的C代码跟踪块。生成的C代码跟踪块,右键单击块C / c++代码>构建这个子系统

限制

  • 该模型中的仿真时间必须与位置数据数组的大小相匹配。如果输入的数据大小发生变化,需要手动调整模拟时间。

  • 该模型只能估计运动点的位置。对于更复杂的运动估计功能,请考虑使用计算机视觉工具箱

相关的例子

更多关于