В этом примере вы будете учиться как:
Автоматически сгенерируйте MEX-функцию из своего кода MATLAB® и используйте эту MEX-функцию, чтобы подтвердить ваш алгоритм в MATLAB прежде, чем сгенерировать код С.
Автоматически сгенерируйте код С из своего кода MATLAB.
Задайте свойства входного параметра функции в командной строке.
Задайте входные параметры переменного размера при генерации кода.
Задайте свойства генерации кода.
Сгенерируйте генерацию кода, сообщают, что можно использовать, чтобы отладить код MATLAB и проверить, что это подходит для генерации кода.
Чтобы завершить этот пример, у вас должно быть основное знакомство с программным обеспечением MATLAB.
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB
MATLAB Coder™
Компилятор C
MATLAB CODER автоматически определяет местоположение и использует поддерживаемый установленный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks®.
Можно использовать mex -setup
, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Для получения инструкций по установке Продуктов 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.
Пример использует следующие файлы:
Пример файлы кода MATLAB для каждого шага примера.
Всюду по этому примеру вы работаете с файлами MATLAB, которые содержат простой алгоритм Фильтра Калмана.
Создайте скрипты, которые вы используете, чтобы скомпилировать ваш функциональный код.
Тестовые файлы, что:
Выполните функции предварительной обработки.
Вызовите Фильтр Калмана.
Выполните функции последующей обработки.
MAT-файл, который содержит входные данные.
Учебные файлы доступны в следующей папке: docroot\toolbox\coder\examples\kalman
. Чтобы запустить пример, необходимо скопировать эти файлы в локальную папку. Для инструкций смотрите Копирование Файлов Локально.
Ввод | Имя | Описание |
---|---|---|
Функциональный код | kalman01.m | Базовая реализация MATLAB скалярного Фильтра Калмана. |
kalman02.m | Версия исходного алгоритма, который подходит для генерации кода. | |
kalman03.m | Фильтр Калмана, подходящий для использования с основанными на кадре и основанными на пакете входными параметрами. | |
Создайте скрипты | build01.m | Генерирует MEX-функцию для исходного Фильтра Калмана. |
build02.m | Генерирует код С для исходного Фильтра Калмана. | |
build03.m | Генерирует код С для основанного на кадре Фильтра Калмана. | |
build04.m | Генерирует код С для переменного размера (основанный на пакете) Фильтр Калмана. | |
Тестовые скрипты | test01.m | Тестирует скалярный Фильтр Калмана и строит график траектории. |
test02.m | Тестовая MEX-функция для исходного Фильтра Калмана и графиков траектория. | |
test03.m | Тестирует основанный на кадре Фильтр Калмана. | |
test04.m | Тестирует переменный размер (основанный на пакете) Фильтр Калмана. | |
Matfile | position.mat | Содержит входные данные, используемые алгоритмом. |
Функция plot | plot_trajectory.m | Строит график траектории объекта, и Фильтр Калмана оценил положение. |
При записи кода MATLAB, который вы хотите преобразовать в эффективный, автономный код C/C++, необходимо рассмотреть следующее:
Типы данных
C и C++ используют статический контроль типов. Чтобы определить типы ваших переменных перед использованием, MATLAB CODER требует полного присвоения на каждую переменную.
Калибровка массивов
Массивы переменного размера и матрицы поддержаны для генерации кода. Можно задать входные параметры, выходные параметры и локальные переменные в функциях MATLAB, чтобы представлять данные, который отличается по размеру во время выполнения.
Memory
Можно выбрать, использует ли сгенерированный код статическое или динамическое выделение памяти.
С динамическим выделением памяти вы потенциально используете меньше памяти за счет времени, чтобы управлять памятью. Со статическим ЗУ вы получаете лучшую скорость, но с более высоким использованием памяти. Большая часть кода MATLAB использует в своих интересах динамические функции калибровки в MATLAB, поэтому динамическое выделение памяти обычно позволяет вам сгенерировать код из существующего кода MATLAB без большой модификации. Динамическое выделение памяти также позволяет некоторым программам компилировать, даже когда верхние границы не могут быть найдены.
Скорость
Поскольку встраиваемые приложения должны запуститься в режиме реального времени, код должен быть достаточно быстрым, чтобы соответствовать необходимой тактовой частоте.
Улучшить скорость сгенерированного кода:
Выберите подходящий компилятор C/C++. Компилятор по умолчанию, что предоставления MathWorks с MATLAB для Windows® 64-битные платформы не являются хорошим компилятором для производительности.
Рассмотрите проверки на этапе выполнения отключения.
По умолчанию, для безопасности, код, сгенерированный для вашего кода MATLAB, содержит проверки целостности памяти и проверки скорости отклика. Обычно эти проверки приводят к большему количеству сгенерированного кода и более медленного моделирования. Отключение проверок на этапе выполнения обычно приводит к оптимизированному сгенерированному коду и более быстрому моделированию. Отключите эти проверки, только если вы проверили, что границы массивов и проверка размерности являются ненужными.
Факторы для того, чтобы сделать ваш код подходящим для генерации кода
Сравнение сгенерированного кода C к оригинальному коду MATLAB
Изменение фильтра, чтобы принять входной параметр фиксированного размера
Изменение фильтра, чтобы принять входной параметр Переменного Размера
Скопируйте учебные файлы в локальную рабочую папку:
Создайте локальную папку solutions
, например, c:\coder\kalman\solutions
.
Изменитесь на папку docroot\toolbox\coder\examples
. В подсказке команды MATLAB войдите:
cd(fullfile(docroot, 'toolbox', 'coder', 'examples'))
Скопируйте содержимое подпапки kalman
к вашей локальной папке solutions
, задав имя полного пути папки solutions
:
copyfile('kalman', 'solutions')
solutions
теперь содержит полный набор решений для примера. Если вы не хотите выполнять шаги для каждой задачи в примере, можно просмотреть решения видеть, как код должен выглядеть.Создайте локальную папку work
, например, c:\coder\kalman\work
.
Скопируйте следующие файлы от своей папки solutions
до вашей папки work
.
kalman01.m
position.mat
Файлы типа "build" build01.m
через build04.m
Тестовые скрипты test01.m
через test04.m
plot_trajectory.m
Ваша папка work
теперь содержит файлы, что необходимо начать с примером.
В этом примере вы работаете с функцией MATLAB, которая реализует алгоритм Фильтра Калмана, который предсказывает положение перемещения, основанного на объектах на его прошлых положениях. Прежде, чем сгенерировать код С для этого алгоритма, вы делаете версию MATLAB подходящей для генерации кода и генерируете MEX-функцию. Затем вы тестируете получившуюся MEX-функцию, чтобы подтвердить функциональность модифицированного кода. Когда вы работаете через пример, вы совершенствовали дизайн алгоритма, чтобы принять входные параметры переменного размера.
Во-первых, используйте скрипт test01.m
, чтобы запустить исходную функцию MATLAB, чтобы видеть, как алгоритм Фильтра Калмана работает. Этот скрипт загружает входные данные и вызывает алгоритм Фильтра Калмана, чтобы оценить местоположение. Это затем вызывает функцию plot, plot_trajectory
, который строит график траектории объекта, и Фильтр Калмана оценил положение.
Установите свою текущую папку MATLAB на папку работы, которая содержит ваши файлы для этого примера. В подсказке команды MATLAB войдите:
cd work
work
является именем полного пути папки работы, содержащей ваши файлы. Для получения дополнительной информации смотрите Файлы и Папки что MATLAB доступы (к MATLAB).В подсказке команды MATLAB войдите:
test01
Тестовый скрипт запускает и строит график траектории объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета. Первоначально, вы видите, что требуется короткое время для предполагаемого положения, чтобы сходиться с фактическим положением объекта. Затем три внезапных сдвига в положении происходят — каждый раз, когда Фильтр Калмана приспосабливает и отслеживает объект после нескольких итераций.
MATLAB CODER автоматически определяет местоположение и использует поддерживаемый установленный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks.
Можно использовать mex -setup
, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Разработка для Генерации кода. Прежде, чем сгенерировать код, необходимо подготовить код MATLAB к генерации кода. Первый шаг должен устранить неподдерживаемые построения.
Проверка Проблемы во Время проектирования. Существует два инструмента, которые помогают вам обнаружить проблемы генерации кода во время проектирования: анализатор кода и инструмент готовности генерации кода.
Вы используете анализатор кода в редакторе MATLAB, чтобы проверить на кодирование проблем во время проектирования, минимизируя ошибки компиляции. Анализатор кода постоянно проверяет ваш код, когда вы вводите его. Это сообщает о проблемах и рекомендует модификациям максимизировать производительность и поддерживаемость.
Чтобы использовать анализатор кода, чтобы идентифицировать предупреждения и ошибки, характерные для MATLAB для генерации кода, необходимо добавить директиву %#codegen
(или прагма) к файлу MATLAB. Полный список MATLAB для сообщений анализатора кода Генерации кода доступен в настройках Анализатора КОДА MATLAB. Смотрите Выполнение Отчета Анализатора кода (MATLAB).
Анализатор кода не может обнаружить весь MATLAB для проблем генерации кода. После устранения ошибок или предупреждений, что анализатор кода обнаруживает, скомпилируйте свой код с MATLAB CODER, чтобы определить, имеет ли код другие проблемы соответствия.
Инструмент готовности генерации кода экранирует код MATLAB на функции и функции, которые не поддерживаются для генерации кода. Инструмент предоставляет отчет, который перечисляет исходные файлы, которые содержат неподдерживаемые функции и функции и индикацию относительно того, сколько работает, требуется, чтобы делать код MATLAB подходящим для генерации кода.
Можно получить доступ к инструменту готовности генерации кода следующими способами:
В браузере текущей папки — путем щелчка правой кнопкой по файлу MATLAB
В командной строке — при помощи функции coder.screener
.
Используя приложение MATLAB CODER — после того, как вы задаете свои файлы точки входа, выполнение приложения Анализатор кода и инструмент готовности генерации кода.
Проверка Проблем во Время Генерации кода. Можно использовать codegen
, чтобы проверить на проблемы во время генерации кода. codegen
проверяет, что ваш код MATLAB подходит для генерации кода.
Когда codegen
обнаруживает ошибки или предупреждения, он автоматически генерирует сообщение об ошибке, которое описывает проблемы и обеспечивает ссылки на оскорбление код MATLAB. Для получения дополнительной информации см. Отчеты Генерации кода.
После генерации кода codegen
генерирует MEX-функцию, которую можно использовать, чтобы протестировать реализацию в MATLAB.
Проверка Проблемы во Время выполнения. Можно использовать codegen
, чтобы сгенерировать MEX-функцию и проверку на проблемы во время выполнения. В моделировании код, сгенерированный для ваших функций MATLAB, включает проверки на этапе выполнения. Отключение проверок на этапе выполнения и внешних вызовов обычно приводит к оптимизированному сгенерированному коду и более быстрому моделированию. Вы управляете проверками на этапе выполнения с помощью объекта настройки MEX, coder.MexCodeConfig
. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления.
Если вы сталкиваетесь с ошибками времени выполнения в своих функциях MATLAB, стек этапа выполнения появляется автоматически в Окне Команды MATLAB. Смотрите Ошибки времени выполнения Отладки.
Создание Кода, Подходящего для Генерации кода. Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл kalman02.m
в вашей подпапке solutions
, чтобы видеть измененный алгоритм.
Чтобы начать процесс создания вашего кода MATLAB, подходящего для генерации кода, вы работаете с файлом kalman01.m
m. Этот код является версией MATLAB скалярного Фильтра Калмана, который оценивает состояние динамической системы от ряда шумных измерений.
Установите свою текущую папку MATLAB на папку работы, которая содержит ваши файлы для этого примера. В подсказке команды MATLAB войдите:
cd work
work
является именем полного пути папки работы, содержащей ваши файлы. Смотрите Файлы и Папки что MATLAB доступы (к MATLAB).Откройте kalman01.m
в редакторе MATLAB. В подсказке команды MATLAB войдите:
edit kalman01.m
Файл открывается в редакторе MATLAB. Индикатор сообщения анализатора кода в правом верхнем углу редактора MATLAB является зеленым, который указывает, что это не обнаружило ошибки, предупреждения или возможности для улучшения кода.
Включите MATLAB для проверки ошибок генерации кода путем добавления директивы %#codegen
после объявления функции.
function y = kalman01(z) %#codegen
Индикатор сообщения анализатора кода остается зеленым, указывая, что он не обнаружил связанные с генерацией кода проблемы.
Для получения дополнительной информации об использовании анализатора кода смотрите Выполнение Отчета Анализатора кода (MATLAB).
Сохраните файл в текущей папке как kalman02.m
m:
Чтобы совпадать с именем функции к имени файла, поменяйте имя функции на kalman02
.
function y = kalman02(z)
В редакторе MATLAB выберите Save As из меню File.
Введите kalman02.m
как новое имя файла.
Если вы не совпадаете с именем файла к имени функции, анализатор кода предупреждает вас, что эти имена не являются тем же самым, и подсвечивает имя функции в оранжевом, чтобы указать, что это может обеспечить автоматическое исправление. Для получения дополнительной информации см. Изменяющийся Код На основе сообщений Анализатора кода (MATLAB).
Нажмите Save.
Лучшая практика — сохранение вашего кода
Вы теперь готовы скомпилировать свой код с помощью codegen
. По умолчанию codegen
проверяет, что ваш код MATLAB подходит для генерации кода. Затем после компиляции codegen
генерирует MEX-функцию, которую можно протестировать в MATLAB.
Поскольку C использует статический контроль типов, codegen
должен определить свойства всех переменных в файлах MATLAB во время компиляции. Поэтому необходимо задать свойства всех входных параметров функции в то же время, что и вы компилируете файл с codegen
.
Чтобы скомпилировать kalman02.m
, необходимо задать размер входного вектора y
.
Загрузите файл position.mat
в свой MATLAB workspace.
load position.mat
position
, содержащий x
и координаты y
точек 310
на Декартовом пробеле.Получите первый вектор в матрице положения.
z = position(1:2,1);
Скомпилируйте файл kalman02.m
с помощью codegen
.
codegen -report kalman02.m -args {z}
codegen
сообщает, что генерация кода завершена. По умолчанию это генерирует MEX-функцию, kalman02_mex
, в текущей папке и обеспечивает ссылку на отчет генерации кода.
Обратите внимание на то, что:
Опция -report
дает команду codegen
генерировать отчет генерации кода, который можно использовать, чтобы отладить код MATLAB и проверить, что это подходит для генерации кода.
Опция -args
дает команду codegen
компилировать файл kalman02.m
с помощью класса, размера и сложности демонстрационного входного параметра z
.
Вы доказали, что пример кода Фильтра Калмана подходит для генерации кода, использующей codegen
. Вы готовы начать следующую задачу в этом примере, Проверяя MEX-функцию.
В этой части примера вы тестируете MEX-функцию, чтобы проверить, что это обеспечивает ту же функциональность как оригинальный код MATLAB.
Кроме того, моделирование вашего алгоритма в MATLAB прежде, чем сгенерировать код С позволяет вам обнаружить и зафиксировать ошибки времени выполнения, которые было бы намного более трудно диагностировать в сгенерированном коде C. По умолчанию MEX-функция включает проверки целостности памяти. Эти проверки выполняют границы массивов и проверку размерности и обнаруживают нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Если нарушение обнаруживается, выполнение остановок MATLAB с диагностическим сообщением. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления.
Выполнение Сгенерированной MEX-функции. Вы запускаете MEX-функцию, kalman02_mex
, с помощью coder.runTest
, чтобы вызвать тестовый файл, test02
. Этот тестовый файл совпадает с test01
, который вы использовали в Выполнении оригинального кода MATLAB за исключением того, что это вызывает kalman02
вместо kalman01
.
coder.runTest
запускает тестовый файл и заменяет вызовы алгоритма MATLAB с вызовами MEX-функции.
coder.runTest('test02','kalman02')
coder.runTest
запускает MEX-функцию, kalman02_mex
, с помощью тех же входных параметров, которые вы использовали в Выполнении оригинального кода MATLAB.
Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.
Вы сгенерировали MEX-функцию для своего кода MATLAB, проверили, что это функционально эквивалентно вашему оригинальному коду MATLAB и проверенное на ошибки времени выполнения. Теперь вы готовы начать следующую задачу в этом примере, Генерируя код С Используя codegen.
Чтобы проверить, что MEX-функция функционально эквивалентна вашему оригинальному коду MATLAB, вместо того, чтобы использовать coder.runTest
, можно использовать опцию -test
codegen
. Например:
codegen kalman02 -args {z} -test test02 -report
Используя codegen
с -test
опция комбинирует генерацию MEX и тестирующий за один шаг.
Лучшая практика — разделение испытательного стенда из функционального кода
В этой задаче вы используете codegen
, чтобы сгенерировать код С для вашего алгоритма фильтра MATLAB. Вы затем просматриваете сгенерированный код C в генерации кода, сообщают и сравнивают сгенерированный код C с оригинальным кодом MATLAB. Вы используете предоставленный скрипт сборки build02.m
, чтобы сгенерировать код.
О Скрипте Сборки. Скрипт сборки автоматизирует серию команд MATLAB, которые вы хотите выполнить неоднократно из командной строки, экономя вам время и устранение входных ошибок.
Скрипт сборки build02.m
содержит:
% Load the position vector load position.mat % Get the first vector in the position matrix % to use as an example input z = position(1:2,1); % Generate C code only, create a code generation report codegen -c -d build02 -config coder.config('lib') -report kalman02.m -args {z}
codegen
открывает файл kalman02.m
и автоматически переводит код MATLAB в исходный код C.
Опция -c
дает команду codegen
генерировать код только, не компилируя код в объектный файл. Эта опция позволяет вам выполнить итерации быстро между изменением кода MATLAB и генерацией кода С.
Опция -config coder.config('lib')
дает команду codegen
генерировать встраиваемый код С, подходящий для предназначения для статической библиотеки вместо того, чтобы генерировать MEX-функцию по умолчанию. Для получения дополнительной информации смотрите coder.config
.
Опция -d
дает команду codegen
генерировать код в выходной папке build02
.
Опция -report
сообщает, что codegen
, чтобы сгенерировать генерацию кода сообщает, что можно использовать, чтобы отладить код MATLAB и проверить, что это подходит для генерации кода.
Опция -args
дает команду codegen
компилировать файл kalman01.m
с помощью класса, размера и сложности демонстрационного входного параметра z
.
Лучшая практика — генерация кода С только во время разработки
Как сгенерировать код С
Запустите скрипт сборки.
build02
MATLAB обрабатывает файл типа "build" и выводит сообщение:
Code generation successful: View report.
codegen
генерирует файлы в папке, build02
.Нажмите просматривают отчет.
Средство просмотра Отчета MATLAB CODER открывает и отображает сгенерированный код, kalman02.c
c. Чтобы узнать больше об отчете, см. Отчеты Генерации кода.
Чтобы сравнить ваш сгенерированный код C с оригинальным кодом MATLAB, откройте файл C, kalman02.c
и файл kalman02.m
в редакторе MATLAB.
Вот некоторые важные моменты о сгенерированном коде C:
Функциональная подпись:
void kalman02(const double z[2], double y[2])
z
соответствует входному параметру z
в вашем коде MATLAB. Размером z
является 2
, который соответствует общему размеру (2 x 1) примера вводит вас используемый, когда вы скомпилировали свой код MATLAB. Можно легко сравнить сгенерированный код C с оригинальным кодом MATLAB. В сгенерированном коде C:
Ваше имя функции неизменно.
Ваши комментарии сохраняются в том же положении.
Ваши имена переменных эквивалентны в оригинальном коде MATLAB.
Если переменная в вашем коде MATLAB установлена в постоянное значение, это не появляется как переменная в сгенерированном коде C. Вместо этого сгенерированный код C содержит фактическое значение переменной.
Фильтр вы продолжили работать до сих пор в этом примере, использует простой процесс пакетной обработки, который принимает входной параметр того за один раз, таким образом, необходимо неоднократно вызывать функцию для каждого входного параметра. В этой части примера вы изучаете, как изменить алгоритм, чтобы принять входной параметр фиксированного размера, который делает алгоритм подходящим для основанной на кадре обработки.
Изменение Вашего КОДА MATLAB. Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл kalman03.m
в вашей подпапке решений, чтобы видеть измененный алгоритм.
Алгоритм фильтра, который вы использовали до сих пор в этом примере, принимает только один входной параметр. Можно теперь изменить алгоритм, чтобы обработать вектор, содержащий больше чем один входной параметр. Необходимо найти длину вектора и вызвать код фильтра для каждого элемента в векторе в свою очередь. Вы делаете это путем вызова алгоритма фильтра в for
- цикл.
Откройте kalman02.m
в редакторе MATLAB.
edit kalman02.m
Добавьте for
- цикл вокруг кода фильтра.
Перед комментарием
% Predicted state and covariance
for i=1:size(z,2)
После
% Compute the estimated measurements y = H * x_est;
end
Ваш код фильтра должен теперь выглядеть так:
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(:,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));
Красный ошибочный маркер исчезает, и индикатор сообщения анализатора кода в правом верхнем краю кода становится зеленым, который указывает, что вы зафиксировали ошибки и предупреждения, обнаруженные анализатором кода.
Для получения дополнительной информации об использовании анализатора кода смотрите Выполнение Отчета Анализатора кода (MATLAB).
Поменяйте имя функции на kalman03
и сохраните файл как kalman03.m
в текущей папке.
Вы готовы начать следующую задачу в примере, Тестируя Ваш Измененный Алгоритм.
Тестирование Измененного Алгоритма. Используйте тестовый скрипт test03.m
, чтобы протестировать kalman03.m
m. Этот скрипт устанавливает формат кадра на 10
и вычисляет количество кадров во входном параметре в качестве примера. Это затем вызывает Фильтр Калмана и строит график результатов для каждого кадра в свою очередь.
В подсказке команды MATLAB войдите:
test03
Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.
Вы готовы начать следующую задачу в примере, Генерируя код С для Вашего Измененного Алгоритма.
Прежде, чем сгенерировать код С, это - лучшая практика сгенерировать MEX-функцию, которую можно выполнить в среде MATLAB, чтобы протестировать алгоритм и проверку на ошибки времени выполнения.
Генерация кода С для Измененного Алгоритма. Вы используете предоставленный скрипт сборки build03.m
, чтобы сгенерировать код. Единственной разницей между этим скриптом сборки и скриптом для начальной версии фильтра является входной параметр в качестве примера, используемый при компиляции файла. build03.m
указывает, что входной параметр к функции является матрицей, содержащей пять радиус-векторов 2x1
, который соответствует формату кадра 10
.
Сгенерировать код С для kalman03
:
В подсказке команды MATLAB войдите:
build03
MATLAB обрабатывает файл типа "build" и выводит сообщение:
Code generation successful: View report.
Сгенерированный код C находится в work\codegen\lib\kalman03
, где work
является папкой, которая содержит ваши учебные файлы.
Просмотреть сгенерированный код C:
Нажмите просматривают отчет.
Средство просмотра Отчета MATLAB CODER открывает и отображает сгенерированный код, kalman03.c
c.
Сравните сгенерированный код C с кодом С для скалярного Фильтра Калмана. Вы видите, что код почти идентичен за исключением того, что существует теперь for
- цикл для обработки кадра.
Вот некоторые важные моменты о сгенерированном коде C:
Функциональная подпись теперь:
void kalman03(const double z[10], double y[10])
z
и y
является теперь 10
, который соответствует размеру входного параметра в качестве примера z
, (2x5)
раньше компилировал ваш код MATLAB.Фильтрация теперь происходит в for
- цикл. for
- цикл выполняет итерации по всем 5 входным параметрам.
for(i = 0; i < 5; i++) { /* Predicted state and covariance */ ...
Алгоритм, который вы использовали до сих пор в этом примере, подходит для обработки входных данных, который состоит из кадров фиксированного размера. В этой части примера вы тестируете свой алгоритм с входными параметрами переменного размера и видите, что алгоритм подходит для обработки пакетов данных переменного размера. Вы затем изучаете, как сгенерировать код для входного параметра переменного размера.
Используйте тестовый скрипт test04.m
, чтобы протестировать kalman03.m
с входными параметрами переменного размера.
Тестовый скрипт вызывает алгоритм фильтра в цикле, передавая различный входной параметр размера фильтру каждый раз. Каждый раз через цикл, тестовый скрипт вызывает функцию plot_trajectory
для каждого положения во входном параметре.
Чтобы запустить тестовый скрипт, в подсказке команды MATLAB, войдите:
test04
Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.
Вы создали алгоритм, который принимает входные параметры переменного размера. Вы готовы начать следующую задачу в примере, Генерируя код С для Входного параметра Переменного Размера.
Прежде, чем сгенерировать код С, это - лучшая практика сгенерировать MEX-функцию, которую можно выполнить в среде MATLAB, чтобы протестировать алгоритм и проверку на ошибки времени выполнения.
Вы используете предоставленный скрипт сборки build04.m
, чтобы сгенерировать код.
О скрипте сборки
Этот файл типа "build":
Задает верхние границы явным образом для входного параметра переменного размера с помощью объявления coder.typeof(z, [2 N], [0 1])
с опцией -args
на командной строке codegen
. Второй входной параметр, [2 N]
, задает размер, и верхние границы переменного размера вводят z
. Поскольку N=100
, coder.typeof
указывает, что входной параметр к функции является матрицей с двумя размерностями, верхней границей для первой размерности является 2
; верхней границей для второго измерения является 100
. Третий входной параметр задает, какие размерности являются переменными. Значение true
или каждый подразумевает, что соответствующая размерность является переменной; значение false
или нуля означает, что соответствующая размерность фиксируется. Значение [0 1]
указывает, что первая размерность фиксируется, второе измерение, является переменным. Для получения дополнительной информации см. Генерирующийся Код для функций MATLAB с Данными Переменного Размера.
Создает объект cfg
настройки кода и использует его с опцией -config
, чтобы задать параметры генерации кода. Для получения дополнительной информации смотрите coder.config
.
Как сгенерировать код С для входного параметра Переменного Размера
Используйте скрипт сборки build04
, чтобы сгенерировать код С.
build04
Просмотрите сгенерированный код C как прежде.
Вот некоторые важные моменты о сгенерированном коде C:
Сгенерированный код C может обработать входные параметры от 2 x 1
до 2 x 100
. Функциональная подпись теперь:
void kalman01(const double z_data[], const int z_size[2], double y_data[], int y_size[2])
Поскольку y
и z
являются переменным размером, сгенерированный код содержит два данные о каждом из них: данные и фактический размер выборки. Например, для переменного z
, сгенерированный код содержит:
Данные z_data[]
.
z_size[2]
, который содержит фактический размер входных данных. Эта информация отличается каждый раз, когда фильтр называется.
Чтобы максимизировать эффективность, фактический размер входных данных, z_size
используется при вычислении предполагаемого положения. Процессы фильтра только количество выборок, доступных во входном параметре.
for(i = 0; i+1 <= z_size[1]; i++) { /* Predicted state and covariance */ for(k = 0; k < 6; k++) { ...
Поддержите свой код MATLAB, прежде чем вы измените его.
Выберите соглашение о присвоении имен для своих файлов и сохраняйте временные версии часто. Например, этот пример использует суффикс двух-цифры, чтобы дифференцировать различные версии алгоритма фильтра.
Используйте скрипты сборки, чтобы создать ваши файлы.
Используйте тестовые скрипты, чтобы отделиться пред - и последующая обработка от основного алгоритма.
Сгенерируйте MEX-функцию прежде, чем сгенерировать код С. Используйте эту MEX-функцию, чтобы моделировать ваш алгоритм в MATLAB, чтобы подтвердить его операцию и проверку на ошибки времени выполнения.
Используйте опцию -args
, чтобы задать входные параметры в командной строке.
Используйте опцию -report
, чтобы создать отчет генерации кода.
Используйте coder.typeof
, чтобы задать входные параметры переменного размера.
Используйте объект настройки генерации кода (coder.config
), чтобы задать параметры для автономной генерации кода C.
К... | Смотрите... |
---|---|
Смотрите параметры компиляции для | |
Узнать, как интегрировать ваш код MATLAB с моделями Simulink® | Отслеживаемый объект Используя КОД MATLAB (Simulink) |
Узнайте больше об использовании MATLAB для генерации кода | |
Используйте данные переменного размера | |
Ускорьте фиксированную точку код MATLAB | |
Интегрируйте пользовательский код С в код MATLAB и сгенерируйте автономный код | |
Интегрируйте пользовательский код С в функцию MATLAB для генерации кода | |
Сгенерируйте HDL из кода MATLAB |