路径跟踪算法之PID、PP、Stanley详细理解

一、前言

今天又来补作业了!


在跟踪控制领域,PID(Proportional-Integral-Derivative, 分别为比例、积分、微分)、PP( Pure-Puresuit, 纯跟踪)、Stanley(前轮反馈控制)是三种最为常见的路径跟踪算法

下面将会以 如何使用 如何最简单理解 的角度进行说明,文章的表达方式比较随意,有稿纸书写的,也有电子记录的,也有代码片段的,终极目的是通俗易懂,希望大家都能有所收获。

二、PID算法

先看一段PID进行横向跟踪的核心代码实现:

// 计算机器人位置到参考位置的夹角
double alpha = atan2(refer_path.y-robot_state.y, refer_path.x-robot_state.x);
// 及算法机器人位置到参考位置的距离
double l_d = sqrt(pow(refer_path.x-robot_state.x,2)+pow(refer_path.y-robot_state.y,2));
// 计算机器人朝向角与参考位置的角度
double theta_e = alpha-robot_state.psi;
// 计算机器人与参考位置的y向距离偏差
double e_y = l_d*sin(theta_e);
// pid求解转向控制量
double delta_f = PID.calOutput(e_y);///
// PID控制的实现
/*** kp 代表比例系数* ki 代表积分系数* kd 代表微分系数* sum_error 表示累计误差* lower 代表最小控制量* upper 代表最大控制量* pre_error 代表上一次误差
*/
double PID_controller::calOutput(double error) {double u = error * this->kp + this->sum_error * this->ki + (error - this->pre_error) * this->kd;if (u < this->lower)u = this->lower;else if (u > this->upper)u = this->upper;this->pre_error = error;this->sum_error = this->sum_error + error;return u;
}

其实PID的核心代码就只有上面一小段!

计算机器人与参考位置的y向距离偏差 可以看下面的示意图
在这里插入图片描述
如何理解PID算法呢?直接给出公式, δ ( k ) \delta \left ( k \right ) δ(k)就是下一时刻的控制量。
在这里插入图片描述
PID的三个参数如何调整呢?直接给出调节口诀
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来

下面也给出比较推荐的几篇文章:
通俗理解:https://blog.csdn.net/m0_38106923/article/details/109545445
原理理解:https://zhuanlan.zhihu.com/p/562593474
调参技巧:https://zhuanlan.zhihu.com/p/85020348

三、Pure-Puresuit 算法

以最简单的差速模型来进行分析
在这里插入图片描述
在这里插入图片描述
对于其他模型,基本原理也是一样,只是要根据对应模型去进行推导就行。
在这里插入图片描述

车辆模型具体可以参考:https://blog.csdn.net/WaiNgai1999/article/details/132062188

四、Stanley算法

Stanley基本上都用于车辆模型,核心思想是基于车辆 前轴中心点 的路径跟踪偏差量对方向盘转向控制量进行计算(pp算法是以后轴中心定义的),下面简单以车辆模型进行推导。

控制模型:
在这里插入图片描述
控制量(转向角)推导如下:
在这里插入图片描述
Stanley算法收敛性的验证:
在这里插入图片描述

五、总结

1、PP 和 Stanley 都是几何跟踪算法,其最大的区别是PP以后轮为中心,Stanley以前轮为中心;
2、PID仍然是目前运用最为广泛的跟踪算法,其计算简单,但调参需要经验;
3、PP 和 Stanley 能够较好的对未来的路径进行调控,而PID更容易出现超调现象;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL——map和set

目录 一、set 二、map 1.插入 2.隆重介绍 [] A使用场景 B原理 一、set set即STL库中提供的K模型的二叉搜索树&#xff0c;他的函数使用和其他容器很相似&#xff0c;可以自行阅读文档#include <set> 本文旨对库中难以理解的函数作说明 二、map map即KV模型的二…

【全面讲解如何安装Jupyter Notebook!】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 —— 《带你自学大语言模型》系列

本系列目录 《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a;带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型 1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xff1…

针对tcp不出网打——HTTP隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件&#xff0c;我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

HTTP-概述

概念 :Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 原始数据格式 特点 1. 基于TCP协议:面向连接&#xff0c;安全&#xff08;三次握手&#xff09; 2. 基于请求-响应模型的:一次请求对应一次响应&#xf…

移动校园(5):课程表数据获取及展示

首先写下静态页面&#xff0c;起初打算做成一周的课表&#xff0c;由于是以小程序的形式展现&#xff0c;所以显示一周的话会很拥挤&#xff0c;所以放弃下面的方案&#xff0c;改作一次显示一天 改后结果如下&#xff0c;后期还会进行外观优化 真正困难的部分是数据获取 大家大…

