到底什么是串级PID?

开发 前端
本文简单介绍了串级PID的相关概念,以四轴飞行器为例,对比了简单PID和串级PID的优劣。

[[382574]]

本文转载自微信公众号「小麦大叔」,作者菜刀和小麦。转载本文请联系小麦大叔公众号。   

什么是串级PID?

什么是串级PID?顾名思义就是两个串起来的PID,下面是一个双闭环的例子,外环是位置环,内环是速度环,最终的执行器是电机,电机输出产生了速度和位置;具体框图如下图所示;

当然执行器也可以是四轴飞行器,整体过程如下:

  • 我们在外环给定相应的位置高度,外环PID的输出就是内环PID的期望值;
  • 内环PID的输出将产生相应的油门大小,最终飞行器会产生上升的速度;
  • 内环反馈值为速度,控制相应的速度达到外环所需的速度期望值;
  • 最终外环达到期望的位置;

可能这里比较抽象,好吧,下面继续细化一下硬件的细节;

PID的算法控制其实是一种无系统模型的控制,可以根据参数经验经验去调试系统;

但是实际的物理对象的模型其实早就确定好了,PID的输入量和输出量的物理意义也会因为实际的被控对象而改变;

换句话说,PID的输入基本上和系统的反馈量相关,而实际的反馈量是什么,从一开始就因为系统而确定下来了;

内环和外环

如果外环是因,那内环就是果。万物皆有因果。

比如伺服控制器的三环:

  • 位置环
  • 速度环
  • 电流环

外环的变化会直接导致内环的变化,而内环是直接导致执行器变化的关键,如果这里依然使用飞行器作为例子,对于整个四轴飞行系统而言;

  1. 我们通过控制电机的电流,从而决定电机的输出扭矩;
  2. 扭矩和负载一起决定电机转速;
  3. 螺旋桨快速旋转从而产生了飞行器的升力,于是也决定了上升的速度;
  4. 最终也导致了飞行器的位置变化;

这是整个的控制过程。

如果只用单环的PID去控制系统,可以在给定系统期望的情况下达到所需要的位置吗?

答案是可以。

那这样串级PID还有什么意义吗?

答案是有。

我们试想一下,如果单纯使用单环PID去控制系统。

那我们看一下单环的PID系统框图;

我们设定了一个高度,并且希望飞行器达到预期位置高度,那么这时候系统的反馈值只有位置量;

那么飞行器是以什么样的速度去飞行?以什么样的加速度去启动?我们就无法去有效地控制飞行器的速度,让它去快速地到达期望的位置,具体位置曲线如下图所示;

其实不难理解,因为一开始的高度差很大,所以PID计算输出的值就很大,因此初始速度会非常大,随着飞行器越来越接近期望位置,偏差越来越小,PID输出量逐渐减小,因此速度逐渐减小。

其实很多时候,PID只是底层,称之为内环PID,通过它可以先稳定某个系统,优化动态特性,然后在外层嵌套其他算法,当然,外面有好几层PID的控制系统是也很常见的。也就是我们介绍的串级PID的系统,具体如下所示;

控制器的本质是出入跟输出的函数映射关系。

其实从这个角度来看,通常PID适用于低阶的线性时不变系统,在此基础上限制到P,I,D三个系数。

整体还需要根据具体的系统,有所变化,有的系统其实只需要两个系数(比如PD或PI),甚至有的系统只需要一个就行(比如P)。因此上面系统中,外环只需要使用P环节就足够了,另外可以对速度曲线进行规划。

假设这里使用了速度曲线规划,因为可以对飞行器的速度进行控制了;

所以我们期望它尽快达到最大速度,因此从最开始的阶段进行匀加速,达到最大速度后开始匀速上升,即将到达期望位置的时候,进行匀减速,最终悬停到目标位置;

那么整体的位置变化曲线如下所示;

换句说话说,就是外环PID的输出作为内环PID的输入;

下面是单环PID的伪算法;

  1. previous_error := 0  //上一次偏差 
  2. integral := 0   //积分和 
  3.  
  4. //循环  
  5. //采样周期为dt 
  6. loop: 
  7.  //setpoint 设定值 
  8.  //measured_value 反馈值 
  9.     error := setpoint − measured_value //计算得到偏差 
  10.     integral := integral + error × dt //计算得到积分累加和 
  11.     derivative := (error − previous_error) / dt //计算得到微分 
  12.     output := Kp × error + Ki × integral + Kd × derivative //计算得到PID输出 
  13.     previous_error := error //保存当前偏差为下一次采样时所需要的历史偏差 
  14.     wait(dt) //等待下一次采用 
  15.     goto loop 

