Отслеживайте объект с помощью кода 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;

Ссылка

Хайкин, Симон. Теория адаптивных фильтров. Upper Saddle River, 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Отключена установка inlining для генерации кода.
Файлы модели Simulinkex_kalman00Модель Simulink без блока MATLAB Function.
ex_kalman11Завершите модель Simulink с MATLAB Function блоком для скалярного фильтра Калмана.
ex_kalman22Модель Simulink с блоком MATLAB Function для фильтра Калмана, который принимает входы фиксированного размера (на основе кадров).
ex_kalman33Simulink модель с блоком MATLAB Function для фильтра Калмана, который принимает входы переменного размера (на основе пакетов).
ex_kalman44Модель Simulink для вызова ex_kalman04.m, который имеет inlining отключен.
Файл данных 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 команда. См. Раздел «Изменение компилятора по умолчанию».

О модели ex_kalman00

Сначала исследуйте ex_kalman00 модель, поставляемая с руководством, чтобы понять задачу, которую вы пытаетесь решить с помощью фильтра Калмана.

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

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

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

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

      ex_kalman00

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

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

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

  • Настройте данные, используемые блоком Index generator, который предоставляет второй вход блоку 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, 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 нажмите 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. На вкладке 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 Параметры Блоков.

    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. На левой панели диалогового окна Параметры конфигурации выберите 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 коллбэк:

    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 Параметры Блоков.

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

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

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

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

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

    3. На левой панели Ports and Данных Manager выберите вход u.

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

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

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

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

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

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

      3. Нажмите Apply.

    7. Закройте диспетчер портов и данных.

  5. Теперь сделайте то же самое для другого блока MATLAB Function. Используйте Ports and Data Manager, чтобы задать входы блока визуализации y и z как данные переменного размера.

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

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

    3. На левой панели Ports and Данных Manager выберите вход 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 Editor выберите Step In.

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

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

    The kalman03.m файл закроется, и код MATLAB Function блока снова появится в редакторе.

  7. Наведите указатель мыши на выходную переменную y.

    Теперь вы можете увидеть значение y.

  8. Щелкните красный мяч, чтобы удалить точку останова.

  9. В меню Блок MATLAB Function 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 и закройте диалоговое окно Параметров конфигурации.

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

  3. Чтобы сгенерировать код для блока Отслеживания:

    1. Щелкните правой кнопкой мыши блок Отслеживать и выберите C/C++ Code > Build Selected Subsystem.

    2. В Build code for Subsystem окне нажмите Build. Для получения дополнительной информации смотрите Сгенерировать код и исполняемые файлы для отдельных подсистем (Simulink Coder).

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

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

      Откроется диалоговое окно Параметры конфигурации (Configuration Parameters).

    • На левой панели диалогового окна Параметров конфигурации выберите Data Import/Export и установите для Format значение Structure with time.

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

    • Нажмите Apply и закройте диалоговое окно Параметров конфигурации.

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

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

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

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

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

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

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

      coder.inline('never');

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

    3. В вашем ex_kalman33 дважды кликните блок Отслеживать.

      Откроется Редактор блоков 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 перед изменением.

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

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

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

    • Вы можете отлаживать код MATLAB в MATLAB, вызывая его из Simulink.

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

См. также

Похожие примеры

Подробнее о