Отслеживаемый объект Используя код MATLAB

Изучение целей

В этом примере вы будете учиться как:

  • Используйте блок MATLAB function, чтобы добавить функции MATLAB® в модели Simulink® для моделирования, симуляции и развертывания на встраиваемых процессорах.

    Эта возможность полезна для алгоритмов кодирования, которые лучше утверждаются на текстовом языке MATLAB, чем на графическом языке Simulink.

  • Используйте coder.extrinsic, чтобы вызвать код MATLAB от блока MATLAB function.

    Эта возможность позволяет вам делать быстрое прототипирование. Можно вызвать существующий код MATLAB от Simulink, не имея необходимость делать этот код подходящим для генерации кода.

  • Проверяйте, что существующий код MATLAB подходит для генерации кода прежде, чем сгенерировать код.

    Необходимо подготовить код прежде, чем сгенерировать код.

  • Задайте входные параметры переменного размера при генерации кода.

Учебные предпосылки

Что необходимо знать

Чтобы завершить этот пример, у вас должно быть основное знакомство с программным обеспечением MATLAB. Необходимо также понять, как создать и моделировать основную модель Simulink.

Необходимые продукты

Чтобы завершить этот пример, необходимо установить следующие продукты:

  • MATLAB

  • MATLAB Coder™

  • Simulink

  • Simulink Coder

  • Компилятор C

Для списка поддерживаемых компиляторов см. Поддерживаемые Компиляторы.

Необходимо настроить компилятор C прежде, чем сгенерировать код С. Смотрите Подготовку Вашего компилятора C.

Для получения инструкций по установке продуктов MathWorks® см. документацию по установке MATLAB для своей платформы. Если вы установили MATLAB и хотите проверять, который установлены другие Продукты Mathworks, введите ver в Окно Команды MATLAB.

Пример: фильтр Калмана

Описание

В этом разделе описываются пример, используемый примером. Вы не должны быть знакомы с алгоритмом, чтобы завершить пример.

Пример для этого примера использует Фильтр Калмана, чтобы оценить положение объекта, перемещающегося в двумерное пространство от серии шумных входных параметров на основе прошлых положений. Радиус-вектор имеет два компонента, x и y, указывая на его горизонтальные и вертикальные координаты.

Фильтры Калмана имеют широкий спектр приложений, включая управление, обработку сигналов и обработку изображений; радар и гидролокатор; и финансовое моделирование. Они - рекурсивные фильтры, которые оценивают состояние линейной динамической системы от ряда неполных или шумных измерений. Алгоритм Фильтра Калмана полагается на представление пространства состояний фильтров и использует набор переменных, сохраненных в векторе состояния, чтобы охарактеризовать полностью поведение системы. Это обновляет вектор состояния линейно и рекурсивно использование матрицы Грина и оценки шума процесса.

Алгоритм

В этом разделе описываются алгоритм Фильтра Калмана и реализован в версии MATLAB фильтра, предоставленного этим примером.

Алгоритм предсказывает положение перемещения, основанного на объектах на его прошлых положениях с помощью средства оценки Фильтра Калмана. Это оценивает нынешнее положение путем обновления вектора состояния Кальмана, который включает положение (x и y), скорость (Vx и Vy), и ускорение (Ax и Ay) движущегося объекта. Вектор состояния Кальмана, x_est, является персистентной переменной.

% Initial conditions
persistent x_est p_est
if isempty(x_est)
    x_est = zeros(6, 1);
    p_est = zeros(6, 6);
end
x_est инициализируется к пустому вектор-столбцу 6x1 и обновил каждый раз, когда фильтр используется.

Фильтр Калмана использует законы движения оценить новое состояние:

X=X0+Vx.dtY=Y0+Vy.dtVx=Vx0+Ax.dtVy=Vy0+Ay.dt

Эти законы движения получены в матрице Грина A, который является матрицей, которая содержит содействующие значения x, y, Vx, Vy, Ax и Ay.

% 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 ];

Фильтрация процесса

Процесс фильтрации имеет две фазы:

  • Предсказанное состояние и ковариация

    Фильтр Калмана использует ранее предполагаемое состояние, x_est, чтобы предсказать текущее состояние, x_prd. Предсказанное состояние и ковариация вычисляются в:

    % Predicted state and covariance
    x_prd = A * x_est;
    p_prd = A * p_est * A' + Q; 

  • Оценка

    Фильтр также использует текущее измерение, z, и предсказанное состояние, x_prd, чтобы оценить более точное приближение текущего состояния. Предполагаемое состояние и ковариация вычисляются в:

    % Measurement matrix
    H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ];
    Q = eye(6);
    R = 1000 * eye(2);
    % 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;