那么改成串级PID需要如何操作呢?

具体伪算法如下所示;

  1. previous_error := 0  //上一次偏差 
  2. integral := 0   //积分和 
  3.      
  4. previous_error_inner := 0  //内环PID上一次偏差 
  5. integral_inner := 0   //内环PID积分和 
  6.      
  7.      
  8. //循环  
  9. //采样周期为dt 
  10. loop: 
  11.  
  12.  //外环计算 
  13.  //setpoint 外环设定值 
  14.  //measured_value 外环反馈值 
  15.     error := setpoint − measured_value //计算得到偏差 
  16.     integral := integral + error × dt //计算得到积分累加和 
  17.     derivative := (error − previous_error) / (n*dt) //计算得到微分 
  18.     output := Kp × error + Ki × integral + Kd × derivative //计算得到PID输出 
  19.     previous_error := error //保存当前偏差为下一次采样时所需要的历史偏差 
  20.  
  21.     setpoint_inner = output //外环的PID输出赋值给内环的PID输入 
  22.          
  23.     wait(n*dt) //等待下一次采样 
  24.  goto loop 
  25.  
  26. loop_inner:        
  27.  //setpoint_inner 内环设定值 
  28.  //measured_value_inner 内环反馈值 
  29.     error_inner := setpoint_inner − measured_value_inner //计算得到偏差 
  30.     integral_inner := integral_inner + error_inner × dt //计算得到积分累加和 
  31.     derivative_inner := (error_inner − previous_error_inner) / dt //计算得到微分 
  32.     //计算得到PID输出 
  33.     output_inner := Kp_inner × error + Ki_inner × integral_inner + Kd_inner × derivative_inner  
  34.     previous_error_inner := error_inner //保存当前偏差为下一次采样时所需要的历史偏差 
  35.     wait(dt) //等待下一次采样 
  36.     goto loop_inner 

这里将内环PID的相关变量加了后缀 _inner,loop是外环PID进行周期控制,loop_inner是内环PID进行周期控制,两者相互独立,将外环PID的输出赋值给内环PID的输入即可;

遇到干扰的时候,内环控制器首先进行粗调,外环控制器再进一步细调。

因此控制效果必然优于单环的PID控制系统。

串级控制系统在结构上仅仅比简单控制系统多了一个内环回路,可是实践证明,对于相同的干扰,串级控制系统的控制质量是简单控制系统无法比拟的。

PID参数

串级PID的参数整定基本遵循从内到外,先整定内环PID的参数,再整定外环PID的参数;

根据经验法调试参数,通常来说先整定内环比例参数P,然后整定积分参数I,动态特性可以整理微分参数D,当然还需要对饱和的情况进行处理;

总之可以观察输入输出曲线;

那到底什么样的响应曲线算好的呢?

一般来说并不存在最优的,比如有的对速度和加速度有限制,有的系统一定不能出现超调量等等,有的系统则是响应越快越好。所以还是那句话,我不要你觉得,我要我觉得,合适才是最好的。

总结

本文简单介绍了串级PID的相关概念,以四轴飞行器为例,对比了简单PID和串级PID的优劣;作者能力有限,难免存在错误和纰漏,请不吝赐教。

 

责任编辑:武晓燕 来源: 小麦大叔
相关推荐

2019-08-21 08:25:23

IaaS云计算数据中心

2022-06-16 07:04:12

RedCap5G技术

2023-09-26 00:01:48

DSP光模块技术

2021-10-28 21:54:00

RedCap网络

2023-11-15 18:55:27

2023-08-18 06:51:13

2020-12-22 06:00:12

CDN互联网边缘计算

2020-06-18 07:52:36

云网融合5G

2021-09-03 07:23:59

哈希洪水攻击黑客DDoS

2020-11-10 07:05:41

DockerK8S云计算

2020-09-04 06:34:25

5GTDDGNSS

2020-07-02 14:30:12

SDNSDON交换机

2022-03-17 21:30:31

BRAS宽带服务器

2022-08-05 20:17:44

算力网络计算与网络

2022-04-15 06:47:54

敏捷开发代码开发

2015-12-01 13:33:51

UnikernelLinux运维

2023-10-12 20:43:15

ETSI3GPPFRMCS

2022-05-18 17:12:38

Wi-Fi 6网络技术

2022-11-03 20:19:35

5G专网网络化

2022-02-07 22:55:13

云原生数据库技术
点赞
收藏

51CTO技术栈公众号