Можно сгенерировать код 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 |
Ненастраиваемые свойства, которые можно задать только однажды, или во время объектной конструкции, или позже использующий запись через точку, но перед использованием predict или correct команды | StateTransitionFcn , MeasurementFcn , StateTransitionJacobianFcn , и MeasurementJacobianFcn | StateTransitionFcn и MeasurementFcn | StateTransitionFcn , MeasurementLikelihoodFcn , StateEstimationMethod , StateOrientation , ResamplingPolicy и ResamplingMethod |
Ненастраиваемые свойства, которые необходимо задать во время объектной конструкции | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise | HasAdditiveProcessNoise и HasAdditiveMeasurementNoise |
extendedKalmanFilter
| particleFilter
| unscentedKalmanFilter