在 GEKKO 中使用非线性模型预测控制实现横向控制器

2023-12-25

我正在尝试为由横向动态模型定义的自动驾驶车辆实现横向控制器。好吧,我的问题是 CV 没有达到 SP 设置的所需参考点或目标点。我正在使用以下运动方程和目标函数。我正在使用半经验公式 (pacejka) 来计算 Fyf Fyr 提供的轮胎力。这里有运动方程 https://i.stack.imgur.com/IcAIH.png and 目标函数 https://i.stack.imgur.com/Ol7Ka.png。提前致谢。

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


#%% NMPC model
T = 5
nt = 51
m = GEKKO(remote=False)
m.time = np.linspace(0,T,nt)

#Model Parameters
X_speed = m.Param(value=10.0)
mass=m.Param(value=1611.0)
c=m.Param(value=1.351) 
b=m.Param(value=1.5242)
Iz=m.Param(value=3048.1) 

Cyf=m.Param(value=1.30)
Dyf=m.Param(value=3449.94238709)
Byf=m.Param(value=0.223771457713)
Eyf=m.Param(value=-0.6077272729)

Cyr=m.Param(value=1.30)
Dyr=m.Param(value=3846.47835351)
Byr=m.Param(value=0.207969093485)
Eyr=m.Param(value=-0.7755647971)

#Variables
slip_angle_front_tire = m.Var(value=0.0, lb=-10.0, ub=14.0 )
slip_angle_rear_tire = m.Var(value=0.0, lb=-10.0, ub=14.0 )

phi_f = m.Var(value=0.0)
phi_r = m.Var(value=0.0)

maxF = 5000

Ffy = m.Var(value=0.0, lb=-.0*maxF, ub=maxF )
Fry = m.Var(value=0.0, lb=-1.0*maxF, ub=maxF )

 
xpos = m.Var(value=0.0)
dy = m.Var(value=0.0)
dpsi = m.Var(value=0.0)

#MV
steering = m.MV(value=0, lb=-0.40, ub=0.40 )

#CV
ypos = m.CV(value=0.0 ,lb =-200.0,ub=200.0 )
psipos = m.CV(value=0.0,lb=-3.5,ub=3.5)

#Equations
m.Equation(ypos.dt() == dy)
m.Equation(psipos.dt() == dpsi)

m.Equation(slip_angle_front_tire == steering - m.atan( (dy+b*dpsi)/X_speed ) )
m.Equation(slip_angle_rear_tire == -1.0*m.atan( (dy-c*dpsi) / X_speed))

m.Equation(phi_f == (1-Eyf)*(slip_angle_front_tire) + (Eyf/Byf)*(m.atan(Byf*slip_angle_front_tire) ) )
m.Equation(phi_r == (1-Eyr)*(slip_angle_rear_tire) + (Eyr/Byr)*(m.atan(Byr*slip_angle_rear_tire) ) )

m.Equation(Ffy == (Dyf*( m.sin(Cyf*m.atan(Byf*phi_f ) ) ) ) *2.0 )
m.Equation(Fry == (Dyr*( m.sin(Cyr*m.atan(Byr*phi_r ) ) ) ) *2.0 )

m.Equation(mass*dy.dt() == (Ffy*m.cos(steering) ) + (Fry) - (X_speed*dpsi*mass) ) 
m.Equation(dpsi.dt()*Iz == ( b*Ffy*m.cos(steering) ) - ( c*Fry) )

#Global options
m.options.IMODE = 6 #MPC
m.options.CV_TYPE = 2
m.options.MV_TYPE = 0

#MV tuning
steering.STATUS = 1
steering.DCOST = 0.01

#CV Tuning
ypos.STATUS = 1
psipos.STATUS = 1

ypos.TR_INIT = 2
psipos.TR_INIT = 2


ypos.WSP = 100 
psipos.WSP = 10

ypos.SP = 9.2
psipos.SP = 1.5

print('Solver starts ...')
t = time.time()
m.solve(disp=True)
print('Solver took ', time.time() - t, 'seconds')

plt.figure()

plt.subplot(4,1,1)
plt.plot(m.time,steering.value,'b-',LineWidth=2)
plt.ylabel('steering wheel')

