热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PID控制理論(2)-Pcontrol

作者J.Slukahttp:www.inpharmix.comjpsPID_Controller_Fo
384009_3810124224093_732240060_n
作者J. Sluka
http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html
準備好了上前一篇所說的機器人平台之後。
接著就準備開始控制了,但是我們還不會這麼快就進入PID控制,我們會先使用一個最簡單的控制方式,也就是”非黑即白”的控制方式,首先我們的紅外線模組,可以藉由讀取到不同比例的紅外線反射量來判別是否為黑線,如圖片一,我用數字來舉例,當紅外線感測器放在完全黑色的線上面,感測器讀取到40,而當放在完全白色的地毯上的時候,感測器讀取到50,而當我有一半看到黑色,有一半看到白色的時候則會讀取到45,因為讀取進來的紅外線反射量恰好是白色反射和黑色反射的平均值。
圖一
經過簡單的測量知道,當數字越接近40則表示車子越靠右黑線區域),當數字越大越接近50時,則表示車子越靠近左(白線區域),而當車子偏左時,得下指令給車子向右邊走,反之亦然,這邊使用簡單的二分法來決定偏左或是偏右,就是剛剛的黑白平均值(50+40)/2 = 45,這個數值我們稱為offset,當紅外線小於45則我要讓車子左轉,大於的時候要右轉,如圖二。
  light_number_line
