微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用GEKKO避障问题未找到解决方案,存在解决方案

如何解决使用GEKKO避障问题未找到解决方案,存在解决方案

可以在here找到原始问题。

我是使用这个包的初学者,下面给出的大部分代码都是从 GEKKO 官方文档中给出的例子中借用的。

通常的进口:

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

初始化模型并定义时间点:

m = GEKKO() # initialize gekko
nt = 501
m.time = np.linspace(0.0,1.0,nt)
t = m.Param(value=m.time)

p = np.zeros(nt) # mark final time point
p[-1] = 1.0
final = m.Param(value=p)

定义状态和控制变量:

x = m.Var(value=0.0)
y = m.Var(value=0.0)
z = m.Var(value=0.0)

V = m.FV(value=2.0,lb=0.0,ub=100.0)
V.STATUS = 1

theta = m.CV(1.0)
theta.STATUS = 1
theta.SPHI = 0
theta.SPLO = 6.28

V 被选为固定变量,因为问题陈述提到:

V 是一个恒定的标量速度。

theta 已被假定在 [0,2*pi] 中,因为它没有在问题陈述中直接提及。

z 用作代理变量以实现积分目标。

定义约束方程:

m.Equation(x.dt()==V*m.cos(theta))
m.Equation(y.dt()==V*m.sin(theta))
m.Equation(x*final==1.2)
m.Equation(y*final==1.6)
m.Equation(((x-0.4)**2)+((y-0.5)**2)>=0.1)
m.Equation(((x-0.8)**2)+((y-1.5)**2)>=0.1)

定义获得二阶导数所需的变量:

dx = m.Var(value = 0.0)
dy = m.Var(value = 0.0)
ddx = m.Var(value = 0.0)
ddy = m.Var(value = 0.0)

使这项工作的相应方程:

m.Equation(dx==x.dt())
m.Equation(dy==y.dt())
m.Equation(ddx==dx.dt())
m.Equation(ddy==dy.dt())

将代理变量的导数设置为积分内的目标并求解:

m.Equation(z.dt()==(ddx**2)+(ddy**2))
m.Obj(z*final)

m.options.IMODE = 6 # optimal control mode
m.solve(disp=True)

我不确定我对给定问题的编码方式是否正确。正如给定的链接所示,存在问题的解决方案。我曾尝试使用APOPT和IPOPT来解决这个问题,两个求解器都无法找到解决方案。自 COLD_START 起无法使用 DOF < 0。 对此的任何帮助将不胜感激!

解决方法

模型的一个问题是两个终端约束,因为除了最后一个点(其中 final=1)之外的每个点都是 TerminateProcess0=1.2

0=1.6

需要另一种形式。

m.Equation(x*final==1.2)
m.Equation(y*final==1.6)

下面是一个可行的解决方案,但没有优化。

path planning

m.Equation((x-1.2)*final==0)
m.Equation((y-1.6)*final==0)

IPOPT 无法解决 import numpy as np from gekko import GEKKO m = GEKKO() nt = 51 m.time = np.linspace(0,1,nt) # mark final time point p = np.zeros(nt); p[-1] = 1 final = m.Param(p) # define theta as a Variable #theta = m.Var(value=np.pi/2.0,lb=0,ub=2*np.pi) # define theta as an MV theta = m.MV(value=0,ub=2*np.pi) theta.STATUS = 1; theta.DCOST = 0 V = m.FV(value=2.15,ub=10) # velocity #V.STATUS = 1 x,y,dx,dy,ddx,ddy = m.Array(m.Var,6) m.Equation(x.dt()==V*m.cos(theta)) m.Equation(y.dt()==V*m.sin(theta)) m.Equation(((x-0.4)**2)+((y-0.5)**2)>=0.1) m.Equation(((x-0.8)**2)+((y-1.5)**2)>=0.1) m.Equation(dx==x.dt()) m.Equation(dy==y.dt()) m.Equation(ddx==dx.dt()) m.Equation(ddy==dy.dt()) # alternative 1 terminal constraint m.Minimize(1e4*(x-1.2)**2) m.Minimize(1e4*(y-1.6)**2) # alternative 2 terminal constraint #m.fix_final(x,1.2) #m.fix_final(y,1.6) # alternative 3 terminal constraint #m.Equation((x-1.2)*final==0) #m.Equation((y-1.6)*final==0) # objective m.Minimize(m.integral((ddx**2)+(ddy**2))*final) m.options.SOLVER = 3 m.options.MAX_ITER = 1000 m.options.NODES = 3 m.options.IMODE = 6 # optimal control mode m.solve(disp=True) import matplotlib.pyplot as plt plt.figure(figsize=(5,5)) th = np.linspace(0,2*np.pi,500) x1 = np.sqrt(0.1)*np.cos(th)+0.4 y1 = np.sqrt(0.1)*np.sin(th)+0.5 x2 = np.sqrt(0.1)*np.cos(th)+0.8 y2 = np.sqrt(0.1)*np.sin(th)+1.5 plt.plot(x1,y1,'r',x2,y2,'r'); plt.plot(x.value,y.value,'b-o',markersize=2) plt.plot([1.2],[1.6],'o',color='orange') plt.xlabel('x'); plt.xlim([0,2.0]) plt.ylabel('y'); plt.ylim([0,2.0]) plt.title('Obstacle avoidance state variables,Speed = %2.4g'%V.value[0]) (计算)的问题。我尝试了其他几个终端约束,但求解器(APOPT 和 IPOPT)不成功。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。