智能车中的PID控制
1.简介
小车程序处理对于数据的处理可简化成这样,其中单片机就是小车的核心。 他单片机主要完成:
-
将传感器采集的数据进行处理 -
自动控制算法 -
输出控制信号 控制算法对小车的性能起了决定性的作用。
PID控制,作为一种控制方法被广泛运用在小车控制中。在大多时候你只要会用pid、会调pid,那么这个车你就完成了一半。
2.位置式pid
我们以小车巡线来介绍位置式pid。这里我们需要实现让小车一直沿着中线前进。
为了实现高速巡线,在巡线过程中我们需要让车快速、稳定地回到中线。
设小车方向盘的转角为Θ,通过控制Θ就可以实现小车的转向。
我们已知小车偏离中线的距离x,当我们仅仅只考虑这一个参数的时候,我们就可以用比例(Proportion)控制。也就是离中线远方向就打的急,离中线近方向打的缓。
θ
=
K
P
x
\theta={K_P}x
θ=KP?x 以时间t为横坐标,以偏差x为纵坐标作图:
图像中的曲线斜率代表小车横向移动的速度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}
θ=KP?x?Kd?dtdx? 其实PD控制就是我们通常用来控制巡线的方法。
这里再介绍一下参数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
θ=KP?x?Kd?dtdx?+Kd?∫xdx 通常我们这样表示:
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)=Kp?e(t)+ki?∫e(k)de+Kd?dtde(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)=Kp?e(k)+ki?∑e(k)+Kd?(e(k)?e(k?1)) 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)=Kp?e(k)+ki?∑e(k)+Kd?(e(k)?e(k?1))u(k?1)=Kp?e(k?1)+ki?∑e(k?1)+Kd?[e(k?1)?e(k?2)]
可以得出增量式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(k?1)]+ki?e(k)+Kd?[e(k)?2e(k?1)+e(k?2)] 这里输出的是每次控制的增加量,而输出也仅仅与最近三次的采集值有关,系统出错或者技术误差对其影响更小。增量式PID常用于带积分的系统,电机速度控制时,在变化控制上加上原来的控制量,相对于对其积分了。
4.总结
在上面的例子,用pid的时候我们不需要知道小车的质量m,打角Θ等物理参数,只需要对系统进行调参得到理想的效果,没有比这更简洁,适用的控制方法了。而它将比例、积分、微分三者的控制量直接相加的,是一种线性控制器。对于复杂的系统比如无动量轮控制的自平衡自行车来说pid调起来就显得明显吃力。所以建议先对控制系统进行分析建模,再结合pid控制。
可以根据实际系统分析进行改进,在某些需用i的系统,可以尝试积分分离的PID和变系数的PID。进一步可以采用模糊PID,能得到比系数不变的pid更好的控制性能。
如果大家想进一步的了解pid以及其他控制理论,那么可以在b站搜索up主 DR_CAN 《自动控制原理》关于pid部分的讲解。
|