[Robotics Studio] Sumo[II] - 開始動手寫相撲機器人 -- Day20

  • 4447
  • 0
  • 2009-02-17

[Robotics Studio] Sumo[II] - 開始動手寫相撲機器人 -- Day20

當然, 是從昨天的 mysumo 開始改起啦...
從頭寫的話, 我應該可以從 Day20 混到 Day 30 ...

不過, 我還是可以混很大...哈哈,
先介紹這個範例幫我們產生的 mysumo 是一個怎麼樣的機器人.
這個機器人有下面這幾種狀態, 分別為:

image

這個狀態就是 mysumo 的 state 當中的 SumoMode , 你可以在 mysumoTypes.cs 當中找到這些定義.

從這個圖你就知道, 在 Pending 以前的狀態我們其實都不需要動. (你也不應該偷跑作弊吧?!)

而 Wander 的期間, 機器人就是漫無目的尋找目標 , 直到感應器發現下面這些動作:
1. 從 webcam 看到對手, 進入 Tracking mode.
2. 從 bumper  (左右各一個) 發現碰撞, 進入 Contact mode.
3. 從 floor sensors (地板感應器) 發現出界, 進入 AvoidBoundary mode.
4. 地板感應器的時間 (timestamp) 太舊了...進入 Blind mode.

最簡單的改法就是從 修改 Wander 方法著手 ... 參考 mysumo.cs 當中的 SetWanderDrive() , 原本如下:


/// <summary>
/// This is the default drive configuration for wander mode
/// </summary>
private void SetWanderDrive()
{
    _state.SumoMode = SumoMode.Wander;
    InternalDrivingMilliseconds(250, 175, 250.0);
}

是不是很簡單呢, 它只做一個小幅度的繞圈圈...設定左輪的速度為 250, 右輪的速度為 175 , 然後等到 250 ms 之後再進行新的決定.

怎麼改會比較好?
老實說我也不知道, 不過可以隨便亂改啊, 所以先改為原地順時鐘繞圈圈看看:
InternalDrivingMilliseconds(250, -250, 250.0);
然後讓 mysumo 跟 SumoPlayer (原本內定的機器人) 對打...
有沒有發現我們的機器人大半的時候都是在原地旋轉呢?!

有沒有發現我們的機器人似乎明明看到對手, 卻往前衝一下就停止, 繼續旋轉??
所以, 下次我們來試試看 Tracking Mode 到底在幹啥...

在此之前, 你可以亂改 SetWanderDrive 玩看看...
你應該會有一些心得, 像是速度太快的話, 根本看不到對手... 就算你把反應時間調快也沒用.
這是因為架構上是利用 TimerHandler 這個函式去處理的, 而該函式預設是 200 ms /4 = 50 ms 觸發一次...
更何況預設是每 200 ms 才去處理一次圖像...(這樣 fps 才 5 ... 你能想像 5 fps 的射擊遊戲是甚麼樣子吧?)