如何使用GEKKO在模型预测控制应用程序中管理采样和命令时间

时间:2019-04-10 03:17:26

标签: python-3.x gekko

我正在将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离散化匹配?另外,如何在采样率和指令率之间找到良好的平衡?恐怕命令过多会对该过程进行不必要的细微调整,但采样不够频繁会使估计的准确性降低。

1 个答案:

答案 0 :(得分:1)

您始终希望在Moving Horizon Estimation和模拟器之间使用相同的采样时间。我建议您使用numpy.linspace或其他numpy.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)

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

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

如果您的模拟器以不同的采样间隔进行测量,则可以在numpy.arange中调整0.5。

这里是additional example code for MHE。如果您使用物理系统而不是模拟器,则MHE的采样时间必须是更新测量值和求解MHE的频率。这是source code for the figure below,它从Arduino设备采样温度数据。

Moving Horizon Estimation

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

关于在采样率和指令率之间找到良好平衡的第二个问题,采样率通常受MHE求解速度的限制。如果您需要更快的速度,则可以使用卡尔曼滤波器或其他方法。通常,控制器的命令速度越快越好,因为您可以更快地响应干扰。如果您担心过于频繁地移动参数值,则可以在目标中使用DCOST (penalize movement) or DMAX (hard constraint on movement)