四轴飞行器1.5 各种PID对比分析及选择
原创文章,欢迎转载,转载请注明出处
这篇文章主要介绍我对PID的理解,以及选择PID算法的过程。
一 PID的理解和学习过程
二 飞控的PID效果
先上个飞控PID的响应的视频:介绍在后面
地址:http://v.youku.com/v_show/id_XNzYxMTI1NzA4.html
一 PID的理解和学习过程
什么是PID呢?查维基百科可以知道:
PID是以它的三种纠正算法而命名的。这三种算法都是用加法调整被控制的数值,其输入为误差值(设定值减去测量值后的结果)或是由误差值衍生的信号。这三种算法是[1]:
- 比例- 来控制当前,误差值和一个正值的常数P(表示比例)相乘。P只是在控制器的输出和系统的误差成比例的时候成立。比如说,一个电热器的控制器的比例尺范围是10°C,它的预定值是20°C。那么它在10°C的时候会输出100%,在15°C的时候会输出50%,在19°C的时候输出10%,注意在误差是0的时候,控制器的输出也是0。
- 积分 - 来控制过去,将误差值过去一段时间和(误差和)乘以一个正值的常数I。I从过去的平均误差值来找到系统的输出结果和预定值的平均误差。一个简单的比例系统会震荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正。通过加上一个负的平均误差比例值,平均的系统误差值就会总是减少。所以,最终这个PID回路系统会在预定值稳定下来。
- 微分 - 来控制将来,计算误差的一阶导,并和一个正值的常数D相乘。这个导数的控制会对系统的改变作出反应。导数的结果越大,那么控制系统就对输出结果作出更快速的反应。这个D参数也是PID被称为可预测的控制器的原因。D参数对减少控制器短期的改变很有帮助。一些实际中的速度缓慢的系统可以不需要D参数。
经典PID就如上所诉,计算机运算的时候是使用的离散公式,因此引申出来了位置式和增量式PID。。
位置式PID的公式为: 
增量式的公式为: 
PID算法有个弊端,调节出来的P I D三个参数是针对固定的模型的。
想象以下,我们手去拿手机的过程,根据PID的参数可以理解为,在手机距离我们远的时候,我们使用的力量就大一些,而当近的时候力就小一些,当PID三个参数调节的很好的时候,这个过程可以很顺利的完成,什么叫超调呢?就是假如P给定的太大,那就是说我们手用的力就会大些,等手机到拿到胸口了,因为之前用力过大,速度太大,导致停不下来,就会触碰到身体,这就是超调了。再想想下,还是用之前那手机的时候调节好的PID参数,这次是拿一块金砖,会有怎样的结果?没错,拿不动,根据值钱的P,在距离乘P的力量下,是不够拿动金装的,这个时候好像只能靠I参数的积分来解决问题了,不过这并不是好的办法,而且效果是非常不理想的,积分需要不少时间来增加这个力量。。
说到积分,我们说说为什么不试用增量式的PID。在实验中,我们试用专家PID的参数,在给定的采样时间里面(后面有图)它可以工作的很好,但是当我们把采样时间增加10倍以后,系统会正当,我的理解就是在规则2中使用了增量式PID,然后系统给的模型惯性可能比较大,我们采样间隔很短的情况下,增量会比较大,所以会导致输出过大,从而震荡。
继续说上面我们手拿手机的问题,想想我们自己拿东西的时候到底是怎么操作的。。。我们不可能会拿手机了而拿不动金砖吧,额。。要是这样我也没什么可说的了。。具体看后面图4后面的解释。
专家PID可以参考百度文库的:http://wenku.baidu.com/view/77c113260722192e4536f6dd.html
先把图放上来,后面再解释。所有图的PID三个参数都是一样的,系统模型(传递函数)也是相同的。
图1和图2如下:

图1

图2
图1和图2唯一的区别就是图2的采样时间是图1的10倍,为什么专家PID会出现震荡,前面已经说过了。。
针对图1我们来说说各个PID我们都进行了怎样的更改。
专家PID表现的相当好,具体可以参看上面给的网址中的内容。经典PID和改进的PID的区别。。首先我们希望尽快达到目标值,超调越少约好并且可以任意时刻都不发散,都是收敛的一个控制系统,I是不利于提前达到目标值的,所以我们将PID进行比例和积分分离,例如可以在距离误差大于80%输出1.5倍的P,然后60%1.3倍P等,当误差小于30%或者什么数值的时候采用0.8倍的P,然后在误差下于5%甚至更小的时候再假如积分环节,同时在误差大于60%的时候使用D,让系统更快接近目标值,从图1中的曲线中可以看到效果还是不错的。根据上面的图形,不管怎么样,采样时间控制好我们还是希望使用专家PID的,因为他的效果更好。。可是,我们看看下面的图,当目标数值是动态的,需要系统跟踪的时候,我们看看特闷的表现:
图3:

图3
可以看到专家PID发生了震荡。。。。问题也处在规则2和规则3上。。。
我们将规则2和规则3进行修改后,专家PID也可以很好的跟踪上了如图4,如下:

