首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GEKKO在模型预测控制应用程序中管理采样和命令时间

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

Stack Overflow用户
提问于 2019-04-10 11:17:26
回答 1查看 187关注 0票数 2

我正在使用GEKKO对一个四轴飞行器(模拟)进行模型预测控制(MPC),包括一个计算四轴飞行器质量和阻力的移动地平线估计器(MHE)。四轴飞行器的命令函数要求我指定一个时间段(即在x秒内保持角度r,p和油门z )。我的估计器中的离散化指定如下:

代码语言:javascript
复制
m = GEKKO()
m.time = (0,5,2)

模拟函数如下所示:

代码语言:javascript
复制
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离散化匹配?另外,如何在采样率和命令率之间找到一个好的平衡点?我担心太频繁的命令会对过程进行不必要的小调整,但如果采样不够频繁,则会使估计不太准确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 23:28:49

您总是希望在Moving Horizon Estimation和模拟器之间使用相同的采样时间。我建议您使用numpy.linspace或else numpy.arange来定义估计器的时间范围。

代码语言:javascript
复制
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:

代码语言:javascript
复制
[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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55604256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档