基於PID控制器的循跡小車簡單演示

本文瀏覽次數

发布日期

2024年1月29日

PID演示程序

變量 數值
比例控制系數(\(P\))
積分控制系數(\(I\))
微分控制系數(\(D\))
受控制量(灰度)
小車前進速度
場地寬度
場地高度

我已經把程序的初始參數調到一個比較舒服的狀態😉。但你可以試著挑戰下更高的車輛速度或更窄的場地高度。

修改輸入參數,按下“提交參數”按鈕,下方的畫面會按新參數輸出仿真結果。

抱歉,此瀏覽器不支持HTML5

PID簡介

本頁面以控制小車沿著規定藍色軌道外沿行走爲例,演示了PID控制算法的運用。上方的畫面展示了仿真環境中小車的運行過程。讀者可以修改輸入參數,按下“提交參數”按鈕,重新輸出仿真結果。

仿真程序在小車的前方設置了一個虛擬的灰度傳感器。畫面的左上角顯示了它接收到的灰度信號大小。假設在初始狀態下小車位於軌道上。如果小車右轉,那麽灰度傳感器將覆蓋藍色軌道,使得灰度增大。反之,傳感器覆蓋白色地面,灰度減小。因此,只要能平滑地控制小車的轉向,使灰度值始終保持在適中的數值附近,就能使小車始終沿著軌道邊緣運動。

總而言之,在這個仿真的例子中,我們直接控制的量是小車的前進角度,而觀測的量是灰度傳感器的數值。

仿真采用了經典的PID控制方法。僞代碼為

/*
全局變量:
 - ierror:誤差的纍積,初始化為0;
 - error_pre:初始誤差,初始化為0;
輸入  
 - value:觀測到的灰度值;
 - target:目標灰度值;
 - PID參數(P、I、D);
*/
var verror = value - target;  //  误差,越暗值越大
ierror += verror;
var derror = verror - error_pre;  //  數值的變化率 
va = verror * P + ierror * I + derror * D;
error_pre = verror;

其中P參數可以説是最爲重要的,它決定了誤差大小和控制量之間的比例。
參數I則用於消除纍計誤差。設想這樣一種情況:車輛的方向盤歪了一點。因此當你想擺正方向的時候,車輛實際上卻在悄悄地左轉。這樣微小的轉向也許一開始看不出來,但是隨著時間的纍積,方向的偏差會越來越大。參數I將誤差的纍積反饋到控制量,從而抑制誤差的纍積;
參數D則可以用來加快控制系統的反應速度。D將誤差的變化率作用於控制量,使得車輛可以在感知到偏差增大的時候,提前采取措施。

後記

本文最初寫於2017年五月30日,那時我還是學生。我在一堂實驗課上調著PID參數,效果離預期還有一定差距就下課了。課後沒有辦法拿實物再做實驗,於是就簡單寫個程序模擬下。當時比較菜(當然現在也是),所以寫完程序的時候很開心。稍微冷靜下來看一看,這個仿真在很多方面並不完善。 首先車輛在運動、轉彎的時候都有慣性。我的仿真沒有考慮這點。如果能加一個運動模型到程序裏會更好; 其次,在真實的車輛/機器人上,受控制的是輪胎的轉速差、車輛的轉向機構,從而間接控制車輛的運動方向。受能力所限,這個仿真也沒法準確模擬這些細節。

今天將這篇文章重新整理一下,但也不去過分修飾了。回頭看這份粗糙的作品,還是能感覺到當時的趣味,足矣。

By @執迷 in
Tags : #自動控制原理, #PID,