Применение фильтра Калмана для оценки результатов измерений#
Данные измерений (например, координаты летательного аппарата, данные о погодных условиях среды, окружающей изделие, или параметры актуального технического состояния изделия) всегда содержат погрешности измерений. Погрешности измерений (или зашумленность данных) и неполнота данных затрудняют расчётную оценку актуального технического состояния изделия.
Фильтр Калмана позволяет решать задачи по оценке результатов измерений, содержащих шумы или погрешности, с целью дальнейшего использования результатов измерений в системах управления, а также для расчётов актуального технического состояния изделий на стадии их эксплуатации.
В данном практическом руководстве:
Представлена краткая информация о фильтре Калмана,
Приведено описание основных шагов о реализации фильтра Калмана на платформе REPEAT VISION на примере оценки результатов измерений датчика давления.
1. Фильтр Калмана#
Фильтр Калмана является математическим алгоритмом для моделирования линейных динамических систем, состояние которых изменяется во времени.[1] Состоянием системы может быть температура, давление технологического процесса, координаты наблюдаемого объекта в пространстве и другие измеримые состояния системы.
Представление линейной динамической системы в пространстве состояний выражается уравнением (1).
В уравнении (1) \(\mathbf x_k\) - вектор актуального состояния системы в момент времени \(t_k\), \(\mathbf x_{k-1}\) - вектор предыдущего состояния системы в момент времени \(t_{k-1}\);
\(\mathbf F\) - переходная матрица состояния системы. Матрица \(\mathbf F\) - дискретная и отражает систему линейных уравнений, которые переходят из состояния \(\mathbf x_{k-1}\) в состояние \(\mathbf x_k\) за дискретный шаг времени \(\Delta t\);
\(\mathbf B_k\) - матрица управления, \(\mathbf u_k\) - вектор управляющих воздействий для момента времени \(t_k\);
\(\mathbf w_k\) описывает нормальный случайный шум системы.
Измерения состояния системы описываются уравнением (2).
В уравнении (2) \(\mathbf z_k\) - вектор измерения состояния системы, \(\mathbf H_k\) - матрица измерений, \(\mathbf v_k\) описывает нормальный случайный шум измерений.
Фильтр Калмана требует использования параметров с нормальным законом распределения случайных величин, характеризующих как саму моделируемую систему, так и измерения состояний системы.
Для моделирования нелинейных динамических систем возможно применение следующих модификаций фильтра Калмана:
Расширенный фильтра Калмана (Extended Kalman Filter),
Сигма-точечный фильтра Калмана (Unscented Kalman Filter).
1.1. Ценность фильтра Калмана#
Ценность фильтра Калмана для обработки результатов измерений заключается в снижении дисперсии ошибки (погрешности) состояния системы после выполнения оценки и последующего уточнения состояния системы по результатам выполненных измерений.
Иными словами, дисперсия ошибки состояния системы после оценки и уточнения фильтром Калмана будет ниже дисперсии необработанных измерений.
См. также
Подробное и доступное описание фильтра Калмана, а также его модификаций излагается в бесплатной интерактивной книге Kalman and Bayesian Filters in Python[1]
2. Постановка задачи оценки результатов измерений датчика давления#
Для примера реализации фильтра Калмана выбирается модель датчика избыточного давления, который на основании измеренных величин давления выдаёт электрический сигнал.
Через каждый промежуток времени \(\Delta t = 0.01 [с]\) датчиком давления выдаётся электрический сигнал в виде напряжения в диапазоне \([1 - 5] [В]\). Сигнал датчика содержит погрешность измерения в виде стандартного отклонения \(0.2 [В]\).
Подсказка
Величину погрешности измерения диагностической системы можно найти в паспорте технических характеристик сертифицированного измерительного прибора (датчика).
Исторические значения электрического сигнала датчика давления приведены на графике ниже. График содержит изменения электрического сигнала от 1 до 5 \([В]\) на временном интервале \([1 - 5] [с]\).
Исторические значения электрического сигнала датчика давления#
При рассмотрении временного интервала \([1 - 2] [с]\) заметно влияние погрешностей измерений со стандартным отклонением \(0.2 [В]\).
В рамках данного раздела демонстрационная модель датчика давления реализована по принципиальной схеме без детальной проработки особенностей датчика давления.
Для практического ознакомления с порядком реализации фильтра Калмана на платформе REPEAT VISION требуется настроить элементы фильтра Калмана для обработки результатов измерений датчика давления.
3. Описание математической модели#
Для реализации фильтра Калмана требуется подготовить матрицы уравнений (1) и (2). В данном разделе приводится описание шагов подготовки необходимых матриц.
Для описания исторических значений электрического сигнала вектор состояния системы должен включать:
Значение напряжения \(\mathbf х\),
Первую производную значения сигнала по времени \(\mathbf v\) (скорость изменения значения)
Значение актуального состояния системы в момент времени \(t_k\) связаны с предыдущим состоянием системы в момент времени \(t_{k-1}\) по зависимости (3).
3.1. Переходная матрица состояния системы#
На первом и главном шаге реализации фильтра Калмана для решения обозначенной выше задачи требуется подготовить переходную матрицу состояния системы \(\mathbf F\) для уравнения (1).
Переходная матрица состояния системы на основании уравнения (3) выглядит следующим образом.
В результате первого шага уравнение (1) будет выглядеть следующим образом.
3.2. Нормальный случайный шум системы#
На втором шаге требуется описать \(\mathbf w_k\) нормальный случайный шум системы для шага измерений \(\Delta t = 0.01 [с]\). Матрица \(\mathbf Q\) нормального случайного дискретного шума системы задаётся уравнением (5).
В уравнении (5) \(N(0, \mathbf Q)\) - нормальное распределение \(\mathbf Q\) с математическим ожиданием, равным 0; \(\sigma_{w}\) - стандартное отклонение случайного шума системы.
В результате второго шага уравнение (1) будет выглядеть следующим образом.
3.3. Матрица управления#
В рамках постановки текущей задачи не требуется описывать матрицу управления \(\mathbf B_k\), поскольку система не предполагает управляющих воздействий.
3.4. Матрица измерений#
На третьем шаге требуется сформировать \(\mathbf H_k\) матрицу измерений.
В соответствии с постановкой задачи измеряется только значение электрического сигнала напряжения \(\mathbf х\), скорость изменения сигнала \(\mathbf v\) не измеряется, поэтому матрица измерений имеет вид (6).
3.5. Нормальный случайный шум измерений#
На четвёртом шаге требуется описать \(\mathbf v_k\) нормальный случайный шум измерений.
В матрице нормального случайного шума указываются дисперсии случайных величин измерений. Для ранее подготовленной матрицы измерений (6) нормальный случайный шум измерений имеет вид (7).
В уравнении (7) \(N(0, \mathbf R)\) - нормальное распределение \(\mathbf R\) с математическим ожиданием, равным 0. В матрице \(\mathbf R\) \(0.2 [В]\) - стандартное отклонение случайной величины измерений.
После формального описания необходимых матриц фильтра Калмана необходимо реализовать алгоритм на платформе REPEAT VISION.
4. Реализация фильтра Калмана на платформе REPEAT VISION#
В соответствии с уравнением (1) алгоритм фильтра Калмана для оценки актуального состояния системы требует наличия измерений предыдущего состояния системы.
Для реализации фильтра Калмана на платформе REPEAT VISION необходимо воспользоваться блоком Jython. Блок позволяет описать алгоритм на языке программирования Python с использованием библиотеки Apache Commons Math, которая содержит готовое исполнение фильтра Калмана.[2]
4.1. Обзор демонстрационного проекта в приложении REPEAT VISION#
В наборе демонстрационных проектов приложения REPEAT VISION доступен пример использования фильтра Калмана для оценки результатов измерений. Далее выполним анализ данного примера, который нам поможет описать все необходимые шаги по реализации фильтра Калмана на платформе REPEAT VISION.
В приложении REPEAT VISION добавьте себе проект [DEMO] Применение фильтра Калмана для оценки результатов измерений из папки Демо проекты и откройте его для последующего выполнения обзора.
Проект с примером использования фильтра Калмана для оценки результатов измерений#
Проект содержит два блока (Датчик и Фильтр Калмана), а также связанные с этими блоками глобальные переменные, которые упрощают процесс настройки необходимых параметров блоков.
Блок Датчик предназначен для формирования исторических значений электрического сигнала датчика давления в соответствии с графиком выше. Значения электрического сигнала формируются на выходном порте signal блока. Также данный блок формирует на выходном порте theoretical_value значения напряжения, не содержащие погрешности измерения, для удобства дальнейшего выполнения анализа результатов моделирования.
Проект содержит набор глобальных переменных в соответствии с таблицей ниже.
Имя переменной |
Значение переменной |
Назначение |
|---|---|---|
SENSOR_MEASURE_ERROR |
0.2 |
Стандартное отклонение случайной величины измерений для блока Jython. |
PROCESS_NOISE |
30 |
Стандартное отклонение случайного шума системы \(\sigma_{w}\) для уравнения (5) |
Далее приступим к обзору алгоритма фильтра Калмана в блоке Jython (№2 на рисунке выше).
4.2. Обзор кода программы в блоке Jython#
Для обзора алгоритма фильтра Калмана требуется в свойствах блока Jython нажать на кнопку Редактировать код блока.
Добавлено в версии 3.0.0: Блок Jython получил возможность разделения программы блока на три этапа процесса моделирования.
Инициализация - код данного этапа выполняется для подготовки к процессу расчёта. На данном этапе необходимо выполнить импорт необходимых библиотек и создать объекты, у которых требуется сохранять состояние между выполнением шагов интегрирования в процессе расчёта;
Код расчёта - код данного этапа выполняется на каждом шаге интегрирования от начала до остановки расчёта. Этап выполняется после инициализации;
Завершение - код данного этапа выполняется при остановке расчёта.
Далее в текстовом редакторе кода блока Jython требуется перейти на вкладку Инициализация для анализа кода подготовки и настройки алгоритма фильтра Калмана.
На этапе инициализации выполняется импорт необходимых классов из библиотеки Apache Commons Math.
1"""
2Jython скрипт предназначен для настройки фильтра Калмана
3на платформе REPEAT VISION с использованием библиотеки Apache Commons Math.
4
5Скрипт должен выполняться на этапе подготовки к процессу выполнения расчёта
6"""
7from org.apache.commons.math3.linear import Array2DRowRealMatrix, ArrayRealVector
8from org.apache.commons.math3.filter import DefaultProcessModel, DefaultMeasurementModel
9from org.apache.commons.math3.filter import KalmanFilter
Строки 1, 6. Краткое описание назначения и особенностей реализации программы;
Строка 7. Импорт необходимых структур данных из модуля линейной алгебры библиотеки Apache Commons Math. Матрица
Array2DRowRealMatrixи векторArrayRealVectorвещественных значений будут использоваться далее для настройки классов фильтра Калмана;Строки 8, 9. Импорт классов для настройки фильтра Калмана. Класс
DefaultProcessModelпозволит настроить матрицы фильтра Калмана в части уравнения (1). КлассDefaultMeasurementModel- в части уравнения (2). КлассKalmanFilterна основании настроенных матриц позволит вычислять состояние динамической системы на основе алгоритма фильтра Калмана.
Обзор функции для настройки фильтра Калмана#
На следующем шаге этапа инициализации необходимо рассмотреть функцию, которая выполняет настройку фильтра Калмана.
11def get_kalman_filter(dt, measure_noise_std, process_noise_std):
12 """
13 Возвращает фильтр Калмана для оценки состояния динамической системы
14 на основании измерения значения сигнала.
15 Данный фильтр Калмана учитывает первую производной состояния системы.
16 Данная реализация фильтра Калмана подходит для описания следующих процессов:
17
18 - Измерение одного параметра физического процесса;
19 - Движение объекта вдоль одного направления координат.
20
21 Parameters
22 ----------
23 dt : float
24 Временной шаг изменения состояния системы.
25 measure_noise_std : float
26 Стандартное отклонение случайной величины измерений.
27 process_noise_std : float
28 Стандартное отклонение случайного шума системы.
29
30 Returns
31 -------
32 kf : KalmanFilter
33 Объект фильтра Калмана
34 """
35
36 trans_m = Array2DRowRealMatrix([
37 [1., dt], # x = x_{k-1} + v*dt
38 [0, 1.] # v = v
39 ])
40 measure_m = Array2DRowRealMatrix([
41 [1., 0] # измерение только значения сигнала
42 ])
Строки 12, 34. Описание задачи, выполняемой функцией
get_kalman_filter, а также описание аргументов функции и возвращаемого результата;Строки 36, 39. Создание переходной матрицы состояния системы в соответствии с (4);
Строки 40, 42. Создание матрицы измерений в соответствии с (6).
43 measure_noise_m = Array2DRowRealMatrix(
44 [measure_noise_std**2]
45 )
46 pocess_noise_m = Array2DRowRealMatrix([
47 [dt**4 / 4, dt**3 / 2],
48 [dt**3 / 2, dt**2]
49 ]).scalarMultiply(process_noise_std**2)
50 initial_values = ArrayRealVector([1., 0])
51 initial_error_cov = Array2DRowRealMatrix([
52 [1, 1],
53 [1, 1]
54 ])
Строки 43, 45. Создание матрицы нормального случайного шума измерений в соответствии с (7);
Строки 46, 49. Создание матрицы нормального случайного дискретного шума системы в соответствии с (5);
Строка 50. Создание начальных значений измерения сигнала и скорости изменения сигнала;
Строки 51, 54. Создание начальных значений для ковариационной матрицы
initialErrorCovarianceклассаDefaultProcessModel.
55 process_model = DefaultProcessModel(
56 trans_m, # Переходная матрица состояния системы
57 None, # Матрица управления
58 pocess_noise_m, # Матрица нормального случайного дискретного шума системы
59 initial_values, # Начальные значения измерения сигнала
60 initial_error_cov # Начальные значения initialErrorCovariance
61 )
62 measure_model = DefaultMeasurementModel(
63 measure_m, # Матрица измерений
64 measure_noise_m # Матрица нормального случайного шума измерений
65 )
66 kf = KalmanFilter(process_model, measure_model)
67
68 return kf
Строки 55, 61. Создаётся экземпляр класса
DefaultProcessModelс настройками матриц уравнения (1);Строки 62, 65. Создаётся экземпляр класса
DefaultMeasurementModelс настройками матриц уравнения (2);Строки 66, 68. Создаётся, настраивается и возвращается из функции экземпляр класса
KalmanFilter.
Функцию необходимо использовать в скрипте блока Jython на этапе инициализации для получения настроенного экземпляра фильтра Калмана.
Инициализация фильтра Калмана#
Ниже приведено описание кода программы на этапе инициализации фильтра Калмана.
70dt = 0.01
71measure_noise_std = SENSOR_MEASURE_ERROR
72process_noise_std = PROCESS_NOISE
73
74sensor_kf = get_kalman_filter(dt, measure_noise_std, process_noise_std)
Строка 70. Создаётся параметр
dtвременного шага изменения состояния системы в соответствии постановкой задачи;
Добавлено в версии 2.6.0: Пользовательские программы Jython блоков получили возможность применения глобальных переменных проекта. Пример использования данной возможности приведён на строках программы 71-72.
Строки 71, 72. Создаются следующие параметры: стандартное отклонение случайных величин измерения, стандартное отклонение случайного шума системы. Значения параметров назначаются из ранее созданных глобальных переменных проекта;
Строка 74. Создаётся и настраивается экземпляр класса
KalmanFilterфильтра Калмана в соответствии с описанием функции get_kalman_filter.
Весь код программы этапа инициализации#
На этапе инициализации выполняется код, приведённый ниже.
1"""
2Jython cкрипт предназначен для настройки фильтра Калмана
3на платформе REPEAT VISION с использованием библиотеки Apache Commons Math.
4
5Скрипт должен выполняться на этапе подготовки к процессу выполнения расчёта
6"""
7from org.apache.commons.math3.linear import Array2DRowRealMatrix, ArrayRealVector
8from org.apache.commons.math3.filter import DefaultProcessModel, DefaultMeasurementModel
9from org.apache.commons.math3.filter import KalmanFilter
10
11def get_kalman_filter(dt, measure_noise_std, process_noise_std):
12 """
13 Возвращает фильтр Калмана для оценки состояния динамической системы
14 на основании измерения значения сигнала.
15 Данный фильтр Калмана учитывает первую производной состояния системы.
16 Данная реализация фильтра Калмана подходит для описания следующих процессов:
17
18 - Измерение одного параметра физического процесса;
19 - Движение объекта вдоль одного направления координат.
20
21 Parameters
22 ----------
23 dt : float
24 Временной шаг изменения состояния системы.
25 measure_noise_std : float
26 Стандартное отклонение случайной величины измерений.
27 process_noise_std : float
28 Стандартное отклонение случайного шума системы.
29
30 Returns
31 -------
32 kf : KalmanFilter
33 Объект фильтра Калмана
34 """
35
36 trans_m = Array2DRowRealMatrix([
37 [1., dt], # x = x_{k-1} + v*dt
38 [0, 1.] # v = v
39 ])
40 measure_m = Array2DRowRealMatrix([
41 [1., 0] # измерение только значения сигнала
42 ])
43 measure_noise_m = Array2DRowRealMatrix(
44 [measure_noise_std**2]
45 )
46 pocess_noise_m = Array2DRowRealMatrix([
47 [dt**4 / 4, dt**3 / 2],
48 [dt**3 / 2, dt**2]
49 ]).scalarMultiply(process_noise_std**2)
50 initial_values = ArrayRealVector([1., 0])
51 initial_error_cov = Array2DRowRealMatrix([
52 [1, 1],
53 [1, 1]
54 ])
55 process_model = DefaultProcessModel(
56 trans_m, # Переходная матрица состояния системы
57 None, # Матрица управления
58 pocess_noise_m, # Матрица нормального случайного дискретного шума системы
59 initial_values, # Начальные значения измерения сигнала
60 initial_error_cov # Начальные значения initialErrorCovariance
61 )
62 measure_model = DefaultMeasurementModel(
63 measure_m, # Матрица измерений
64 measure_noise_m # Матрица нормального случайного шума измерений
65 )
66 kf = KalmanFilter(process_model, measure_model)
67
68 return kf
69
70dt = 0.01
71measure_noise_std = SENSOR_MEASURE_ERROR
72process_noise_std = PROCESS_NOISE
73
74sensor_kf = get_kalman_filter(dt, measure_noise_std, process_noise_std)
75
Объект sensor_kf, экземпляр класса KalmanFilter, будет сохранять своё состояние между шагами интегрирования в процессе выполнения расчёта, код которого создаётся на следующем этапе, рассматриваемый в разделе ниже.
Обзор кода расчёта#
Далее в текстовом редакторе кода блока Jython требуется перейти на вкладку Кода расчёта для анализа программы которая выполняется на каждом шаге интегрирования с начального времени моделирования и до остановки расчёта.
Важно
Объекты, созданные в рамках кода расчёта не сохраняют своего состояния после завершения шага интегрирования.
Если вашим объектам необходимо сохранять состояние между шагами интегрирования, то их необходимо создавать и настраивать на этапе инициализации, а затем использовать в коде расчёта.
После инициализации всех необходимых данных, требуется выполнить программу работы фильтра Калмана по оценке состояния системы на основе набора измеренных значений состояния системы. Порядок работы должен включать:
Оценку состояния системы, которая выполняется методом
.predict()экземпляра классаKalmanFilter, который присвоен объекту с именемsensor_kfв коде ниже;Уточнение состояния системы, которая выполняется методом
.correct()экземпляра классаKalmanFilter.
После каждого этапа выполнения оценки состояния системы возвращаются значения оценки состояния системы методом .getStateEstimation() экземпляра класса KalmanFilter.
1"""
2Jython cкрипт предназначен для применения фильтра Калмана
3в процессе выполнения расчёта.
4"""
5
6current_measure = in_1
7sensor_kf.predict()
8before_update = sensor_kf.getStateEstimation()
9sensor_kf.correct(
10 ArrayRealVector([current_measure])
11)
12after_update = sensor_kf.getStateEstimation()
13out_1 = before_update[0]
14out_2 = after_update[0]
После работы фильтра Калмана формируются результаты оценки состояния системы, которые передаются в выходные порты Jython блока:
В порт
out_1передаётся значение оценки сигнала;В порт
out_2передаётся значение оценки сигнала после уточнения состояния системы на основании текущего измерения на момент времени \(t_k\).
13out_1 = before_update[0]
14out_2 = after_update[0]
4.3. Результаты работы фильтра Калмана по оценке измерений#
Выполните запуск проекта на расчёт и создайте новый график на панели Визуализация.
На график добавьте параметры в соответствии с таблицей ниже.
Параметр |
Описание |
|---|---|
Проект [1] - signal |
Исторические значения электрического сигнала датчика давления в соответствии с постановкой задачи |
Проект [1] - theoretical_value |
Значения напряжения, не содержащие погрешности измерения |
Jython [2] - out_1 |
Значения оценки сигнала фильтром Калмана из порта |
Jython [2] - out_2 |
Значения оценки сигнала после уточнения состояния системы из порта |
Далее необходимо выполнить анализ работы фильтра Калмана.
На первом этапе анализа работы фильтра Калмана необходимо рассмотреть, в целом, все исторические значения измерений и соответствующие им оценки состояния системы фильтра Калмана.
Результаты оценки измерений фильтром Калмана.#
На графике выше приняты следующие обозначения.
Линии, метки |
Описание |
|---|---|
Синие метки |
Исторические значения электрического сигнала датчика давления |
Зелёная линия |
Оценка состояния системы фильтром Калмана |
Далее требуется рассмотреть оценку фильтра Калмана на временном диапазоне \([0.2 - 1] [c]\) с плавным возрастанием значений электрического сигнала.
Результаты оценки измерений фильтром Калмана на временном диапазоне [0.2 - 1] [с].#
На графике выше приняты следующие обозначения.
Линии, метки |
Описание |
|---|---|
Синие метки |
Исторические значения электрического сигнала датчика давления |
Оранжевая пунктирная линия |
Теоретические значения |
Зелёная линия |
Оценка состояния системы фильтром Калмана с последующим уточнением состояния |
На диапазоне \([0.2 - 1] [c]\) видна близость оценочных значений фильтра Калмана измерениям сигнала особенно после выполнения уточнения состояния системы (зелёная линия).
На следующем этапе необходимо рассмотреть оценку состояния системы фильтром Калмана в диапазоне \([0.9 - 1.4] [c]\), когда измерения переходят от плавно возрастающих значений к постоянным значениям (с учётом стандартного отклонения случайных величин) измерений.
Результаты оценки измерений фильтром Калмана на временном диапазоне [0.9 - 1.4] [с].#
Необходимо отметить, что фильтру Калмана требуется определённое время на возможность оценки последующего состояния с постоянными значениями измерений.
Подсказка
Если в данной области требуется более точная оценка состояния системы, то в настройке фильтра Калмана необходимо учитывать матрицу управления \(\mathbf B_k\), а в цикле работы фильтра Калмана необходимо включать вектор управляющих воздействий \(\mathbf u_k\).
На графике ниже также хорошо видно, что в момент времени \(t = 3.1 [с]\) выполнена оценка состояния системы с близким состоянием к измеренным значениям.
Результаты оценки измерений фильтром Калмана на временном диапазоне [2.7 - 3.5] [с].#
Совет
Для адаптации фильтра Калмана на актуальные исторические данные результатов измерений рекомендуется варьировать стандартным отклонением случайного шума системы (PROCESS_NOISE в наборе глобальных переменных примера использования фильтра Калмана на платформе REPEAT VISION)
5. Выводы#
В рамках данного практического руководства вам удалось освоить процесс реализации фильтра Калмана на платформе REPEAT VISION с применением блока Jython.
Фильтр Калмана:
с одной стороны, является гибким инструментом для оценки состояния динамических систем на основе результатов измерений, позволяющий работать с зашумленными данными;
с другой стороны, от инженера требуется понимание физики процессов, происходящих в системе, и возможность формального описания процессов в математическом аппарате фильтра Калмана.
Платформа REPEAT VISION предоставляет инженерам необходимый набор инструментов для реализации фильтра Калмана, а также для его применения в междисциплинарных моделях отраслевых систем.