Вызовите файлы функции MATLAB в блоках MATLAB function

Модель в качестве примера использует блок MATLAB function, чтобы оценить местоположение движущегося объекта путем вызова файла функции MATLAB на пути. Модель затем отображает эти данные о предсказании на графике против фактического местоположения объекта с другим блоком MATLAB function. Пример затем позволяет вам генерировать код от блока MATLAB function, который вызывает файл функции MATLAB.

Симулируйте модель

Модель берет данные о положении объекта, хранившего в MAT-файле, и запускает данные через алгоритм отслеживания. Блок MATLAB function пометил Tracking вызывает отдельный файл функции MATLAB, ex_kalman_f.m, выполнить алгоритм отслеживания. В модели дважды кликните Tracking блокируйтесь, чтобы видеть код, который вызывает ex_kalman_f.m.

function y = kalman(u)
y = ex_kalman_f(u);
end

Открытый ex_kalman_f.m просмотреть алгоритм. ex_kalman_f.m использует алгоритм Фильтра Калмана, чтобы отследить местоположение объекта. Алгоритм использует две персистентных переменные. x_est хранит состояние между временными шагами и p_ext хранит ковариацию. Алгоритм использует эти персистентные переменные, чтобы вычислить предполагаемое местоположение объекта на каждом временном шаге как выход y.

function y = ex_kalman_f(z)
%#codegen
% Initialize state transition matrix
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 ];
% Measurement matrix
H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ];
Q = eye(6);
R = 1000 * eye(2);
% Initial conditions
persistent x_est p_est
if isempty(x_est)
    x_est = zeros(6, 1);
    p_est = zeros(6, 6);
end
% Predicted state and covariance
x_prd = A * x_est;
p_prd = A * p_est * A' + Q;
% Estimation
S = H * p_prd' * H' + R;
B = H * p_prd';
klm_gain = (S \ B)';
% Estimated state and covariance
x_est = x_prd + klm_gain * (z - H * x_prd);
p_est = p_prd - klm_gain * H * p_prd;
% Compute the estimated measurements
y = H * x_est;
end

Код блока MATLAB function и файлы функции вызовы блока, должны поддерживаться для генерации кода. В отличие от блока MATLAB function, файлы MATLAB, вызванные блоком MATLAB function, требуют %#codegen директива, чтобы найти нарушения регулярной кодовой последовательности, которые привели бы к ошибкам во время генерации кода. В этом примере, ex_kalman_f.m не имеет никаких нарушений.

После того, как Simulink вычисляет предполагаемое местоположение объекта, Visualizing блок строит фактические и предполагаемые местоположения объекта при помощи plot MATLAB функция.

function plot_me(y,z)
persistent h
if isempty(h)
    h = figure;
    hold;
end
N = size(z,2);
title('Trajectory of object [blue] its Kalman estimate[green]');
xlabel('horizontal position');
ylabel('vertical position');
for i = 1:N
    plot(y(1,i), y(2,i), 'bx-');
    plot(z(1,i), z(2,i), 'go-');
    axis([-1.1, 1.1, -1.1, 1.1]);
    pause(0.02);
end
end

Запустите модель, чтобы смотреть данные в процессе моделирования.

Сгенерируйте код С

Если у вас есть лицензия на Embedded Coder или Simulink Coder, можно сгенерировать код С от блоков MATLAB function, которые не включают внешние функции. В этом примере вы не можете сгенерировать код С от Visualizing блокируйтесь, потому что это включает plot и figure, который обрабатывает MATLAB, когда значение внешних параметров функционирует. Для получения дополнительной информации смотрите Использование MATLAB Engine, чтобы Выполнить Вызов функции в Сгенерированном коде (MATLAB Coder). Однако можно сгенерировать код С для Tracking блок. Сгенерировать код С для Tracking блокируйте, щелкните правой кнопкой по блоку и нажмите C/C ++ Code> Build This Subsystem.

Ограничения

  • Время симуляции в этой модели должно совпадать с размером массива данных положения. Если размер входных данных изменяется, необходимо вручную настроить время симуляции.

  • Эта модель может только оценить местоположение движущейся точки. Для более сложных возможностей оценки движения рассмотрите использование Computer Vision Toolbox.

Связанные примеры

Больше о