路径跟踪算法之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,一经查实,立即删除!

相关文章

Rust 组织管理

Rust 组织管理 Rust 是一种系统编程语言&#xff0c;以其内存安全性、速度和并发性而闻名。它由 Mozilla 开发&#xff0c;并得到了一个庞大而活跃的社区的支持。Rust 的组织管理涉及多个方面&#xff0c;包括项目管理、社区参与、工具和库的维护&#xff0c;以及生态系统的整…

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解决办法按以下选择就行

Leetcode 17.10.主要要素

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组&#xff0c;找出其中的主要元素。若没有&#xff0c;返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。示例 1&#xff1a;输入&#xff1a;[1,2,5,9,5,9,5,5,5] 输出&#xff1a;5 示例 2&…

远程内核连接秘籍:IPython %connect 命令的深度指南

远程内核连接秘籍&#xff1a;IPython %connect 命令的深度指南 在 IPython 的强大功能中&#xff0c;%connect 命令是一个允许用户连接到远程 IPython 内核的魔术命令。这对于在远程服务器上进行数据分析和计算尤其有用&#xff0c;因为它可以让你利用远程资源&#xff0c;同…

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#——Array类详情

Array类 Array 类是 C# 中所有数组的基类&#xff0c;其中提供了一系列用来处理数组的操作&#xff0c;例如对数组元素进行排序、搜索数组中指定的元素等。 Array 类中的属性 Array 类中提供了一系列属性&#xff0c;通过这些属性可以获取数组的各种信息。 属性 描述 IsF…

深入理解Spring Boot中的容器与依赖注入

深入理解Spring Boot中的容器与依赖注入 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Java应用程序开发中&#xff0c;Spring Boot已经成为了一个非常流行的框架&#xff0c;它通过其强大的…

将缓冲文件写到磁盘中的命令sync

将缓冲文件写到磁盘中的命令sync There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quick…