双环PID控制详细讲解

参考博客:
(1)PID双环控制(速度环和位置环)
(2)PID控制(四)(单环与双环PID)
(3)内外双环pid算法

0 单环PID

目标位置→系统→速度→当前位置
输入目标位置,得到输出的位置是当前位置作为反馈量,而这个输出结果的位置量是我们通过控制中间过程量速度来控制的
单环控制的是速度量

1 PID双环控制

在这里插入图片描述
位置环做为外环,速度环作为内环。外环的输出值作为内环的目标值,外环计算一次pid,根据pid公式可以知道,当离位置目标越来越近时,第一个误差(外环误差)就越来越小,以至于输出的内环目标值就越来越小,所以最终达到的效果就是,离目标值越近,速度越小。(理想情况下,要调节好pid参数,不然系统也会崩溃)

双环控制的时候,外环PID参数调节幅度不要太大,这对于整个曲线的影响很大

代码实现步骤:
PID参数结构体:定义位置、速度闭环的PID参数结构体变量

初始化PID参数:把目标值、期望值、累计偏差清零,配置PID系数
在这里插入图片描述

设置目标位置:只要设置外环的,内环的不用设置,因为内环的目标值,就是外环的输出值。

PID双环控制
在定时器中断(1ms)里,每50ms计算一次当前编码器的总计数值,并通过这个值进行外环PID
(位置环)计算,得到目标速度,要经过速度限幅(防止速度过快),然后存放到g_motor_data.motor_pwm变量(临时存放而已),根据目标速度,再进行速度环PID计算,最终得出要输出的pwm比较值,存放g_motor_data.motor_pwm变量(最终存放),然后再限制pwm比较值输出
在这里插入图片描述

3 PID双环控制详细解析

如果采用PID双环控制,控制的其实就是加速度。如果直接输入目标位置,输出当前位置,控制直接是用加速度来控制这个位置显然是不稳定的。所以我们采用双环,用外环来输出目标速度,用内环来控制加速度从而来控制位置
总体流程:目标位置→系统1→目标速度→系统2→加速度→当前位置和速度→反馈回系统1和2

外环:目标位置→系统1→目标速度→反馈给系统1

外环控制的是速度,也就是通过输入目标位置,来控制速度,从而反馈给系统,当我们把目标速度调的比较稳定后,再把此输出的目标速度当作内环的目标值传进内环中

内环:目标速度→系统2→加速度→当前位置→反馈给系统2

内环是把外环的目标速度作为目标值,根据当前的速度控制加速度从而向目标加速度靠近,最后再把输出值作为反馈值

4 双环PID控制器的C++代码实现

float outer_pid_controller(float setpoint, float input, float kp, float ki, float kd, float dt) {
    static float integral = 0;
    static float prev_error = 0;
    float error = setpoint - input;

    // 计算积分项
    integral += error * dt;

    // 计算微分项
    float derivative = (error - prev_error) / dt;

    // 计算输出
    float output = kp * error + ki * integral + kd * derivative;

    // 更新上一个误差
    prev_error = error;

    return output;
}

float inner_pid_controller(float setpoint, float input, float kp, float ki, float kd, float dt) {
    static float integral = 0;
    static float prev_error = 0;
    float error = setpoint - input;

    // 计算积分项
    integral += error * dt;

    // 计算微分项
    float derivative = (error - prev_error) / dt;

    // 计算输出
    float output = kp * error + ki * integral + kd * derivative;

    // 更新上一个误差
    prev_error = error;

    return output;
}

float double_pid_controller(float setpoint, float input, float outer_kp, float outer_ki, float outer_kd, float inner_kp, float inner_ki, float inner_kd, float dt) {
    // 计算外环控制器输出
    float outer_output = outer_pid_controller(setpoint, input, outer_kp, outer_ki, outer_kd, dt);

    // 计算内环控制器输出
    float inner_output = inner_pid_controller(outer_output, input, inner_kp, inner_ki, inner_kd, dt);

    return inner_output;
}

outer_pid_controllerinner_pid_controller分别是外环和内环PID控制器的实现函数。double_pid_controller函数则是将两个PID控制器串联起来,实现双环PID控制器。其中,setpoint是设定值,input是输入值,outer_kpouter_kiouter_kd是外环控制器的比例、积分和微分系数,inner_kpinner_kiinner_kd是内环控制器的比例、积分和微分系数,dt是采样时间。该函数返回内环PID控制器的输出值。

百度Apollo纵向控制原理如下所示,该图可以为纵向控制器的设置提供参考:
百度Apollo纵向控制框架

可以看出纵向控制是基于Frenet坐标系的,位置跟踪控制器采用P控制器实现车辆位置闭环控制,速度跟踪控制器实现速度闭环控制,根据车辆的俯仰角得出坡道加速度补偿,以及预览点的加速度实现加速度开环控制。基于加速度和定位反馈纵向速度查找油门制动标定表得到油门和刹车的控制量,从而实现车辆的纵向控制。

6 油门刹车标定表

纵向控制逻辑:油门 --> 功率 --> 转速 / 扭矩 --> 车速 / 车加速度 --> 车加速

