【路径跟踪】PIDMPC
路径跟踪(Path Tracking)是指在实际行驶过程中,根据预先规划好的路径进行控制,能够沿着设定的路径行驶。常见的路径跟踪算法包括基于模型的控制方法(如PID控制器)、模型预测控制(Model Predictive Control, MPC)等。
一.PID
PID被广泛用于需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),具体如平衡小车、汽车的定速巡航、3D打印机上的温度控制器等。
1.算法原理
PID控制器由比例单元(Proportional)、积分单元(Integral)和微分单元(Derivative)组成。可以透过调整3个单元的增益 ,
和
来调定其特性。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。
离散时间下的PID公式如下所示:
2.实例
import numpy as np
import matplotlib.pyplot as pltclass PID:def __init__(self, P=0, I=0, D=0, initValue=0):self.Kp = Pself.Ki = Iself.Kd = D'''self.curValue表示现在的值self.ErrorSum表示前面所有误差之和self.PreError表示前一次的误差self.CurError表示现在的误差'''self.curValue = initValueself.ErrorSum = 0.0self.PreError = 0.0self.CurError = 0.0def PID_output(self, Target):self.PreError = self.CurErrorself.CurError = Target - self.curValuedErr = self.CurError - self.PreErrorself.ErrorSum += self.CurError# PID算法公式output = self.Kp * self.CurError + self.Ki * self.ErrorSum + self.Kd * dErrself.curValue += outputreturn self.curValue
def test_PID(P=0, I=0, D=0, initValue=0, len=1, target=0):pid = PID(P, I, D, initValue)pid_list = []time_list = []pid_list.append(pid.curValue)time_list.append(0)for i in range(1, len + 1):output = pid.PID_output(target)pid_list.append(output)time_list.append(i)time_list = np.array(time_list)pid_list = np.array(pid_list)plt.figure()plt.style.use('seaborn')plt.plot(time_list, pid_list)plt.axhline(target, c='green')plt.xlim((0, len))plt.ylim((min(pid_list) - 1, max(pid_list) + 1))plt.xlabel('time(s)')plt.ylabel('value')plt.title('PID control')plt.grid(True)plt.show()if __name__ == '__main__':test_PID(P=0.1, I=0.1, D=0.1, initValue=0, len=200, target=100)
二.MPC
模型预测控制(Model Predictive Control,MPC)是1种基于模型的控制方法,通过建立车辆的动力学模型和路面情况等环境信息来预测车辆未来的行驶轨迹,并在保证车辆稳定性的前提下寻找最优控制策略。相较于传统的控制方法,MPC可以根据车辆实时状态和环境信息调整控制策略,从而实现更加智能化和精准化的路径跟踪。
1.算法原理
(1)问题定义
假设有1个离散时间线性系统,用以下状态空间方程描述:
![]()
其中, 是系统状态,
是控制输入,A 和 B 是系统矩阵。目标是通过控制
,使系统状态
尽可能接近期望状态
。
(2)代价函数
代价函数及约束条件如下:

其中,分别表示系统状态、系统输入和终端状态的代价矩阵。
(3)求解
将MPC问题转换为QP问题。

其中,分别表示系统状态和控制输入的维度。
MPC的代价函数可以写为:


和
之间的关系推导:

矩阵形式为:

令:

则:

代入代价函数可得:

对比标准QP形式:

令:

