平衡小车的一些常见问题总结

1、基本理论

PID控制

pid控制值对偏差进行比例,积分和微分的控制,分别是三个部分,对应为比例单元,积分单元和微分单元。
三个单元的作用可以简单的称为:

  • 比例项:提高响应速度,减小净差。
  • 积分项:减小稳态误差,因为只要有误差存在,只要有偏差,就会不断地使得积分作用越来越强。
  • 微分项:减小系统的震荡和超调现象。

2、直立环速度环串级pid

这里要注意一点就是串级pid有一般会有一个环起到比较重要的作用,而另一个环只是辅助这个环的,比如这个系统中的直立环就是这样的。

直立环的理论简单来说就是车子往那边倒下就往那边移动:

在这里插入图片描述
用公式来表达就是:

a = b 1 ∗ θ + b 2 ∗ θ ' a=b1*\theta +b2*\theta \text{'} a=b1θ+b2θ

上面这个是使用到了比例微分控制,在这个系统中误差是角度,角度的变化量正好是角速度,所以这里甚至可以直接将角速度作为输入参数来进行计算,而不用我们去求取微分,当然直接套用经典的pid公式来求微分也没什么问题。

但是这样小车还是不能很好的平衡,因为单独直立环只是让 小车角度趋近0,小车还是可以在水平地面上移动,理论上是可以保持角度为0不变的,因此就需要引入速度环,那么在这个串级系统中的作用就是:

  • 角度环:小车角度趋于0
  • 速度环:电机速度趋于0

最终的控制系统这里用平衡小车之家的一张图来看,如下所示:

在这里插入图片描述

PID串级控制中,最外环是输入是整个控制系统的期望值,外环PID的输出值是内环PID的期望值。,因此在这个系统中速度环是外环,正如图中所展现的,内环为直立环,内环是最核心的一个环。

其中每个环的作用效果如下所示:

速度环输入:1、给定速度 2、速度反馈
输出:角度值(这里注意为什么是角度值,因为他是直立环的期望速度)

直立环输入:1、给定角度(速度环输出) 2.角度反馈
输出:PWM(小车的控制变量)

那么关于这个串级系统(也可以衍生到其他的串级控制系统上来)

速度期望在外环,属于最初需求。角度环是最内环具有决定性作用,速度环的目的只是改变期望角度,以达到“能适应速度=0”的绝对角度的姿态。

对于我们这个系统来说:

假设初始期望为0度,系统运行,手指后推车体(外部扰动),车子首先后退(产生负速度)这个时候速度环起作用,产生负输出,进而角度环动态期望变为负值。又因为当前实际是0度,所以接下来车体会整体前倾,准备向前跑以回正,当向前跑后车体回正,速度此时也为0,故速度环输出也为0,即角度环动态期望也变为0。

3、代码差异的解释

可以看到平衡小车之家的pid用的是两个部分的pid进行直接叠加的方式:

在这里插入图片描述

但是按照我们的理解应该是这样的:
在这里插入图片描述

下面对代码进行一下分析:

单纯直立环输出的情况如下:

V e r t i c a l    o u t = K p 1 ∗ ( θ r − θ e ) + K d ∗ ( θ r − θ e ) ' Vertical\,\,out=Kp1*(\theta _r-\theta _e)+Kd*(\theta _r-\theta _e)\text{'} Verticalout=Kp1(θrθe)+Kd(θrθe)

单独速度环的输出如下:

V e l o c i t y    o u t = K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) Velocity\,\,out=Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e) Velocityout=Kp2(ErEe)+KiΣ(ErEe)

这里假设速度环输出就是目标角度,也就是:

θ e = V e l o c i t y    o u t \theta _e=Velocity\,\,out θe=Velocityout

将上面的式子带入,可得:

V e r t i c a l    o u t = = K p 1 ∗ θ r − [ K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) ] + K d ∗ ( θ r − θ e ) ' = K p 1 ∗ θ r − K p 1 ∗ K p 2 ∗ ( E r − E e ) − K p 1 ∗ K i ∗ Σ ( E r − E e ) + K d ∗ ( θ r − θ e ) ' = K p 1 ∗ θ r + K d ∗ ( θ r − θ e ) ' − K p 1 ∗ [ K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) ] Vertical\,\,out=\\=Kp1*\theta _r-[Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e)]+Kd*(\theta _r-\theta _e)\text{'}\\=Kp1*\theta _r-Kp1*Kp2*(E_r-E_e)-Kp1*Ki*\varSigma (E_r-E_e)+Kd*(\theta _r-\theta _e)\text{'}\\=Kp1*\theta _r+Kd*(\theta _r-\theta _e)\text{'}-Kp1*[Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e)] Verticalout==Kp1θr[Kp2(ErEe)+KiΣ(ErEe)]+Kd(θrθe)=Kp1θrKp1Kp2(ErEe)Kp1KiΣ(ErEe)+Kd(θrθe)=Kp1θr+Kd(θrθe)Kp1[Kp2(ErEe)+KiΣ(ErEe)]

也就是最终的输出为:

K p 1 ∗ 真实角度 + K d ∗ 角度偏差的微分 − K p 1 ∗ [ K p 2 ∗ 编码器偏差 − K i ∗ 编码器偏差的积分] Kp1*\text{真实角度}+Kd*\text{角度偏差的微分}-Kp1*[Kp2*\text{编码器偏差}-Ki*\text{编码器偏差的积分]} Kp1真实角度+Kd角度偏差的微分Kp1[Kp2编码器偏差Ki编码器偏差的积分]

可以再化简一下,就是:

K p 1 ∗ 真实角度 + K d ∗ 角度偏差的微分 − ( K p 1 ∗ K p 2 ) ∗ 编码器偏差 − ( K p 1 ∗ K i ) ∗ 编码器偏差的积分 Kp1*\text{真实角度}+Kd*\text{角度偏差的微分}-\text{(}Kp1*Kp2\text{)}*\text{编码器偏差}-\text{(}Kp1*Ki\text{)}*\text{编码器偏差的积分} Kp1真实角度+Kd角度偏差的微分Kp1Kp2编码器偏差Kp1Ki编码器偏差的积分

这就说明了为什么他们两个可以进行简单叠加,因为这样最后算的结果也是一样的!

在这里插入图片描述

注:上面的部分参考了b站up主视频:

https://www.bilibili.com/video/BV1j7411z7uX?spm_id_from=333.337.search-card.all.click

4、转向环

关于转向环,这是一个独立起来的单环,他的目标仅仅是对转动的角度进行控制,可以看到使用转向环的代码最终也是当成一个叠加量放到了最后,这是多个比较独立的pid一起作用的时候比较常见的方法。

在这里插入图片描述

甚至如果我们对于转向环精度要求不是很高的情况下,转向环甚至只用比例控制即可,都可以不需要使用多个参数进行控制了。

那么为什么转向环没有进入到三个环进行三个环的串级来进行计算呢

这里我们就可以来考虑串级pid的思想,什么时候可以用 串级pid,什么时候不可以,以及这个系统的输入输出是什么的问题,针对这个系统,可以理解为:

  • 既然是串联,必然需要前面和后面有耦合联系,如果只有一条通路,那前面的输出就一定要是后面的输入。
  • 直立环和速度环都是针对一个轴。转向环是最次要闭环并且去掉也不影响最原始目标:直立。

猜你喜欢

转载自blog.csdn.net/m0_51220742/article/details/125540130