0. 参考与前言

  1. Python 代码:github AtsushiSakai/PythonRobotics
  2. C++ 代码:github jchengai/gpir/mpc_controller
  3. 相关参考博文:
    1. 无人车系统(十一):轨迹跟踪模型预测控制(MPC)原理与python实现【40行代码】
    2. PythonRobotics 的文档

来源 参考3.a

PID,pure pursuit方法,Stanley方法都只是利用当前的系统误差来设计控制器。

人们对这些控制器的设计过程中都利用了构建模型对无人车未来状态的估计(或者说利用模型估计未来的运动趋势)。每个控制周期只选择一个目标路点作为跟踪对象,因此,我们也可以说以上控制器只利用了模型进行向前一步预测

那么如果在更远的未来,参考轨迹变化不是那么平缓,并且有很多弯度小(急)的部分,那么只利用一步预测很难对整条轨迹进行有效的跟踪。为了让无人车的控制器更有前瞻性,设计控制器必须得利用模型对未来状态进行多步预测

假设向前预测步长为 T ,那么T步的时空模型要比原始的空间模型要大很多。MPC在每个控制周期都需要重新利用未来T步的模型计算得到当前执行的控制指令。MPC利用了一个比原始空间模型大很多的模型(更高的计算成本)仅仅只得到当前一步的最优控制器(跟PID,pure pursuit, stanley做了同样的事)

————————————————

版权声明:本文为CSDN博主「windSeS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u013468614/article/details/103519721

1. 公式推导及讲解

以下为公式车辆状态和线性化等求解过程: 大部分参考于3.b文档,添加了更详细的为什么是这样的公式的碎碎念;主要是感觉用latex打太累了,感觉总是想画一些线之类的,所以就手写了 再也不用担心公式乱码了 hhh;其中@阿信同学参与了常微分方程的推导和一些解释(给我解释了好久 hhh )

2. 代码对应

至此我们已经有了 所有我们需要的部分,接下来对应到代码,以python为例:

  1. 求A, B, C

    def get_linear_model_matrix(v, phi, delta):
    
        A = np.zeros((NX, NX))
    A[0, 0] = 1.0
    A[1, 1] = 1.0
    A[2, 2] = 1.0
    A[3, 3] = 1.0
    A[0, 2] = DT * math.cos(phi)
    A[0, 3] = - DT * v * math.sin(phi)
    A[1, 2] = DT * math.sin(phi)
    A[1, 3] = DT * v * math.cos(phi)
    A[3, 2] = DT * math.tan(delta) / WB B = np.zeros((NX, NU))
    B[2, 0] = DT
    B[3, 1] = DT * v / (WB * math.cos(delta) ** 2) C = np.zeros(NX)
    C[0] = DT * v * math.sin(phi) * phi
    C[1] = - DT * v * math.cos(phi) * phi
    C[3] = - DT * v * delta / (WB * math.cos(delta) ** 2) return A, B, C
  2. minimize的cost形式

    # mpc parameters
    R = np.diag([0.01, 0.01]) # input cost matrix
    Rd = np.diag([0.01, 1.0]) # input difference cost matrix
    Q = np.diag([1.0, 1.0, 0.5, 0.5]) # state cost matrix
    Qf = Q # state final matrix
    T = 5 # horizon length
    for t in range(T):
    cost += cvxpy.quad_form(u[:, t], R) # 对应 R u_t^2 第三项 if t != 0:
    cost += cvxpy.quad_form(xref[:, t] - x[:, t], Q) # 对应 第二项 A, B, C = get_linear_model_matrix(
    xbar[2, t], xbar[3, t], dref[0, t])
    constraints += [x[:, t + 1] == A @ x[:, t] + B @ u[:, t] + C] #车辆模型约束 if t < (T - 1):
    cost += cvxpy.quad_form(u[:, t + 1] - u[:, t], Rd) # 对应 第四项
    constraints += [cvxpy.abs(u[1, t + 1] - u[1, t]) <=
    MAX_DSTEER * DT] #最大最小输入 cost += cvxpy.quad_form(xref[:, T] - x[:, T], Qf) # 对应第一项

    所以一开始会磕出一个水平的长度,也就是mpc t:T考虑的部分

  3. 物理约束,详情见上面推导的第一幅图右边有写约束

    constraints += [x[:, 0] == x0]
    constraints += [x[2, :] <= MAX_SPEED]
    constraints += [x[2, :] >= MIN_SPEED]
    constraints += [cvxpy.abs(u[0, :]) <= MAX_ACCEL]
    constraints += [cvxpy.abs(u[1, :]) <= MAX_STEER]
  4. 求解,使用python cvxpy库进行优化求解,优化对象是刚刚写的一系列cost,然后添加了各个约束

    prob = cvxpy.Problem(cvxpy.Minimize(cost), constraints)
    prob.solve(solver=cvxpy.ECOS, verbose=False) if prob.status == cvxpy.OPTIMAL or prob.status == cvxpy.OPTIMAL_INACCURATE:
    ox = get_nparray_from_matrix(x.value[0, :])
    oy = get_nparray_from_matrix(x.value[1, :])
    ov = get_nparray_from_matrix(x.value[2, :])
    oyaw = get_nparray_from_matrix(x.value[3, :])
    oa = get_nparray_from_matrix(u.value[0, :])
    odelta = get_nparray_from_matrix(u.value[1, :]) else:
    print("Error: Cannot solve mpc..")
    oa, odelta, ox, oy, oyaw, ov = None, None, None, None, None, None return oa, odelta, ox, oy, oyaw, ov

完整代码可见参考 运行后类似于下面的gif图:https://github.com/AtsushiSakai/PythonRobotics/blob/master/PathTracking/model_predictive_speed_and_steer_control/model_predictive_speed_and_steer_control.py

