2008年11月30日 星期日

電腦鼠-向心法則



其實我們的向心法則還挺浪費時間的,不過還滿好用的就是了。


首先還是一樣,和中右法則一樣,先定義好迷宮資訊,和第一格的資訊。



講白了,我們的向心法就每一格都算一次FLOOD 演算法,這樣每格就都會有一條建議路徑提供給電腦鼠怎麼走會比較快的走到終點。因為方式都一樣,所以就不任外做了。




不過用這樣的向心法有一個缺點就是,如果FLOOD 的執行效率很低的話,是會算不出路徑的。


所以是有必要針對FLOOD 演算法做最佳化的動作。


原先我們使用掃描的方式,也就是需要每格每格的找出需要被更新的格子,這樣的運算非常浪費時間,運算起來大概約9ms @ 30MIPS。



我們使用了資料結構的方式,將需要被更新的格子記錄起來,下一次再更新被記錄的格子即可,這樣的運算時間約3ms @30MIPS。
 


大概只要完成了向心法則,大概電腦鼠就可以擁有滿聰明的大腦了。


至於還有一些程式技巧就需要給大家花更多的功夫研究了。


電腦鼠-中右法則

這次來介紹,電腦鼠如何找到終點


要用中右法則前,需學會FLOOD 演算法,這樣才可以讓老鼠迷宮時,可以幫忙找一條建議路徑提供給老鼠走到終點。


S為起點,G為終點,黃色格子為已走過的路徑。


因為規格上指出,起點為東南方,朝向為北邊的方向,邊東、南、西皆為有牆。


根據這條規格,所以我們可以將第一格事先更新,且定義已走過的格子。



因為是中右法則,所以優先順序為:前方優先、右轉第二、左轉第三。因為前方有路,所以老鼠會向前走。


因為是中右法則,所以優先順序為:前方優先、右轉第二、左轉第三。因為前方有路,所以老鼠會向前走。


因為是中右法則,所以優先順序為:前方優先、右轉第二、左轉第三。因為前方沒路,所以老鼠會向右轉。



走到這裡,中間有一格雖然沒有走過,但是它的上、下、左、右、皆走過。


所以我們可以定義中間這格為:已走過。


像這樣,已走過就會填上黃色,定義成已走過。


老鼠走到都走過的路徑時,會執行一次FLOOD 演算法,提供一條路徑供老鼠走到還沒走過的地方。


走到這裡,因為前方沒有走過,所以會放棄藍色的建議路徑,改為中右法則。


照著中右法則,走到這裡。一樣中間有一格沒有走過,但上、下、左、右也走過了,所以可以視為已走過。


當老鼠走到死巷死,一樣會執行FLOOD演算法。


FLOOD 演算法會提供一條建議路徑給老鼠。


老鼠走到沒有走過的路徑時,就會放棄建議路徑了。


用這個想法,就可以幫忙老鼠走到終點了。


其實中右、中左、左中右、右中左,大概的想法都是這樣,只是優先權不一樣而已。


我們用了中右法則好一陣子了,雖然走的路徑很多,但是如果要測試校正的話,中右法則是一個不錯的選擇。


電腦鼠-演算法

其實電腦鼠需要一個好的腦袋,就需要一個迷宮演算法


我們的迷宮演算法是參考flood 演算法,FLOOD 的意思就是像洪水一樣的流動。


因為直走的速度可以較快,像我們的直走最高速約160cm/s,轉彎約50cm/s,所以如果考慮了希望可以讓直走的路徑多一點的話,就把轉彎的權重變大,這樣找路徑的時後,就會找直線多一點的路出來(因為直走的權重較低,會以權重較低的為優先尋找)


假設電腦鼠已知地圖:S為起點,G為終點。洪水先從終點開起,直到流到起點。



將終點的上、下、左、右,可以流動的填上權重值。


將1的上、下、左、右,可以流動的填上權重值。


將2的上、下、左、右,可以流動的填上權重值。


將終點的上、下、左、右,可以流動的填上權重值。這時後可以看到,轉彎會在2的地方填上4。


照著這個想法,一直填到起點。


再從起點,由大到小,就可以找到一條最短的路徑出來。


或許也可以比較一下A*演算法的差異性。如果電腦鼠要走斜線的話,也是可以考慮直接使用A*演算法。


2008年11月29日 星期六

第四代電腦鼠-雜訊分析

新版的電腦鼠有另一個重點,就是希望可以降低硬體上的雜訊,那就做個比較吧


