Можно сгенерировать код 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