plt.subplot(4,1,2)
plt.plot(m.time,ypos.value,'r--',LineWidth=2)
plt.ylabel('y-point')

plt.subplot(4,1,3)
plt.plot(m.time,psipos.value,'r--',LineWidth=2)
plt.ylabel('yaw angle')
plt.xlabel('time')
plt.show()

对于参考轨迹,您需要包括时间常数TAU for 达到设定点的速度有多快.

ypos.TAU = 1.5
psipos.TAU = 1.5

还有关于以下的附加信息在动态优化练习中调整 MPC 应用程序 https://apmonitor.com/do/index.php/Main/ControllerTuning.

您需要的另一项更正是-1.0 in Ffy = m.Var(value=0.0, lb=-1.0*maxF, ub=maxF)。否则,它永远无法达到设定点。看来两个设定点都无法达到,因此它优先尝试满足ypos具有较高权重的设定点。您可能需要另一个MV来控制两者ypos and psipos。否则,您可以考虑打开steering看看是否能找到限制更少、更好的解决方案。我还将结束时间设置为 10,即 101 点,因为需要额外的时间才能稳定到新的设定点。

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


#%% NMPC model
T = 10
nt = 101
m = GEKKO(remote=False)
m.time = np.linspace(0,T,nt)

#Model Parameters
X_speed = m.Param(value=10.0)
mass=m.Param(value=1611.0)
c=m.Param(value=1.351) 
b=m.Param(value=1.5242)
Iz=m.Param(value=3048.1) 

Cyf=m.Param(value=1.30)
Dyf=m.Param(value=3449.94238709)
Byf=m.Param(value=0.223771457713)
Eyf=m.Param(value=-0.6077272729)

Cyr=m.Param(value=1.30)
Dyr=m.Param(value=3846.47835351)
Byr=m.Param(value=0.207969093485)
Eyr=m.Param(value=-0.7755647971)

#Variables
slip_angle_front_tire = m.Var(value=0.0, lb=-10.0, ub=14.0 )
slip_angle_rear_tire = m.Var(value=0.0, lb=-10.0, ub=14.0 )

phi_f = m.Var(value=0.0)
phi_r = m.Var(value=0.0)

maxF = 5000

Ffy = m.Var(value=0.0, lb=-1.0*maxF, ub=maxF )
Fry = m.Var(value=0.0, lb=-1.0*maxF, ub=maxF )


xpos = m.Var(value=0.0)
dy = m.Var(value=0.0)
dpsi = m.Var(value=0.0)

#MV
steering = m.MV(value=0, lb=-0.4, ub=0.4 )

#CV
ypos = m.CV(value=0.0 ,lb =-200.0,ub=200.0 )
psipos = m.CV(value=0.0,lb=-3.5,ub=3.5)

#Equations
m.Equation(ypos.dt() == dy)
m.Equation(psipos.dt() == dpsi)

m.Equation(slip_angle_front_tire == steering - m.atan( (dy+b*dpsi)/X_speed ) )
m.Equation(slip_angle_rear_tire == -1.0*m.atan( (dy-c*dpsi) / X_speed))

m.Equation(phi_f == (1-Eyf)*(slip_angle_front_tire) + (Eyf/Byf)*(m.atan(Byf*slip_angle_front_tire) ) )
m.Equation(phi_r == (1-Eyr)*(slip_angle_rear_tire) + (Eyr/Byr)*(m.atan(Byr*slip_angle_rear_tire) ) )

m.Equation(Ffy == (Dyf*( m.sin(Cyf*m.atan(Byf*phi_f ) ) ) ) *2.0 )
m.Equation(Fry == (Dyr*( m.sin(Cyr*m.atan(Byr*phi_r ) ) ) ) *2.0 )

m.Equation(mass*dy.dt() == (Ffy*m.cos(steering) ) + (Fry) - (X_speed*dpsi*mass) ) 
m.Equation(dpsi.dt()*Iz == ( b*Ffy*m.cos(steering) ) - ( c*Fry) )

#Global options
m.options.IMODE = 6 #MPC
m.options.CV_TYPE = 2
m.options.MV_TYPE = 1

#MV tuning
steering.STATUS = 1
steering.DCOST = 0.1

#CV Tuning
ypos.STATUS = 1
psipos.STATUS = 1