Ссылка

Haykin, Саймон. Адаптивная теория фильтра. Верхний Сэддл-Ривер, NJ: Prentice-Hall, Inc., 1996.

Файлы для примера

Об учебных файлах

Пример использует следующие файлы:

  • Файлы модели Simulink для каждого шага примера.

  • Пример файлы кода MATLAB для каждого шага примера.

    В этом примере вы работаете с моделями Simulink, которые вызывают файлы MATLAB, содержащие алгоритм Фильтра Калмана.

  • MAT-файл, который содержит входные данные в качестве примера.

  • Файл MATLAB для графического вывода.

Местоположение файлов

Учебные файлы доступны в следующей папке: docroot\toolbox\simulink\examples\kalman. Чтобы запустить пример, необходимо скопировать эти файлы в локальную папку. Для инструкций смотрите Копирование Файлов Локально.

Имена и описания файлов

ВводИмяОписание
Файлы функции MATLABex_kalman01Базовая реализация MATLAB скалярного Фильтра Калмана.
ex_kalman02Версия исходного алгоритма, подходящего для генерации кода.
ex_kalman03Версия Фильтра Калмана, подходящего для генерации кода и для использования с основанными на кадре и основанными на пакете входными параметрами.
ex_kalman04Отключенное встраивание для генерации кода.
Файлы модели Simulinkex_kalman00Модель Simulink без блока MATLAB function.
ex_kalman11Полная модель Simulink с блоком MATLAB function для скалярного Фильтра Калмана.
ex_kalman22Модель Simulink с блоком MATLAB function для Фильтра Калмана, который принимает фиксированный размер (основанные на кадре) входные параметры.
ex_kalman33Модель Simulink с блоком MATLAB function для Фильтра Калмана, который принимает переменный размер (основанные на пакете) входные параметры.
ex_kalman44Модель Simulink, чтобы вызвать ex_kalman04.m, который имеет отключенное встраивание.
Файл данных MATLABpositionСодержит входные данные, используемые алгоритмом.
Постройте файлыplot_trajectoryСтроит траекторию объекта, и Фильтр Калмана оценил положение.

Шаги примера

Копирование файлов локально

Скопируйте учебные файлы в локальную рабочую папку:

  1. Создайте локальную папку solutions, например, c:\simulink\kalman\solutions.

  2. Изменитесь на папку docroot\toolbox\simulink\examples. В командной строке MATLAB, введите:

    cd(fullfile(docroot, 'toolbox', 'simulink', 'examples')) 

  3. Скопируйте содержимое подпапки kalman к вашей локальной папке solutions, задав имя полного пути папки solutions:

    copyfile('kalman', 'solutions')

    Например:

    copyfile('kalman', 'c:\simulink\kalman\solutions')

    Ваша папка solutions теперь содержит полный набор решений для примера. Если вы не хотите выполнять шаги для каждой задачи в примере, можно просмотреть решения, чтобы видеть, как код должен выглядеть.

  4. Создайте локальную папку work, например, c:\simulink\kalman\work.

  5. Скопируйте следующие файлы от своей папки solutions до вашей папки work.

    • ex_kalman01

    • ex_kalman00

    • position

    • plot_trajectory

    Ваша папка work теперь содержит все файлы, что необходимо начать с примером.

Подготовка вашего компилятора C

Создание вашего блока MATLAB function требует поддерживаемого компилятора. MATLAB автоматически выбирает тот как компилятор по умолчанию. Если у вас есть несколько поддерживаемых MATLAB компиляторов, установленных в вашей системе, можно изменить значение по умолчанию с помощью команды mex -setup. См. Компилятор Значения по умолчанию Изменения (MATLAB).

О ex_kalman00 Модели

