2008年7月20日 星期日

Fuzzy control for NXT motor

http://4rdp.blogspot.com/2008/07/fuzzy-control-for-nxt-motor.html

七月初提到 Fuzzy control,應該有 NXT 玩家試試看,今天公佈
我的 Fuzzy 程式碼 (NXC),另外大家可以比較與 PID 程式碼差異。

以個人比較結果,PID 的轉速控制比較和緩順暢,因為 K 參數已經調好,Fuzzy 控制法轉速控制震盪情形較大,當然可以再調整 Fuzzy rule 改善,留給有興趣的人去研究。

47 則留言:

  1. Dear Bridan:
    我最近想用fuzzy去控制Segway(兩輪平衡機器人),就你的原程式碼,模糊規則是三角形的歸屬函數,如果我想用Normal Distribution funtion(NDF,鐘型函數),即:exp(-((x-m)/SD)((x-m)/SD))。
    其中m是NDF平均值、SD是NDF標準差。

    Labview for NXT好像沒有exp()的函數可以用。感覺被受限了!不知道您是否有什麼idea可以解決這個問題?

    回覆刪除
  2. 薛老師您好,

    您可以將 exp(x)=e^x 泰勒級數展開取近似高階函數,即
    e^x = 1 + x/1! + x^2/2! + x^3/3! + ...

    就個人經驗,PID 控制比較平順,使用它比較好,FUZZY 控制多半用在建不出系統數學模式的時候,不得已採用的方法,提供你參考。

    回覆刪除
  3. PID我不知道為什麼我的Segway很容易爆衝,PID的參數設定也不易有很好的規劃。

    回覆刪除
  4. 薛老師您好,

    PID 控制調整確實不太容易,你可能要注意調整的時間點,例如,你每 0.1 秒可得到轉速回授資料一筆,那麼就每 0.1 秒調整輸出控制,否則很容易調過頭。

    回覆刪除
  5. dear bridan
    我想看一下你提供的fuzzy寫法,但是我在網頁中並未看到source code,因為我想要把它拿來寫在超音波沿牆走中,做判別,一直沒有好的想法。

    回覆刪除
  6. Wallace 您好,

    請告訴我電郵,明天將郵寄給你。

    謝謝

    回覆刪除
  7. dear bridan

    my mail is p886222@hotmail.com
    thank you very much

    回覆刪除
  8. 由於 Google 不再支援群組論壇,致使檔案下載失敗,因此我將逐步搬移檔案到 Google Documents,想下載的朋友仍須登入 Google 帳號,但要等待我的批准許可。

    我喜歡 Google Group 主要是它免費讓大家上載或下載檔案,並自動幫我留下參觀者電郵,真是蠻可惜 Google 不再支援它。

    不便之處,敬請見諒。

    回覆刪除
  9. Dear 布里登,
    之前有看到你的NXC之fuzzy control程式,由於目前有需要,是否可唐突請你寄該
    source code給我?

    謝謝~

    hanuskimo@kimo.com.tw

    回覆刪除
  10. hanuskimo 您好,

    已經設定檔案共用,您隨時可以從 Docs 下載。

    回覆刪除
  11. Dear 布里登,

    本人不會使用Docs,所以.....
    可以跟我講怎用呢?

    謝謝~

    hanuskimo@kimo.com.tw

    回覆刪除
  12. 沛穎 您好

    我忘記 Google Docs 只對 Google e-mail 帳號有效

    因此電郵附件給你參考

    有甚麼問題,歡迎討論

    回覆刪除
  13. Dear Bridan,

    Sorry! I haven't received your email yet. How about trying another email?

    email: c3479201@ms5.hinet.net
    (original hanuskimo@yahoo.com.tw)
    Best regards,

    Robert

    回覆刪除
  14. Dear Robert,

    I don't know what happen that you cannot receive my e-mail.

    But any way, I re-sent the Fuzzy and the PID source codes to your two e-mails.

    Hope no problem again.

    Best Regards,
    Bridan

    回覆刪除
  15. dear bridan:
    前陣子跟你拿了fuzzy控制馬達的code,一開始看我是不太懂,我就去借了fuzzy的書,我看大部分會用建表的方式來查,但是表中的值要怎麼設定我實在沒有什麼sense,再回頭看你的code,發現你也沒有建表,好像是直接計算的,其實我現在是想做一個很簡單的動作,就是前端的3~5個超音波來避障,但是沒有什麼頭緒下去寫程式,當然其實也可以不用fuzzy的方式來寫,但是還是想要用fuzzy試試看,不知你可以給點建意嗎?

    回覆刪除
  16. Wallace您好,

    想Fuzzy控制,應先列出規則式,也就是

    IF ...input... THEN ...output...

    當你能列出規則式後,我們再來看輸入與輸出歸屬函數。

    回覆刪除
  17. dear bridan:

    假設我的機器人前方有五個超音波,

    在距離的部分(讀入超音波目前最近的值)
    if (distance)is small than 停下來
    if (distance)is normal than 保持速度
    if (distance)is large than 速度加快

    在角度轉彎的部分(目前前進方向和障礙物的夾角)
    if (robot向前方) & 障礙物在右方 than 向左轉
    if (robot向前方) & 障礙物在左方 than 向右轉
    if (robot向前方) & 障礙物在中間 than 向右轉或左轉
    if (robot向左方) & 障礙物在右方 than 向左轉
    if (robot向左方) & 障礙物在左方 than 向右轉
    if (robot向左方) & 障礙物在中間 than 向左轉
    if (robot向右方) & 障礙物在右方 than 向左轉
    if (robot向右方) & 障礙物在左方 than 向右轉
    if (robot向右方) & 障礙物在中間 than 向右轉

    這樣列也不知道對不對?上下兩組規則最後應該會有輸出值多少速度,轉多少彎?

    回覆刪除
  18. Wallace 您好,

    看你用五個超音波感測器會不會太多,除非你的機器人很大,需要多向檢知,不然超音波感測器會相互干擾,甚至每個感測器須分隔 45 度角以上。

    另外,這機器人用途為何? 依目前規則式來看,當它被放在ㄇ字型位置時會靜止,但是多數的規則式會前進或轉向不會停止,它何時需要停止?

    有幾個馬達要控制 ? 這些基本問題先弄清楚,再討論其它。

    回覆刪除
  19. dear bridan
    機器人滿大的,五個我覺得差不多,干擾的問題我了解,每組打開的時間會停一小段的delay(但還是會干擾,但有盡量避開),馬達的控制之前就寫好,只是call function而以,何時會停止的話,應該是設定一組目標點的座標,用目前的座標點去算出距離和角度,再來中間有障礙物,所以要避障。

    回覆刪除
  20. Wallace 您好,

    OK 清楚你的系統概況,簡單的說,機器人知道自己的位置,它會自行前進到目標點,只是遇到障礙物需要避碰,如果沒有特殊需求,建議等速前進就好,到達目的地或靠近障礙物就停止。至於是否到達目的地的判別,應該不是用超音波感測器檢知吧? 這很容易會誤判為障礙物而轉向。

    轉向規則須要修改,考量兩種情形,直行方向沒有障礙物,但是旁邊有東西,依你的規則會轉向偏走; 第二種是走迷宮時,前行遇障,請固定向右或固定向左轉,不要隨機左右轉,不然可能走不出迷宮。

    改完後再討論。

    回覆刪除
  21. DEAR BRIDAN
    因該說向前方,向右方,向左方,是用目標點減現在的座標點,方向是用tan算出來的

    if (robot向前方) & 障礙物在右方 than 向左轉
    if (robot向前方) & 障礙物在左方 than 向右轉
    if (robot向前方) & 障礙物在中間 than 向右轉
    if (robot向左方) & 障礙物在右方 than 向左轉
    if (robot向左方) & 障礙物在左方 than 向右轉
    if (robot向左方) & 障礙物在中間 than 向右轉
    if (robot向右方) & 障礙物在右方 than 向左轉
    if (robot向右方) & 障礙物在左方 than 向右轉
    if (robot向右方) & 障礙物在中間 than 向左轉

    大概修改了一下,不知道這樣是不是對的,感覺不難,但是叫我突然寫,實在沒什麼概念

    回覆刪除
  22. Dear Wallace,

    目前這些規則式仍潛藏問題,請暫時放下對 Fuzzy 的迷思,你所列出的規則式也必須適用非 Fuzzy 控制的系統。

    我假想你的機器人是走迷宮的,迷宮會是長長的走道,簡單的說兩旁都有障礙物,可是機器人仍必須向前行,因此我認為現在的規則會讓你的機器人轉來轉去不會直行。

    所列的規則,必須要能讓機器人走到轉角再轉彎,如果不是迷宮請告知,有些規則可能要修改,當所有規則列出後,你找個迷宮圖走看看,走的通,表示規則式正確。

    抱歉,我無法提供你完整規則式,這些都需要你自己思考,現在對你來說也許很困難,不過透過這樣的訓練,可以讓自己設計技術更加進步,我可以幫你檢視規則式的合宜性,加油。

    回覆刪除
  23. Dear Bridan:
    我最近想用fuzzy去控制BLDC,麻煩分享你的程式,參考如何實作。
    billshih.tw@gmail.com

    回覆刪除
  24. Dear Amigo.tw,

    歡迎來訪,已經發信給你,如果還收不到,請再留言。

    回覆刪除
  25. 你好:
    可不可以給我可用FUZZY的C程式!因為理論看不懂?

    謝謝

    回覆刪除
  26. jlian168 你好,

    請點選本篇文章中 FUZZY 的連結,我會設定核准你的申請,那你就可以下載 NXC 程式碼。

    回覆刪除
  27. 老師 你好:
    1.可能我反應比較不好,我點FUZZY後沒有,
    然後我點NXT後下載了"lms_arm_nbcnxc_src"檔案,
    但好像沒有FUZZY的程式?
    所以我不知道對不對?
    2.有FUZZY+PID的C程式嗎?
    3.能不能傳給我?

    jlian168@yahoo.com.tw

    謝謝.

    回覆刪除
  28. jlian168 您好,

    FUZZY 及 PID 兩檔案已經開放你可以直接下載,我並沒有兩者合併的程式,未來你可以研究兩者的合併,利用 FUZZY 找出 PID 的係數。

    回覆刪除
  29. 老師您好:
    我想參考您的Fuzzy Rule,我想利用在RFID讀取的時間差當輸入參數調整我的讀取效率,能否請老師給我權限,謝謝您
    jerrychen68@gmail.com

    回覆刪除
  30. 阿營您好,

    權限已經設定,程式參考看看,通常嵌入式系統為了資料讀取不漏接,是在中斷程式中處理,而且會有輸入暫存區,我不清楚你的構想,不過祝你成功。

    回覆刪除
  31. 老師您好,

    我目前的研究是,透過讀取的時間差,餵給PID當參數進以調整馬達轉速,想試試改用Fuzzy的表現如何,另外請問老師,所謂的Fuzzy調整PID是甚麼意思?

    回覆刪除
  32. 阿營您好,

    我所謂 Fuzzy 調整 PID 意思是以 Fuzzy 調整 PID 的 Kp, Ki, Kd 等係數,其實跟你的想法是一樣的,至於 Fuzzy rules 要看你的 case 決定。

    回覆刪除
  33. 老師您好,
    我還是不太懂您的意思,PID的參數調整一部分是依照經驗法則。
    就我的認知,Fuzzy的主要精神應該是仿照人類的思維近似推理的方式找出結果。
    若以冷氣為例,PID是控制,Fuzzy也是控制,用控制調整控制,我還是不懂

    回覆刪除
  34. 阿營您好,

    舉例說明,以 PID 控制馬達轉速,通常 PID 係數是常數,而且是工程師經過無數次實驗找出來的,但是你可以將這些 PID 係數改成變數而不再是固定的常數,這樣控制馬達轉速的特性就會完全不同。也許有些情況,要馬達慢慢轉速增減,也許有時要馬達急速變化。

    如果是固定的 PID 係數,必須搭配其他方法才能展現這樣功能。那利用 FUZZY 來調整 PID 係數,是不錯的方法,仿照人類的思維近似推理的方式找出適合的 PID 係數。

    回覆刪除
  35. Dear Bridan
    現正學習Lego-NXT,RXC程式中,敬請提供fuzzy寫法的source code,以利學習。若有PID寫法的source code,也一倂寄出為何?感謝您。
    我的E_Mail如下:
    hjchen3724@yahoo.com.tw
    阿紫

    回覆刪除
  36. Dear Bridan
    已收到Fuzzy程式,然
    1. 程式中僅有OUT_A,而無OUT_B,造成機器原地打轉;
    2. Light Sensor沒用到嗎
    阿紫

    回覆刪除
  37. 阿紫您好,

    這裡的範例程式只對馬達A控制,建議你閱讀我另一篇前文 PID speed control (http://4rdp.blogspot.com/2008/05/pid-speed-control.html),這樣才會對 NXT 馬達控制有全貌了解。

    本文並非控制循跡車,因此light sensor沒有使用。

    回覆刪除
  38. 網友阿紫電郵詢問下列問題,以及我的答覆如下
    ----------------------------------------------------------------------------------------------
    Dear Bridan,
    因Blog上之留言區,好像Down掉,故用Mail回應。尚有以下問題請釋疑:
    1. 因您的Fuzzy程式,沒用Light Sensor,而用角速度當輸入。這另我不解,您的車子何以會沿著黑線走?(此程式好像是SegWay,但又少另一顆Motor的程式)
    2. 因只控制單顆Motor,不知另一顆Motor的程式,要如何下程式?
    3. x0是否應改為 x0 = MotorRotationCount (OUT_B)?;但又少了tracking功能?
    敬請釋疑。

    阿紫
    ----------------------------------------------------------------------------------------------
    阿紫您好

    我的文章是從 PID speed control 寫起,主要針對馬達定速控制討論,因此 Fuzzy control 也是延續這個主軸說明,因為不是為循跡車寫文,所以沒有使用 light sensor,這些文章只單純討論一顆馬達的定速控制,因此以角速度當輸入,車子只會直線前進很正常。

    如果想同時控制兩顆馬達定速前進,你可以參考範例程式,加入第二顆馬達控制,請記得為第二顆馬達控制另增變數名稱。當兩輪速度設定不相同時,就可以左右轉彎。

    關於 x0 改成 x0 = MotorRotationCount (OUT_B) ,想藉此讓 A 輪 tracking B 輪,個人並不喜歡這種做法,因為直覺這樣程式設計會很複雜,建議兩個馬達獨立控制,但是速度要設定一樣,會比較簡單直接。

    當你寫好上述雙馬達定速控制程式後,循跡車可以再加入 light sensor 的數值,調整兩輪不同速度設定,就可以達到循跡的目的,祝你成功。

    回覆刪除
  39. 你好我作論文需要用到 將導盲磚辨識度提升 將使用到fuzzy能教我如何用matlab寫模糊程式控制嗎

    回覆刪除
  40. 徐同學您好,

    我樂於在部落格上給予指導,基本上一切須要你自己努力,我會提供意見參考,討論內容會公開於部落格上。
    倘若同意上述原則,歡迎留言討論,假如另有圖檔資料可能以電子郵件討論比較好,如果需要請留下電郵。

    因為工作忙碌關係,留言不會立即回覆。此外,想知道你的系統輪廓,從留言得知,你想用 Matlab 設計模糊控制程式,代表你的控制平台是一台電腦,疑問是系統的檢知器如何?以及你要控制甚麼東西?

    回覆刪除
  41. 你好最近用光感+馬達FUZZY 有興趣 可是點FUZZY 沒有東西OAO~是否可以討論 以及 拿檔案 研究一下?

    我的E-Mail如下:kiter_1005@hotmail.com

    回覆刪除
  42. Dear Kiter,
    檔案已經寄給你,有問題請留言討論。

    回覆刪除
  43. 您好 最近我在使用fuzzy pid控制馬達 但是fuzzy部分的code不太行 跪求您的fuzzy code
    我的信箱:q456741@yahoo.com.tw

    回覆刪除
    回覆
    1. Hi,

      程式碼已電郵l,如有問題歡迎部落格上討論。

      刪除
  44. 最近有讀者問我一些問題,重點整理如下:

    Q1: 請問您 Fuzzy.nxc 這三行的code用意
    d0 = d1;...........................為什麼還要特地把di設為do
    if (abs(d0) < abs(d2)) d0 = d2;........................此兩行的依據怎麼知道要取哪個?
    if (abs(d0) < abs(d3)) d0 = d3;

    A1: 這三行程式是一體的,d0 是取 d1, d2, d3 最大值


    Q2: 照理來說一般而言都是使用最小推論再用重心法解模糊 但是我看您是直接用比例得輸出 好像跟我所知道的算法不太一樣?

    A2: 解決問題的方法不只一種,你多閱讀其它模糊控制相關書籍,就會知道更多方法,我的程式是採用
    http://4rdp.blogspot.tw/2008/07/fuzzy-control-on-nxt-motor.html,簡單及容易理解。

    回覆刪除
  45. Hi Bridan,
    很高興能看到這麼好的教學網站,因本人對Fuzzy控制有興趣,
    想瞭解Fuzzy 與 PID 的差異,因為上面連結似乎是失效了,
    是否方便再提供一次呢?
    謝謝!!

    回覆刪除
    回覆
    1. Hung Sir,

      歡迎參閱研發養成所,程式碼連結已重新設定,應該可以正常下載檔案,這兩程式皆以NXC撰寫,你也可以用其它文書處理程式開啟。有任何疑問歡迎討論。

      刪除