PID控制算法学习笔记分享

目录

一、参数设定

二、PID计算公式

三、位置式PID代码实现

四、增量式PID代码实现

五、两种控制算法的优缺点

六、PID算法的改进


一、参数设定

  1. 比例系数(kp):P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比,误差越大,控制量的变化越大。P项可以提高系统的响应速度,但可能会导致系统的超调和稳态误差

  2. 积分时间(Ti):I项的作用是累积误差并产生一个控制量。它可以消除系统的稳态误差,因为它会积累误差并持续地调整控制量,直到误差为零。然而,I项可能会导致系统的超调和振荡。

  3. 微分常数(Td):D项的作用是根据误差变化的速度来产生一个控制量。它可以提高系统的稳定性,因为它可以减小误差的快速变化。D项可以抑制超调和减小振荡,但可能会增加系统的灵敏度

PD算法:适用于惯性较大的设备,比如舵机。

PI算法:适用于不允许有静差的设备。

二、PID计算公式

1)位置式PID

2)增量式PID

三、位置式PID代码实现

#define IntegralMAX 2000//pid结构体
typedef struct{float target_val;               //目标值float temp_val;                 //当前值float actual_val;                       //输出控制值float err;                              //定义偏差值float err_last;                         //定义上一个偏差值float Kp,Ki,Kd;                         //定义比例、积分、微分系数float sum;                              //定义历史偏差}pid_t; 
//pid算法实现void PID_realize(pid_t *pid)
{/*目标值只在这里参与计算,计算目标值与实际值的误差*/pid->err=pid->target_val - pid->temp_val;/*误差累积*/pid->sum+=pid.err;//此处可以进行误差限幅//*if(pid->integral > IntegralMAX) pid->integral = IntegralMAX;// else if(pid->integral < -IntegralMAX) pid->integral = -IntegralMAX;//*/*PID算法实现*/pid->actual_val = pid->Kp*pid->err + pid->Ki*pid->sum+ pid->Kd*(pid->err - pid->err_last);/*误差传递*/pid->err_last=pid->err;}

位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制。

四、增量式PID代码实现

 /*pid*/typedef struct{float target_val;     //目标值float actual_val;     //实际输出值float temp_val;       //当前值float err;            //定义当前偏差值float err_next;       //定义下一个偏差值float err_last;       //定义最后一个偏差值float Kp, Ki, Kd;     //定义比例、积分、微分系数}_pid;
//增量式PID算法实现
void PID_realize(pid_t *pid){/*目标值只在这里参与计算,计算目标值与实际值的误差*/pid->err = pid->target_val - pid->temp_val;/*PID算法实现*/float increment_val = pid->Kp*(pid->err - pid->err_next) + pid->Ki*pid->err + pid->Kd*(pid->err - 2 * pid->err_next + pid->err_last);/*累加*/pid->actual_val += increment_val;/*传递误差*/pid->err_last = pid->err_next;pid->err_next = pid->err;}

可见,增量式PID不需要进行累加,能对其产生影响的只有最近的三次的采样,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。

增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等。

五、两种控制算法的优缺点

1)位置式PID的优缺点

优点:

①位置式PID是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以很好应用

缺点:

①每次输出均与过去的状态有关,计算时要对e(k)进行累加,运算工作量大。

2)增量式PID优缺点:

优点:

①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。

②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。

③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。

缺点:

①积分截断效应大,有稳态误差;

②溢出的影响大。有的被控对象用增量式则不太好;

六、PID算法的改进

1)积分饱和

位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出。

解决方法:

1、积分限幅:在积分积累达到最大值时,停止积分的积累。

//积分限幅
if(pid->integral > IntegralMAX) pid->integral = IntegralMAX;
else if(pid->integral < -IntegralMAX) pid->integral = -IntegralMAX;

2、变速积分:

在系统误差较大时对积分进行积累会导致积分过饱和,此后需要很长的一段时间进行消除。所以我们希望在系统偏差大时积分作用应减弱甚至全无,而在偏差小时则应加强。变速积分可以根据系统偏差大小改变积分的速度。

使用变速积分后I项的表达式:

其中系数f 为:

当积分误差小于B时,对误差进行全积累;当误差大于A+B时,不积累;当误差处于两者之间时,积累量和误差值是线性关系

若A=0,f取值为0或1,此时为积分分离

3、抗积分饱和

是在计算输出的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。

2)梯形积分

在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度。即在每次计算积分时,积累的误差总是修改为当前误差与上一次误差的平均值。

3)不完全微分

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。

位置式PID的微分部分计算公式:

增量式PID的微分部分计算公式:

其中\alpha为不完全微分系数。

4)死区PID控制

在实际控制中可能总是存在微小的静差难以消除,导致系统频繁地不稳定,这时就可以引入带死区的PID算法,即在偏差达到一定程度时才进行调节,否则认为已经到达目标值。

5)步进式PID

所谓步进式PID算法,实际就是在设定值发生阶跃变化时,不直接对阶跃信号进行响应,而是在一定的时间内逐步改变设定值,直至使设定值达到目标值。这种逐步改变设定值的办法使得对象运行平稳。适用于高精度伺服系统的位置跟踪。

其基本思想是设定一个适当的步长,每次控制移动一个步长的值,直到达到目标值。