Во-первых, исследуйте модель ex_kalman00, предоставленную примером, чтобы понять проблему, что вы пытаетесь решить использование Фильтра Калмана.

  1. Откройте модель ex_kalman00 в Simulink:

    1. Установите свою текущую папку MATLAB на папку, которая содержит ваши рабочие файлы для этого примера. В командной строке MATLAB, введите:

      cd work
      где work является именем полного пути папки, содержащей ваши файлы.

    2. В командной строке MATLAB, введите:

      ex_kalman00

      Эта модель является неполной моделью, чтобы продемонстрировать, как интегрировать код MATLAB с Simulink. Полной моделью является ex_kalman11, который также предоставляется этим примером.

Функция обратного вызова Модели InitFcn.  Модель использует эту функцию обратного вызова для:

  • Загрузите данные о положении из MAT-файла.

  • Настройте данные, используемые Индексным блоком генератора, который предоставляет второй вход Селекторному блоку.

Просмотреть этот коллбэк:

  1. Выберите File> Model Properties> Model Properties.

  2. Выберите вкладку Callbacks.

  3. Выберите InitFcn в панели Model callbacks.

    Коллбэк появляется.

    load position.mat;
    [R,C]=size(position);
    idx=(1:C)';
    t=idx-1;

Исходные блоки.  Модель использует два Исходных блока, чтобы обеспечить данные о положении и скалярный индекс к Селекторному блоку.

Селекторный Блок.  Модель использует Селекторный блок, который выбирает элементы его входного сигнала и генерирует выходной сигнал на основе его индексного входа и его настроек Index Option. Путем изменения настройки этого блока можно сгенерировать различные сигналы размера.

Чтобы просмотреть Селекторные настройки блока, дважды кликните Селекторный блок, чтобы просмотреть параметры функционального блока.

В этой модели Index Option для первого порта является Select all, и для второго порта Index vector (port). Поскольку вход является матрицей положения 2 x 310 и индексным шагом данных от 1 до 310, Селекторный блок просто выводит один 2x1 вывод в каждом шаге расчета.

Блок MATLAB function.  Модель использует блок MATLAB function, чтобы построить траекторию объекта, и Фильтр Калмана оценил положение. Эта функция:

  • Сначала объявляет figure, hold и функции plot_trajectory как внешние, потому что эти функции визуализации MATLAB не поддерживаются для генерации кода. Когда вы вызываете неподдерживаемую функцию MATLAB, необходимо объявить, что он является внешним, таким образом, MATLAB может выполнить его, но не пытается сгенерировать код для него.

  • Создает окно рисунка и содержит его на время симуляции. В противном случае новое окно рисунка появляется для каждого шага расчета.

  • Вызывает функцию plot_trajectory, которая строит траекторию объекта, и Фильтр Калмана оценил положение.

Время остановки симуляции.  Временем остановки симуляции является 309, потому что вход к фильтру является вектором, содержащим элементы 310, и Simulink использует основанную на нуле индексацию.

Добавление блока MATLAB function к модели

Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman11 в своей подпапке solutions, чтобы видеть измененную модель.

В целях этого примера вы добавляете блок MATLAB function в модель ex_kalman00.mdl, предоставленную примером. Необходимо было бы разработать собственный испытательный стенд начиная с пустой модели Simulink.

Добавление блока MATLAB function.  Добавить блок MATLAB function в модель ex_kalman00:

  1. Откройте ex_kalman00 в Simulink.

    ex_kalman00

  2. Добавьте блок MATLAB function в модель:

    1. В командной строке MATLAB введите slLibraryBrowser, чтобы открыть Браузер Библиотеки Simulink.

    2. Из списка Библиотек Simulink выберите библиотеку User-Defined Functions.

    3. Кликните по блоку MATLAB function и перетащите его в модель ex_kalman00. Поместите блок чуть выше красной текстовой аннотации, которая читает Place MATLAB Function Block here.

    4. Удалите красные текстовые аннотации из модели.

    5. Сохраните модель в текущей папке как ex_kalman11.

       Лучшая практика — сохранение инкрементных обновлений кода

Вызов кода MATLAB от блока MATLAB function.  Вызывать ваш код MATLAB от блока MATLAB function:

  1. Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.

  2. Удалите код по умолчанию, отображенный в редакторе.

  3. Скопируйте следующий код в блок MATLAB function.

    function y = kalman(u)
    %#codegen
    
    y = ex_kalman01(u);

  4. Сохраните модель.

Соединение ввода и вывода блока MATLAB function

  1. Соедините ввод и вывод блока MATLAB function так, чтобы ваша модель выглядела так.

  2. Сохраните модель.

Симуляция ex_kalman11 Модели

