Модель в качестве примера использует блок 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.