图4
图4和图3中专家PID的区别在于我们对规则2的修改,在规则2中,我们判断了目标数值的变化,如果没变化,我们不采用增量的方式,否则采用增量的方式就可以解决上诉跟踪震荡的问题。。不过暂时还不敢拿到飞控上实验。。我们打算还是先用传统PID,然后用比例积分分离和分段比例控制
再回到我们手拿手机的问题,想想我们是怎样又可以拿手机又可以拿金砖的?首先我们肯定不是根据距离通过比例来控制力量的?那是什么?没错,那就是速度。。拿过来的速度。。。我们希望拿过来的时候保持匀速拿过来,速度不够我们就大点力,速度快了我们就小点力。。没错吧。。更细分点,就是远的时候我们希望拿过来的速度快点,近了我希望它慢点。。综合起来我们的算法应该怎样呢,方法可以描述如下:
让P能够自动变换,想法是通过误差的变化速率来调整P,变化速率达到我设定的数值我就让P保持,然后不够就增加P。。这个通过变化速率控制P同时根据误差的大小来调整他的作用权值。。比例 积分 分开。。后期才开积分。。为什么希望让P可以自动变换呢?是这样的,对于一架已经调好PID的四轴飞行器,如果你外挂了什么物品上去,导致飞机重心不在中间,那么之前调好的PID将不再适用,轻则导致飞机飞的过程中控制会一边灵活一边笨重,重则飞机直接往一边偏。炸机的节奏。。在高空如果碰到稍微i强一点的侧风的时候,也会。。。。。。。。。但是如果可以根据误差变化速度来动态调节PID的参数,那这些问题都将不是问题。。。
效果如下图所示:

我们可以看到P的增加,然后效果并没有想象的好,这个指示一个思路,现在是先要简单暴力的把飞机做出来。。我们后期可以再想办法解决这个问题。。不过我们请教了猞猁大神,他高速我,这个东西调好了,可以很快达到稳定,但是容易像专家PID一样,在跟踪或者一有扰动的情况下会震动,然后发散。。。不过确实有这样的PID控制器,这个想法的最终形态就是Gain-Scheduled PID ,中文好像叫做模糊PID控制。。。估计有机会,要一直弄到模糊PID控制为止了。。路还很长哈。。
二 飞控的PID效果

上图蓝色的为PID的输出,红色为实际数值。绿色为目标值,后面好像之所以偏离中间目标值点的原因是I积分的作用。。。
四轴飞行器1.5 各种PID对比分析及选择的更多相关文章
- 四轴飞行器飞行原理与双闭环PID控制
四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...
- 面向企业级的开源WebGIS解决方案--MapGuide(对比分析)
在技术特点.功能.架构等方面,MapGuide与其他WebGIS产品有什么区别?本文主要从此角度来介绍MapGuide的特性,以供参考. 本人选择了比较熟悉的几款WebGIS产品:MapServ ...
- 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法
四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法 原创文章,欢迎转载,转载请注明出处 最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...
- MiniFly四轴飞行器之部分系统及电源分析
最近硬件四轴很火,了解了很久,还是选择了MiniFly,主要还是资料多,后边可以有人讨论,不像很多就是建了个群,研究问题还是在论坛方便很多. 四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- wait、notify、sleep、interrupt对比分析
对比分析Java中的各个线程相关的wait().notify().sleep().interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程:(类方法) yield:暂停 ...
- Android和Linux应用综合对比分析
原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...
- GitHub & Bitbucket & GitLab & Coding 的对比分析
目前基于 Git 做版本控制的代码托管平台有很多种,比较流行的服务有 Github.Bitbucket. GitLab. Coding,他们各自有什么特点,个人使用者和开发团队又该如何选择? 在这篇文 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
随机推荐
- OCP prepare 20140703
1. trim trim('aaa' from 'aaabbbccc') 这个是错误的.ora-30001: trim set should have only one character 2. in ...
- mysql-5.7.10-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法
总结报错原因:在my.init文件下新增data目录(datadir = F:\mysqldata ) 最新解压版本的mysql 解压安装的时候报错D:\mysql\mysql-5.7.10-wi ...
- ecmall 点滴记录
/* 取得列表数据 */ $model_wish =& m('wish'); $wish= $model_wish->find(array( 'conditions' => 'us ...
- C++学习笔录2
1.如果一个类要成为基类,那么它的成员变量声明成受保护的变量,既用关键字protected修饰. 2.处理共同继承产生的二义性:采用虚继承方式,当出现两个相同的成员时,编译器会自动删除其中一个.其方法 ...
- OpenCV系列--摄像头控制的简单代码
操作系统:windows xp 开发工具:VS2008 opencv版本:2.1.0 依赖库:OpenCV2.1\lib\highgui.lib #include "cv.h" # ...
- [LeetCode]题解(python):150-Evaluate Reverse Polish Notation
题目来源: https://leetcode.com/problems/evaluate-reverse-polish-notation/ 题意分析: 给定一个数组,用这个数组来表示加减乘除,例如 [ ...
- C 中注意的小问题
输入:char ch[100],gets(ch); scanf("%d",&in); char ch,ch=getchar(); VC: 所有变量声明放在所有操作前面: ...
- 【Chromium中文文档】跨平台开发的约定与模式
跨平台开发的约定与模式 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/C ...
- 18.java.lang.OutOfMemoryException
java.lang.OutOfMemoryException内存不足错误 当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误.
- Python调用C/C++的种种方法
Python调用C/C++的种种方法 2010-12-07 09:59 28433人阅读 评论(1) 收藏 Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面 ...