Моделировать модель:

  1. В окне модели Simulink выберите Simulation> Run.

    Когда Simulink запускает модель, он строит траекторию объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета. Первоначально, вы видите, что требуется короткое время для предполагаемого положения, чтобы сходиться с фактическим положением объекта. Затем три внезапных сдвига в положении происходят — каждый раз, когда Фильтр Калмана приспосабливает и отслеживает объект после нескольких итераций.

  2. Остановки симуляции.

Вы доказали, что ваш алгоритм MATLAB работает в Simulink. Вы теперь готовы изменить фильтр, чтобы принять, что вход фиксированного размера, как описано в Изменении Фильтра Принимает Вход Фиксированного размера.

Изменение фильтра, чтобы принять вход фиксированного размера

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

Изменение Вашего кода MATLAB.  Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл ex_kalman03.m в вашей подпапке solutions, чтобы видеть измененный алгоритм.

Можно теперь изменить алгоритм, чтобы обработать вектор, содержащий больше чем один вход. Необходимо найти длину вектора и вызвать код фильтра для каждого элемента в векторе в свою очередь. Вы делаете это путем вызова алгоритма фильтра в цикле for.

  1. Откройте ex_kalman02.m в редакторе MATLAB. В командной строке MATLAB, введите:

    edit ex_kalman02.m

  2. Добавьте цикл for вокруг кода фильтра.

    1. Перед комментарием:

      % Predicted state and covariance
      вставьте:
      for i=1:size(z,2)

    2. После:

      % Compute the estimated measurements
      y = H * x_est;
      вставьте:
      end

    3. Выберите код между оператором for и оператором end, щелкните правой кнопкой, чтобы открыть контекстное меню и выбрать Smart Indent, чтобы расположить код с отступом.

    Ваш код фильтра должен теперь выглядеть так:

    for i=1:size(z,2)
    	 % 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

  3. Измените строку, которая вычисляет предполагаемое состояние и ковариацию, чтобы использовать элемент ith входа z.

    Изменение:

    x_est = x_prd + klm_gain * (z - H * x_prd);
    к:
    x_est = x_prd + klm_gain * (z(1:2,i) - H * x_prd);

  4. Измените строку, которая вычисляет предполагаемые измерения, чтобы добавить результат к элементу ith вывода y.

    Изменение:

    y = H * x_est;
    к:
    y(:,i) = H * x_est;

    Индикатор сообщения анализатора кода в правых верхних поворотах, оранжевых, чтобы указать, что анализатор кода обнаружил предупреждения. Анализатор кода подчеркивает незаконный код в оранжевом и помещает оранжевый маркер направо.

  5. Переместите указатель через оранжевый маркер, чтобы просмотреть информацию об ошибке.

    Анализатор кода обнаруживает, что y должен быть полностью задан прежде, чем преобразовать его в нижний индекс и что вы не можете вырастить переменные посредством индексации в сгенерированном коде.

  6. Чтобы обратиться к этому предупреждению, предварительно выделите память для вывода y, который одного размера как вход z. Добавьте этот код перед циклом for.

     % Pre-allocate output signal:
     y=zeros(size(z));

    Оранжевый маркер исчезает, и индикатор сообщения анализатора кода в правом верхнем ребре кода становится зеленым, который указывает, что вы зафиксировали все ошибки и предупреждения, обнаруженные анализатором кода.

     Почему предварительно выделяют Выходные параметры?

  7. Поменяйте имя функции на ex_kalman03 и сохраните файл как ex_kalman03.m в текущей папке.

 Содержимое ex_kalman03.m

Вы готовы начать следующую задачу в примере, Изменяя Вашу Модель, чтобы Вызвать Обновленный Алгоритм.

Изменение Модели, чтобы Вызвать Обновленный Алгоритм.  Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman22.mdl в своей подпапке solutions, чтобы видеть измененную модель.

