3. 基于龙伯格观测器的直流电机转速估计

任务目标

针对一个由电枢电压驱动、带有恒定负载转矩的直流电机,设计全阶龙伯格状态观测器,在仅测量电枢电流(或仅测量转速,本案例选择仅测量电流)的条件下,实时估计电机转速。要求在负载转矩阶跃扰动下,转速估计值仍能快速收敛至真实值,并保持较小的稳态误差。

被控对象模型与观测器设计

直流电机的电气与机械动态可写为如下二阶线性系统(状态量为电流 \(i\) 与转速 \(\omega\)):

\[ \begin{cases} \dot{i} = -\frac{R}{L}i - \frac{K_e}{L}\omega + \frac{1}{L}u \\ \dot{\omega} = \frac{K_t}{J}i - \frac{B}{J}\omega - \frac{T_L}{J} \end{cases} \]

其中 \(T_L\) 为负载转矩(视为可测或不可测扰动,本案例将其作为已知输入处理)。若仅电流可测(\(y=i\)),则系统可观。全阶龙伯格观测器结构为:

\[ \dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x}) + d \]

其中 \(d=[0,\ -T_L/J]^T\) 为扰动补偿项。观测器增益 \(L=[l_1,\ l_2]^T\) 通过极点配置确定,使观测误差动态 \((A-LC)\) 的极点比系统自身极点快3~5倍。

关键完整代码(Python + NumPy)


import numpy as np
import matplotlib.pyplot as plt

# 电机参数
R, L, Ke, Kt, J, B = 1.0, 0.05, 0.1, 0.1, 0.01, 0.001
# 输入电压与负载转矩(阶跃扰动)
u = 12.0
TL = 0.0

# 连续时间状态矩阵
A = np.array([[-R/L, -Ke/L],
              [Kt/J, -B/J]])
B = np.array([[1/L],
              [0.0]])
C = np.array([[1.0, 0.0]])   # 仅测量电流
d = np.array([0.0, -TL/J])   # 扰动补偿

# 期望观测器极点(比系统极点快约5倍)
sys_poles = np.linalg.eigvals(A)
obs_poles = 5.0 * sys_poles
# 若实部为正则取负(确保稳定)
obs_poles = -np.abs(obs_poles)
L = np.linalg.place(A.T, C.T, obs_poles).T

# 离散化(零阶保持,步长1ms)
dt = 0.001
Ad = np.eye(2) + A*dt
Bd = B*dt
Cd = C
dd = d*dt

# 仿真时长与初值
t_end = 2.0
steps = int(t_end/dt)
x_true = np.array([0.0, 0.0])   # 真实状态 [i, w]
x_hat = np.array([0.0, 0.0])   # 观测器状态
y = 0.0

# 记录数据
time = np.linspace(0, t_end, steps)
i_true = np.zeros(steps); w_true = np.zeros(steps)
i_hat = np.zeros(steps); w_hat = np.zeros(steps)

for k in range(steps):
    # 0.5s时负载阶跃
    if time[k] >= 0.5:
        TL = 0.5
        dd = np.array([0.0, -TL/J])*dt

    # 真实系统更新
    x_true = Ad @ x_true + Bd*u + dd
    y = Cd @ x_true

    # 观测器更新(使用测量电流)
    x_hat = Ad @ x_hat + Bd*u + dd + L*dt @ (y - Cd @ x_hat)

    i_true[k] = x_true[0]; w_true[k] = x_true[1]
    i_hat[k] = x_hat[0]; w_hat[k] = x_hat[1]

# 绘图
plt.figure(figsize=(8,4))
plt.subplot(1,2,1)
plt.plot(time, w_true, 'b-', label='真实转速')
plt.plot(time, w_hat, 'r--', label='估计转速')
plt.axvline(0.5, color='gray', linestyle=':', label='负载阶跃')
plt.xlabel('时间/s'); plt.ylabel('转速/(rad/s)'); plt.legend(); plt.grid()
plt.subplot(1,2,2)
plt.plot(time, i_true, 'b-', label='真实电流')
plt.plot(time, i_hat, 'r--', label='估计电流')
plt.xlabel('时间/s'); plt.ylabel('电流/A'); plt.legend(); plt.grid()
plt.tight_layout(); plt.show()

运行与验证方法

  1. 依赖安装:需安装 numpy 与 matplotlib(pip install numpy matplotlib)。
  2. 执行:直接运行上述脚本,将弹出两个并排曲线图。
  3. 通过判定标准:
  • 0~0.5s内(无负载),估计转速约在0.1s内收敛至真实值(稳态误差<1%);
  • 0.5s负载阶跃后,真实转速下降,估计转速应在约0.2s内重新跟踪真实值,稳态误差<2%;
  • 电流估计曲线与真实电流基本重合,无持续偏差。

关键说明

本案例将负载转矩 \(T_L\) 作为已知输入进行前馈补偿,因此观测器在负载阶跃后仍能无偏估计。若 \(T_L\) 不可测,需将 \(T_L\) 扩维为第三个状态(即扩展状态观测器),不在本案例范围内。极点配置使用 numpy.place 实现,观测器极点取系统极点的5倍并取负保证稳定,实际工程中可根据测量噪声调整该倍数(3~10倍)。