圖二
由於是為了沿著黑線前進,關於馬達該下什麼樣的指令,不同的馬達有不同的方式,這邊使用馬達的動力百分比來表示轉速,作者J. Sluka說道,當使用這種方式走直線的時候盡可能讓車子走的不要太快,要走的溫柔一點,否則會有衝出去黑線的情況常常發生(或許看到這邊的時候,各位的車子早就衝出去好幾次了也說不定。
車 子要直走很簡單,只要讓馬達都往前旋轉即可,但是要轉彎怎麼辦?兩輪平台又和我們一般的車子不同,沒有方向盤這種東西,可以去帶動轉向機構。說的沒錯,然 而這樣的機器車平台,比較像是坦克車,只有兩條履帶,但是卻能夠前後左右甚至原地旋轉,以向左轉為例,將右邊的輪子給予50%power,左邊則是給予20%power,此刻車子就會慢慢向左邊前進,或是右邊給30%,左邊給0%,車子就會轉左邊靠近,但不太會往前,後者就是相對於前著更溫柔的走法,更不容易跑出去黑線之外。
其 實走黑線車的最基本架構就是這樣,這就是一台循跡自走車了,但是當你坐好的時候你會感覺十分的氣餒,因為雖然會沿著黑線走,但是實在走的不是很好,總是抖 來抖去的,而且常常還是會跑出去,甚至他在直線的部分其實也未曾走過真正的直走,那何不再多另外弄出一個判別區段是直走呢?沒錯,從這邊開始就是準備和PID接軌的第一步,在此之前全部都是概念和簡單的實作方式,如下圖三,中間多出一塊區域判別走,只有在真的Error很多的時候開始左轉或是右轉,多了這項判別,你將會發現車子的抖動變小了,至少會有一些時候真正開始走直線了。
light_number_line_2
圖三
此刻,你會突然發現,既然三個判別區比兩個好,那個分成四個、五個、六個……不就會越來越好嗎?沒錯,這就是PID的P(Proportion(al))。
 PID_Proportional部分
  light_number_line_3
圖四
最初使用了2-Level Line Follower 的方式來控制,後來又用了3-Level Line Follower,而效果有越來越好的趨勢,因此接著要讓這個Level變得盡可能越大越好,如圖四來說,Turn表示右邊輪子的圈數減去左邊輪子旋轉的 圈數,而這個Trun在之後將會提供給馬達作為指令參考用,Turn越大則表示右邊的速度得比左邊更快,當這個Level越分越多,漸漸地,你將會發現本 來應該是階梯狀的圖案,漸漸會變成一條有斜率的斜直線。
 斜率公式:y = m * x +b
在數學上面一般會用這樣的方程式來表示一條斜直線, 然後為了讓事情看起來簡單點,將圖四的最右邊那張轉換成新的XY軸。
  light_number_line_4
圖五
我們將本來的40~50減去他們的平均值45,則變成-5~5,而轉換成這樣之後,我們將X軸的數值稱為ERROR,也就是誤差量,Y軸的部分將設定成轉速差百分比(100% = 1),因此剛剛的斜率公式變成
y = m * x   or  Turn =  m * error
而 m的計算方式就是(Y軸每單位變化)/(X軸每單位變化),以上面的例子來說
m = ( -1  –  1 ) / ( 5  –  -5 ) =  – 0.2
 m是一個很重要的 比例常數(proportionality constant),之後將感測器所讀取到的的資料轉換成error之後就可以藉由這個比例常數將error直接轉換成Turn,這是一件很重要的事情, 而這個m在PID控制理論裡面有一個特別的名字,稱為K,是constant的簡稱,在之後我們還會有另外兩個K也會加進來這個PID控制裡面,K這個數 值是一個轉換值,可以讓輸入進來的數據轉換成Turn。
在PID裡面還有一 件關於P很重要的事情,就是P的範圍大小(proportional range) ,就是線性範圍,在這邊的範例來說,紅外線感測器的proportional range 是40~50,而馬達我們是假設從-100~100,而從proportional range 這個議題中,衍生出兩項重點。
 1.proportional range 越大越好,從剛剛的2-Level和3-Level那邊可以知道,如果可以讓proportional range 越大,則表示我們可以有越多種的速度變化,假如現在車子稍微遠離黑線,他可以稍微修正回來,假如非常嚴重遠離黑線,他就會相對應地強烈的修正回來,因此能 夠有越多變化的話,就能夠讓車子適應更多種的變化(就不怕很彎的轉彎了)。
2.如果超出了proportional range ,那車子會怎麼辦?大致上車子走的方向不會錯,但是計算出來的Turn就不一定正確了,因此我們必須限制車子不要超出proportional range 。
Turn???!!!!! 剛剛就是為了這個Turn弄了半天,但他到底要麼實際應用在車子上面?我現在經過紅外線感測器並且經過一連串的運算取得了Turn,那麼他要怎麼轉成馬達 用的Power%?首先先定義一個新名詞,Tp (Target Power Level) 目標馬力,簡單來說,這個就是直走的時候的速度,接下來將一顆馬達的速度設定為 Tp + Turn 和另外一顆設定為 Tp – Turn,因為有時候馬達再設定正反轉的時候會有相反的狀況發生,如果出現這樣的情況,把 Tp ± Turn的正負號倒過來試試看。
 在進去程式碼之前,先計算我們剛剛說的斜率,也就是K,在這邊的K是表示proportiona,因此稱之為Kp,為了測試我們先粗估error和馬達的Power,當error從0~-5的時候,希望馬達可以從50%~10%
Kp = ( 50 –  0 ) / ( 0 – -5 ) = 10
 下面的 Pseudo Code是來自作者J. Sluka
 Pseudo Code for a Pcontroller  (原作者在Kp那邊輸入1000到了後來除100的用意是為了使用浮點樹的關係)
Kp = 10                              //Initialize our three variables
offset = 45
Tp = 50
Loop forever
LightValue = read light sensor     //what is the current light reading?
error = LightValue - offset        //calculate the error by subtracting the offset
Turn = Kp * error                 
//the "P term", how much we want to change the motors' power

powerA = Tp + Turn                //the power level for the A motor
powerC = Tp - Turn                //the power level for the C motor
MOTOR A direction=forward power=powerA     
//issue the command with the new power level in a MOTOR block
MOTOR C direction=forward power=powerC     
//same for the other motor but using the other power level

end loop forever                    
//done with this loop, go back to the beginning and do it again
由上面可以知道有兩個可調變數和一個常數是關鍵。
offset常數是需要藉由模組編寫過的資料來的或是自行編寫程式製作出來的。
Kp和Tp這兩個可 調變數是需要經過多次的錯誤嘗試才能夠測量出來的,Kp決定當車子偏離軌道時,所修正回來的強度,Tp則是車子在直線行走的速度,在不同的場合所需要的 Kp和Tp是不相同的 ,當路徑大多是直線的時候,Tp可以調大一點,Kp可以小一些,反之,當遇到很多大轉彎,則需要Tp小一點,Kp大一點。
最後總結一下
P control 有幾個重點
1.輸入的動態範圍要大點比較好,以本例子來說,也就是紅外線40~50的這個範圍要大一點,能看得越多,因為輸入的動態範圍就直接影響到Error的範圍,這將決定我們能夠有多少的辨識條件。
2.輸出的動態範圍也得大一點,不然即使有了很大的輸入動態範圍,結果馬達卻只能夠作正反轉的輸出,那麼就一切都免談了,又回到之前說的2-Level的模式,所以說輸入輸入的動態範圍要盡可能的大,但是這兩者還是要能夠互相匹配才能夠互相發揮良好的作用。
3. 接著這是之前都沒提過的部分,程式的所在地,控制板,它的系統運作速度不能夠太慢,否則當車子都跑出去後他才說趕快回來,那也是白白浪費了P control 的強大效益了。
大家先試玩看看吧~~加油!!!!!!下一篇就會開始寫  I control進來囉

推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
彤彤柯安_839
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有