原创文章,欢迎转载,转载请注明出处

这篇文章主要介绍我对PID的理解,以及选择PID算法的过程。

一 PID的理解和学习过程

二 飞控的PID效果

先上个飞控PID的响应的视频:介绍在后面

地址:http://v.youku.com/v_show/id_XNzYxMTI1NzA4.html

一 PID的理解和学习过程

什么是PID呢?查维基百科可以知道:

  PID是以它的三种纠正算法而命名的。这三种算法都是用加法调整被控制的数值,其输入为误差值(设定值减去测量值后的结果)或是由误差值衍生的信号。这三种算法是[1]

  1. 比例- 来控制当前,误差值和一个正值的常数P(表示比例)相乘。P只是在控制器的输出和系统的误差成比例的时候成立。比如说,一个电热器的控制器的比例尺范围是10°C,它的预定值是20°C。那么它在10°C的时候会输出100%,在15°C的时候会输出50%,在19°C的时候输出10%,注意在误差是0的时候,控制器的输出也是0。
  2. 积分 - 来控制过去,将误差值过去一段时间和(误差和)乘以一个正值的常数II从过去的平均误差值来找到系统的输出结果和预定值的平均误差。一个简单的比例系统会震荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正。通过加上一个负的平均误差比例值,平均的系统误差值就会总是减少。所以,最终这个PID回路系统会在预定值稳定下来。
  3. 微分 - 来控制将来,计算误差的一阶导,并和一个正值的常数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对比分析及选择的更多相关文章

  1. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  2. 面向企业级的开源WebGIS解决方案--MapGuide(对比分析)

    在技术特点.功能.架构等方面,MapGuide与其他WebGIS产品有什么区别?本文主要从此角度来介绍MapGuide的特性,以供参考.    本人选择了比较熟悉的几款WebGIS产品:MapServ ...

  3. 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

    四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...

  4. MiniFly四轴飞行器之部分系统及电源分析

    最近硬件四轴很火,了解了很久,还是选择了MiniFly,主要还是资料多,后边可以有人讨论,不像很多就是建了个群,研究问题还是在论坛方便很多. 四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究 ...

  5. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  6. wait、notify、sleep、interrupt对比分析

    对比分析Java中的各个线程相关的wait().notify().sleep().interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程:(类方法) yield:暂停 ...

  7. Android和Linux应用综合对比分析

    原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...

  8. GitHub & Bitbucket & GitLab & Coding 的对比分析

    目前基于 Git 做版本控制的代码托管平台有很多种,比较流行的服务有 Github.Bitbucket. GitLab. Coding,他们各自有什么特点,个人使用者和开发团队又该如何选择? 在这篇文 ...

  9. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

随机推荐

  1. 转 C#String与string的区别

    C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识. MSDN中对string的说明:string is an ali ...

  2. lightoj 1064 Throwing Dice

    题意:给你n个骰子,求n个骰子的和不小于x的概率. 刚开始想每给一组数就计算一次~~太笨了- -,看了别人的代码,用dp,而且是一次就初始化完成,每次取对应的数据就行了.WA了好多次啊,首先不明白的就 ...

  3. PHP搭建简单暴力的mvc

    对于一个web系统来说,我们使用mvc很必要, 给我们带来的是清晰的结构,易运维,易扩展, mvc 我对其的理解应该叫mxvc, 多了一个x , 这个x代表什么,x可以理解为 relay,proxy, ...

  4. JVM学习之GC常用算法

    出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...

  5. oracle 取头十条数据

    select * from(select * from table order by age)where rownum < 11

  6. Nginx+PostgreSQL+Django+UWSGI搭建

    最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI ...

  7. 50行实现简易HTTP服务器

    话说由于一直很懒,所以博客好像也没怎么更新...今天有空就写一下吧. 最近在看node.js的时候开始对http协议感兴趣了,毕竟node一开始就是为了做web服务器而产生的.于是试着想了一下大概的思 ...

  8. IOS 访问系统粘贴板

    粘贴板提供了一种核心OS特性,用于跨应用程序共享数据.用户可以跨应用来复制粘贴,也可以设置只在本应用中复制粘贴用来保护隐私. UIPasteboard类允许访问共享的设备粘贴板以及内容,下面代码返回一 ...

  9. 调bug时候应该提高思维深度(多问二十个为什么)

    版权声明:本文为博主原创文章,未经博主允许不得转载. (一)关于思维深度 读书时 有的人做一份卷子有一份卷子的收获 有的人做100张卷子只有一份卷子的收获 写代码时 有的人调一个Bug可以收获多方面的 ...

  10. delphi 关于命名

    请告别 TMyXXX 的命名方法吧... 程序名: Demo.exe 窗体:TFrmDemo ,窗体文件 uFrmDemo.Pas DataModule: TDMDemo, 窗体文件 uDMDemo. ...