四轴飞行器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的源码实现分析性能结果,总结结论. 通过本文你可以 ...
随机推荐
- redis memcache
谈谈Memcached与Redis(一) 1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高 ...
- leetcode LRU Cache python
class Node(object): def __init__(self,k,x): self.key=k self.val=x self.prev=None self.next=None clas ...
- java InputStream使用
InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中read()方法是一次读取一个字节,效率 ...
- OSG事件回调
OSG中的节点主要使用回调(CallBack)来完成用户临时.需要每帧执行的工作.根据回调功能被调用的时机划分为更新回调(Update CallBack)和人机交互时间回调(Event CallBac ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(五)
目的: 1. 了解PCI的基本知识,为完成watchdog的设备做准备. 准备知识: 简单的说,PCI 设备分3个空间. 配置空间,IO空间,内存地址空间. PCI设备厂家决定了外设是使用IO空间还是 ...
- maintenance ShellScripts
1.Linux挂载Winodws共享文件夹 2.查看http的并发请求数及其TCP连接状态: 3.用tcpdump嗅探80端口的访问看看谁最高 4.统计/var/log/下文件个数 5.查看当前系统每 ...
- kafka学习(二)-zookeeper集群搭建
zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...
- java--jsp+ssh+select动态结合数据和选择(解)
在三层体系结构和jsp合并项目,如何实现select动态绑定数据和动态选择指定的行?让我们来看看下面的: 1.首先定义一个Bean分类.它用于实例select的结合数据中的每一个id和name: pu ...
- Unity 3d 实施刚体力
1.选中已经添加了刚体的物体,然后添加恒定力组件. 此组件可以给刚体中添加恒定的力或扭矩力,常用于一次性发射的刚体,如模拟火箭的发射.这种物体的初始速度不是很大,但是随着时间的推移,加速度会越来越大. ...
- Node.cloneNode()方法
概述 返回调用该方法的节点的一个副本. 语法 var dupNode = node.cloneNode(deep);node将要被克隆的节点dupNode克隆生成的副本节点deep 可选是否采用深度克 ...