Сгенерируйте код для онлайн-оценки состояния в MATLAB

Вы можете сгенерировать код C/C + + из MATLAB® код, который использует extendedKalmanFilter, unscentedKalmanFilter и particleFilter объекты для оценки состояния в режиме онлайн. Код C/C + + генерируется с помощью codegen (MATLAB Coder) из программного обеспечения MATLAB Coder™. Используйте сгенерированный код для развертывания алгоритмов оценки в целевой процессор. Можно также развернуть онлайн- код оценки путем создания автономного приложения с помощью программного обеспечения MATLAB Compiler™.

Чтобы сгенерировать код C/C + + для онлайн-оценки состояния:

  1. Создайте функцию, чтобы объявить объект фильтра постоянным и инициализировать объект. Объект определяется как постоянный для поддержания состояний объекта между вызовами.

    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 в командной строке.

  2. Сгенерируйте код 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)}
  3. Используйте сгенерированный код.

    • Используйте сгенерированный код 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, и MeasurementNoiseState, StateCovariance, ProcessNoise, MeasurementNoise, Alpha, Beta, и Kappa Particles и Weights
Нетронутые свойства, которые можно задать только один раз, либо во время конструкции объекта, либо после с использованием записи через точку, но перед использованием predict или correct командыStateTransitionFcn, MeasurementFcn, StateTransitionJacobianFcn, и MeasurementJacobianFcnStateTransitionFcn и MeasurementFcnStateTransitionFcn, MeasurementLikelihoodFcn, StateEstimationMethod, StateOrientation, ResamplingPolicy и ResamplingMethod
Нетронутые свойства, которые вы должны задать во время конструкции объектаHasAdditiveProcessNoise и HasAdditiveMeasurementNoiseHasAdditiveProcessNoise и HasAdditiveMeasurementNoise 

См. также

| |

Похожие темы