暑假期间,对于四旋翼有一点兴趣,没有亲手做,但是看了一些资料。这个系列文章只是对自己看的东西的记录,对于想要学习了解相关知识的同学没有任何参考价值!
本篇是系列的第二部分:介绍了我自己对于串级PID和卡尔曼滤波的理解。
1.串级PID
1.PID的思想
PID可以说是最著名的控制方式,公式如下(离散)
y ( n ) = K P e ( n ) + K i ∑ i = 0 n e ( i ) + K d [ e ( n ) − e ( n − 1 ) ] y(n)=K_Pe(n)+K_i\sum_{i=0}^ne(i)+K_d[e(n)-e(n-1)] y(n)=KPe(n)+Kii=0∑ne(i)+Kd[e(n)−e(n−1)]
y(n)是输出量,e(n)是目标量与输出量之间的误差。PID就是一个输出量和误差之间的函数。
输出量由这么几个部分组成:
1.比例项:以KP为系数,作为当前的误差对于输出的影响,如果误差越大,就要加大输出;
2.积分项:以KI为系数,作为过去误差对于输出的影响,如果累积的误差越大,输出也要考虑;
3.微分项:以KD为系数,作为将来误差对于输出的影响,如果误差变化率越大,我们预计将来的误差也会越大,所以输出也要考虑。
调节参数的影响:
1.KP越大,则被控质量追踪目标量的速度越快,但是被控质量在目标量附近震荡越大;
2.KD越大,则被控质量变换速度减缓,优点在于震荡也会变小,KD有压制KP的作用
3.KI的作用是消除稳差,但是参数不合适也会有累积效应。
2.串级PID
以我参考的开源四旋翼代码为例讲一讲我的理解:
在控制姿态角度时,使用的就是两级PID串联,第一级输入量是当前实际的偏航角度,目标量是遥控器发送的目标角度。也就是使用外环PID来控制角度,输出量自然就是角速度。
但是,飞行器的主控芯片实际能够控制的,只是桨叶的转速大小,而桨叶转速和角速度之间的关系是不确定的。所以就需要增加一个内环,目标量是外环的输出量,输入为当前的角速度,输出是发送给电调的信号。如果桨叶转速和角速度之间有一个明确的公式,那么一层PID就足够了,但是事实是不行。
外环PID一般不加入积分微分,只有比例P。因为添加I后相应变慢,添加D又会引入噪声。
2.卡尔曼滤波
卡尔曼滤波似乎是一个可以很复杂也可以很简单的东西,下面说一下我自己的理解。举个例子:我们一辆以1m/s匀速行驶的小车,开始离墙10m,1s后离墙距离,按照计算是9m。但是传感器的数据是8.9m,那么我应该信任哪个数据呢?合理的方式是结合两个数据,算出概率期望最大的数值。这个过程就是卡尔曼滤波。
1.运动方程和观测方程
x k = f ( x k − 1 , u k ) + w k ( 1 ) z k = h ( x k ) + v k ( 2 ) x_k=f(x_{k-1},u_k)+w_k (1)\\ z_k=h(x_k)+v_k(2) xk=f(xk−1,uk)+wk(1)zk=h(xk)+vk(2)
公式1是运动方程,xk是当前的状态,xk-1是上一个时刻的状态,uk是输入量,wk是噪声。
公式2是观测方程,xk是当前的状态量,zk是观测量,vk是传感器所加入的噪声。
这里要再假设两点:1.马尔可夫性:k时刻的状态只与k-1时刻有关。2.状态xk的概率服从高斯分布。
2.线性系统与卡尔曼滤波
假设状态方程与观测方程都是线性的
x k = A k x k − 1 + u k + w k z k = C k x k + v k x_k=A_kx_{k-1}+u_k+w_k\\z_k=C_kx_k+v_k xk=Akxk−1+uk+wkzk=Ck