2014年6月19日 星期四

用 Arduino 製作四軸飛行器(四之二)PID 理論 之 P

接下來這一篇我會提一下如何去使用 PID 理論來達到控制平衡的目的

不過我們要先從 PID 是什麼東西開始講起

先不負責的把 Wiki 連結丟上來~

http://zh.wikipedia.org/wiki/PID
http://en.wikipedia.org/wiki/PID_controller

另外也可以參考這一篇:
http://www.tabbymeow.com/pid%E6%8E%A7%E5%88%B6%E7%90%86%E8%AB%96-%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/

看完這一篇也不用看我這一篇了 XD



不過我們所舉的例子不太一樣,他是使用了沿著黑線的自走車,所以只會去計算一組 PID 來控制,但是如果是四軸的話,則會需要計算出兩組,分別是 X 軸平衡以及 Y 軸平衡。

我們先來談一下 PID 是什麼,雖然說上面有三個連結可以給大家參考,但是為了方便,我在這邊用稍微簡單的方式簡介一次,不過我還是建議各位看一下上面的那一篇,講的真的相當的好。

首先, PID 是由 P 跟  I 跟 D 這三種不同的錯誤修正算式組合而成,P 表示 Proportional,I 表示Integral,D 表示 Derivative,我們這一篇會先從 P 開始說明,並且順便整合到我們的四軸控制當中。

在四軸平衡當中,我們主要是使用兩軸的加速度或是陀螺儀角度來進行平衡校正,在這邊我們先使用加速度校正,而加速度原則上會有三個軸,我們這邊使用兩個軸來進行校正,分別是 X 軸以及 Y 軸。

但因為 X 軸以及 Y 軸的校正原則上差不多,所以我們會先討論 X 軸的部份。

一開始我們會有一個基準點,也就是 X 軸為多少的時候表示水平,在沒有任何意外的情況之下,一般來說 X = 0 就表示 X 軸目前是水平的狀態。

另外我們知道,如果將 X 軸與地平線垂直,則 X 軸的數值就會是 1 或是 -1,表示他現在的加速度為 1 個重力加速度,正負號則是表示方向。

要修正 X 軸水平,我們是必須要提昇或是減少特定馬達的輸出功率,以達到平衡的效果

這時候我們就可以用 P Control 還去控制,所謂的 P Control,就是使用現在的誤差值(錯誤值)來進行修正

加速度 X 的值為 -1 ~ 1,其基準點為 0 所以如果當 X 軸為正的時候,我們是必須要去給特定兩顆馬達提高轉速,來達到平衡的效果

所以當 X 軸為負的時候,勢必要提高編號 1 跟編號 4 的馬達,然後將編號 2 跟編號 3 的馬達轉速降低,才能後平衡回來。

我們需要調高多少?這部份的計算就是透過 P Control 去算出最佳的數值,依據直覺,可以知道如果他越傾斜,我們就需要輸出越大的力量給他去矯正,如下表:



我們假設馬達的輸出為 0~180,表格中表示我們把它分割成五個階段去判斷說他應該要加或是減多少力量在上面。

各位可以發現,我們可以將他細分成七個階段,這樣會更加精密,當我們不斷細分下去,則他就會變成一個二元一次方程式,這一個方程式就是我們所需要在 P Control 中用到的

其中的公式如下:

要改變(修正)的輸出量 = 常數 * 誤差量

其中常數在 P Control 裡面就是 Kp

誤差量等同於 「現在的 X 加速度值」 減去 「基準的 X 加速度值」

原則上 Kp 這一個比例常數需要去嘗試才能夠找出最好的解,舉這一次的例子來說,如果你希望,當我的誤差量達到最大(error = 1)的時候,修正的數值為 180,則你可以把 Kp 設定成:

180 = Kp * 1  --> Kp = 180

但是一般來說不會有這麼極端的設定,我會建議將 Kp 值條小一點,這樣才不太會造過度修正

目前我所撰寫的 Kp 值為 18,也就是說,當我的 X 軸加速度偏差為 1 (最大誤差)的時候,其中一邊馬達會多 18 個單位的速度,另一邊則是會少 18 個單位,這部份就要取決於飛機的特性了。

Y軸的解法也是一樣的,所以程式的部份,我們可以撰寫如下:



搭配我們先前所撰寫的初始化程式,這一個四軸目前已經具備了 P Control 來做為平衡修正了

下一篇我會撰寫 I Control,並且把一些遠端控制的東西順便補上