我正在将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离散化匹配?另外,如何在采样率和指令率之间找到良好的平衡?恐怕命令过多会对该过程进行不必要的细微调整,但采样不够频繁会使估计的准确性降低。
答案 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设备采样温度数据。
在这种情况下,每秒测量一次温度,然后重新解析MHE。总时间范围为120秒,间隔为3秒,或者np.linspace(0,120,41)
为m.time=[0,3,...,117,120]
。
关于在采样率和指令率之间找到良好平衡的第二个问题,采样率通常受MHE求解速度的限制。如果您需要更快的速度,则可以使用卡尔曼滤波器或其他方法。通常,控制器的命令速度越快越好,因为您可以更快地响应干扰。如果您担心过于频繁地移动参数值,则可以在目标中使用DCOST (penalize movement) or DMAX (hard constraint on movement)。