2

我正在使用 GEKKO 进行四轴飞行器(模拟)的模型预测控制 (MPC),包括计算四轴飞行器质量和阻力的移动地平线估计器 (MHE)。四轴飞行器的命令功能需要我指定一个时间段(即在 x 秒内保持角度 r,p 和油门 z)。我的估计器中的离散化指定如下:

m = GEKKO()
m.time = (0,5,2)

模拟函数如下所示:

for i in range(cycles):

  #Simulation measurements
  #Request measurements
  #MV inputs

  T.MEAS = throttle_i[i]
  roll.MEAS = roll_i[i]
  pitch.MEAS = pitch_i[I]

  #simulate one step
  quad.move(roll_i[i],pitch_i[i],throttle_i[i],dt).join()

其中dt是指定命令的时间长度。(即保持滚动,俯仰和油门dt几秒钟)。

如何确保模拟中的离散化与 MHE 离散化相匹配?另外,我怎样才能在采样率和命令率之间找到一个很好的平衡?恐怕命令过于频繁会对过程进行不必要的细微调整,但采样频率不够会使估计的准确性降低。

4

1 回答 1

1

您总是希望在移动地平线估计和模拟器之间使用相同的采样时间。我建议您使用numpy.linspaceor elsenumpy.arange来定义估计器的时间范围。

import numpy as np
from gekko import GEKKO
m = GEKKO()
m.time = np.linspace(0,5,11)
print(m.time)
m.time = np.arange(0,5.01,0.5)
print(m.time)

这给出了一个时间步长为 0.5 的 11 个时间点:

[0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5 5. ]

如果您的模拟器使用不同的采样间隔进行测量,那么您可以调整 0.5 in numpy.arange.

这是MHE 的附加示例代码。如果您使用的是物理系统而不是模拟器,则 MHE 的采样时间需要是您更新测量和求解 MHE 的频率。这是下图的源代码,它是从 Arduino 设备采样温度数据。

移动地平线估计

在这种情况下,每秒测量一次温度并重新求解 MHE。总时间范围为 120 秒,间隔np.linspace(0,120,41)为3 秒m.time=[0,3,...,117,120]

对于关于在采样率和命令率之间找到良好平衡的第二个问题,采样率通常受到 MHE 解决速度的限制。如果您需要更快的东西,则可以使用卡尔曼滤波器或替代方法。通常,控制器的命令速度越快越好,因为您能够更快地响应干扰。如果您担心过于频繁地移动参数值,那么您可以在目标中使用DCOST(惩罚移动)或 DMAX(移动硬约束)

于 2019-04-10T15:28:49.337 回答