float StepInProcessing(pid_t *vPID)
{float stepIn=(vPID->maximum-vPID->minimum))*0.1;float kFactor=0.0;if(fabs(vPID->actual_val - vPID->target_val)<=stepIn){vPID->actual_val = vPID->target_val;}else{if(vPID->actual_val - vPID->target_val > 0){kFactor=-1.0;}else if(vPID->actual_val - vPID->target_val < 0){kFactor=1.0;}else{kFactor=0.0;}vPID->actual_val = vPID->actual_val + kFactor*stepIn;}return vPID->actual_val;
}

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

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

相关文章

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字&#xff0c;作为一种高度抽象化的符号系统&#xff0c;承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字&#xff0c;科学家们不断探索各种方法&#xff0c;以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

大模型 Scaling Law 的本质是工业化思维,Token 工厂,Token 生意

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. Scaling Law 的本质是工业化思维 我认为很多人对 Scaling Law 的理解还不够深入&#xff0c;他们仍然只是简单地认为&#xff1a;效果与参数规模成等比增长&#xff0c;目前的瓶颈应该是数据问题。…

军事人工智能的3个流派

在军事领域应用人工智能的态度大致分为三类&#xff1a;激进者、否认者、实用主义者。激进者认为&#xff0c;人工智能将彻底改变战争&#xff0c;改变战争的进行方式&#xff0c;有时甚至改变战争的性质及战争发生的原因。实用主义者认为&#xff0c;人工智能将越来越多地进入…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…

C++ Thead互斥量死锁,mutex如何防止死锁---C++11多线程快速学习

假设有两个线程 T1 和 T2&#xff0c;它们需要对两个互斥量 mtx1 和 mtx2 进行访问&#xff0c;而且需要按照以下顺序获取互斥量的所有权&#xff1a; - T1 先获取 mtx1 的所有权&#xff0c;再获取 mtx2 的所有权。 - T2 先获取 mtx2 的所有权&#xff0c;再获取 mtx1 的所有…

Error: MiniProgramError {“errno“:600009,“errMsg“:“request:fail invalid url \

vscode使用uniappvue3开发小程序&#xff0c;使用mockjs拦截接口&#xff0c;小程序报错&#xff1a; {status: 9value: "ide unknown command(empty parse result):**** }问题原因&#xff1a;mockjs不兼容微信小程序 解决办法&#xff0c;切换mockjs为better-mock npm…

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

PHP入门教程4:文件处理和表单处理

PHP入门教程4&#xff1a;文件处理和表单处理 在前几篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构、函数的使用以及数组和字符串的操作。本文将重点介绍PHP中的文件处理和表单处理&#xff0c;这些是Web开发中非常常见的任务。本文将包含以下几个部分&#xff1a; …

SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间&#xff0c;操作人员&#xff0c;更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码&#xff0c;那这个时候我们就需要使用一些通用方法&#xff0c;统一就行修改…

html中如何写一个提示框,css画一个提示框

在HTML中&#xff0c;提示框通常使用<div>元素来创建&#xff0c;然后使用CSS进行样式化。以下是一个示例&#xff0c;展示如何在HTML中写一个提示框&#xff0c;并使用CSS来设计其外观。 HTML 首先&#xff0c;创建一个HTML文件&#xff0c;其中包含一个提示框的结构&…

嵌套使用模板类

#include<iostream> using namespace std;template <class Datatype> class Stack { private:Datatype* items;//栈数组int stacksize;//栈的实际大小int top;//栈顶指针 public://构造函数&#xff1a;1&#xff09;分配栈数组内存&#xff0c;2&#xff09;把栈顶…

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策&#xff0c;自2024年6月10日起&#xff0c;允许买家在商品仍在运输途中申请退货与退款&#xff0c;此即“在途退货/退款”功能&#xff0c;主要的目的是为了提升买家的购物体验&#xff0c;增强市场竞争力。 图源&#xff1a;Shopee菲律…

一年前 LLM AGI 碎片化思考与回顾系列⑤ · 探索SystemⅡ复杂推理的未知之境

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想&#xff0c;探寻世界模型…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

C#面:abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized?

abstract 的方法不能同时是 static、native 或 synchronized。 static 方法是属于类的方法&#xff0c;而 abstract 方法是需要在子类中实现的方法&#xff0c;两者的概念相互矛盾。static 方法是在编译时就确定的&#xff0c;而abstract方法需要在运行时才能确定具体实现。na…

Qt多线程技术

Qt提供了许多处理线程的类和函数。下面是Qt程序员可以用来实现多线程应用程序的四种不同方法。 QThread:带有可选事件循环的低级API QThread是Qt中所有线程控制的基础&#xff0c;每个QThread实例代表并控制一个线程。 QThread既可以被直接实例化&#xff0c;也可以被子类化。…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果&#xff0c;然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误&#xff0c;本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下&#xff1a; import datasets import nu…

Linux screen命令使用

文章目录 1. 前言2. screen是什么?3. screen使用场景描述3. screen常用命令4. 小结5. 参考 1. 前言 实际开发中用到的云服务器&#xff0c;如果项目使用的是python&#xff0c;需要利用项目运行一些时间较长的项目程序脚本的话&#xff0c;由于我们通过ssh连接远端服务器&…

一文详解扩散模型

文章目录 1、常见的生成模型2、变分推断简介3、文生图的评价指标4、Diffusion Models5、其他技术交流群精选 节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地…

软设之进度管理之pert图

pert图 优点: 不仅给出了各个任务的开始时间&#xff0c;结束时间和完成该任务所需的时间&#xff0c;还给出了任务之间的关系&#xff0c;即哪些任务完成之后才能开始另外一些任务&#xff0c;以及如期完成整个工程的关键路径。松弛时间反映了某些任务是可以推迟其开始时间或…