ypos.TR_INIT = 2
psipos.TR_INIT = 2

ypos.WSP = 100 
psipos.WSP = 10

ypos.SP = 9.2
psipos.SP = 1.5

ypos.TAU = 1.5
psipos.TAU = 1.5

print('Solver starts ...')
t = time.time()
m.solve(disp=True)
print('Solver took ', time.time() - t, 'seconds')

plt.figure()

plt.subplot(3,1,1)
plt.plot(m.time,steering.value,'b-',LineWidth=2)
plt.ylabel('steering wheel')

plt.subplot(3,1,2)
plt.plot([0,10],[9.2,9.2],'k-')
plt.plot(m.time,ypos.value,'r--',LineWidth=2)
plt.ylabel('y-point')

plt.subplot(3,1,3)
plt.plot([0,10],[1.5,1.5],'k-')
plt.plot(m.time,psipos.value,'g:',LineWidth=2)
plt.ylabel('yaw angle')
plt.xlabel('time')
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GEKKO 中使用非线性模型预测控制实现横向控制器 的相关文章

  • 我已经多次看到说LQR和MPC相似

    https zhuanlan zhihu com p 139145957 https blog csdn net sinat 16643223 article details 109707776
  • 自动驾驶控制算法-模型预测MPC

    本文记录一下MPC控制算法的学习过程和自己的理解 xff0c 初步接触控制算法 xff0c 理解肯定不是很完善 xff0c 重在记录思考的过程 背景 随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热 xff0c 模型预测控制 MPC
  • 模型预测控制(Model predictive control,MPC)

    模型预测控制 MPC 是一种先进的过程控制方法 xff0c 用于在满足一组约束条件的同时控制过程 自 1980 年代以来 xff0c 它一直在化工厂和炼油厂的加工工业中使用 近年来 xff0c 它还被用于电力系统平衡模型 1 和电力电子学中
  • LQR、LQR-MPC、GP-MPC控制倒立摆

    LQR控制倒立摆 xff1a 倒立摆状态方程 xff1a 目标任务 xff1a 模型参数 xff1a LQR for the cart pole system load 39 cp params mat 39 syms phi phid x
  • GEKKO 和 Scipy.optimize 导致非线性参数估计结果不同

    我正在学习如何使用 GEKKO 来解决参数估计问题以及 作为第一步 我正在开发我遇到的示例问题 之前使用 Scipy 最小化例程实现 这些有 已按照 APMonitor com 中提供的信息和 内提供的课程 目前的问题是间歇式反应器 甲醇转
  • 使用 Pyinstaller 编译 Gekko

    我想知道是否可能 或者是否有人有任何经验 用 pyinstaller 将 gekko 优化包编译成 exe 作为测试用例 我使用来自 gekko 优化网站的 HS 71 Benchmark 用例 https gekko readthedoc
  • 如何在 lambda 和 gekko 中使用 If...else

    场景如下 我想最大限度地降低运行电机的成本 我有 X 个电机 每个电机都有一个下限和一个上限 它不能超过上限 也不能低于下限 除非它与 0 一致 当这些电机必须达到 Y 的功率时 我必须找到一种方法来最小化这些电机的成本 并非每个电机都必须
  • 如何使用 Gekko 加快优化速度?

    我的计划是优化家用电池的充电和放电 以最大限度地降低年底的电力成本 每15分钟测量一次家庭用电量 所以我在1天内有96个测量点 我想优化电池 2 天的充电和放电 以便第 1 天考虑到第 2 天的使用情况 我编写了以下代码并且它有效 from
  • 如何避免在 GEKKO 中创建许多二进制切换变量

    我通过最小化数千个方程来求解 14 个变量IMODE 3 in GEKKO 每个方程都是真实响应与 P 样条模型预测之间的平方误差 i e 惩罚 B 样条 eq i m Minimize y true i spline coeffs kno
  • GEKKO RTO 与 MPC 模式

    这是一个由此衍生的问题one https stackoverflow com questions 60761440 variable bounds in mpc with gekko 在发布我的问题后 我找到了一个解决方案 更像是强制优化器
  • 从 Schittkowski DAE 测试套件中求解 PENDULUM2?

    我只是试图解决 Schittkowski DAE 测试套件中的 DAE 问题之一 http klaus schittkowski de mc dae htm http klaus schittkowski de mc dae htm 但没有
  • 使用 Python Gekko 的全局最小值与局部最小值解决方案

    一个简单的优化示例有 2 个局部最小值 0 0 8 有目标的936 0 and 7 0 0 有目标的951 0 在 Python Gekko 中使用本地优化器的技术有哪些 APOPT BPOPT IPOPT 寻找全局解决方案 from ge
  • 如何在 GEKKO 中实现 OR 约束

    我有一个优化问题 我必须找到给定电机的最低成本 并且存在一个限制 即电机要么运行 要么不运行 但如果它运行的话 它必须达到其功率范围的下限 我将包含我的代码 以展示我所尝试的内容 from gekko import GEKKO power
  • Python gekko 方程定义中的换行符

    我目前正在手动实现有限元的伽辽金法 并使用 python gekko 来求解所得的非线性代数方程组 这对于小型系统来说不会产生任何问题并且工作正常 一旦系统变得更加复杂 涉及长方程和指数项m exp 对于求解器来说 方程可能不再具有正确的格
  • Python:有限制的非线性优化(Gekko?)

    我希望能够用Python解决以下问题 给定观测数据 x 1 x n 和已知的固定目标 B 和公差 E 求解参数 a0 a1 和 a2 从而最小化 总和 w i 2 其中 w i exp a0 a1x i a2x i 2 具有以下两个限制 s
  • 使用 gekko 进行优化时返回“@Error:未找到解决方案”

    我正在尝试完成长达一年的电池优化问题 8760 小时 ind 1 和 ind 2 是长度为8760的列表 包含0 1 一年中的某些时间可能会获得额外的收入 因此这些指标列表用于区分这些时间 进一步用于最大化函数 m Gekko remote
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • 整数约束优化,目标函数表示执行另一个程序调用

    我正在研究整数优化问题 想尝试 GEKKO 问题描述 x1 x2 x3 x9 x10 x11 1 16 范围内的整数 是目标函数的 11 个整数参数 我想找到一组 x 值来最小化目标函数的输出 然而 由于问题无法用数学来表达 因此需要通过运
  • 如何解决 Gekko 中由于 m.connection 导致的警告消息?

    我正在使用 m connection 来估计变量初始条件 但收到 12 条警告消息 例如 此外 APM文件显示 我不确定如何解决这些消息 我按照这个解释 如果 pos1 或 pos2 不是 None 则关联的 var 必须是 GEKKO 变
  • 如何使用 Python Gekko 求解绝对值 abs() 目标?

    使用 Python Gekko 中的 IPOPT 成功解决了具有平方目标的优化问题 from gekko import GEKKO import numpy as np m GEKKO x m Var y m Param 3 2 m Obj

