簡體   English   中英

在速度限制下使用 Gekko 進行軌跡優化

[英]Trajectory optimization with gekko under speed constraints

PSA:我對壁虎很陌生,因此我可能在這里遺漏了一些非常明顯的東西。

我一直試圖找到最優控制問題的解決方案,即常規車輛的軌跡優化,在一定的速度限制下,在他們的行程中的特定距離。 為了做到這一點,我嘗試使用基於距離和速度約束數據的 pwl function 並使用v_max作為對 v 的約束。作為目標 function,我使用車輛比功率 (VSP) 近似值。

計算一直持續到最大值。 迭代次數達到並取消。 是否有一種方法可以離散化這個問題的搜索空間,使其在可接受的時間內解決,權衡計算時間以獲得准確性?

  • 目標距離 = 需要覆蓋的距離
  • max_accel = 車輛的最大可能加速度
  • max_decel = 車輛的最大可能減速度
  • max_velocity = 車輛的最大可能速度
  • min_velocity = 車輛的最小可能速度
  • trip_time = 離散數據點的數量(相隔 1 秒)
  • 距離 = 基於所需行程的 GPS 數據點的離散距離值的長度trip_time 數組
  • speed_limits = 基於所需行程的 GPS 數據點的離散速度限制的長度 trip_time 數組
  • 斜率=離散角度值的長度trip_time數組
def optimal_trip(goal_dist, max_accel, max_decel, max_velocity, min_velocity, trip_time, distances ,speed_limits, slope):

    model = GEKKO(remote=True)
    model.time = [i for i in range(trip_time)]

    x = model.Var(value=0.0)
    v = model.Var(value=0.0, lb = min_velocity, ub = max_velocity)

    v_max = model.Var()
    slope_var = model.Var()
    
    a = model.MV(value=0, lb=max_decel ,ub=max_accel)
    a.STATUS = 1
    
    #define vehicle movement
    model.Equation(x.dt()==v)
    model.Equation(v.dt()==a)
    # path constraint
    model.Equation(x >= 0)

    #aggregated velocity constraint
    model.pwl(x, v_max, distances, speed_limits)
    model.Equation(v_max>=v)

#slope is modeled as a piecewise linear function
    model.pwl(x, slope_var, distances, slope)

    #End state constraints
    model.fix(x, pos=trip_time-1,val=goal_dist) # vehicle must arrive at destination
    model.fix(v, pos=trip_time-1,val=0) # vehicle must be fully stopped
    #VSPI Objective function
    obj = (v * (1.1 * a + 9.81 * slope_var + 0.132) +0.0003002*pow(v, 3))
    model.Obj(obj)
    # solve
    model.options.IMODE = 6
    model.options.REDUCE = 3
    model.solve(disp=True)
    return x.value, v.value, obj.value

有人可以對此有所了解嗎?

這是 model 的一個版本,其中包含成功求解的示例值:

from gekko import GEKKO
import numpy as np

min_velocity =  0
max_velocity = 10
max_decel    = -1
max_accel    =  1
distances    = np.linspace(0,20,21)
goal_dist    = 200

trip_time    = 100

# set up PWL functions
distances    = np.linspace(0,1000,10)
speed_limits = np.ones(10)*5
speed_limits[5:]=7
slope        = np.zeros(10)
slope[3:5]=1; slope[7:9]=-1

model = GEKKO(remote=True)
model.time = [i for i in range(trip_time)]

x = model.Var(value=0.0)
v = model.Var(value=0.0, lb = min_velocity, ub = max_velocity)

v_max = model.Var()
slope_var = model.Var()

a = model.MV(value=0, lb=max_decel ,ub=max_accel)
a.STATUS = 1

#define vehicle movement
model.Equation(x.dt()==v)
model.Equation(v.dt()==a)
# path constraint
model.Equation(x >= 0)

#aggregated velocity constraint
model.pwl(x, v_max, distances, speed_limits)
model.Equation(v_max>=v)

#slope is modeled as a piecewise linear function
model.pwl(x, slope_var, distances, slope)

#End state constraints
model.fix(x, pos=trip_time-1,val=goal_dist) # vehicle must arrive at destination
model.fix(v, pos=trip_time-1,val=0) # vehicle must be fully stopped
#VSPI Objective function
obj = (v * (1.1 * a + 9.81 * slope_var + 0.132) +0.0003002*pow(v, 3))
model.Obj(obj)
# solve
model.options.IMODE = 6
model.options.REDUCE = 3
model.solve(disp=True)

您使用的值可能會導致不可行的解決方案。 以下是一些幫助 model 更可靠地解決問題的建議:

  1. 盡可能使用變量的上限而不是一般的不等式約束。
# remove these lines
#model.Equation(x >= 0)
#x = model.Var(value=0.0)

# put lower bound on x
x = model.Var(value=0,lb=0)
  1. 使用軟終端約束而不是硬終端約束。
#End state constraints
# vehicle must arrive at destination
#model.fix(x, pos=trip_time-1,val=goal_dist)
# vehicle must be fully stopped
#model.fix(v, pos=trip_time-1,val=0) 
p = np.zeros_like(model.time); p[-1]=1
final = model.Param(p)
model.Minimize(1e4*final*(v**2))
model.Minimize(1e4*final*((x-goal_dist)**2))
  1. 增加最大迭代次數。 有時求解器需要更多的迭代才能找到解決方案。
model.options.MAX_ITER=1000

model 的最終版本具有這些更改。 我可以幫助收斂到一個解決方案並避免最大迭代或不可行的解決方案。

from gekko import GEKKO
import numpy as np

min_velocity =  0
max_velocity = 10
max_decel    = -1
max_accel    =  1
distances    = np.linspace(0,20,21)
goal_dist    = 200

trip_time    = 100

# set up PWL functions
distances    = np.linspace(0,1000,10)
speed_limits = np.ones(10)*5
speed_limits[5:]=7
slope        = np.zeros(10)
slope[3:5]=1; slope[7:9]=-1

model = GEKKO(remote=True)
model.time = [i for i in range(trip_time)]

x = model.Var(value=0.0, lb=0)
v = model.Var(value=0.0, lb = min_velocity, ub = max_velocity)

v_max = model.Var()
slope_var = model.Var()

a = model.MV(value=0, lb=max_decel ,ub=max_accel)
a.STATUS = 1

#define vehicle movement
model.Equation(x.dt()==v)
model.Equation(v.dt()==a)

#aggregated velocity constraint
model.pwl(x, v_max, distances, speed_limits)
model.Equation(v_max>=v)

#slope is modeled as a piecewise linear function
model.pwl(x, slope_var, distances, slope)

#End state constraints
# vehicle must arrive at destination
#model.fix(x, pos=trip_time-1,val=goal_dist)
# vehicle must be fully stopped
#model.fix(v, pos=trip_time-1,val=0) 
p = np.zeros_like(model.time); p[-1]=1
final = model.Param(p)
model.Minimize(1e4*final*(v**2))
model.Minimize(1e4*final*((x-goal_dist)**2))

#VSPI Objective function
obj = (v * (1.1 * a + 9.81 * slope_var + 0.132) +0.0003002*pow(v, 3))
model.Minimize(obj)
# solve
model.options.IMODE = 6
model.options.REDUCE = 3
model.options.MAX_ITER=1000
model.solve(disp=True)

如果您在 StackOverflow 上提出另一個問題,請不要忘記包含一個最小且完整的工作示例來復制該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM