我正在使用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离散化匹配?另外,如何在采样率和命令率之间找到一个好的平衡点?我担心太频繁的命令会对过程进行不必要的小调整,但如果采样不够频繁,则会使估计不太准确。
发布于 2019-04-10 23:28:49
您总是希望在Moving Horizon Estimation和模拟器之间使用相同的采样时间。我建议您使用numpy.linspace或else 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的频率。这是从Arduino设备采样温度数据的source code for the figure below。

在这种情况下,每秒测量一次温度,并重新求解MHE。总的时间范围是120秒,间隔为3秒,或者用np.linspace(0,120,41)表示m.time=[0,3,...,117,120]。
对于你的第二个问题,关于在采样率和命令率之间找到良好的平衡,采样率通常受到MHE求解速度的限制。如果您需要更快的方法,那么可以使用卡尔曼滤波器或其他方法。一般来说,控制器的命令速率越快越好,因为您能够更快地对干扰做出反应。如果你担心移动参数值太频繁,那么你可以在你的目标中使用DCOST (penalize movement) or DMAX (hard constraint on movement)。
https://stackoverflow.com/questions/55604256
复制相似问题