python-3.x - 如何使用 GEKKO 管理模型预测控制应用程序中的采样和命令时间

标签 python-3.x gekko

我正在使用 GEKKO 进行四轴飞行器(模拟)的模型预测控制 (MPC),其中包括计算四轴飞行器质量和阻力的移动地平线估计器 (MHE)。四轴飞行器的命令功能要求我指定一个时间段(即在 x 秒内保持角度 r、p 和 throttle 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是指定命令的时间长度。 (即保持滚动、俯仰和 throttle dt 秒)。

如何确保模拟中的离散化与 MHE 离散化相匹配?另外,如何在采样率和命令率之间找到良好的平衡?恐怕指挥太频繁会对流程做出不必要的微小调整,但采样不够频繁又会使估计不太准确。

最佳答案

您始终希望在 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 求解速度的限制。如果您需要更快的速度,则可以使用卡尔曼滤波器或替代方法。一般来说, Controller 的命令速率越快越好,因为您能够更快地响应干扰。如果您担心过于频繁地移动参数值,那么您可以使用 DCOST (penalize movement) or DMAX (hard constraint on movement)在你的目标中。

关于python-3.x - 如何使用 GEKKO 管理模型预测控制应用程序中的采样和命令时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55604256/

相关文章:

python - tf.gfile.GFile() 中使用的编码是什么?

python - 如何使用 Python Gekko 修复 IPOPT 中的局部不可行性?

python - 如何从gekko中获取 'infeasibilities.txt'

python - GEKKO if3 变量在优化中给出意想不到的结果

python - 使用 GEKKO 移动水平估计和模型预测控制,对测量数据而不是平均测量使用react

Python 3 二进制到十六进制(带填充)

python - 在 Python 3 CGI 脚本中设置编码

python - 无法腌制 redis-py 实例 (_thread.lock)

Python3 列出来自特定目录的文件

python - 当我运行 GEKKO 优化时,我得到了 'FileNotFoundError'