Затем, обновите свою модель, чтобы обеспечить вход как кадры фиксированного размера данных и вызвать передачу ex_kalman03 в данных один кадр за один раз.

  1. Открытая модель ex_kalman11 в Simulink.

    ex_kalman11

  2. Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.

  3. Замените код, который вызывает ex_kalman02 с вызовом ex_kalman03.

    function y = kalman(u)
    %#codegen
    
    y = ex_kalman03(u);

  4. Закройте редактор.

  5. Измените коллбэк InitFcn:

    1. Выберите File> Model Properties> Model Properties.

      Диалоговое окно Model Properties открывается.

    2. В этом диалоговом окне выберите вкладку Callbacks.

    3. Выберите InitFcn в панели Model callbacks.

    4. Замените существующий коллбэк на:

      load position.mat;
      [R,C]=size(position);
      FRAME_SIZE=5;
      idx=(1:FRAME_SIZE:C)';
      LEN=length(idx);
      t=(1:LEN)'-1;
      
      Этот коллбэк устанавливает формат кадра на 5 и индекс постепенно увеличиваться 5.

    5. Нажмите Apply и закройте диалоговое окно Model Properties.

  6. Обновите Селекторный блок, чтобы использовать правильные индексы.

    1. Дважды кликните Селекторный блок, чтобы просмотреть параметры функционального блока.

      Диалоговое окно Function Block Parameters открывается.

    2. Установите второй Index Option на Starting index (port).

    3. Установите Output Size для второго входа к FRAME_SIZE, нажмите Apply и закройте диалоговое окно.

    Теперь, Index Option для первого порта является Select all, и для второго порта Starting index (port). Поскольку индексный шаг 5, каждым шагом расчета и выходным размером является 5, Селекторный блок, выводит 2x5 вывод в каждом шаге расчета.

  7. Измените время остановки симуляции модели на 61. Теперь форматом кадра является 5, таким образом, симуляция завершается в одной пятой шагов расчета.

    1. В окне модели Simulink выберите Simulation> Model Configuration Parameters.

    2. На левой панели диалогового окна Configuration Parameters выберите Solver.

    3. На правой панели, набор Stop time к 61.

    4. Нажмите Apply и закройте диалоговое окно.

  8. Сохраните модель как ex_kalman22.mdl.

Тестирование Измененного Алгоритма.  Моделировать модель:

  1. В окне модели Simulink выберите Simulation> Run.

    Когда Simulink запускает модель, он строит траекторию объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде, когда вы использовали пакетный фильтр.

  2. Остановки симуляции.

Вы доказали, что ваш алгоритм принимает сигнал фиксированного размера. Вы теперь готовы к следующей задаче, Используя Фильтр Принять Вход Переменного Размера.

Используя фильтр, чтобы принять вход Переменного Размера

В этой части примера вы изучаете, как задать данные переменного размера в вашей модели Simulink. Затем вы тестируете свой алгоритм Фильтра Калмана с входными параметрами переменного размера и видите, что алгоритм подходит для обработки пакетов данных переменного размера. Для получения дополнительной информации об использовании данных переменного размера в Simulink смотрите Основы Сигнала Переменного Размера.

