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

Можно сгенерировать код C/C++ из кода MATLAB®, который использует extendedKalmanFilter, unscentedKalmanFilter и объекты particleFilter для онлайновой оценки состояния. Код C/C++ сгенерирован с помощью команды codegen из программного обеспечения 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.

    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.

Настраиваемые и ненастраиваемые свойства объектов

Тип свойстваРасширенный объект фильтра КалманаОбъект сигма-точечного фильтра КалманаОбъект фильтра частиц
Настраиваемые свойства, которые можно задать многократно или во время объектной конструкции, или позже использующий запись через точкуState, StateCovariance, ProcessNoise и MeasurementNoiseState, StateCovariance, ProcessNoise, MeasurementNoise, Alpha, Beta и Kappa Particles и Weights
Ненастраиваемые свойства, которые можно задать только однажды, или во время объектной конструкции, или позже использующий запись через точку, но перед использованием команд correct или predictStateTransitionFcn, MeasurementFcn, StateTransitionJacobianFcn и MeasurementJacobianFcnStateTransitionFcn и MeasurementFcnStateTransitionFcn, MeasurementLikelihoodFcn, StateEstimationMethod, StateOrientation, ResamplingPolicy и ResamplingMethod
Ненастраиваемые свойства, которые необходимо задать во время объектной конструкцииHasAdditiveProcessNoise и HasAdditiveMeasurementNoiseHasAdditiveProcessNoise и HasAdditiveMeasurementNoise 

Смотрите также

| |

Похожие темы