随机推荐

  • D3:获取选定元素的边界框

    我的 svg 中有多个元素 我想放大其中之一 我想做同样的事这个例子 http bl ocks org mbostock 9656675但具有非地理路径 就像是 d3 select myElement bounds that I can u
  • pandas 将 NaN 替换为 None 表现出违反直觉的行为

    给定一个系列 s pd Series 1 1 1 2 np nan s 0 1 1 1 1 2 2 NaN dtype float64 如果需要将 NaN 转换为 None 例如 使用镶木地板 那么我希望 0 1 1 1 1 2 2 Non
  • 针对非 IE 浏览器和特定 IE 版本的有效条件注释

    如何使用条件评论来定位 仅限 Internet Explorer 某些 IE 版本 某些 IE 版本和所有其他浏览器 没有IE 只有其他浏览器 以一种验证的方式 validator w3 org http www validator w3
  • Pygame:帧重影?

    我正在使用 pygame 在 python 中开发动画环境 用户绘制每一帧 然后使用 ffmpeg 将动画保存为 avi 电影 我想实现一个功能 但不知道如何 帧重影 就像在绘制当前帧时显示前一帧一样 我尝试创建一个名为ghost当按下下一
  • NSTextView 选择特定行

    我使用的是 Xcode 10 Objective C macOS 而不是 iOS 是否可以以编程方式选择一行NSTextView如果给出行号 无需更改内容的任何属性 只需像用户通过三次单击一样选择它即可 我知道如何按范围获取选定的文本 但这
  • C++ 内存模型和 char 数组上的竞争条件

    基本上我很难理解这一点 来自 Bjarne FAQ 然而 大多数现代处理器无法读取或写入单个 字符 它必须读取或写入整个单词 因此分配给 c 实际上是 读取包含c的单词 替换c部分 然后写 单词又回来了 由于对 b 的赋值类似 因此有 两个
  • 有什么办法可以阻止用户在本地保存文档吗?

    如果用户在我的网站上查看文档 例如代表某些机密信息的 pdf 文件 我是否可以阻止他们在本地保存文档 一句话 不 一旦您将数据发送到他们的浏览器 他们就可以用它做他们想做的事情 您可以使用一些 Flash 组件或 Java Applet 来
  • 如何使用jdbc从db2读取xml列

    假设我在 DB2 中有一个名为 ABC 的表 其中有 2 列 id number content xml String q select from ABC where id 121 Connection conn getConnection
  • 在Android的不同模块中使用不同版本的SO文件(如libc++_shared.so)

    我在应用程序的两个单独的模块中使用两个不同的自定义 aar 库 库附带了许多 so 文件 例如 libc shared so 等 在包含这两个文件后 我收到如下错误 2 files found with path lib arm64 v8a
  • 从另一个 PHP 脚本执行 PHP 脚本

    如何使用 php 手动触发服务器来运行 php 脚本 基本上我有一个相当大的 cronjob 文件 每 2 小时运行一次 但我希望能够自己手动触发该文件 而不必等待它加载 我希望它在服务器端完成 编辑 我想从 php 文件执行该文件 而不是
  • for..of 和迭代器状态

    考虑这个Python代码 it iter 1 2 3 4 5 for x in it print x if x 3 break print for x in it print x 它打印1 2 3 4 5 因为迭代器it记住它在循环中的状态
  • 如何将 JDBC 连接到 tns oracle

    我可以使用 tns 文件从 plsql 连接到数据库 现在我想使用 JDBC 从 Java 连接到数据库 我尝试过的 我搜索谷歌 发现我必须使用这个连接字符串 jdbc oracle thin host port tnsfile 我的计算机
  • Eclipse 中保存文件的选项呈灰色

    I m using Eclipse 3 7 on Ubuntu Often after editing a file I cannot save it the save option is greyed out in the menu an
  • 在 python 中列出带有标题的 csv [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我编写了一个脚本 其中给出了如下所示的列表作为输出 red 361 0 blue 1 0 orange 77 0 cream 66
  • 导入样式表中的 XSLT 样式表参数

    是否可以为导入的样式表的参数赋值 我期待类似的事情
  • 如何使用 Perl 且仅使用 LWP::UserAgent 更新我的 Twitter 状态?

    我正在尝试通过 Twitter API 和 OAuth 更新我的状态 我陷入了最后一步 即状态更新 这是我的代码 标题 ua gt default header Content Type gt application x www form
  • 堆叠两个 pandas 数据框

    如何堆叠以下 2 个数据框 df1 hzdept r hzdepb r sandtotal r 0 0 114 0 1 114 152 92 1 df2 hzdept r hzdepb r sandtotal r 0 0 23 83 5 1
  • pandas 中按列随机排列行

    我有以下数据框示例 c1 c2 0 1 a 1 2 b 2 3 c 3 4 d 4 5 e 给定一个模板c1 3 2 5 4 1 我想根据新的列顺序更改行的顺序c1 所以它看起来像 c1 c2 0 3 c 1 2 b 2 5 e 3 4 d
  • 如何判断文件是否已完成 FTP 传输?

    我们有一个 C Windows 服务轮询一个文件夹 等待 FTP 文件被发布 为了避免在文件仍在写入时使用该文件 我们首先尝试锁定该文件 但是 似乎有有时我们会在创建 FTP 文件之后但在写入文件之前锁定文件 因此我们最终会打开一个空文件
  • 在 GEKKO 中使用非线性模型预测控制实现横向控制器

    我正在尝试为由横向动态模型定义的自动驾驶车辆实现横向控制器 好吧 我的问题是 CV 没有达到 SP 设置的所需参考点或目标点 我正在使用以下运动方程和目标函数 我正在使用半经验公式 pacejka 来计算 Fyf Fyr 提供的轮胎力 这里