Отслеживаемый объект Используя код 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, который является матрицей, которая содержит содействующие значения xY, 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-файла.

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

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

  1. На вкладке Modeling выберите Model Settings> Model Properties.

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

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

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

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

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

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

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

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

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

  • Сначала объявляет figureсодержание, и 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 нажмите 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 'callback':

    1. На вкладке Modeling выберите Model Settings> 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. Обновите блок Selector, чтобы использовать правильные индексы.

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

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

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

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

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

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

    1. В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.

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

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

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

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

Тестирование Модифицированного Алгоритма.  Симулировать модель:

  1. В окне модели Simulink Нажмите Run.

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

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

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

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

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

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

  1. Открытый ex_kalman22.mdl в Simulink.

    ex_kalman22

  2. Измените InitFcn 'callback':

    1. На вкладке Modeling выберите Model Settings> 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. Обновите блок Selector, чтобы использовать правильные индексы.

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

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

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

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

  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 'callback'.

      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 нажмите Run.

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

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

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

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

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

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

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

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

    y = kalman03(u);

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

  3. В окне модели Simulink нажмите 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. Затем вы генерируете код C/C++ для своей модели. Генерация кода требует Simulink Coder.

Примечание

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

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

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

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

    1. В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.

      Диалоговое окно 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 и выберите C/C++ Code> Build Selected Subsystem.

    2. В окне Build code for Subsystem нажмите Build. Для получения дополнительной информации смотрите, Генерируют Код и Исполняемые файлы для Отдельных Подсистем (Simulink Coder).

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

    • В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.

      Диалоговое окно 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. Повторите шаг 3.

    2. На левой панели отчета генерации кода нажмите Tracking.c соединитесь, чтобы просмотреть сгенерированный код 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 обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.

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

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

Больше о