智慧型控制 Intelligent Control

範例:台車倒單擺的 FIS

老師錄製的操作示範:檢視台車倒單擺的 Sugeno 型 FIS(附檔 slcp.fis)。模型與動畫程式在 InvertCart.zip(slcp.mdl、slcp.fis、initcp.m、animcp.m),台車模型的說明見舊站 Cart and Pole Model ↗。

原講義此處的連結寫成 ../matlab/InvertCart.htm,在原站會指到不存在的位置,已改為上方的正確網址。

▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 3 節 slcp.mdl 模擬與台車動畫),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb

台車與擺桿 Cart and Pole

(以下依附檔整理並模擬,為補充)台車在水平軌道上,頂端以鉸鏈接一根擺桿。控制器對台車施加水平力 F,要讓擺桿保持直立,同時把台車移到目標位置。目標是 ±1.5 m 的方波,每 5 s 換邊一次。

θF台車位置 x目標位置擺桿長 1 m、質量 0.1 kg台車 1 kg

依 slcp.mdl 的參數(initcp.m 只負責讀入 slcp.fis):擺桿長 1 m(質心到鉸鏈 l = 0.5 m)、質量 m = 0.1 kg,台車 M = 1 kg,g = 9.8 m/s²。θ 以直立為 0、向 +x 傾為正,運動方程式為

$$\ddot\theta = \frac{g\sin\theta + \cos\theta\,\dfrac{-F - m l\dot\theta^2\sin\theta}{M+m}}{l\left(\dfrac43 - \dfrac{m\cos^2\theta}{M+m}\right)},\qquad \ddot x = \frac{F + m l\left(\dot\theta^2\sin\theta - \ddot\theta\cos\theta\right)}{M+m}$$

slcp.fis A Sugeno FIS with Four Inputs

輸入意義範圍歸屬函數
in1擺角 θ(rad)±0.3各兩個 gbellmf,中心在範圍兩端(例如 in1:a = 0.3、b = 2、c = ∓0.3),在範圍內大致是「偏負」與「偏正」兩個寬廣的鐘形
in2擺角速度 θ˙(rad/s)±1
in3台車位置 − 目標(m)±3
in4台車速度 ẋ(m/s)±3

四個輸入各兩個歸屬函數,排列組合共 2⁴ = 16 條規則,每條規則的結論都是一階線性函數

$$z_i = a_i\theta + b_i\dot\theta + c_i(x - x_d) + d_i\dot x + e_i$$

四個輸入的意義與 in3 的正負號,是以模擬確認的:照上表接線,台車能追上目標;若 in3 改成「目標 − x」,擺桿雖然還扶得住,台車卻一路往同一方向跑掉(60 s 跑了 130 m)。

編註:16 條規則的係數幾乎一樣:a = 37.6~41.4、b = 10.03~10.18、c 全部等於 √10 = 3.1623、d 全部等於 4.2875,常數 e 在 ±0.34 以內(verify_fzex.py 核對)。所以這個 FIS 在整個範圍內都接近一個線性狀態回授 $$F \approx 40\,\theta + 10\,\dot\theta + 3.16\,(x - x_d) + 4.29\,\dot x$$ 係數的樣子(位置增益恰為 √10)很像以最佳控制(LQR)求得的回授增益,再讓模糊規則在不同擺角、角速度下做小幅修正。歸屬函數與規則名稱都是工具箱的自動命名(in1mf1、outmf1…),應是由程式產生,而非逐條手寫。

注意位置項的正負號:台車在目標右邊(x − xd > 0)時,F 反而先往右推。這是倒單擺的特性:要讓台車往左走,得先把台車往右推一下,讓擺桿向左傾,接著才能一邊扶住擺桿、一邊帶著台車往左移。直接往左推的話,擺桿會往右倒。

模擬結果 Simulation

02468101214161820-2-1012台車位置 x(m)02468101214161820-20020擺角 θ(度)02468101214161820-10010時間(s)施力 F(N)紅虛線:目標位置(±1.5 m,週期 10 s) 藍:台車位置

互動模擬 Try It

下方動畫用同一個 slcp.fis 即時控制。可以換目標、推擺桿一下看它恢復,或關掉控制器看擺桿倒下:

自製動畫(依控制理論數值模擬)