這是三代的硬體,當初在拉線的時後,並不清楚電源原來是要分開拉的,所以這電路的VCC和GND全部都接在一起。



pwm沒有開啟時的雜訊,約400mV的ripple。還滿髒的,


奇怪的是,把PWM打開,竟然雜訊是一樣的,呵呵,應該更髒才對,怎麼會一樣髒- -。


這是四代的硬體,把VCC和重電的都分開拉了,並在所有的VCC和GND上都接上一顆電容。


PWM不開的時後確實5V還滿乾淨的,約140mV的ripple。


pwm一開竟然有440mV的ripple,真奇怪,不知道那來的,可能是用地在包pwm的時後,沒有包好,在layout 4.1版的時後,有注意這地方。


這是4.1版的硬體,主要是修正了鎖點沒有對準,和修正第四版包地問題。


pwm不開時,vcc還滿乾淨的,100mV的ripple。和電源供應器差不多了。



pwm打開也只有280mV的ripple。還可以接受。但應該還可以更好。


這是馬達不知道進到什麼狀況,有時後會有這奇怪的ripple產生。最高的ripple達到1.22v。驚人!


每根雜訊約間距2.2~2.4ms,也不知從那裡來的。


小弟的pwm約30k,一個取樣時間約1ms,2ms 的頻率段不知道那裡產生出來的,也不知道該如何下手濾這波段的雜訊。試過將104的電容並聯103、102、101、也沒有辦法壓下這個波段的雜訊。


不知道那裡有在教LAYOUT的實務經驗,還滿想上上看的。


2008年11月27日 星期四

電腦鼠-PI Control



最近在做優化,重新把程式一塊一塊的搬出來重新檢示一次


之前比賽的都只有p control


從下面這張圖很明顯的看得出來實際速度跟不上命令的速度,會很有明顯的穩態誤差


原因是在計算i控制的時後,變數型態是整數,忘記把型態轉成浮點數了。



經過修改過後成了真正的pi control,用了一陣子,老大說這pi control 怪怪的


所以最近又重新做了這部分。



加大i gain,感覺是變好了,但振盪也變嚴重了。


在測試的過程中,因為電池沒電了,所以跑起來變順了,所以就試著把p gain 調低。


將p gian 調成20, i gain 調成200,看起來還不錯。


將p gian 調成20, i gain 調成400,看起來還不錯。


將p gian 調成20, i gain 調成500,看起來是最好的。


最後的pi control 就選用這組了。


大至上不會再改變了。


在檢視PI Control的時後,之前調參數是改一次燒一次程式,很浪費時間,現在習慣把變數寫在eeprom裡,用按鍵設定就可以測試了,這樣就可以省去非常多燒錄的時間,不然燒一次程式大概2分鐘吧,真的很久。


電腦鼠第四代




為了希望可以讓電腦鼠可以擁有更高的性能,不只是軔體,連硬體也要來加強一下。


這是第四代的電路圖背面



這是正面


零件焊好的樣子


這是舊版的零件


這是新版的擋塊


裝上馬達的樣子


這是這版的擋版用雷射製作的


因為四代雖然電路正常,但是因為配置沒有注意到,還有孔位誤差約0.3mm


當果被老大訓了一頓,整個壓力很大


當天和老大一起學習protel 製作機構圖


這次就很注意這些配置上的問題。


第4.1版的正面


4.1版的背面


完成圖


原本三代重250公克



第四代目標是200公克,用現在的鋰電池約220公克。


希望可以找到合適的電池。


第三代和第四代的正面比較


第三代和第四代的側面比較



其實三代和四代並沒有太大的差異,主要在於拿掉不要硬體和增加buzzer,還有重心的降低,所以可能感覺不出來有很大的差異。這次的齒輪比並沒有更改,或許達來更改齒輪比也是一個非常重要的重點,現在約為5.2:1,如果可以改到3:1的話,最高速應該可以提升快六成的速度。不過目前的重心放在優化程式和加快轉彎速度。等這都做好後就要著手校正了。


在焊完後做測試,結果slave 的MCU一直當機,導至encoder 的pulse 數一直不對,一直以為是雜訊的干擾- -  最後重焊了一次master的接腳,好佳在正常了,不然這下就真的很有趣了。


ps:在老大要回家時和他報告說會一直reset的現象,他笑著對我說:「你糟糕了」,ㄜ~ 我的老闆像小孩一樣在撒嬌。