Обновление Модели, чтобы Использовать Входные параметры Переменного Размера.  Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman33.mdl в своей подпапке solutions, чтобы видеть измененную модель.

  1. Откройте ex_kalman22.mdl в Simulink.

    ex_kalman22

  2. Измените коллбэк InitFcn:

    1. Выберите File> Model Properties> Model Properties.

      Диалоговое окно Model Properties открывается.

    2. Выберите вкладку Callbacks.

    3. Выберите InitFcn в панели Model callbacks.

    4. Замените существующий коллбэк на:

      load position.mat;
      idx=[ 1 1 ;2 3 ;4 6 ;7 10 ;11 15 ;16 30 ;
           31 70 ;71 100 ;101 200 ;201 250 ;251 310];
      LEN=length(idx);
      t=(0:1:LEN-1)';
      Этот коллбэк настраивает индексацию, чтобы сгенерировать одиннадцать различных входных параметров размера. Это задает запуск и индексы конца для каждого шага расчета. Первый шаг расчета использует только первый элемент, второй шаг расчета использует вторые и третьи элементы и так далее. Самая большая выборка, 101 к 200, содержит 100 элементов.

    5. Нажмите Apply и закройте диалоговое окно Model Properties.

  3. Обновите Селекторный блок, чтобы использовать правильные индексы.

    1. Дважды кликните Селекторный блок, чтобы просмотреть параметры функционального блока.

      Диалоговое окно Function Block Parameters открывается.

    2. Установите второй Index Option на Starting and ending indices (port), затем нажмите Apply и закройте диалоговое окно.

      Эта установка означает, что вход к индексному порту задает запуск и индексы конца для входа в каждом шаге расчета. Поскольку индексный вход задает различный запуск и конечные индексы в каждом шаге расчета, Селекторный блок выводит сигнал переменного размера, в то время как симуляция прогрессирует.

  4. Используйте Порты и Менеджер данных, чтобы установить вход MATLAB Function x и вывод y как данные переменного размера.

    1. Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.

    2. Из меню редактора выберите Edit Data.

    3. В Портах и левой панели Менеджера данных, выберите вход u.

      Порты и Менеджер данных отображают информацию о u на правой панели.

    4. На вкладке General установите флажок Variable size и нажмите Apply.

    5. На левой панели выберите вывод y.

    6. На вкладке General:

      1. Установите Size y к [2 100] задавать 2D матрицу, где верхними границами является 2 для первой размерности и 100 для второго, которое является максимальным входом размера, заданным в коллбэке InitFcn.

      2. Установите флажок Variable size.

      3. Нажмите Apply.

    7. Закройте порты и менеджер данных.

  5. Теперь сделайте то же самое для другого блока MATLAB function. Используйте Порты, и Менеджер данных, чтобы установить блок Visualizing вводит y и z как данные переменного размера.

    1. Дважды кликните блок Visualizing, чтобы открыть Редактор блока MATLAB function.

    2. Из меню редактора выберите Edit Data.

    3. В Портах и левой панели Менеджера данных, выберите вход y.

    4. На вкладке General установите флажок Variable size и нажмите Apply.

    5. На левой панели выберите вход z.

    6. На вкладке General установите флажок Variable size и нажмите Apply.

    7. Закройте порты и менеджер данных.

  6. Измените время остановки симуляции модели на 10. На этот раз фильтр процессы один из одиннадцати различных размеров вводит каждый шаг расчета.

  7. Сохраните модель как ex_kalman33.mdl.

Тестирование Измененной Модели.  Моделировать модель:

  1. В окне модели Simulink выберите Simulation> Run.

    Когда Simulink запускает модель, он строит траекторию объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде.

    Обратите внимание на то, что сигнальные линии между Селекторным блоком и блоками Отслеживания и Визуализации изменяются, чтобы показать, что эти сигналы являются переменным размером.

  2. Остановки симуляции.

Вы успешно создали алгоритм, который принимает входные параметры переменного размера. Затем, вы изучаете, как отладить ваш блок MATLAB function, как описано в Отладке блока MATLAB function.

Отладка блока MATLAB function

Можно отладить блок MATLAB function точно так же, как можно отладить функцию в MATLAB.

  1. Дважды кликните блок MATLAB function, который вызывает Фильтр Калмана, чтобы открыть Редактор блока MATLAB function.

  2. В редакторе кликните по тире (-) символ в левом поле строки:

    y = kalman03(u);

    Маленький красный шар появляется в поле этой строки, указывая, что вы установили точку останова.

  3. В окне модели Simulink выберите Simulation> Run.

    Симуляция делает паузу, когда выполнение достигает точки останова, и маленькая зеленая стрелка появляется в левом поле.

  4. Поместите указатель по переменной u.

    Значение u кажется смежным с указателем.

  5. Из меню MATLAB Function Block Editor выберите Step In.

    Файл kalman03.m открывается в редакторе, и можно теперь продвинуться через этот код с помощью Step, Step In и Step Out.

  6. Выберите Step Out.

    Завершения файла kalman03.m и код блока MATLAB function вновь появляются в редакторе.

  7. Поместите указатель по выходной переменной y.

    Можно теперь видеть значение y.

  8. Кликните по красному шару, чтобы удалить точку останова.

  9. Из меню MATLAB Function Block Editor выберите Quit Debugging.

  10. Закройте редактор.

  11. Закройте окно рисунка.

    Теперь вы готовы к следующей задаче, Генерируя код С.

Генерация кода С

Вы доказали, что ваш алгоритм работает в Simulink. Затем вы генерируете код для своей модели.

Примечание

