智能车中的PID控制

智能车中的PID控制

文章目录

  • 智能车中的PID控制
      • 1.简介
      • 2.位置式pid
      • 3.增量式pid
      • 4.总结

1.简介

小车程序处理对于数据的处理可简化成这样,其中单片机就是小车的核心。智能车中的PID控制_第1张图片
他单片机主要完成:

  • 将传感器采集的数据进行处理

  • 自动控制算法

  • 输出控制信号

    控制算法对小车的性能起了决定性的作用。
    智能车中的PID控制_第2张图片

PID控制,作为一种控制方法被广泛运用在小车控制中。在大多时候你只要会用pid、会调pid,那么这个车你就完成了一半。

2.位置式pid

智能车中的PID控制_第3张图片

我们以小车巡线来介绍位置式pid。这里我们需要实现让小车一直沿着中线前进

为了实现高速巡线,在巡线过程中我们需要让车快速稳定地回到中线。

设小车方向盘的转角为Θ,通过控制Θ就可以实现小车的转向。

我们已知小车偏离中线的距离x,当我们仅仅只考虑这一个参数的时候,我们就可以用比例(Proportion)控制。也就是离中线远方向就打的急,离中线近方向打的缓。
θ = K P x \theta={K_P}x θ=KPx
以时间t为横坐标,以偏差x为纵坐标作图:

智能车中的PID控制_第4张图片

图像中的曲线斜率代表小车横向移动的速度Vx。这里可以看到,当小车快要接近中线的时候,Vx没有明显的下降,而是出现的一个控制滞后的现象。这其实是因为没有考虑小车的质量,也就是质量产生的惯性使他有一个过冲现象。

为了消除这个现象我们可以引入小车的速度Vx(即x的微分Differentiation),在小车横移速度比较快的时候对P产生的控制量 KpX起一个牵制的,可理解为阻尼。相当于在车横移速度比较快的时候轻点一下刹车,去消除过冲现象,踩刹车的轻重与速度成正比。
θ = K P x − K d d x d t \theta={K_P}x-{K_d}{dx\over dt} θ=KPxKddtdx
其实PD控制就是我们通常用来控制巡线的方法。

智能车中的PID控制_第5张图片

这里再介绍一下参数i(Integration)。如果对x积分,那他其实就是X-t坐标图围成的面积。在这里就是对历史偏移量的一个记录,对应物理意义可以是位置偏差的累计,如果将他加入控制中,那么他将起到消除稳态误差的作用,而对于巡线来说,这是一个随动控制系统,消除稳态误差意义不大,而且会使得系统不稳定。所以对于巡线来说我们只采用PD控制器。需要用到i控制的时候,我们也通常对其限幅避免出错。

如果将完整PID形式:
θ = K P x − K d d x d t + K d ∫ x d x \theta={K_P}x-{K_d}{dx\over dt}+{K_d}\int xdx θ=KPxKddtdx+Kdxdx
通常我们这样表示:

u ( t ) = K p e ( t ) + k i ∫ e ( k ) d e + K d d e ( t ) d t u(t)=K_p e(t)+k_i \int e(k)de +K_d {de(t)\over dt} u(t)=Kpe(t)+kie(k)de+Kddtde(t)
u(t):控制量 e(t):偏差

而具体应用到单片机时,我们采集到的不可能是连续的信号,而是每隔5ms,或者10ms的偏差值。这就要进行离散处理。公式如下:
⋆   u ( k ) = K p e ( k ) + k i ∑ e ( k ) + K d ( e ( k ) − e ( k − 1 ) ) \star \ u(k)=K_p e(k)+k_i \sum e(k) +K_d {(e(k)-e(k-1))}  u(k)=Kpe(k)+kie(k)+Kd(e(k)e(k1))
e(k):当前偏差 e(k-1):上一次的偏差

由于d有超前控制的作用,i有滞后效果,所以P可看作对当前的控制,I看作对过去的控制,D看作对未来的控制

3.增量式pid

对于上面的式子如果我们用增量表示每次控制的增加量

u ( k ) = K p e ( k ) + k i ∑ e ( k ) + K d ( e ( k ) − e ( k − 1 ) ) u ( k − 1 ) = K p e ( k − 1 ) + k i ∑ e ( k − 1 ) + K d [ e ( k − 1 ) − e ( k − 2 ) ] u(k)=K_p e(k)+k_i \sum e(k) +K_d {(e(k)-e(k-1))}\\ u(k-1)=K_p e(k-1)+k_i \sum e(k-1) +K_d {[e(k-1)-e(k-2)]}\\ u(k)=Kpe(k)+kie(k)+Kd(e(k)e(k1))u(k1)=Kpe(k1)+kie(k1)+Kd[e(k1)e(k2)]

可以得出增量式pid的公式:

⋆   Δ u = K p [ e ( k ) − e ( k − 1 ) ] + k i e ( k ) + K d [ e ( k ) − 2 e ( k − 1 ) + e ( k − 2 ) ] \star\ \Delta u=K_p [e(k)-e(k-1)]+k_i e(k) +K_d {[e(k)-2e(k-1)+e(k-2)]}  Δu=Kp[e(k)e(k1)]+kie(k)+Kd[e(k)2e(k1)+e(k2)]
这里输出的是每次控制的增加量,而输出也仅仅与最近三次的采集值有关,系统出错或者技术误差对其影响更小。增量式PID常用于带积分的系统,电机速度控制时,在变化控制上加上原来的控制量,相对于对其积分了。

4.总结

在上面的例子,用pid的时候我们不需要知道小车的质量m,打角Θ等物理参数,只需要对系统进行调参得到理想的效果,没有比这更简洁,适用的控制方法了。而它将比例、积分、微分三者的控制量直接相加的,是一种线性控制器。对于复杂的系统比如无动量轮控制的自平衡自行车来说pid调起来就显得明显吃力。所以建议先对控制系统进行分析建模,再结合pid控制。

可以根据实际系统分析进行改进,在某些需用i的系统,可以尝试积分分离的PID和变系数的PID。进一步可以采用模糊PID,能得到比系数不变的pid更好的控制性能。

如果大家想进一步的了解pid以及其他控制理论,那么可以在b站搜索up主 DR_CAN 《自动控制原理》关于pid部分的讲解。

在这里插入图片描述

你可能感兴趣的:(自动驾驶)