2024用友实习笔试

题目一 解题思路&#xff1a; 动态规划&#xff0c;对于当前位置&#xff0c;如果选择&#xff0c;那前一个不能选&#xff0c;前两个及以上不影响。如果不选&#xff0c;那前一个及以上不影响。 题目二 解题思路 数据范围比较小&#xff0c;可以用前缀和然后双重循环遍历每个…

分数的表示和运算方法fractions.Fraction()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 分数的表示和运算方法 fractions.Fraction() 选择题 以下代码三次输出的结果分别是&#xff1f; from fractions import Fraction a Fraction(1, 4) print(【显示】a ,a) b Fraction(1, 2…

解决Visual Studio 一直弹出管理员身份运行问题(win10/11解决办法)

不知道大家是否有遇到这个问题 解决办法也很简单 找到启动文件 如果是快捷方式就继续打开文件位置 找到这个程序启动项 右键 选择 兼容性疑难解答&#xff08;win11 则需要 按住 shift 右键&#xff09; win10 解决办法 这样操作完后就可以了 win11解决办法按以下选择就行

3.js - 模板渲染 - 金属切面效果

md&#xff0c;狗不学&#xff0c;我学 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.m…

新手入门渗透必刷靶场(overthewire_bandit系列0~11关)

前言&#xff1a;overthewire系列的靶场是国外的网址&#xff0c;如果连接不上试试用魔法&#xff0c;每一个关卡拿到的flag,都是下一个关卡的登录密码&#xff08;靶场每段时间都会更新&#xff0c;所以是没法直接抄秘钥的&#xff0c;只能跟着过关方法来拿到秘钥&#xff09;…

【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat

自动装配加载 ServletWebServerFactoryAutoConfiguration 在自动装配的时候&#xff0c;会加载spring.factories&#xff0c;并且添加到IOC容器中。这里包含web自动配置类ServletWebServerFactoryAutoConfiguration &#xff0c;其中本类中注入三个bean&#xff0c;分别是Embed…

Threejs将场景生成全景图导出

实现思路&#xff1a; 创建全景相机CubeCamera&#xff08;六个方位的透视相机&#xff09;并渲染场景 读取六个面的纹理数据 填充进canvas中 即可按照常规的canvas导出图片了 demo https://gitee.com/honbingitee/three-template-next.js/tree/HDR 核心代码 const cubeRender…

分享大厂对于缓存操作的封装

hello&#xff0c;伙伴们好久不见&#xff0c;我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙&#xff0c;基本是993了。 缓存大家再熟悉不过了&#xff0c;几乎是现在任何系统的标配&#xff0c;并引申出来很多的问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩…

C语言调试技巧

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.bug 是什么2.debug 是什么3.两种模式的区别4.IDE 调试介绍4.1.模…

嵌入式c语言5——位运算符

<<与>>是c语言中两个移位运算符&#xff0c;分别有乘以2与除以2的意义 位运算符还包括&#xff0c;与&&#xff0c;或|&#xff0c;均进行按位操作 同时&#xff0c;还可以进行取反以及异或操作

synchronized和ReentrantLock

ReentrantLock ReentrantLock fairLock new ReentrantLock(true);// 这里是演示创建公平锁&#xff0c;一般情况不需要。 fairLock.lock(); try {// do something } finally {fairLock.unlock(); }

商家店铺电商小程序模板源码

橙色通用的商家入驻&#xff0c;商户商家&#xff0c;商家店铺&#xff0c;购物商城&#xff0c;商家购物平台app小程序网页模板。包含&#xff1a;商家主页、优先商家、商品详情、购物车、结算订单、个人中心、优惠券、会员卡、地址管理等功能页面。 商家店铺电商小程序模板源…

基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启

1. erlang与RabbitMQ对应版本参考&#xff1a;https://www.rabbitmq.com/which-erlang.html 2. 安装erlang 官网&#xff1a;https://www.erlang.org/downloads GitHub: https://github.com/rabbitmq/erlang-rpm/releases 2.1 安装依赖&#xff1a; yum -y install gcc glib…

Nginx实战:nginx性能压测(ab)

在nginx的生产实践中,不管是服务上线,还是性能优化,都会遇到需要对nginx的性能压测,本文介绍一个简单的压测工具:ab命令 ab(Apache Bench)是一个常用的HTTP压力测试工具,可以用来测试Nginx的性能和压力。ab命令可以指定并发请求数、请求数、请求类型等参数,并输出测试…