阅读目录
1.PID介绍及原理
2.常用四轴的两种PID算法讲解(单环PID、串级PID)
3.常用PID算法的C语言实现
5.常用的四轴飞行器PID算法
PID介绍及原理
PID介绍
在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,也是最经典的算法。
现在已经演变出很多智能的算法,如蚁群,神经网络等,感兴趣可以看一下刘金琨老师的《先进pid控制》
PID算法的一般形式:
通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻):
偏差控制被控制量
偏差的控制过程;
伪代码:
串级PID
上述角度单环PID控制算法仅仅考虑了飞行器的角度信息,如果想增加飞行器的稳定性(增加阻尼)并提高它的控制品质,我们可以进一步的控制它的角速度,于是角度/角速度-串级PID控制算法应运而生。在这里,相信大多数朋友已经初步了解了角度单环PID的原理,但是依旧无法理解串级PID究竟有什么不同。其实很简单:它就是两个PID控制算法,只不过把他们串起来了(更精确的说是套起来)。那这么做有什么用?答案是,它增强了系统的抗干扰性(也就是增强稳定性),因为有两个控制器控制飞行器,它会比单个控制器控制更多的变量,使得飞行器的适应能力更强。为了更为清晰的讲解串级PID,这里笔者依旧画出串级PID的原理框图,如图所示:
伪代码:
常用PID算法的C语言实现
位置型PID的C语言实现:
第一步:定义PID变量结构体,代码如下:
struct _pid{
}pid;
第二部:初始化变量,代码如下:
void PID_init(){
}
第三步:编写控制算法,代码如下:
float PID_realize(float speed){
}
注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。
int main(){
return 0;
}
增量型PID的C语言实现:
实现过程仍然是分为定义变量、初始化变量、实现控制算法函数、算法测试四个部分,
#include<stdio.h>
#include<stdlib.h>
struct _pid{
}pid;
void PID_init(){
}
float PID_realize(float speed){
}
int main(){
}
积分分离的PID控制算法C语言实现:
在普通PID控制中,引入积分环节的目的,主要是为了消除静差,提高控制精度。但是在启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,导致控制量超过执行机构可能允许的最大动作范围对应极限控制量,从而引起较大的超调,甚至是震荡,这是绝对不允许的。
if(abs(pid.err)>200)
//算法具体实现过程可参考上面的
抗积分饱和的PID控制算法C语言实现:
float PID_realize(float speed){
}
变积分的PID控制算法C语言实现:
}
常用的四轴飞行器PID算法
四轴飞行器常用PID组合:
效果:简单暴力,但是补滤波效果差,单级PID响应慢,打舵跟随效应差。
效果:卡尔曼滤波噪声偏大,滞后略微严重,单级PID难操作,打舵响应慢,跟随效应差。不过比较适合初学四轴的人,难度比四元数加串级PID版本低,易于理解。
常用PID:
此外,网上的版本多是用反正弦函数解算的,那样其实是错的,假使我要解算物体在XZ坐标轴所构成的平面的角度时朝Y轴偏移了一点,那么解算出来的值就是错的,原因自己画图想想吧。
一般情况下来讲,陀螺仪比加速度计的比值取值为0.95:0.05或0.98:0.02。当然也可以根据实际情况降低陀螺仪的比重。
单级PID整定方法参见我写的第一篇帖子!
refer:
https://blog.csdn.net/gen_ye/article/details/52534609
http://bbs.elecfans.com/jishu_1615869_1_1.html
https://blog.csdn.net/mish84/article/details/51062165
更多阅读:
位置式PID与增量式PID的区别:http://www.elecfans.com/dianzichangshi/20171124585738.html
卡尔曼滤波的原理说明,附源代码 :http://bbs.elecfans.com/jishu_484128_1_1.html
【开源】分享一个经典的串级PID算法,附源代码 :http://bbs.elecfans.com/jishu_486485_1_1.html
教你在单片机上套公式实现卡尔曼滤波器 ;http://bbs.elecfans.com/jishu_484132_1_1.html
四元数互补滤波(目前匿名等四轴也是用这个解算方):http://bbs.elecfans.com/jishu_4757431_1.html