В этом примере вы будете учиться как:
Используйте блок 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 и Эйе) движущегося объекта. Вектор состояния Кальмана, 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
и обновил каждый раз, когда фильтр используется.Фильтр Калмана использует законы движения оценить новое состояние:
Эти законы движения получены в матрице Грина 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
. Чтобы запустить пример, необходимо скопировать эти файлы в локальную папку. Для инструкций смотрите Копирование Файлов Локально.
Ввод | Имя | Описание |
---|---|---|
Файлы функции MATLAB | ex_kalman01 | Базовая реализация MATLAB скалярного Фильтра Калмана. |
ex_kalman02 | Версия исходного алгоритма, подходящего для генерации кода. | |
ex_kalman03 | Версия Фильтра Калмана, подходящего для генерации кода и для использования с основанными на кадре и основанными на пакете входными параметрами. | |
ex_kalman04 | Отключенное встраивание для генерации кода. | |
Файлы модели Simulink | ex_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 , который имеет отключенное встраивание. | |
Файл данных MATLAB | position | Содержит входные данные, используемые алгоритмом. |
Постройте график файлов | plot_trajectory | Строит график траектории объекта, и Фильтр Калмана оценил положение. |
Изменение фильтра, чтобы принять входной параметр фиксированного размера
Используя фильтр, чтобы принять входной параметр Переменного Размера
Скопируйте учебные файлы в локальную рабочую папку:
Создайте локальную папку solutions
, например, c:\simulink\kalman\solutions
.
Изменитесь на папку docroot\toolbox\simulink\examples
. В командной строке MATLAB войдите:
cd(fullfile(docroot, 'toolbox', 'simulink', 'examples'))
Скопируйте содержимое подпапки kalman
к вашей локальной папке solutions
, задав имя полного пути папки solutions
:
copyfile('kalman', 'solutions')
Например:
copyfile('kalman', 'c:\simulink\kalman\solutions')
Ваша папка solutions
теперь содержит полный набор решений для примера. Если вы не хотите выполнять шаги для каждой задачи в примере, можно просмотреть решения видеть, как код должен выглядеть.
Создайте локальную папку work
, например, c:\simulink\kalman\work
.
Скопируйте следующие файлы от своей папки solutions
до вашей папки work
.
ex_kalman01
ex_kalman00
position
plot_trajectory
Ваша папка work
теперь содержит все файлы, что необходимо начать с примером.
Создание вашего блока MATLAB function требует поддерживаемого компилятора. MATLAB автоматически выбирает тот как компилятор по умолчанию. Если у вас есть несколько поддерживаемых MATLAB компиляторов, установленных в вашей системе, можно изменить значение по умолчанию с помощью команды mex -setup
. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Во-первых, исследуйте модель ex_kalman00
, предоставленную примером, чтобы понять проблему, что вы пытаетесь решить использование Фильтра Калмана.
Откройте модель ex_kalman00
в Simulink:
Установите свою текущую папку MATLAB на папку, которая содержит ваши рабочие файлы для этого примера. В командной строке MATLAB войдите:
cd work
work
является именем полного пути папки, содержащей ваши файлы.В командной строке MATLAB войдите:
ex_kalman00
Эта модель является неполной моделью, чтобы продемонстрировать, как интегрировать код MATLAB с Simulink. Полной моделью является ex_kalman11
, который также предоставляется этим примером.
Функция обратного вызова Модели InitFcn. Модель использует эту функцию обратного вызова для:
Загрузите данные положения из MAT-файла.
Настройте данные, используемые Индексным блоком генератора, который предоставляет второй входной параметр Селекторному блоку.
Просмотреть этот обратный вызов:
Выберите File> Model Properties> Model Properties.
Выберите вкладку Callbacks.
Выберите InitFcn
в Образцовой панели обратных вызовов.
Обратный вызов появляется.
load position.mat; [R,C]=size(position); idx=(1:C)'; t=idx-1;
Исходные блоки. Модель использует два Исходных блока, чтобы обеспечить данные положения и скалярный индекс к Селекторному блоку.
Селекторный Блок. Модель использует Селекторный блок, который выбирает элементы его входного сигнала и генерирует выходной сигнал на основе его индексного входного параметра и его настроек 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
, и Симулинк использует основанную на нуле индексацию.
Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный образцовый ex_kalman11
в своей подпапке solutions
, чтобы видеть измененную модель.
В целях этого примера вы добавляете блок MATLAB function к модели ex_kalman00.mdl
, предоставленной примером. Необходимо было бы разработать собственный испытательный стенд начиная с пустой модели Simulink.
Добавление блока MATLAB function. Добавить блок MATLAB function к модели ex_kalman00
:
Откройте ex_kalman00
в Simulink.
ex_kalman00
Добавьте блок MATLAB function к модели:
В командной строке MATLAB введите slLibraryBrowser
, чтобы открыть Браузер Библиотеки Simulink.
Из списка Библиотек Simulink выберите библиотеку User-Defined Functions
.
Кликните по блоку MATLAB function и перетащите его в модель ex_kalman00
. Поместите блок чуть выше красной текстовой аннотации, которая читает Place MATLAB Function Block here.
Удалите красные текстовые аннотации из модели.
Сохраните модель в текущей папке как ex_kalman11
.
Вызов КОДА MATLAB от блока MATLAB function. Вызывать ваш код MATLAB от блока MATLAB function:
Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Удалите код по умолчанию, отображенный в редакторе.
Скопируйте следующий код в блок MATLAB function.
function y = kalman(u) %#codegen y = ex_kalman01(u);
Сохраните модель.
Соединение ввода и вывода блока MATLAB function
Соедините ввод и вывод блока MATLAB function так, чтобы ваша модель выглядела так.
Сохраните модель.
Моделировать модель:
В окне модели Simulink выберите Simulation> Run.
Когда Simulink запускает модель, он строит график траектории объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета. Первоначально, вы видите, что требуется короткое время для предполагаемого положения, чтобы сходиться с фактическим положением объекта. Затем три внезапных сдвига в положении происходят — каждый раз, когда Фильтр Калмана приспосабливает и отслеживает объект после нескольких итераций.
Остановки моделирования.
Вы доказали, что ваш алгоритм MATLAB работает в Simulink. Вы теперь готовы изменить фильтр, чтобы принять, что входной параметр фиксированного размера, как описано в Изменении Фильтра Принимает Входной параметр Фиксированного размера.
Фильтр вы продолжили работать до сих пор в этом примере, использует простой процесс пакетной обработки, который принимает входной параметр того за один раз, таким образом, необходимо неоднократно вызывать функцию для каждого входного параметра. В этой части примера вы изучаете, как изменить алгоритм, чтобы принять входной параметр фиксированного размера, который делает алгоритм подходящим для основанной на кадре обработки. Вы затем изменяете модель, чтобы обеспечить входной параметр как кадры фиксированного размера данных и вызвать передачу фильтра в данных один кадр за один раз.
Изменение Вашего КОДА MATLAB. Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл ex_kalman03.m
в вашей подпапке solutions
, чтобы видеть измененный алгоритм.
Можно теперь изменить алгоритм, чтобы обработать вектор, содержащий больше чем один входной параметр. Необходимо найти длину вектора и вызвать код фильтра для каждого элемента в векторе в свою очередь. Вы делаете это путем вызова алгоритма фильтра в цикле for
.
Откройте ex_kalman02.m
в редакторе MATLAB. В командной строке MATLAB войдите:
edit ex_kalman02.m
Добавьте цикл for
вокруг кода фильтра.
Перед комментарием:
% Predicted state and covariance
for i=1:size(z,2)
После:
% Compute the estimated measurements y = H * x_est;
end
Выберите код между оператором 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
Измените строку, которая вычисляет предполагаемое состояние и ковариацию, чтобы использовать элемент 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);
Измените строку, которая вычисляет предполагаемые измерения, чтобы добавить результат к элементу ith
вывода y
.
Изменение:
y = H * x_est;
y(:,i) = H * x_est;
Индикатор сообщения анализатора кода в правых верхних поворотах, оранжевых, чтобы указать, что анализатор кода обнаружил предупреждения. Анализатор кода подчеркивает незаконный код в оранжевом и помещает оранжевый маркер направо.
Переместите указатель через оранжевый маркер, чтобы просмотреть информацию об ошибке.
Анализатор кода обнаруживает, что y
должен быть полностью задан прежде, чем преобразовать его в нижний индекс и что вы не можете вырастить переменные посредством индексации в сгенерированном коде.
Чтобы обратиться к этому предупреждению, предварительно выделите память для вывода y
, который одного размера как входной параметр z
. Добавьте этот код перед циклом for
.
% Pre-allocate output signal: y=zeros(size(z));
Оранжевый маркер исчезает, и индикатор сообщения анализатора кода в правом верхнем краю кода становится зеленым, который указывает, что вы зафиксировали все ошибки и предупреждения, обнаруженные анализатором кода.
Поменяйте имя функции на ex_kalman03
и сохраните файл как ex_kalman03.m
в текущей папке.
Вы готовы начать следующую задачу в примере, Изменяя Вашу Модель, чтобы Вызвать Обновленный Алгоритм.
Изменение Модели, чтобы Вызвать Обновленный Алгоритм. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный образцовый ex_kalman22.mdl
в своей подпапке solutions
, чтобы видеть измененную модель.
Затем, обновите свою модель, чтобы обеспечить входной параметр как кадры фиксированного размера данных и вызвать передачу ex_kalman03
в данных один кадр за один раз.
Откройте модель ex_kalman11
в Simulink.
ex_kalman11
Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Замените код, который вызывает ex_kalman02
с вызовом ex_kalman03
.
function y = kalman(u) %#codegen y = ex_kalman03(u);
Закройте редактор.
Измените обратный вызов InitFcn
:
Выберите File> Model Properties> Model Properties.
Диалоговое окно Model Properties открывается.
В этом диалоговом окне выберите вкладку Callbacks.
Выберите InitFcn
в Образцовой панели обратных вызовов.
Замените существующий обратный вызов на:
load position.mat; [R,C]=size(position); FRAME_SIZE=5; idx=(1:FRAME_SIZE:C)'; LEN=length(idx); t=(1:LEN)'-1;
5
и индекс постепенно увеличиваться 5
.Нажмите Apply и закройте диалоговое окно Model Properties.
Обновите Селекторный блок, чтобы использовать правильные индексы.
Дважды кликните Селекторный блок, чтобы просмотреть параметры функционального блока.
Диалоговое окно Function Block Parameters открывается.
Установите вторую Индексную Опцию на Starting index (port)
.
Установите Выходной Размер для второго входного параметра к FRAME_SIZE
, нажмите Apply и закройте диалоговое окно.
Теперь, Индексной Опцией для первого порта является Select all
, и для второго порта Starting index (port)
. Поскольку индексные инкременты 5
, каждой частотой дискретизации и выходным размером является 5
, Селекторный блок, выводят 2x5
вывод в каждой частоте дискретизации.
Измените образцовое время остановки моделирования на 61
. Теперь форматом кадра является 5
, таким образом, моделирование завершается в одной пятой частот дискретизации.
В окне модели Simulink выберите Simulation> Model Configuration Parameters.
На левой панели диалогового окна Configuration Parameters выберите Solver.
На правой панели, Времени остановки набора к 61
.
Нажмите Apply и закройте диалоговое окно.
Сохраните модель как ex_kalman22.mdl
.
Тестирование Измененного Алгоритма. Моделировать модель:
В окне модели Simulink выберите Simulation> Run.
Когда Simulink запускает модель, он строит график траектории объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде, когда вы использовали пакетный фильтр.
Остановки моделирования.
Вы доказали, что ваш алгоритм принимает сигнал фиксированного размера. Вы теперь готовы к следующей задаче, Используя Фильтр Принять Входной параметр Переменного Размера.
В этой части примера вы изучаете, как задать данные переменного размера в вашей модели Simulink. Затем вы тестируете свой алгоритм Фильтра Калмана с входными параметрами переменного размера и видите, что алгоритм подходит для обработки пакетов данных переменного размера. Для получения дополнительной информации об использовании данных переменного размера в Simulink смотрите Основы Сигнала Переменного Размера.
Обновление Модели, чтобы Использовать Вводы Переменного Размера. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный образцовый ex_kalman33.mdl
в своей подпапке solutions
, чтобы видеть измененную модель.
Откройте ex_kalman22.mdl
в Simulink.
ex_kalman22
Измените обратный вызов InitFcn
:
Выберите File> Model Properties> Model Properties.
Диалоговое окно Model Properties открывается.
Выберите вкладку Callbacks.
Выберите InitFcn
в Образцовой панели обратных вызовов.
Замените существующий обратный вызов на:
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 элементов.Нажмите Apply и закройте диалоговое окно Model Properties.
Обновите Селекторный блок, чтобы использовать правильные индексы.
Дважды кликните Селекторный блок, чтобы просмотреть параметры функционального блока.
Диалоговое окно Function Block Parameters открывается.
Установите вторую Индексную Опцию на Starting and ending indices (port)
, затем нажмите Apply и закройте диалоговое окно.
Эта установка означает, что входной параметр к индексному порту задает запуск и индексы конца для входного параметра в каждой частоте дискретизации. Поскольку индексный входной параметр задает различный запуск и конечные индексы в каждой частоте дискретизации, Селекторный блок выводит сигнал переменного размера, в то время как моделирование прогрессирует.
Используйте Порты, и Менеджер данных, чтобы установить функцию MATLAB ввел x
и вывод y
как данные переменного размера.
Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Из меню редактора выберите Edit Data.
В Портах и левой панели Менеджера данных, выберите входной параметр u
.
Порты и Менеджер данных отображают информацию о u
на правой панели.
На вкладке "Общие" установите Переменный флажок размера и нажмите Apply.
На левой панели выберите вывод y
.
На вкладке "Общие":
Установите Размер y
к [2 100]
задавать 2D матрицу, где верхними границами является 2
для первой размерности и 100
для второго, которое является максимальным входным параметром размера, заданным в обратном вызове InitFcn
.
Установите Переменный флажок размера.
Нажмите Apply.
Закройте порты и менеджер данных.
Теперь сделайте то же самое для другого блока MATLAB function. Используйте Порты, и Менеджер данных, чтобы установить блок Visualizing вводит y
и z
как данные переменного размера.
Дважды кликните блок Visualizing, чтобы открыть Редактор блока MATLAB function.
Из меню редактора выберите Edit Data.
В Портах и левой панели Менеджера данных, выберите входной параметр y
.
На вкладке "Общие" установите Переменный флажок размера и нажмите Apply.
На левой панели выберите входной параметр z
.
На вкладке "Общие" установите Переменный флажок размера и нажмите Apply.
Закройте порты и менеджер данных.
Измените образцовое время остановки моделирования на 10
. На этот раз фильтр процессы один из одиннадцати различных размеров вводит каждую частоту дискретизации.
Сохраните модель как ex_kalman33.mdl
.
Тестирование Измененной Модели. Моделировать модель:
В окне модели Simulink выберите Simulation> Run.
Когда Simulink запускает модель, он строит график траектории объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде.
Обратите внимание на то, что сигнальные линии между Селекторным блоком и блоками Отслеживания и Визуализации изменяются, чтобы показать, что эти сигналы являются переменным размером.
Остановки моделирования.
Вы успешно создали алгоритм, который принимает входные параметры переменного размера. Затем, вы изучаете, как отладить ваш блок MATLAB function, как описано в Отладке блока MATLAB function.
Можно отладить блок MATLAB function точно так же, как можно отладить функцию в MATLAB.
Дважды кликните блок MATLAB function, который вызывает Фильтр Калмана, чтобы открыть Редактор блока MATLAB function.
В редакторе кликните по тире (-) символ в левом поле строки:
y = kalman03(u);
Маленький красный шар появляется в поле этой строки, указывая, что вы установили точку останова.
В окне модели Simulink выберите Simulation> Run.
Моделирование делает паузу, когда выполнение достигает точки останова, и маленькая зеленая стрелка появляется в левом поле.
Поместите указатель по переменному u
.
Значение u
кажется смежным с указателем.
Из меню MATLAB Function Block Editor выберите Step In.
Файл kalman03.m
открывается в редакторе, и можно теперь продвинуться через этот код с помощью Шага, Вступить и Выйти.
Выберите Step Out.
Завершения файла kalman03.m
и код блока MATLAB function вновь появляются в редакторе.
Поместите указатель по выходной переменной y
.
Можно теперь видеть значение y
.
Кликните по красному шару, чтобы удалить точку останова.
Из меню MATLAB Function Block Editor выберите Quit Debugging.
Закройте редактор.
Закройте окно фигуры.
Теперь вы готовы к следующей задаче, Генерируя код С.
Вы доказали, что ваш алгоритм работает в Simulink. Затем вы генерируете код для своей модели.
Прежде, чем сгенерировать код, необходимо проверить, что код MATLAB подходит для генерации кода. Если вы вызываете свой код MATLAB как внешнюю функцию, необходимо удалить внешние вызовы прежде, чем сгенерировать код.
Переименуйте блок MATLAB function к Tracking
. Чтобы переименовать блок, дважды кликните аннотацию MATLAB Function
ниже блока MATLAB function и замените текст на Tracking
.
Когда вы генерируете код для блока MATLAB function, Simulink Coder использует имя блока в сгенерированном коде. Это - хорошая практика, чтобы использовать понятное имя.
Прежде, чем сгенерировать код, гарантируйте, что Simulink Coder создает отчет генерации кода. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.
В окне модели Simulink выберите Simulation> Model Configuration Parameters.
Диалоговое окно Configuration Parameters открывается.
На левой панели диалогового окна Configuration Parameters выберите Report под Генерацией кода.
На правой панели выберите отчет генерации кода Create.
Открытый отчет автоматически опция также выбран.
Нажмите Apply и закройте диалоговое окно Configuration Parameters.
Сохраните свою модель.
Сгенерировать код для блока Tracking:
В вашей модели выберите блок Tracking.
В окне модели Simulink выберите Code> C/C ++ Code> Build Selected Subsystem.
Программное обеспечение Simulink генерирует ошибку при информировании вас, что оно не может регистрировать сигналы переменного размера как массивы. Необходимо изменить формат данных, сохраненных к MATLAB workspace. Изменить этот формат:
В окне модели Simulink выберите Simulation> Model Configuration Parameters.
Диалоговое окно Configuration Parameters открывается.
На левой панели диалогового окна Configuration Parameters выберите Data Import/Export и установите Формат на Structure with time
.
Записанные данные являются теперь структурой, которая имеет два поля: поле времени и поле сигналов, позволяя Simulink регистрировать сигналы переменного размера.
Нажмите Apply и закройте диалоговое окно Configuration Parameters.
Сохраните свою модель.
Повторный шаг 3
, чтобы сгенерировать код для блока Tracking.
Программное обеспечение Simulink Coder генерирует код С для блока и запускает отчет генерации кода.
Для получения дополнительной информации об использовании отчета генерации кода см. Отчеты для Генерации кода (Simulink Coder).
На левой панели отчета генерации кода щелкните по ссылке Tracking.c
, чтобы просмотреть сгенерированный код C. Обратите внимание на то, что в коде, сгенерированном для блока MATLAB function, Tracking
, нет никакого кода для функции ex_kalman03
, потому что встраивание включено по умолчанию.
Измените свой алгоритм фильтра, чтобы отключить встраивание:
В ex_kalman03.m
, после объявления функции, добавьте:
coder.inline('never');
Поменяйте имя функции на ex_kalman04
и сохраните файл как ex_kalman04.m
в текущей папке.
В вашей модели ex_kalman33
дважды кликните блок Tracking.
Редактор блока MATLAB function открывается.
Измените вызов алгоритма фильтра, чтобы вызвать ex_kalman04
.
function y = kalman(u) %#codegen y = ex_kalman04(u);
Сохраните модель как ex_kalman44.mdl
.
Сгенерируйте код для обновленной модели.
Выберите блок Tracking.
В образцовом окне выберите Code> C/C ++ Code> Build Selected Subsystem.
Код Сборки для диалогового окна Subsystem появляется.
Нажмите кнопку Build.
Программное обеспечение Simulink Coder генерирует код С для блока и запускает отчет генерации кода.
На левой панели отчета генерации кода щелкните по ссылке 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, прежде чем вы измените его.
Выберите соглашение о присвоении имен для своих файлов и сохраняйте временные версии часто. Например, этот пример использует суффикс двух-цифры, чтобы дифференцировать различные версии алгоритма фильтра.
В целях моделирования, прежде, чем сгенерировать код, вызывают ваш код MATLAB с помощью coder.extrinsic
, чтобы проверить, что алгоритм подходит для использования в Simulink. Эта практика предоставляет эти преимущества:
Вы не должны делать код MATLAB подходящим для генерации кода.
Можно отладить код MATLAB в MATLAB при вызове его от Simulink.
Создайте отчет генерации кода Simulink Coder. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.