Код C/C + + можно создать из кода MATLAB ®, который используетextendedKalmanFilter, unscentedKalmanFilter и particleFilter объекты для оценки состояния в режиме онлайн. Код C/C + + генерируется с помощью codegen (Кодер MATLAB) из программного обеспечения 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). Включить директиву компиляции%#codegen в этих функциях, чтобы указать, что предполагается создать код для функции. Добавление этой директивы дает команду анализатору кода MATLAB помочь в диагностике и устранении нарушений, которые могут привести к ошибкам при создании кода. В качестве примера введите vdpStateFcn.m в командной строке.
Создание кода C/C + + и MEX-файлов с помощью codegen (Кодер MATLAB) из программного обеспечения кодера MATLAB.
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) в документации кодера MATLAB.
| Тип свойства | Расширенный объект фильтра Калмана | Незараженный объект фильтра Калмана | Объект фильтра частиц |
|---|---|---|---|
| Настраиваемые свойства, которые можно указать несколько раз либо во время построения объекта, либо после этого с помощью точечной нотации | 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