首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GEKKO中导出流形上的最佳轨迹

在GEKKO中导出流形上的最佳轨迹
EN

Stack Overflow用户
提问于 2021-02-14 04:23:47
回答 1查看 39关注 0票数 3

我终于回到了我的项目中,并找到了我的下一个障碍。

我有一个封闭式歧管:

另外,这里有一个游戏中的轨迹示例

我可以让我的系统像普通车一样开着。我很好奇在gekko中加入这种约束的最好方法是什么。歧管看起来像一个圆边和圆角的立方体。我现在的想法是创建一个MLP (多层感知器)来近似流形上表面上每个点的法向量。我试着使用GEKKO的大脑模型来做这件事,但它最终非常慢,所以我转向了keras模型。我现在有一个keras模型,它将位置连接到法向量的准确率约为89% (这可能已经足够了)。

所以我的第一件事是,我如何将keras模型合并到我的gekko方程中?如果我能够计算每个点的神经网络输出的导数,是否可以对模型进行黑箱操作,使得gekko放置一个位置,然后黑箱函数输出一个法向量和这个法向量导数,最终计算出最优轨迹?

如果这是不可能的,你认为我可以很容易地将这个歧管建模为B样条曲线?当系统处于驾驶状态时,我应该如何处理使歧管曲面成为系统的约束?我的想法是,取系统当前的速度矢量,并将其与系统所在位置的流形的法向量打点,以获得速度矢量沿流形旋转了多少。我已经看到了一些问题,比如大的时间步长,缺少流形的曲率,导致系统离开流形的表面。我认为这样做的典型数学方法是将系统的速度投影到流形的“切线空间”中,在切线空间中导出未来状态,然后使用回缩将其映射回流形。我对拓扑和流形这个话题还是相当陌生的,所以如果我在理论上犯了错误,请纠正我。

我还没有太多的代码来做这件事,因为我被困在如何在等式中使用keras模型。我确实有一个更简单的问题,那就是在R2中,我不是在这个复杂的流形上行驶,而是在一个圆圈上行驶。我也使用keras模型在R2中对这个圆进行了建模。我计划从更简单的版本开始,如果我能够在方程中使用keras,然后再开始在R3中的流形上驾驶。

有没有类似的例子可以让我学习呢?

谢谢!很高兴能回到这个项目中。

EN

回答 1

Stack Overflow用户

发布于 2021-02-16 02:09:49

这个路径规划优化应用程序可能更好地使用拍摄方法,其中模型是优化器反复调用模拟器的“黑盒”。其中一些挑战是当车辆与地面相互作用而不是在空中时,变化的方程。如果您确实想要同时模拟地面和空中,则可以使用if3语句进行切换,或者使用松弛变量。

对于边界约束,也许有一种更简单的方法来开始建模,比如形成一个盒子的简单不等式约束。您可以为边添加额外的不等式约束,以模拟曲率。

下面是一个相关的应用程序,其中包含适用于空气动力学的rocket launch。您需要将其扩展到3D。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO

# create GEKKO model
m = GEKKO()

# scale 0-1 time with tf
m.time = np.linspace(0,1,101)

# options
m.options.NODES = 6
m.options.SOLVER = 3
m.options.IMODE = 6
m.options.MAX_ITER = 500
m.options.MV_TYPE = 0
m.options.DIAGLEVEL = 0

# final time
tf = m.FV(value=1.0,lb=0.1,ub=100)
tf.STATUS = 1

# force
u = m.MV(value=0,lb=-1.1,ub=1.1)
u.STATUS = 1
u.DCOST = 1e-5

# variables
s = m.Var(value=0)
v = m.Var(value=0,lb=0,ub=1.7)
mass = m.Var(value=1,lb=0.2)

# differential equations scaled by tf
m.Equation(s.dt()==tf*v)
m.Equation(mass*v.dt()==tf*(u-0.2*v**2))
m.Equation(mass.dt()==tf*(-0.01*u**2))

# specify endpoint conditions
m.fix(s, pos=len(m.time)-1,val=10.0)
m.fix(v, pos=len(m.time)-1,val=0.0)

# minimize final time
m.Obj(tf)

# Optimize launch
m.solve()

print('Optimal Solution (final time): ' + str(tf.value[0]))

# scaled time
ts = m.time * tf.value[0]

# plot results
plt.figure(1)
plt.subplot(4,1,1)
plt.plot(ts,s.value,'r-',linewidth=2)
plt.ylabel('Position')
plt.legend(['s (Position)'])

plt.subplot(4,1,2)
plt.plot(ts,v.value,'b-',linewidth=2)
plt.ylabel('Velocity')
plt.legend(['v (Velocity)'])

plt.subplot(4,1,3)
plt.plot(ts,mass.value,'k-',linewidth=2)
plt.ylabel('Mass')
plt.legend(['m (Mass)'])

plt.subplot(4,1,4)
plt.plot(ts,u.value,'g-',linewidth=2)
plt.ylabel('Force')
plt.legend(['u (Force)'])

plt.xlabel('Time')
plt.show()

这是另一个带有source fileslanding of a reusable rocket应用程序。他们开发了火箭动力学的代理模型,将该模型应用于预测控制。

这是一个3D火箭应用程序的例子,但它们没有改变动力学方程时地面交互的复杂性。

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

https://stackoverflow.com/questions/66189542

复制
相关文章

相似问题

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