Можно сгенерировать код C/C++ из кода MATLAB®, который использует extendedKalmanFilter
, unscentedKalmanFilter
и объекты particleFilter
для онлайновой оценки состояния. Код C/C++ сгенерирован с помощью команды codegen
из программного обеспечения 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.
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.
Тип свойства | Расширенный объект фильтра Калмана | Объект сигма-точечного фильтра Калмана | Объект фильтра частиц |
---|---|---|---|
Настраиваемые свойства, которые можно задать многократно или во время объектной конструкции, или позже использующий запись через точку | State , StateCovariance , ProcessNoise и MeasurementNoise | State , StateCovariance , ProcessNoise , MeasurementNoise , Alpha , Beta и Kappa |
Particles и Weights |
Ненастраиваемые свойства, которые можно задать только однажды, или во время объектной конструкции, или позже использующий запись через точку, но перед использованием команд correct или predict | StateTransitionFcn , MeasurementFcn , StateTransitionJacobianFcn и MeasurementJacobianFcn | StateTransitionFcn и MeasurementFcn | StateTransitionFcn , MeasurementLikelihoodFcn , StateEstimationMethod , StateOrientation , ResamplingPolicy и ResamplingMethod |
Ненастраиваемые свойства, которые необходимо задать во время объектной конструкции | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise |
extendedKalmanFilter
| particleFilter
| unscentedKalmanFilter