找到油门和v,a对应的关系
在这里插入图片描述
做实验,踩不同的油门,得到不同的v,a曲线
在这里插入图片描述
对于一个throttle,不同的时间 t 得到一系列v、a点,v,a可以合并,得到v,a曲线
在这里插入图片描述
不同的throttle会得到不同的v、a曲线
在这里插入图片描述
使用不同的throttle做实验,可以得到一个三维曲面
在这里插入图片描述
通过做实验,得到大量的(v,a,throttle)的三维点,从而拟合出throttle = f(v,a)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git撤回代码提交commit或者修改commit提交注释

执行commit后,还没执行push时,想要撤销之前的提交commit 撤销提交 使用命令: git reset --soft HEAD^命令详解: HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1 如果进行两次的commit&#xf…

【Redis】Redis 缓存重点解析

Redis 缓存重点解析 推荐文章:【Redis】Redis的特性和应用场景 数据类型 持久化 数据淘汰 事务 多机部署-CSDN博客 1. 我看你的项目都用到了 Redis,你在最近的项目的哪些场景下用到了 Redis 呢? 一定要结合业务场景来回答问题&#x…

Bitmap实现原理应用场景

Bitmap是什么? 用内存中连续的二进制位(bit),用0或1标识数据是否存在。 长度为10的bitmap,1,2,3,4 在bitmap中存在。 Bitmap实现 1、字符串 数值对应字符串的下标、二进制位0&…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识,但也不仅仅是进程的预备知识, 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构:进一步理解操作系统: 冯诺依曼体系结构: 关于这张图先进行一下必要的解释: 输…

DIY可视化整合MQTT生成UniApp源码

DIY可视化整合MQTT生成UniApp源码 MQTT协议是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,专门设计用于在低带宽、不稳定的网络环境下进行物联网设备之间的通信。具有以下特点&…

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

【yolov8和yolov5】用命令快速着手训练

文章目录 1.yolov81.1.创建conda环境1.2.下载代码和环境1.3.YOLOv8训练、自测和预测的代码及解释1.3.1. YOLOv8 训练代码:1.3.2.yolov8 自测代码:1.3.3.yolov8 推理代码:1.3.4.注意: 2.yolov52.1.创建conda环境2.2.下载代码和环境…

小白必看,靠这几步写一份简单的产品说明书!

我们都知道,无论是新产品发布,还是老产品的推广,产品说明书都扮演着至关重要的角色。产品说明书可以帮助用户正确、高效地使用产品,也是传递企业发展理念、展示企业形象的有效途径。但作为一个小白,怎样才能写一份简单…

C语言数据结构之堆排序

青衿之志 履践致远 堆排序(Heapsort) 是指利用 堆 这种数据结构所设计的一种排序算法,它是 选择排序 的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。 🎥二叉堆 🎥二叉树 🔥期待小伙伴们…

K 个一组翻转链表

题目: struct ListNode{int val;ListNode* next;ListNode(): val(0), next(nullptr) {}ListNode(int _val): val(_val), next(nullptr) {}ListNode(int _val, ListNode* _next): val(_val), next(_next) {} };class Solution { public:ListNode* reverseKGroup(Li…

代码随想录训练营Day21:● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 题目描述 思路 遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪,大胜呼延灼。呼延灼损失了很多人马,不敢回京,一个人去青州找慕容知府。一天在路上住店,马被桃花山的人偷走了,于是到了青州,带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

linux设置systemctl启动

linux设置nginx systemctl启动 生成nginx.pid文件 #验证nginx的配置,并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx,让nginx是未…

PXI8540高速数据采集卡

XI高速数据采集卡,PXI8540卡是一种基于PXI总线的模块化仪器,可使用PXI系统,在一个机箱内实现一个综合的测试系统,构成实验室、产品质量检测中心等各种领域的数据采集、波形分析和处理系统。也可构成工业生产过程监控系统。它的主要…

EPDM和钉钉集成审批工作—移动端直接处理审批节点,高效协同!

我们发现很多我们工业界的用户,也是有很多是使用钉钉作为日常办公的。于是他们在使用EPDM时,尤其是在日常处理很多审批工作时,希望能和移动端设备和APP一起协同处理。 原文链接:https://www.ict.com.cn/article/20/993.html 钉钉目…

LeetCode刷题---即时食物配送 II

LeetCode题解 解题思路: 1.首先先求出每个用户首次订单表,将其命名为表t (select customer_id,min(order_date) as order_datefrom Deliverygroup by customer_id)as t2.与原表连接,求出在用户首次订单表中即时订单的数量的总和…

离线强化学习Offline Reinforcement Learning

离线强化学习(Offline Reinforcement Learning,简称Offline RL)是深度强化学习的一个子领域,它不需要与模拟环境进行交互,而是直接从已有的数据中学习一套策略来完成相关任务。这种方法被认为是强化学习落地的重要技术…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型(LLM)中可能存在一些过时的、不适当的和错误的信息,所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…

BUGKU-WEB cookies

题目描述 题目截图如下: 进入场景看看: 解题思路 看源码看F12:看请求链接看提示:cookies欺骗 相关工具 插件:ModHeader或者hackbarbase64解密 解题步骤 看源码 就是rfrgrggggggoaihegfdiofi48ty598whrefeoia…

【算法面试题】-06

智能成绩表 题目描述 小明来到学校当老师&#xff0c;需要将学生按考试总分或单科分数进行排名&#xff0c;你能帮帮他吗&#xff1f; 输入描述 第 1 行输入两个整数&#xff0c;学生人数 n 和科目数量 m。 0 < n < 100 0 < m < 10 第 2 行输入 m 个科目名称&…