В этом примере вы будете учиться как:
Используйте блок 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
вектор-столбец и обновленный каждый раз фильтр используется.Фильтр Калмана использует законы движения оценить новое состояние:
Эти законы движения получены в матрице переходов 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
команда. См. Компилятор Значения по умолчанию Изменения.
Во-первых, исследуйте ex_kalman00
модель предоставила пример, чтобы изучить проблему, что вы пытаетесь решить использование Фильтра Калмана.
Откройте ex_kalman00
модель в Simulink:
Установите свою текущую папку MATLAB на папку, которая содержит ваши рабочие файлы для этого примера. В командной строке MATLAB, введите:
cd work
work
имя полного пути папки, содержащей ваши файлы.В командной строке MATLAB, введите:
ex_kalman00
Эта модель является неполной моделью, чтобы продемонстрировать, как интегрировать код MATLAB с Simulink. Полной моделью является ex_kalman11
, который также предоставляется этим примером.
Функция обратного вызова Модели InitFcn. Модель использует эту функцию обратного вызова для:
Загрузите данные о положении из MAT-файла.
Настройте данные, используемые блоком генератора индекса, который предоставляет второй вход блоку Selector.
Просмотреть этот коллбэк:
На вкладке Modeling выберите Model Settings> Model Properties.
Выберите вкладку Callbacks.
Выберите 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 используют основанную на нуле индексацию.
Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель 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 нажмите 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
'callback':
На вкладке Modeling выберите Model Settings> Model Properties.
Диалоговое окно Model Properties открывается.
В этом диалоговом окне выберите вкладку Callbacks.
Выберите InitFcn
в панели Model callbacks.
Замените существующий коллбэк на:
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.
Обновите блок Selector, чтобы использовать правильные индексы.
Дважды кликните блок Selector, чтобы просмотреть параметры функционального блока.
Диалоговое окно Function Block Parameters открывается.
Установите второй Index Option на Starting index (port)
.
Установите Output Size для второго входа к FRAME_SIZE
, нажмите Apply и закройте диалоговое окно.
Теперь Index Option для первого порта является Select all
и поскольку вторым портом является Starting index (port)
. Поскольку индекс постепенно увеличивается 5
каждым шагом расчета и выходным размером является 5
, блок Selector выводит 2x5
выведите в каждом шаге расчета.
Измените время остановки симуляции модели в 61
. Теперь форматом кадра является 5
, таким образом, симуляция завершается в одной пятой шагов расчета.
В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.
На левой панели диалогового окна Configuration Parameters выберите Solver.
На правой панели, набор Stop time к 61
.
Нажмите Apply и закройте диалоговое окно.
Сохраните модель как ex_kalman22.mdl
.
Тестирование Модифицированного Алгоритма. Симулировать модель:
В окне модели Simulink Нажмите Run.
Когда Simulink запускает модель, он строит траекторию объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде, когда вы использовали пакетный фильтр.
Остановки симуляции.
Вы доказали, что ваш алгоритм принимает сигнал фиксированного размера. Вы теперь готовы к следующей задаче, Используя Фильтр Принять Вход Переменного Размера.
В этой части примера вы изучаете, как задать данные переменного размера в вашей модели Simulink. Затем вы тестируете свой алгоритм Фильтра Калмана с входными параметрами переменного размера и видите, что алгоритм подходит для обработки пакетов данных различного размера. Для получения дополнительной информации об использовании данных переменного размера в Simulink смотрите Основы Сигнала Переменного Размера.
Обновление Модели, чтобы Использовать Входные параметры Переменного Размера. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman33.mdl
в вашем solutions
подпапка, чтобы видеть модифицированную модель.
Открытый ex_kalman22.mdl
в Simulink.
ex_kalman22
Измените InitFcn
'callback':
На вкладке Modeling выберите Model Settings> Model Properties.
Диалоговое окно Model Properties открывается.
Выберите вкладку Callbacks.
Выберите InitFcn
в панели Model callbacks.
Замените существующий коллбэк на:
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.
Обновите блок Selector, чтобы использовать правильные индексы.
Дважды кликните блок Selector, чтобы просмотреть параметры функционального блока.
Диалоговое окно Function Block Parameters открывается.
Установите второй Index Option на Starting and ending indices (port)
, затем нажмите Apply и закройте диалоговое окно.
Эта установка означает, что вход к порту индекса задает индексы начала и конца для входа в каждом шаге расчета. Поскольку вход индекса задает различные начальные и конечные индексы в каждом шаге расчета, блок Selector выводит сигнал переменного размера, в то время как симуляция прогрессирует.
Используйте Порты и Менеджер данных, чтобы установить вход MATLAB Function x
и выход y
как данные переменного размера.
Дважды кликните блок MATLAB Function, чтобы открыть Редактор блока MATLAB function.
В меню редактора выберите Edit Data.
В Портах и левой панели Менеджера данных, выберите вход u
.
Порты и Менеджер данных отображают информацию о u
на правой панели.
На вкладке General установите флажок Variable size и нажмите Apply.
На левой панели выберите выход y
.
На вкладке General:
Установите Size y
к [2 100]
задавать 2D матрицу, где верхними границами является 2
для первой размерности и 100
для второго, которое является максимальным входом размера, заданным в InitFcn
'callback'.
Установите флажок Variable size.
Нажмите Apply.
Закройте порты и менеджер данных.
Теперь сделайте то же самое для другого блока MATLAB Function. Используйте Порты, и Менеджер данных, чтобы установить блок Visualizing вводит y
и z
как данные переменного размера.
Дважды кликните блок Visualizing, чтобы открыть Редактор блока MATLAB function.
В меню редактора выберите Edit Data.
В Портах и левой панели Менеджера данных, выберите вход y
.
На вкладке General установите флажок Variable size и нажмите Apply.
На левой панели выберите вход z
.
На вкладке General установите флажок Variable size и нажмите Apply.
Закройте порты и менеджер данных.
Измените время остановки симуляции модели в 10
. На этот раз фильтр процессы один из одиннадцати различных размеров вводит каждый шаг расчета.
Сохраните модель как ex_kalman33.mdl
.
Тестирование Модифицированной Модели. Симулировать модель:
В окне модели Simulink нажмите Run.
Когда Simulink запускает модель, он строит траекторию объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета как прежде.
Обратите внимание на то, что сигнальные линии между блоком Selector и блоками Отслеживания и Визуализации изменяются, чтобы показать, что эти сигналы являются переменным размером.
Остановки симуляции.
Вы успешно создали алгоритм, который принимает входные параметры переменного размера. Затем вы изучаете, как отладить ваш блок MATLAB Function, как описано в Отладке блока MATLAB function.
Можно отладить блок MATLAB Function точно так же, как можно отладить функцию в MATLAB.
Дважды кликните блок MATLAB Function, который вызывает Фильтр Калмана, чтобы открыть Редактор блока MATLAB function.
В редакторе кликните по тире (-) символ в левом поле линии:
y = kalman03(u);
Маленький красный мяч появляется в поле этой линии, указывая, что вы установили точку останова.
В окне модели Simulink нажмите Run.
Симуляция делает паузу, когда выполнение достигает точки останова, и маленькая зеленая стрела появляется в левом поле.
Поместите указатель по переменной u
.
Значение u
кажется смежным с указателем.
В меню MATLAB Function Block Editor выберите Step In.
kalman03.m
файл открывается в редакторе, и можно теперь продвинуться через этот код с помощью Step, Step In и Step Out.
Выберите Step Out.
kalman03.m
завершения файла и блочный код MATLAB Function вновь появляются в редакторе.
Поместите указатель по выходной переменной y
.
Можно теперь видеть значение y
.
Кликните по красному мячу, чтобы удалить точку останова.
В меню MATLAB Function Block Editor выберите Quit Debugging.
Закройте редактор.
Закройте окно рисунка.
Теперь вы готовы к следующей задаче, Генерируя код С.
Вы доказали, что ваш алгоритм работает в Simulink. Затем вы генерируете код C/C++ для своей модели. Генерация кода требует Simulink Coder.
Примечание
Прежде, чем сгенерировать код, необходимо проверять, что код MATLAB подходит для генерации кода. Если вы вызываете свой код MATLAB как внешнюю функцию, необходимо удалить внешние вызовы прежде, чем сгенерировать код.
Переименуйте блок MATLAB Function в Tracking
. Чтобы переименовать блок, дважды кликните аннотацию MATLAB Function
ниже блока MATLAB Function и замены текст с Tracking
.
Когда вы генерируете код для блока MATLAB Function, Simulink Coder использует имя блока в сгенерированном коде. Это - хорошая практика, чтобы использовать понятное имя.
Прежде, чем сгенерировать код, гарантируйте, что Simulink Coder создает отчет генерации кода. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.
В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.
Диалоговое окно Configuration Parameters открывается.
На левой панели диалогового окна Configuration Parameters выберите Report под Code Generation.
На правой панели выберите Create code generation report и Open report automatically.
Нажмите Apply и закройте диалоговое окно Configuration Parameters.
Сохраните свою модель.
Сгенерировать код для блока Tracking:
Щелкните правой кнопкой по блоку Tracking и выберите C/C++ Code> Build Selected Subsystem.
В окне Build code for Subsystem нажмите Build. Для получения дополнительной информации смотрите, Генерируют Код и Исполняемые файлы для Отдельных Подсистем (Simulink Coder).
Программное обеспечение Simulink генерирует ошибку при информировании вас, что оно не может регистрировать сигналы переменного размера как массивы. Необходимо изменить формат данных, сохраненных в рабочее пространство MATLAB. Изменить этот формат:
В окне модели Simulink, на вкладке Modeling, нажимают Model Settings.
Диалоговое окно Configuration Parameters открывается.
На левой панели диалогового окна Configuration Parameters выберите Data Import/Export и установите Format на 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
.
Сгенерируйте и смотрите код С.
Повторите шаг 3.
На левой панели отчета генерации кода нажмите 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 обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.