七月初提到 Fuzzy control,應該有 NXT 玩家試試看,今天公佈
我的 Fuzzy 程式碼 (NXC),另外大家可以比較與 PID 程式碼差異。
以個人比較結果,PID 的轉速控制比較和緩順暢,因為 K 參數已經調好,Fuzzy 控制法轉速控制震盪情形較大,當然可以再調整 Fuzzy rule 改善,留給有興趣的人去研究。
騎沈四傑2024年度總結
-
騎沈四傑指ichirou、馬拉錘、CEKU、cj6,由於ceku隱退,他的位置由jackchows頂替。 成員介紹
ichirou:facebook倉頡群組管理員,大馬倉友論壇管理員。I.明體作者。性情暴躁,智商偏低,因此常鬧笑話,多次摔跤。現已不敢隨便對倉頡規則發表意見。
馬拉錘:大馬倉友管理員,三代補完計...
2 天前
Dear Bridan:
回覆刪除我最近想用fuzzy去控制Segway(兩輪平衡機器人),就你的原程式碼,模糊規則是三角形的歸屬函數,如果我想用Normal Distribution funtion(NDF,鐘型函數),即:exp(-((x-m)/SD)((x-m)/SD))。
其中m是NDF平均值、SD是NDF標準差。
Labview for NXT好像沒有exp()的函數可以用。感覺被受限了!不知道您是否有什麼idea可以解決這個問題?
薛老師您好,
回覆刪除您可以將 exp(x)=e^x 泰勒級數展開取近似高階函數,即
e^x = 1 + x/1! + x^2/2! + x^3/3! + ...
就個人經驗,PID 控制比較平順,使用它比較好,FUZZY 控制多半用在建不出系統數學模式的時候,不得已採用的方法,提供你參考。
PID我不知道為什麼我的Segway很容易爆衝,PID的參數設定也不易有很好的規劃。
回覆刪除薛老師您好,
回覆刪除PID 控制調整確實不太容易,你可能要注意調整的時間點,例如,你每 0.1 秒可得到轉速回授資料一筆,那麼就每 0.1 秒調整輸出控制,否則很容易調過頭。
dear bridan
回覆刪除我想看一下你提供的fuzzy寫法,但是我在網頁中並未看到source code,因為我想要把它拿來寫在超音波沿牆走中,做判別,一直沒有好的想法。
Wallace 您好,
回覆刪除請告訴我電郵,明天將郵寄給你。
謝謝
dear bridan
回覆刪除my mail is p886222@hotmail.com
thank you very much
由於 Google 不再支援群組論壇,致使檔案下載失敗,因此我將逐步搬移檔案到 Google Documents,想下載的朋友仍須登入 Google 帳號,但要等待我的批准許可。
回覆刪除我喜歡 Google Group 主要是它免費讓大家上載或下載檔案,並自動幫我留下參觀者電郵,真是蠻可惜 Google 不再支援它。
不便之處,敬請見諒。
Dear 布里登,
回覆刪除之前有看到你的NXC之fuzzy control程式,由於目前有需要,是否可唐突請你寄該
source code給我?
謝謝~
hanuskimo@kimo.com.tw
hanuskimo 您好,
回覆刪除已經設定檔案共用,您隨時可以從 Docs 下載。
Dear 布里登,
回覆刪除本人不會使用Docs,所以.....
可以跟我講怎用呢?
謝謝~
hanuskimo@kimo.com.tw
沛穎 您好
回覆刪除我忘記 Google Docs 只對 Google e-mail 帳號有效
因此電郵附件給你參考
有甚麼問題,歡迎討論
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
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
dear bridan:
回覆刪除前陣子跟你拿了fuzzy控制馬達的code,一開始看我是不太懂,我就去借了fuzzy的書,我看大部分會用建表的方式來查,但是表中的值要怎麼設定我實在沒有什麼sense,再回頭看你的code,發現你也沒有建表,好像是直接計算的,其實我現在是想做一個很簡單的動作,就是前端的3~5個超音波來避障,但是沒有什麼頭緒下去寫程式,當然其實也可以不用fuzzy的方式來寫,但是還是想要用fuzzy試試看,不知你可以給點建意嗎?
Wallace您好,
回覆刪除想Fuzzy控制,應先列出規則式,也就是
IF ...input... THEN ...output...
當你能列出規則式後,我們再來看輸入與輸出歸屬函數。
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 向右轉
這樣列也不知道對不對?上下兩組規則最後應該會有輸出值多少速度,轉多少彎?
Wallace 您好,
回覆刪除看你用五個超音波感測器會不會太多,除非你的機器人很大,需要多向檢知,不然超音波感測器會相互干擾,甚至每個感測器須分隔 45 度角以上。
另外,這機器人用途為何? 依目前規則式來看,當它被放在ㄇ字型位置時會靜止,但是多數的規則式會前進或轉向不會停止,它何時需要停止?
有幾個馬達要控制 ? 這些基本問題先弄清楚,再討論其它。
dear bridan
回覆刪除機器人滿大的,五個我覺得差不多,干擾的問題我了解,每組打開的時間會停一小段的delay(但還是會干擾,但有盡量避開),馬達的控制之前就寫好,只是call function而以,何時會停止的話,應該是設定一組目標點的座標,用目前的座標點去算出距離和角度,再來中間有障礙物,所以要避障。
Wallace 您好,
回覆刪除OK 清楚你的系統概況,簡單的說,機器人知道自己的位置,它會自行前進到目標點,只是遇到障礙物需要避碰,如果沒有特殊需求,建議等速前進就好,到達目的地或靠近障礙物就停止。至於是否到達目的地的判別,應該不是用超音波感測器檢知吧? 這很容易會誤判為障礙物而轉向。
轉向規則須要修改,考量兩種情形,直行方向沒有障礙物,但是旁邊有東西,依你的規則會轉向偏走; 第二種是走迷宮時,前行遇障,請固定向右或固定向左轉,不要隨機左右轉,不然可能走不出迷宮。
改完後再討論。
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 向左轉
大概修改了一下,不知道這樣是不是對的,感覺不難,但是叫我突然寫,實在沒什麼概念
Dear Wallace,
回覆刪除目前這些規則式仍潛藏問題,請暫時放下對 Fuzzy 的迷思,你所列出的規則式也必須適用非 Fuzzy 控制的系統。
我假想你的機器人是走迷宮的,迷宮會是長長的走道,簡單的說兩旁都有障礙物,可是機器人仍必須向前行,因此我認為現在的規則會讓你的機器人轉來轉去不會直行。
所列的規則,必須要能讓機器人走到轉角再轉彎,如果不是迷宮請告知,有些規則可能要修改,當所有規則列出後,你找個迷宮圖走看看,走的通,表示規則式正確。
抱歉,我無法提供你完整規則式,這些都需要你自己思考,現在對你來說也許很困難,不過透過這樣的訓練,可以讓自己設計技術更加進步,我可以幫你檢視規則式的合宜性,加油。
Dear Bridan:
回覆刪除我最近想用fuzzy去控制BLDC,麻煩分享你的程式,參考如何實作。
billshih.tw@gmail.com
Dear Amigo.tw,
回覆刪除歡迎來訪,已經發信給你,如果還收不到,請再留言。
你好:
回覆刪除可不可以給我可用FUZZY的C程式!因為理論看不懂?
謝謝
jlian168 你好,
回覆刪除請點選本篇文章中 FUZZY 的連結,我會設定核准你的申請,那你就可以下載 NXC 程式碼。
老師 你好:
回覆刪除1.可能我反應比較不好,我點FUZZY後沒有,
然後我點NXT後下載了"lms_arm_nbcnxc_src"檔案,
但好像沒有FUZZY的程式?
所以我不知道對不對?
2.有FUZZY+PID的C程式嗎?
3.能不能傳給我?
jlian168@yahoo.com.tw
謝謝.
jlian168 您好,
回覆刪除FUZZY 及 PID 兩檔案已經開放你可以直接下載,我並沒有兩者合併的程式,未來你可以研究兩者的合併,利用 FUZZY 找出 PID 的係數。
老師您好:
回覆刪除我想參考您的Fuzzy Rule,我想利用在RFID讀取的時間差當輸入參數調整我的讀取效率,能否請老師給我權限,謝謝您
jerrychen68@gmail.com
阿營您好,
回覆刪除權限已經設定,程式參考看看,通常嵌入式系統為了資料讀取不漏接,是在中斷程式中處理,而且會有輸入暫存區,我不清楚你的構想,不過祝你成功。
老師您好,
回覆刪除我目前的研究是,透過讀取的時間差,餵給PID當參數進以調整馬達轉速,想試試改用Fuzzy的表現如何,另外請問老師,所謂的Fuzzy調整PID是甚麼意思?
阿營您好,
回覆刪除我所謂 Fuzzy 調整 PID 意思是以 Fuzzy 調整 PID 的 Kp, Ki, Kd 等係數,其實跟你的想法是一樣的,至於 Fuzzy rules 要看你的 case 決定。
老師您好,
回覆刪除我還是不太懂您的意思,PID的參數調整一部分是依照經驗法則。
就我的認知,Fuzzy的主要精神應該是仿照人類的思維近似推理的方式找出結果。
若以冷氣為例,PID是控制,Fuzzy也是控制,用控制調整控制,我還是不懂
阿營您好,
回覆刪除舉例說明,以 PID 控制馬達轉速,通常 PID 係數是常數,而且是工程師經過無數次實驗找出來的,但是你可以將這些 PID 係數改成變數而不再是固定的常數,這樣控制馬達轉速的特性就會完全不同。也許有些情況,要馬達慢慢轉速增減,也許有時要馬達急速變化。
如果是固定的 PID 係數,必須搭配其他方法才能展現這樣功能。那利用 FUZZY 來調整 PID 係數,是不錯的方法,仿照人類的思維近似推理的方式找出適合的 PID 係數。
Dear Bridan
回覆刪除現正學習Lego-NXT,RXC程式中,敬請提供fuzzy寫法的source code,以利學習。若有PID寫法的source code,也一倂寄出為何?感謝您。
我的E_Mail如下:
hjchen3724@yahoo.com.tw
阿紫
Dear Bridan
回覆刪除已收到Fuzzy程式,然
1. 程式中僅有OUT_A,而無OUT_B,造成機器原地打轉;
2. Light Sensor沒用到嗎
阿紫
阿紫您好,
回覆刪除這裡的範例程式只對馬達A控制,建議你閱讀我另一篇前文 PID speed control (http://4rdp.blogspot.com/2008/05/pid-speed-control.html),這樣才會對 NXT 馬達控制有全貌了解。
本文並非控制循跡車,因此light sensor沒有使用。
網友阿紫電郵詢問下列問題,以及我的答覆如下
回覆刪除----------------------------------------------------------------------------------------------
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 的數值,調整兩輪不同速度設定,就可以達到循跡的目的,祝你成功。
你好我作論文需要用到 將導盲磚辨識度提升 將使用到fuzzy能教我如何用matlab寫模糊程式控制嗎
回覆刪除徐同學您好,
回覆刪除我樂於在部落格上給予指導,基本上一切須要你自己努力,我會提供意見參考,討論內容會公開於部落格上。
倘若同意上述原則,歡迎留言討論,假如另有圖檔資料可能以電子郵件討論比較好,如果需要請留下電郵。
因為工作忙碌關係,留言不會立即回覆。此外,想知道你的系統輪廓,從留言得知,你想用 Matlab 設計模糊控制程式,代表你的控制平台是一台電腦,疑問是系統的檢知器如何?以及你要控制甚麼東西?
你好最近用光感+馬達FUZZY 有興趣 可是點FUZZY 沒有東西OAO~是否可以討論 以及 拿檔案 研究一下?
回覆刪除我的E-Mail如下:kiter_1005@hotmail.com
Dear Kiter,
回覆刪除檔案已經寄給你,有問題請留言討論。
您好 最近我在使用fuzzy pid控制馬達 但是fuzzy部分的code不太行 跪求您的fuzzy code
回覆刪除我的信箱:q456741@yahoo.com.tw
Hi,
刪除程式碼已電郵l,如有問題歡迎部落格上討論。
最近有讀者問我一些問題,重點整理如下:
回覆刪除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,簡單及容易理解。
Hi Bridan,
回覆刪除很高興能看到這麼好的教學網站,因本人對Fuzzy控制有興趣,
想瞭解Fuzzy 與 PID 的差異,因為上面連結似乎是失效了,
是否方便再提供一次呢?
謝謝!!
Hung Sir,
刪除歡迎參閱研發養成所,程式碼連結已重新設定,應該可以正常下載檔案,這兩程式皆以NXC撰寫,你也可以用其它文書處理程式開啟。有任何疑問歡迎討論。