首页 理论教育开源飞控中的优化PID算法实现

开源飞控中的优化PID算法实现

【摘要】:开源飞控为我们提供了丰富的研究、实践、学习资料。为了平衡硬件与算法实践难度,本小节会以Multiwii开源飞控为例,挑选2.3版本控制器实现的部分代码与大家一同分析。完整代码或其他开源算法中的实现过程,大家可以通过互联网找到。在控制器设计中往往会涉及三个方面:误差的获取,基于误差的算法实现,控制信号的生成和输出。代码中errorGyroI[axis]+error体现了上一小节中积分运算的程序实现方式。

开源飞控为我们提供了丰富的研究、实践、学习资料。分析由全球无人机爱好者、研究者、工作者共同完成的代码,会在很多方面对我们产生帮助,同时也为大家提供了很好的平台去锻炼自己的实际工程能力,写出好的算法,做出好的系统与来自全世界的朋友分享。

为了平衡硬件与算法实践难度,本小节会以Multiwii开源飞控为例,挑选2.3版本控制器实现的部分代码与大家一同分析。完整代码或其他开源算法中的实现过程,大家可以通过互联网找到。

在控制器设计中往往会涉及三个方面:误差的获取,基于误差的算法实现,控制信号的生成和输出。在这其中“误差”的作用和意义犹如散文中“形散而神不散”的“神”,让我们借着它轻松理解整个算法结构。可以看到下面的代码:

error =rc-imu.gyroData[axis];

errorGyroI[axis] =constrain(errorGyroI[axis]+error,-16000,+16000);

这两行代码的作用是通过陀螺仪传回的数据,计算无人机角速度的误差。其中constrain为限幅函数,constrain(a,b,c),是将三个输入变量中的a限制在b,c组成的区间中。代码中errorGyroI[axis]+error体现了上一小节中积分运算的程序实现方式。

ITerm =(errorGyroI[axis]>>7)∗conf.pid[axis].I8>>6;

PTermACC=((int32_t)errorAngle∗conf.pid[PIDLEVEL].P8)>>7;

在这段代码中ITerm和PTermACC分别是PI控制器中的积分项和比例项。其中ITerm等号右边的代码中的errorGyroI[axis]即为三个误差的积分项,conf.pid[axis].I8实际上是PI控制器中的积分项系数Ki,因此ITerm的整个计算代码本质上就是计算了控制量的积分部分:ui。而PTermACC对应的代码就是计算控制器的比例部分:up,其中errorAngle为对应的角度误差,conf.pid[PIDLEVEL].P8则是飞控设置中写入的比例项系数Kp

上面两段代码虽然很简单,可当我们真正进行代码实现时,必须熟悉所使用的语言工具,了解其中的语法规则和计算规则,并能够从中抽象出控制器结构,或者把控制器结构用合适的代码表示出来,还要注意对于编程而言非常重要的格式、注释习惯等,这些内容都需要读者慢慢在实践中进行积累。(请思考问题:上面这些内容哪些是你工作中需要的?哪些你并不需要?)