Прежде, чем сгенерировать код, необходимо проверять, что код MATLAB подходит для генерации кода. Если вы вызываете свой код MATLAB как внешнюю функцию, необходимо удалить внешние вызовы прежде, чем сгенерировать код.

  1. Переименуйте блок MATLAB function к Tracking. Чтобы переименовать блок, дважды кликните аннотацию MATLAB Function ниже блока MATLAB function и замените текст на Tracking.

    Когда вы генерируете код для блока MATLAB function, Simulink Coder использует имя блока в сгенерированном коде. Это - хорошая практика, чтобы использовать понятное имя.

  2. Прежде, чем сгенерировать код, гарантируйте, что Simulink Coder создает отчет генерации кода. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.

    1. В окне модели Simulink выберите Simulation> Model Configuration Parameters.

      Диалоговое окно Configuration Parameters открывается.

    2. На левой панели диалогового окна Configuration Parameters выберите Report под Code Generation.

    3. На правой панели выберите Create code generation report.

      Опция Open report automatically также выбрана.

    4. Нажмите Apply и закройте диалоговое окно Configuration Parameters.

    5. Сохраните свою модель.

  3. Сгенерировать код для блока Tracking:

    1. В вашей модели выберите блок Tracking.

    2. В окне модели Simulink выберите Code> C/C++ Code> Build Selected Subsystem.

  4. Программное обеспечение Simulink генерирует ошибку при информировании вас, что оно не может регистрировать сигналы переменного размера как массивы. Необходимо изменить формат данных, сохраненных в рабочее пространство MATLAB. Изменить этот формат:

    • В окне модели Simulink выберите Simulation> Model Configuration Parameters.

      Диалоговое окно Configuration Parameters открывается.

    • На левой панели диалогового окна Configuration Parameters выберите Data Import/Export и установите Format на Structure with time.

      Записанные данные являются теперь структурой, которая имеет два поля: поле времени и поле сигналов, позволяя Simulink регистрировать сигналы переменного размера.

    • Нажмите Apply и закройте диалоговое окно Configuration Parameters.

    • Сохраните свою модель.

  5. Повторный шаг 3, чтобы сгенерировать код для блока Tracking.

    Программное обеспечение Simulink Coder генерирует код С для блока и запускает отчет генерации кода.

    Для получения дополнительной информации об использовании отчета генерации кода см. Отчеты для Генерации кода (Simulink Coder).

  6. На левой панели отчета генерации кода щелкните по ссылке Tracking.c, чтобы просмотреть сгенерированный код C. Обратите внимание на то, что в коде, сгенерированном для блока MATLAB function, Tracking, нет никакого кода для функции ex_kalman03, потому что встраивание включено по умолчанию.

  7. Измените свой алгоритм фильтра, чтобы отключить встраивание:

    1. В ex_kalman03.m, после объявления функции, добавьте:

      coder.inline('never');

    2. Поменяйте имя функции на ex_kalman04 и сохраните файл как ex_kalman04.m в текущей папке.

    3. В вашей модели ex_kalman33 дважды кликните блок Tracking.

      Редактор блока MATLAB function открывается.

    4. Измените вызов алгоритма фильтра, чтобы вызвать ex_kalman04.

      function y = kalman(u)
      %#codegen
      
      y = ex_kalman04(u);

    5. Сохраните модель как ex_kalman44.mdl.

  8. Сгенерируйте код для обновленной модели.

    1. Выберите блок Tracking.

    2. В окне модели выберите Code> C/C++Code> Build Selected Subsystem.

      Диалоговое окно Build code for Subsystem появляется.

    3. Нажмите кнопку Build.

      Программное обеспечение Simulink Coder генерирует код С для блока и запускает отчет генерации кода.

    4. На левой панели отчета генерации кода щелкните по ссылке Tracking.c, чтобы просмотреть сгенерированный код C.

      На этот раз функция ex_kalman04 имеет код, потому что вы отключили встраивание.

      /* Forward declaration for local functions */
      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]);
      
      /* Function for MATLAB Function Block: '<Root>/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, прежде чем вы измените его.

  • Выберите соглашение о присвоении имен для своих файлов и сохраняйте временные версии часто. Например, этот пример использует суффикс 2D цифры, чтобы дифференцировать различные версии алгоритма фильтра.

  • В целях симуляции, прежде, чем сгенерировать код, вызывают ваш код MATLAB с помощью coder.extrinsic, чтобы проверять, что алгоритм подходит для использования в Simulink. Эта практика предоставляет эти преимущества:

    • Вы не должны делать код MATLAB подходящим для генерации кода.

    • Можно отладить код MATLAB в MATLAB при вызове его от Simulink.

  • Создайте отчет генерации кода Simulink Coder. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.

Смотрите также

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

Больше о

Для просмотра документации необходимо авторизоваться на сайте