第98章 PID算法的「玄學」

投票推薦 加入書籤 小說報錯

  當那雙明亮的、不受任何干擾的「眼睛」,被成功地安裝在甩帶機上時,林浩感覺自己像一個剛剛打通了遊戲第一關的玩家,雖然過程艱辛,但巨大的成就感,讓他瞬間充滿了繼續挑戰下一關的勇氣。

  他知道,「眼睛」的問題解決了,接下來,他要面對的,是一個更複雜的、也更核心的挑戰——為這台「超級跑車」,安裝上一個足夠聰明、足夠快速的「大腦」。

  這個「大腦」的核心,就是那個在自動化領域,如雷貫耳,卻又讓無數工程師「聞風喪膽」的東西——PID控制算法。

  PID,即比例(Proportional)、積分(Integral)、微分(Derivative)。這是一種最經典、也最廣泛應用的閉環反饋控制算法。它的原理,簡單來說,就像一個經驗豐富的司機在開車。

  比例(P),就像司機看到了前方路況(誤差),然後,根據距離的遠近,決定踩下油門或剎車的力度。誤差越大,踩得越狠。

  積分(I),則像司機的「記憶力」。他會記住過去一段時間裡,所有的累積誤差。如果車子一直偏離車道中心線,哪怕偏離得很小,他也會不斷地、持續地修正方向盤,直到把這個累積的誤差,徹底消除。

  而微分(D),則像司機的「預判能力」。他能根據誤差變化的「趨勢」,來提前做出反應。如果他看到前方的車輛,正在快速地減速,他就會提前鬆開油門,而不是等到快撞上了,才猛踩剎車。

  這三個參數,聽起來,簡單明了。

  但林浩很快就發現,想把這三個「性格迥異」的傢伙,完美地,調校到一起,讓它們能像一個配合默契的樂隊一樣,協同工作,這,簡直是一門「玄學」。

  他開始了他人吃卯糧中,又一段「煉獄」般的調試之旅。

  他先是把自己關在宿舍,從網上,找來了大量的、關於PID算法的教程和代碼。他那顆充滿了邏輯性的理科生大腦,再次發揮了作用。他很快,就在Arduino的編程環境裡,寫出了一個最基礎的PID控制程序。

  然後,他將這個程序,燒錄進單片機,連接上甩帶機的銅輥電機驅動模塊,開始了第一次「空載測試」。

  他的目標很簡單:讓銅輥的轉速,能夠精準地、快速地,達到並穩定在他設定的任何一個目標值上。

  然而,當他第一次,在控制程序里,輸入目標轉速「3000轉/分鐘」時,現實,就給了他一記響亮的耳光。

  他看到,電機的轉速,像一個喝醉了酒的醉漢,先是猛地,衝到了三千五百轉,遠遠地,超過了目標值(超調過大)。然後,它又迅速地,掉了下來,掉到了兩千五百轉。接著,又再次衝上去,再掉下來……

  整個系統,在目標值附近,來來回回,像一個失控的鐘擺一樣,劇烈地振盪,遲遲無法穩定下來。

  「P值太大了。」林浩根據自己剛學到的理論,做出了判斷。比例項的反應太「激烈」了,一看到誤差,就猛踩油門,結果,次次都衝過頭。

  於是,他減小了P值。

  這一次,振盪,確實減小了。但是,新的問題,又出現了。

  他發現,無論他怎麼等,電機的最終轉速,總是穩定在兩千九百五十轉左右,離他設定的三千轉,永遠,都差那麼一點點。

  「靜態誤差。」林浩的腦海里,又冒出了一個專業名詞。這是因為P值太小,當誤差變得很小時,它的「糾錯」力度,已經不足以,去克服電機本身的摩擦力等固有阻力了。

  「看來,得讓『積分項』出馬了。」

  他開始,在他的代碼里,加入積分(I)的計算。他要讓這個有「記憶力」的參數,去不斷地累積那個微小的靜態誤差,然後,持續地,給系統一個「加油」的信號,直到,那個誤差,被徹底消除。

  然而,當他興沖沖地,再次進行測試時,他發現,自己,捅了更大的「馬蜂窩」。

  積分項的加入,確實,消除了靜態誤差。電機的轉速,最終,可以精準地,穩定在三千轉了。

  但是,它的「反應」,也變得,像一個反射弧超長的老大爺。

  當他下達指令後,系統需要很長一段時間,才能慢悠悠地,達到目標。而且,由於積分項會累積過去所有的誤差,導致系統在啟動初期,產生了巨大的「積分飽和」,超調,變得比之前還要嚴重!

  更要命的是,當他試圖,去改變目標轉速時,整個系統,會因為之前累積的積分,而產生巨大的「慣性」,反應遲鈍,甚至,再次陷入劇烈的振盪。


  林浩感覺,自己要瘋了。

  他發現,P、I、D這三個參數,就像三個互相看不順眼的、脾氣古怪的大爺。P大爺性如烈火,I大爺穩如老狗,而D大爺(林浩還沒來得及加),則是個神經質的「預言家」。想讓他們三個和平共處,簡直比登天還難。

  他把自己關在地下室,沒日沒夜地,與這三個「玄學」般的參數搏鬥。

  他嘗試了各種從網上學來的「經驗調參法」,他畫著各種各樣奇形怪狀的、代表著系統響應的曲線,但他,就是得不到那條他夢寐以求的、快速、準確、而又穩定的「完美曲線」。

  就在他快要被這三個神秘的字母,給折磨到精神崩潰時,陳默,像一個幽靈一樣,出現在了他的身後。

  他已經,默默地,看了林浩,調試了整整一個下午。

  「還在跟PID死磕?」陳默的聲音,平靜地響起。

  「老師!」林浩像看到了救星,「我……我感覺我快瘋了。這三個參數,根本就沒法調到一起!它們互相矛盾!」

  「誰告訴你,一定要讓它們『調到一起』的?」陳默反問道。

  「啊?」林浩愣住了。

  陳默沒有直接解釋。他走到白板前,拿起筆,畫了一個簡單的控制框圖。

  「你現在做的,叫『反饋控制』。」他說,「它的邏輯是,『先看到誤差,再進行補償』。這就像一個司機,他必須先看到車子偏離了車道,才能開始打方向盤。這種方式,天生,就帶有『滯後性』。」

  「對於我們這個要求極高動態響應的系統來說,光靠『反饋』,是不夠的。」

  陳-默在框圖的前面,又畫上了一個新的模塊,並寫上了兩個字:

  「前饋」。

  「前饋控制?」林浩對這個名詞,有些陌生。

  「對。」陳默解釋道,他的眼中,閃爍著一種屬於「控制理論」的、清晰的邏輯光芒,「『前饋』的邏輯,與『反饋』完全相反。它不是『亡羊補牢』,而是『未雨綢繆』。」

  「我們知道,我們最終的目標,不是一個恆定值,而是一條已知的、非線性的冷卻曲線,對嗎?」

  林浩點點頭。

  「既然我們已經提前知道了『標準答案』,那我們為什麼,還要等系統出現誤差了,再去被動地修正呢?」陳默反問道,「我們完全可以,根據這條目標曲線,提前計算出,在每一個時刻,電機『理論上』應該輸出多大的力矩,才能完美地追蹤這條曲線。」

  「我們把這個『理論上的力矩』,作為一個『前饋信號』,直接,加到我們的控制系統里。讓電機,提前,就做好準備!」

  「然後,」陳默在兩個模塊之間,畫上了一個加號,「我們再用你那個雖然有滯後、但能消除最終誤差的PID『反饋控制』,去修正因為模型不准、外部擾動等因素,而產生的、那一點點微小的偏差。」

  「前饋,負責『打主力』,完成99%的追蹤任務;反饋,負責『打輔助』,處理那最後1%的殘餘誤差。」

  「這,才是一個真正先進的、現代的控制系統。這叫,『前饋-反饋複合控制』。」

  陳默的這番話,像一把鑰匙,瞬間,打開了林浩腦子裡那扇生了鏽的、名為《自動控制原理》的大門。

  他之前所有的努力,都只是在試圖,去訓練一個「反應型」的司機。而陳默,現在教他的,是如何,去打造一個擁有「導航系統」和「自動駕駛」能力的、真正的「未來戰車」!

  這是一種,思維維度上的,徹底的「升維」!

  巨大的興奮,讓林浩忘記了所有的疲憊。

  在接下來的兩天裡,在陳默的指導下,他開始構建這個全新的、更複雜的複合控制算法。

  他先是,通過一系列的實驗,測量出了他那台「魔改」電機的各項關鍵參數,比如轉動慣量、摩擦係數等,建立起了一個雖然粗糙、但可用的「電機數學模型」。

  然後,他基於這個模型,編寫了「前饋控制器」的代碼。

  最後,他再將自己之前調試了無數次的PID「反饋控制器」,作為一個「輔助」,耦合了進去。

  當他將這個全新的、凝聚了現代控制理論精髓的算法,燒錄進單片機,並進行第一次測試時。

  奇蹟,發生了。

  屏幕上,那條代表著「實際轉速」的紅色曲線,像一個擁有了靈魂的舞者,以一種極其矯健、而又無比精準的姿態,完美地,「咬」住了那條代表著「目標曲線」的、非線性的藍色指令。

  無論目標曲線,如何加速,如何減速,如何轉折。

  那條紅色的曲線,都如同它的影子一般,不離不棄,緊緊跟隨。

  誤差,被控制在了驚人的千分之一以內!

  林浩看著屏幕上那兩條幾乎完美重合的曲線,感覺自己的呼吸,都快要停止了。

  他知道,他,終於,馴服了那頭隱藏在代碼深處的「上古神獸」。

  他為他們的「超級武器」,成功地,安裝上了一個最強大、最聰明的「大腦」。

章節目錄