https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/PathTracking/model_predictive_speed_and_steer_control/animation.gif

C++代码 则是基于ROS和CARLA实验的跟随,整体是高斯过程的路径规划问题求解等,但是因为jg实现了mpc在里面,所以也可以参考直接用:

https://github.com/jchengai/gpir/blob/main/planning_core/simulation/controller/mpc_controller.cc

3. Optional: CARLA实现

接下来则是 python下的CARLA实现,因为CARLA全部都是PID跟随器,想来写一个MPC的试一试,不过上面给出的已经能 让大家自己心里有数 整个过程步骤是怎样的了,下面仅实验实现

TODO


赠人点赞 手有余香 ;正向回馈 才能更好开放记录 hhh

【基础推导】MPC控制器及其车辆模型详细推导 (附代码链接及详细推导说明)的更多相关文章

  1. 全渠道定价、库存决策,运筹混合整数规划建模求解,MNL选择模型,内附代码!

    0. 写在前面 刊论文!模型简单,代码实现更简单,墙裂推荐!可为运筹建模提供参考,也可作为全渠道零售研究的入门资料ε٩(๑> ₃ <)۶з 全文有点长,前面先放一个博文结构和涉及内容: 第 ...

  2. Python之简单的SMTP发送邮件详细教程附代码

      简介 Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详 ...

  3. PHP判断手机号运营商(详细介绍附代码)

    道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ...

  4. Oracle OAF 应用构建基础之实现控制器 (转)

    原文地址: Oracle OAF 应用构建基础之实现控制器 设计一个OA Controller 如OA Framework Page解析中所描述的,OA Controller定义了web beans的 ...

  5. extjs5 一个容器中有几个组件公用一个控制器和一个模型

    Ext.define('TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to v ...

  6. Jvm基础(2)-Java内存模型

    Jvm基础(2)-Java内存模型 主内存和工作内存 Java内存模型包括主内存和工作内存两个部分:主内存用来存储线程之间的共享变量:而工作内存中存储每个线程的相关变量. 如下图所示: 需要注意的是: ...

  7. (二)用控制器controller给模型数据赋初始值

    之前博客,非常easy的就实现了模型数据和页面显示的自己主动绑定.如今我们使用控制器,给模型赋初始值. 假设使用jquery来实现变量赋初值,须要在页面载入完毕后运行$("#target&q ...

  8. 【CUDA 基础】3.1 CUDA执行模型概述

    title: [CUDA 基础]3.1 CUDA执行模型概述 categories: CUDA Freshman tags: CUDA SM SIMT SIMD Fermi Kepler toc: t ...

  9. 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

    前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...

  10. IIS7.0出错的解决方案 IIS 状态代码:IIS详细错误代码以及解释

    一.请求筛选模块被配置为拒绝包含双重转义序列的请求.HTTP 错误 404.11 - Not Found   1.单击 开始 . 在 开始搜索 框中, 键入 Notepad. 右击 记事本 , 然后单 ...

随机推荐

  1. SAP Adobe Form 教程五 图片

    前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 SAP Adobe Form 教程三 日期,时间,floating field SAP Adobe F ...

  2. 快速入门一篇搞定RocketMq-实现微服务实战落地

    1.RocketMq介绍 RocketMQ起源于阿里巴巴,最初是为了解决邮件系统的高可靠性和高性能而设计的.在2016年开源分布式消息中间件,并逐渐成为Apache顶级项目.现在是Apache的一个顶 ...

  3. 【python爬虫案例】用python爬豆瓣读书TOP250排行榜!

    目录 一.爬虫对象-豆瓣读书TOP250 二.python爬虫代码讲解 三.讲解视频 四.完整源码 一.爬虫对象-豆瓣读书TOP250 今天我们分享一期python爬虫案例讲解.爬取对象是,豆瓣读书T ...

  4. .NET有哪些好用的定时任务调度框架

    前言 定时任务调度的相关业务在日常工作开发中是一个十分常见的需求,经常有小伙伴们在技术群提问:有什么好用的定时任务调度框架推荐的?今天大姚给大家分享5个.NET开源.简单.易用.免费的任务调度框架,帮 ...

  5. kkfileview搭建指南

    最近公司有个需求,需要在线预览pdf,excel,world文档,pdf浏览器是直接支持预览的,vue也有很多插件支持,但是world文档和excel的方案就非常少了,市面上很多付费的,但是咱一般不舍 ...

  6. angualr2+ 性能优化-trackBy

    1.使用trackBy提高性能 为什么使用trackBy进行性能优化,在平时的开发中,我们对数组的处理基本都是通过接口获取新的数组进行替换或push,但是在这个过程中,Angular不知道你是要做什么 ...

  7. mybatis-plus id在高并发下出现重复

    mybaits-plus ASSIGN_ID生成 id生成策略 在分布式高并发环境下出现重复id https://github.com/baomidou/mybatis-plus/issues/307 ...

  8. linux sort命令的重要用法:按分隔符/字母/数字/月份进行排序

    1.指定分隔符,以某一列进行排序并输出 #-t 指定一个分隔符 #-k 后面跟数字,指定按第几列进行排序 #-r 反序排序(升序变成降序) #按":"做分隔符,以第3列,也就是用户 ...

  9. Sqlserver存储过程中使用try-catch和事务

    BEGIN TRY BEGIN TRANSACTION --逻辑代码 COMMIT TRANSACTION --提交事务 END TRY BEGIN CATCH SELECT @Msg = ERROR ...

  10. Python爬取数据并保存到csv文件中

    1.数据源 2.Python代码 import requests from lxml import etree import csv url = 'http://211.103.175.222:508 ...