Вы можете сгенерировать код C/C + + из MATLAB® код, который использует extendedKalmanFilter
, unscentedKalmanFilter
и particleFilter
объекты для оценки состояния в режиме онлайн. Код C/C + + генерируется с помощью codegen
(MATLAB Coder) из программного обеспечения MATLAB Coder™. Используйте сгенерированный код для развертывания алгоритмов оценки в целевой процессор. Можно также развернуть онлайн- код оценки путем создания автономного приложения с помощью программного обеспечения MATLAB Compiler™.
Чтобы сгенерировать код C/C + + для онлайн-оценки состояния:
Создайте функцию, чтобы объявить объект фильтра постоянным и инициализировать объект. Объект определяется как постоянный для поддержания состояний объекта между вызовами.
function [CorrectedX] = ukfcodegen(output) % Declare object as persistent. persistent obj; if isempty(obj) % Initialize the object. obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[2;0]); obj.MeasurementNoise = 0.01; end % Estimate the states. CorrectedX = correct(obj,output); predict(obj); end
Функция создает объект сигма-точечного фильтра Калмана для онлайн-оценки состояния осциллятора Ван дер Поля с двумя состояниями и одним выходом. Вы используете ранее написанные и сохраненные функции перехода и измерения, vdpStateFcn.m
и vdpMeasurementFcn.m
, и задайте начальные значения состояния для двух состояний следующим [2;0]
. Вот output
- измеренные выходные данные. Сохраните ukfcodegen.m
функция в пути MATLAB. Также можно задать полное имя пути для этой функции.
В ukfcodegen.m
функция, постоянный объект инициализируется условием if isempty(obj)
чтобы убедиться, что объект инициализирован только один раз, когда функция вызывается первый раз. Последующие вызовы функции выполняют только predict
и correct
команды для обновления оценок состояния. Во время инициализации вы задаете нетронутые свойства объекта, такие как StateTransitionFcn
(указано в ukfcodegen.m
как vdpStateFcn.m
) и MeasurementFcn
(указано в ukfcodegen.m
как vdpMeasurementFcn.m
). После этого можно задать только настраиваемые свойства. Для получения дополнительной информации см. Раздел «Настраиваемые и нетронутые свойства объекта».
В функциях перехода и измерения состояния вы должны использовать только команды, которые поддерживаются для генерации кода. Список этих команд см. в разделах Функции и Объекты, поддерживаемые для генерации кода C/C + + (MATLAB Coder). Включите директиву
компиляции %#codegen
в этих функциях, чтобы указать, что вы намерены сгенерировать код для функции. Добавление этой директивы предписывает анализатору кода MATLAB помочь вам диагностировать и исправить нарушения, которые могут привести к ошибкам во время генерации кода. Для примера введите vdpStateFcn.m
в командной строке.
Сгенерируйте код C/C + + и файлы MEX с помощью codegen
(MATLAB Coder) из программного обеспечения MATLAB Coder.
codegen ukfcodegen -args {1}
Синтаксис -args {1}
задает пример аргумента для вашей функции. Аргумент устанавливает размерности и типы данных аргумента функции output
как скаляр двойной точности.
Примечание
Если вам нужен фильтр с переменными с одной точностью с плавающей точностью, необходимо задать начальное значение состояний как одинарную точность во время конструкции объекта.
obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,single([2;0]))
Затем для генерации кода используйте следующий синтаксис.
codegen ukfcodegen -args {{single(1)}
Используйте сгенерированный код.
Используйте сгенерированный код C/C + +, чтобы развернуть оценку состояния в режиме онлайн на целевом процессоре.
Используйте сгенерированный файл MEX для проверки скомпилированного кода C/C + + в MATLAB. Сгенерированный файл MEX также полезен для ускорения симуляций алгоритмов оценки состояния в MATLAB.
Загрузите данные оценки. Предположим, что ваши выходные данные хранятся в measured_data.mat
файл.
load measured_data.mat output
Оцените состояния путем вызова сгенерированного файла MEX.
for i = 1:numel(output) XCorrected = ukfcodegen_mex(output(i)); end
Этот пример генерирует код C/C + + для компиляции файла MEX. Чтобы сгенерировать код для других целей, см.codegen
(MATLAB Coder) в документации MATLAB Coder.
Тип свойства | Расширенный объект фильтра Калмана | Сигма-точечный фильтр Калмана | Объект фильтра частиц |
---|---|---|---|
Настраиваемые свойства, которые можно задавать несколько раз или во время конструкции объекта, или после с помощью записи через точку | State , StateCovariance , ProcessNoise , и MeasurementNoise | State , StateCovariance , ProcessNoise , MeasurementNoise , Alpha , Beta , и Kappa |
Particles и Weights |
Нетронутые свойства, которые можно задать только один раз, либо во время конструкции объекта, либо после с использованием записи через точку, но перед использованием predict или correct команды | StateTransitionFcn , MeasurementFcn , StateTransitionJacobianFcn , и MeasurementJacobianFcn | StateTransitionFcn и MeasurementFcn | StateTransitionFcn , MeasurementLikelihoodFcn , StateEstimationMethod , StateOrientation , ResamplingPolicy и ResamplingMethod |
Нетронутые свойства, которые вы должны задать во время конструкции объекта | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise |
extendedKalmanFilter
| particleFilter
| unscentedKalmanFilter