我正在使用 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 设备采样温度数据。
在这种情况下,每秒测量一次温度并重新求解 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/