已经将MPC问题转换为QP问题,后面只需要调用QP求解器进行优化即可。
确定矩阵后,优化输入为当前t时刻的系统状态,优化输出为控制序列
,由于理论构建的模型与系统真实模型存在偏差,优化所得的未来控制量对系统控制的价值很低,因此MPC仅执行输出序列
中的第1个控制输出。
2.实例
import numpy as np
from scipy import sparse
from qpsolvers import solve_qpclass MPC:def __init__(self, Ad, Bd, Q, R, Qf, N = 10):self.Ad = Adself.Bd = Bdself.Q = Qself.R = Rself.Qf = Qfself.N = N # 预测步数self.nx = Bd.shape[0]self.nu = Bd.shape[1]def solve(self, x0, Ad, Bd, Q, R, Qf, N = 10):self.Ad = Adself.Bd = Bdself.Q = Qself.R = Rself.Qf = Qfself.N = N # 预测步数self.nx = Bd.shape[0]self.nu = Bd.shape[1]A_powers = []for i in range(self.N + 1):A_powers.append(np.linalg.matrix_power(Ad, i))C = np.zeros(((self.N + 1) * self.nx, self.N * self.nu))M = np.zeros(((self.N + 1) * self.nx, self.nx))for i in range(self.N + 1):for j in range(self.N):if i - j - 1 >= 0:C_ij = A_powers[i - j - 1] * self.BdC[i * self.nx : (i + 1) * self.nx, j * self.nu : (j + 1) * self.nu] = C_ijelse:C_ij = np.zeros((self.nx, self.nu))C[i * self.nx : (i + 1) * self.nx, j * self.nu : (j + 1) * self.nu] = C_ijM[i * self.nx : (i + 1) * self.nx, :] = A_powers[i]Q_bar = np.kron(np.eye(self.N + 1), Q)Q_bar[self.N * self.nx : (1 + self.N) * self.nx, self.N * self.nx : (1 + self.N) * self.nx:] = QfR_bar = np.kron(np.eye(self.N), R)E = M.T * Q_bar * CP = 2 * C.T * Q_bar * C + R_barq = 2 * E.T * x0# Gx <= hG_ = np.eye(self.N * self.nu)G = np.block([ # 不等式约束矩阵[G_, np.zeros_like(G_)],[np.zeros_like(G_), -G_]])h = np.vstack(np.ones((2 * self.N * self.nu, 1)) * 999) # 不等式约束向量# Ax = bA = None # 等式约束矩阵b = None # 等式约束向量# 转换为稀疏矩阵的形式能加速计算P = sparse.csc_matrix(P)q = np.asarray(q)if G is None:passelse:G = sparse.csc_matrix(G)if A is None:passelse:A = sparse.csc_matrix(A)res = solve_qp(P, q, G, h, A, b, solver="osqp")return res
三.参考
1.https://blog.csdn.net/TeenLucifer/article/details/139887288?spm=1001.2014.3001.5501
2.https://github.com/TeenLucifer/Vehicle_PnC
相关文章:
【路径跟踪】PIDMPC
路径跟踪(Path Tracking)是指在实际行驶过程中,根据预先规划好的路径进行控制,能够沿着设定的路径行驶。常见的路径跟踪算法包括基于模型的控制方法(如PID控制器)、模型预测控制(Model Predicti…...
Spring源码分析之事件机制——观察者模式(二)
目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二ÿ…...
热备份路由HSRP及配置案例
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,HSRP的相关概念二,…...
仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...
CentOS 7系统 OpenSSH和OpenSSL版本升级指南
文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...
【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...
【Ubuntu】不能连上网络
1. ping路由器的IP地址 ping 192.168.1.1 如果ping不通的话,可能是网络故障导致的。需要重启配置ip地址。配置文件 sudo vi /etc/network/interface 2. ping 8.8.8.8 如果ping不通的话,可能是路由器不能链接往外网; 或者路由器显示了当…...
CSS3 框大小
CSS3 框大小 CSS3 是网页设计和开发中不可或缺的一部分,它为开发者提供了更多样化、更灵活的样式和布局选择。在 CSS3 中,框大小(Box Sizing)是一个重要的概念,它决定了元素内容的宽度和高度以及元素整体的大小。本文将详细介绍 CSS3 框大小的概念、用法以及最佳实践。 …...
联发科MTK6771/MT6771安卓核心板规格参数介绍
MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...
python中的时间模块--datetime模块、time模块
python中的时间模块 一.datetime模块二.time模块 一.datetime模块 引入时间模块 from datetime import datetime获取当前时间 print(datetime.today()) # 前的日期和时间 print(datetime.now()) # 当前的日期和时间 print(datetime.now().year) # 当前的年份 print(datetime…...
CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性
CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性 Numpy广播 OpenCV - Python归一化提取ROI(感兴趣区域)分离和合并通道 Pytorch 基础算子自动梯度计算 CV 全流程图像数据采集1. 确认目标2. 分析过程(使用目标-手段分析法࿰…...
OWASP ZAP之API 请求基础知识
ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …...
南京观海微电子----GH7009国宇测试盒使用
1. SPI接线 针对7009: 2. 国宇上位机代码准备 在主函数首尾两端加入IO2时序控制的代码、以及国语SPI有效位控制的代码(请注意7009和其他700x使用的有效位控制不一致,需要用哪一款加入哪一行即可): 三、国宇SPI读的使…...
mysql及其兼容语法数据库对于注释的特殊要求
我司大部分数据库使用MS-SQL,其中使用大量–开头的行注释,由于业务需要,切换到了Starrocks数据库(兼容mysql语法)后发现使用with开头子查询的时候,大量报错,单独执行内部的子查询又正常…...
数据去重与重复数据的高效处理策略
在实际业务中,数据去重是一个非常常见的需求,特别是在日志数据、用户操作记录或交易记录等领域。去重不仅仅是删除重复数据,更重要的是按照业务规则保留最有价值的数据记录。 本文将探讨如何在 SQL 中高效地处理重复数据,通过 DI…...
Spring Boot自动装配代码详解
概述 Spring Boot自动装配是其核心特性之一,它能够根据项目中添加的依赖自动配置Spring应用程序。通过自动装配,开发人员可以减少大量的配置工作,快速搭建起一个可用的Spring应用。 关键组件和注解 SpringBootApplication注解 这是Spring Bo…...
渗透测试-非寻常漏洞案例
声明 本文章所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台!࿰…...
122. 买卖股票的最佳时机 II
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析: 和买卖股票的最佳时机I这题相比,区别就是可以买多只股票虽然同时只能持有一支,但是我们还是可以…...
Python爬虫入门指南:从零开始抓取数据
Python爬虫入门指南:从零开始抓取数据 引言 在大数据时代,数据是新的石油。而爬虫作为获取数据的重要手段,受到了越来越多的关注。Python作为一门强大的编程语言,其简洁易用的特性使得它成为爬虫开发的首选语言。本篇文章将带你…...
Android使用JAVA调用JNI原生C++方法
1.native-lib.cpp为要生成so库的源码文件 2.JNI函数声明说明 NewStringUTF函数会返回jstring JNI函数声明规则 3.JAVA中声明及调用JNI函数 声明: 调用 4.源码地址: gitgithub.com:tonyimax/UpdateTimeByThread.git...
用PyTorch3D玩转3D艺术:手把手教你生成渐变小牛和旋转植物GIF
用PyTorch3D玩转3D艺术:手把手教你生成渐变小牛和旋转植物GIF 在数字艺术与创意编程的交汇处,PyTorch3D正成为技术爱好者手中的魔法棒。当传统3D建模软件需要复杂操作时,这个基于PyTorch的库让代码生成炫酷视觉效果变得像搭积木一样简单。本文…...
企业云盘选型标准合同条款:数据归属/服务等级/SLA全解析
作者:巴别鸟技术团队 适用场景:IT采购、合规审查、法务评估 更新时间:2026-04引言:为什么选云盘先看合同? 企业选择云盘时,大多数人盯着功能对比、UI体验、存储价格——但真正踩过坑的IT负责人知道…...
AGI与量子计算融合的7个致命断层:2026奇点大会未公开技术白皮书首曝
第一章:AGI与量子计算融合的范式危机与奇点临界态 2026奇点智能技术大会(https://ml-summit.org) 当通用人工智能(AGI)的推理架构遭遇量子叠加态的本征坍缩机制,传统冯诺依曼—图灵范式正经历不可逆的结构性失稳。实验表明&#…...
手把手配置华为交换机VLAN:为移动IMS专线搭建安全私网(含SBC对接要点)
华为交换机VLAN实战:构建IMS专线安全私网的7个关键步骤 在运营商级语音通信项目中,IMS专线的网络隔离是保障业务稳定性的第一道防线。去年某省会城市政务云项目就曾因VLAN配置疏漏,导致语音专线流量与公众宽带混传,最终引发大规模…...
AGI平民化接入实战手册(SITS2026现场闭门报告首次公开)
第一章:SITS2026专家:AGI的民主化访问 2026奇点智能技术大会(https://ml-summit.org) 从封闭模型到开放协议 AGI能力正加速脱离专有云服务与高门槛API调用范式,转向基于轻量级推理引擎、可验证提示合约和联邦式知识更新的开放基础设施。SIT…...
告别网络选择困难症:Android双Wi-Fi/蜂窝网络下,用ip rule实现App指定出口(附ADB命令)
Android多网络智能分流实战:用ip rule实现App专属通道 你是否遇到过这样的场景:手机同时连着公司Wi-Fi和家庭Wi-Fi,游戏却总是卡顿;或者用5G下载大文件时,微信消息却延迟严重?现代Android设备支持多网络并发…...
Python的__complex__方法支持复数运算重载与数值类型系统的完整性
Python作为一门动态类型语言,其数值类型系统的灵活性一直备受开发者青睐。其中,复数作为数学计算的重要工具,在科学计算、信号处理等领域有着广泛应用。Python通过__complex__方法实现了对复数运算的重载支持,这不仅增强了语言的表…...
从晶振到基站同步:拆解手机射频校准中AFC的‘隐藏’逻辑与避坑指南
从晶振到基站同步:拆解手机射频校准中AFC的‘隐藏’逻辑与避坑指南 在智能手机的射频系统中,频率校准(AFC)就像一位隐形的交响乐指挥,默默协调着晶振、基带芯片与基站之间的精密互动。当你在电梯里流畅刷短视频时&…...
别再被EMI困扰了!手把手教你理解并配置PCIE/SATA/USB3.0的SSC扩频时钟
高速接口EMI实战指南:SSC扩频时钟配置与参数优化 在硬件工程师的日常工作中,电磁干扰(EMI)问题就像一位不请自来的"隐形访客",总是在产品认证测试的关键时刻突然出现。特别是面对PCIE、SATA、USB3.0这类高速…...
PTA天梯赛L2通关秘籍:从链表去重到彩虹瓶,这10道模拟题帮你避开所有坑
PTA天梯赛L2模拟题深度解析:从解题框架到实战技巧 在算法竞赛的世界里,PTA天梯赛作为国内最具影响力的程序设计赛事之一,其L2级别的题目往往成为选手晋级的关键门槛。而其中占比高达70%的模拟类题型,更是检验选手编程基本功和逻辑…...
