顯示具有 kalman filter 標籤的文章。 顯示所有文章
顯示具有 kalman filter 標籤的文章。 顯示所有文章

2016年8月6日 星期六

四驅車GP晶片計畫

自從去年發現租屋處附近開了一家四驅車店家之後,就又重新燃燒起熱血
台灣不流行的期間基本上幾乎完全沒有消息,也沒有軌道可玩(日本好一點四驅車一直都存在,但也是沉寂多年官方沒有辦全國性的比賽)

回鍋後發現現在的玩家有很大的比例跟我一樣是二十多到三十多歲的大人,小時候有玩過,長大後又跳進來玩
可能因此導致現在軌道跟十多年前相比比較偏向技術軌,多了很多難度,所以不是單純比高速,而是變成在不飛車的前提下盡快跑完全程

之前看了很多四驅車相關的網站、論壇、玩家的部落格
基本上是都是以田宮 or 半田宮 的規則在玩,使用固定的機制去應付像是跳台或交換到這種難關
例如跳台落地為了穩定度,改成避震車或使用金球、吊鐘,為了過彎加裝單向輪/彈簧前後翼等...
為了因應不同場地而做調整,須累積大量的經驗,熟悉各種零件的特性,以整體賽道所有難關的"最大公約數" 的方向去做調整

在這個過程中,不斷的去發揮創意改裝與測試,真的有很多樂趣,這也是四驅車吸引人的地方

不過玩了一陣子後,就一直在想以這種玩法,就算玩到最極限,也是要配合賽道在各種方面(速度、重量、改裝方式等...)做取捨,所以漸漸地有了一個想法:
何不結合單晶片,讓車子自行適應軌道後做調整,這樣可以使用幾個基本車型(像是輕量高速型或是扭力型)來稱霸所有類型跑道

其實這就是卡通裡的GP 晶片啊!!!
在網路上有看到一些玩家使用單晶片改裝GP晶片,但是偏向語音或人工控制車子
https://www.youtube.com/watch?v=85913C7MjoQ
https://www.youtube.com/watch?v=C1x2Jdm_9eA


而我比較感興趣的部分則是讓車子自行學習,能夠自行適應各種跑到跑出不錯的成績

有了這個想法後,漸漸的想了一些可行的架構與做法,部分的功能也曾經做出可行的成品
(綠色部分是已經有做過有經驗的部分,藍色部分是已有方向正在研究中,紅色部分是還沒有想法或是需要重頭學習的領域)

目前先規劃一下架構,整理一下有能力與需要學習的部分,最後再全部整合起來




2014年2月26日 星期三

卡爾曼濾波

為了將sensor量測的結果計算出真正得四軸的姿態,研究了一陣子,看起來大部分的人卡爾曼綠波來做處理

目前study一下稍微有點概念,但實際要套用到四軸上,三軸資料同時運算,又要考慮效率,看起來要回去把大學的線性代數、矩陣運算重新複習一遍了

系統描述

  • X(k)=A X(k-1)+B U(k)+W(k) 
    • X(k): 這次的狀態
    • A X(k-1): 上次的狀態經過A做轉換
    • B U(k): 輸入的改變經過B做轉換
    • W(k): 實際影響的誤差

系统的测量值:

  • Z(k)=H X(k)+V(k) 
    • Z(k) 測量值
    • H X(k): 將X(k)轉換為測量值
    • V(k) 為測量誤差

誤差定義

  • Q: 量測的誤差(高斯分布,平均為0) <==固定
    • 例如每次溫度計量出來跟實際溫度都會有+-0.5度的誤差,但多次平均後仍與實際溫度相同
  • R: 隨著時間演變的誤差(高斯分布,平均為0) <==固定
    • 假設系統理想上每隔一分鐘上升一度,但實際上可能有+-0.1度的誤差,但長期的趨勢平均還是每隔一分鐘上升一度


基本公式




  1. X(k|k-1)=A X(k-1|k-1)+B U(k)
  2. P(k|k-1)=A P(k-1|k-1) A’+Q
  3. X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) 
  4. Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) 
  5. P(k|k)=(I-Kg(k) H)P(k|k-1)

基本概念在這個網站上講解的非常清楚
http://www.geek-workshop.com/thread-1487-1-1.html

以溫度為例計算為例
  1. X(k|k-1)=A X(k-1|k-1)+B U(k)
    1. 這次推估的溫度X(k|k-1)等於上次預測的溫度X(k-1|k-1) 透過A轉換出來的值加上這次輸入的熱量造成的改變BU(k)做轉換(例如輸入U(k)100卡, 透過B轉換為溫度1度)
    2. 這個例子來說A 跟B 都是1
      1. 這次的推估溫度X(k|k-1)單位跟上次計算出的溫度X(k-1|k-1)單位相同,不用做轉換,所以A=1
      2. 溫度計量到的值就是溫度,所以不用做轉換,B=1
  2. P(k|k-1)=A P(k-1|k-1) A’+Q
    1. 這次推估的溫度X(k|k-1)的推估誤差P(k|k-1)上一段時間的誤差P(k-1|k-1)加上測量誤差Q
  3. X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) 
    1. 這次的計算結果等於推估溫度加上  這次卡爾曼增益Kg(k)* [測量值Z(k)與推估值H X(k|k-1)的誤差]
    2. 這邊H=1
  4. Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) 
    1. 這次卡爾曼增益Kg(k) 為這次的推估誤差P(k|k-1)/(這次的推估誤差P(k|k-1) + 隨著時間演變的誤差R)
    2. H'=H=1
  5. P(k|k)=(I-Kg(k) H)P(k|k-1)
    1. 這次實際的推估誤差為(1-這次卡爾曼增益Kg(k))*這次推估的誤差P(k|k-1)




參考
http://www.360doc.com/content/11/0506/14/3810344_114798067.shtml
http://www.geek-workshop.com/thread-15257-1-1.html
http://gcyrobot.blogspot.com/2012/08/simple-kalman-filter_29.html?m=1
http://jpkc.nwpu.edu.cn/jpkc2005/40/ebook/kcsj/chp12/12_7.htm