基于温度匀速变化的扩展卡尔曼滤波器(EKF),可用与pt100 ni100 cu100 ntc 等电阻型的温度传感器。 1.全部采用公式计算,不需要储存表格 2.通过一阶泰勒公式展开,处理非线性问题

在温度测量领域,pt100、ni100、cu100、ntc 等电阻型温度传感器应用广泛。但由于实际情况中温度变化的复杂性以及传感器自身的特性,准确测量温度并非易事。基于温度匀速变化假设的扩展卡尔曼滤波器(EKF)能有效地对测量数据进行处理,提高温度测量的精度。

一、EKF 基本原理

扩展卡尔曼滤波器主要用于处理非线性系统的状态估计问题。对于非线性系统,状态方程一般可表示为:

\[

\mathbf{x}{k} = f(\mathbf{x}{k - 1}, \mathbf{u}{k - 1}) + \mathbf{w}{k - 1}

\]

测量方程为:

\[

\mathbf{z}{k} = h(\mathbf{x}{k}) + \mathbf{v}_{k}

\]

其中,\(\mathbf{x}{k}\) 是 \(k\) 时刻的系统状态,\(\mathbf{u}{k - 1}\) 是 \(k - 1\) 时刻的控制输入(在温度匀速变化场景中,我们可简单假设没有外部控制输入,即 \(\mathbf{u}{k - 1} = 0\)),\(\mathbf{w}{k - 1}\) 是过程噪声,\(\mathbf{z}{k}\) 是 \(k\) 时刻的测量值,\(h(\cdot)\) 是测量函数,\(\mathbf{v}{k}\) 是测量噪声。

二、针对电阻型温度传感器的应用

(一)温度与电阻关系

以 pt100 为例,其电阻与温度的关系近似为:

\[

RT = R0(1 + A T + B T^2)

\]

其中 \(RT\) 是温度 \(T\) 时的电阻值,\(R0\) 是参考温度(通常为 0℃)时的电阻值,\(A\) 和 \(B\) 是常量。这就是我们要处理的非线性关系。

(二)基于一阶泰勒公式展开处理非线性

为了能用卡尔曼滤波器处理这个非线性问题,我们利用一阶泰勒公式对 \(f(\cdot)\) 和 \(h(\cdot)\) 进行线性化。

基于温度匀速变化的扩展卡尔曼滤波器(EKF),可用与pt100 ni100 cu100 ntc 等电阻型的温度传感器。 1.全部采用公式计算,不需要储存表格 2.通过一阶泰勒公式展开,处理非线性问题

假设我们的状态变量 \(\mathbf{x} = [T]\)(即温度),预测状态方程为:

\[

\hat{\mathbf{x}}{k|k - 1} = \hat{\mathbf{x}}{k - 1|k - 1} + \Delta t \cdot \dot{T}

\]

这里假设温度是匀速变化的,\(\Delta t\) 是时间间隔,\(\dot{T}\) 是温度变化率。

测量方程 \(h(\mathbf{x}{k})\) 关于 \(\mathbf{x}{k}\) 的雅可比矩阵 \(H_k\) 为:

\[

Hk = \left.\frac{\partial h(\mathbf{x})}{\partial \mathbf{x}}\right|{\mathbf{x}=\hat{\mathbf{x}}_{k|k - 1}}

\]

对于 \(RT = R0(1 + A T + B T^2)\),对 \(T\) 求导得:

\[

\frac{\partial RT}{\partial T} = R0(A + 2BT)

\]

这就是 \(Hk\) 的值(在当前估计温度 \(\hat{T}{k|k - 1}\) 处求值)。

(三)代码实现

下面是一个简单的 Python 代码示例,展示如何在模拟数据上应用基于温度匀速变化假设的 EKF:

import numpy as np
import matplotlib.pyplot as plt


# 定义过程噪声协方差
Q = np.array([[0.01]])
# 定义测量噪声协方差
R = np.array([[1]])


# 状态转移函数
def f(x, dt):
    return x + dt * 0.1  # 假设温度变化率为 0.1℃/s


# 测量函数
def h(x):
    return 100 * (1 + 3.9083e - 3 * x - 5.775e - 7 * x ** 2)  # pt100 电阻 - 温度关系


# 测量函数的雅可比矩阵
def H(x):
    return 100 * (3.9083e - 3 - 2 * 5.775e - 7 * x)


# 初始状态
x_hat = np.array([[0]])  # 初始温度估计
P = np.array([[1]])  # 初始估计协方差
dt = 1  # 时间间隔

# 模拟测量数据
num_steps = 100
true_temperatures = np.zeros(num_steps)
measurements = np.zeros(num_steps)
estimated_temperatures = np.zeros(num_steps)

for k in range(num_steps):
    # 生成真实温度
    true_temperatures[k] = f(true_temperatures[k - 1] if k > 0 else 0, dt)
    # 生成测量值
    measurements[k] = h(true_temperatures[k]) + np.random.normal(0, np.sqrt(R))
    # 预测步骤
    x_hat_minus = f(x_hat, dt)
    P_minus = P + Q
    # 更新步骤
    K = P_minus.dot(H(x_hat_minus).T).dot(np.linalg.inv(H(x_hat_minus).dot(P_minus).dot(H(x_hat_minus).T) + R))
    x_hat = x_hat_minus + K.dot(measurements[k] - h(x_hat_minus))
    P = (np.eye(1) - K.dot(H(x_hat_minus))).dot(P_minus)
    estimated_temperatures[k] = x_hat[0, 0]


# 绘图
plt.plot(range(num_steps), true_temperatures, label='True Temperature')
plt.plot(range(num_steps), measurements, label='Measurements')
plt.plot(range(num_steps), estimated_temperatures, label='Estimated Temperature')
plt.legend()
plt.xlabel('Time step')
plt.ylabel('Temperature (℃)')
plt.show()

代码分析

  1. 参数定义:定义了过程噪声协方差 \(Q\) 和测量噪声协方差 \(R\),这两个值会影响滤波器的性能。值越小,滤波器对测量值越信任;值越大,滤波器对预测值越信任。
  2. 函数定义f 函数是状态转移函数,根据温度匀速变化假设更新温度估计值。h 函数是测量函数,根据温度计算对应的电阻值(这里以 pt100 为例)。H 函数计算测量函数的雅可比矩阵,用于线性化测量方程。
  3. 初始化:设置初始温度估计值 x_hat 和初始估计协方差 P
  4. 模拟与滤波过程:在循环中,首先生成真实温度和带有噪声的测量值。然后进行预测步骤,得到先验估计 xhatminus 和先验估计协方差 Pminus。接着通过计算卡尔曼增益 K 进行更新步骤,得到更准确的温度估计值 xhat 和更新后的估计协方差 P
  5. 绘图:最后绘制真实温度、测量温度和估计温度的曲线,直观展示 EKF 的滤波效果。

通过这种基于温度匀速变化的扩展卡尔曼滤波器,结合一阶泰勒公式对非线性关系的处理,我们能有效地提高电阻型温度传感器测量温度的准确性。这种方法在实际工业生产、环境监测等对温度测量精度要求较高的场景中具有重要的应用价值。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