【Unity】 坦克尋路

這是一篇殘缺不全的記錄……

Unity尋路所有的資料大概都是NavMesh吧。本來這一塊跟我沒啥關係,後來隊友告訴我:NavMesh沒法模擬坦克的轉向。
我也不知道是怎樣勇氣打算試一下機器學習?反正最後涼了想看解決方法的散了吧……

配環境啥的都不說了。
agent的移動方式是轉向和向前向後運動,就是基本的坦克的運動。
提醒一個問題就是如果是用

Input.GetAxis("Vertical")

來判斷方向的話,這個值在brain設置爲player的時候是對的但是在訓練的時候是0……

一開始設計的是

  • 獎勵
    • +2 看到目標(正前方的射線檢測到目標並且在一定距離內)
    • -0.01 每步
    • +0.02 如果這一次比上一次更接近目標點
    • -1 坦克掉下去
  • 重置條件
    • 坦克的 y < 正常值(掉了下去)
    • 目標的 y < 正常值(也是掉下去了)
    • 坦克長期不移動(可能卡在了哪裏)
    • 目標在坦克視線範圍內

我還加過一個重置條件是當超過一定時間還沒有找到目標的時候,重置目標的位置。無法評價這個決策的好壞……就不在這裏加了。

這樣訓練的結果是,坦克開始瘋狂撞牆——可能是由於它找到目標的概率太低了。

於是我開始考慮增加找到目標的概率。
雖然坦克需要處於攻擊狀態的話,最後是要面向目標。但是一旦我方的坦克和對方之間沒有障礙物的話,就意味着我可以在後期通過轉向來解決面向目標這個問題。
於是獎勵改爲

  • +2 能夠看到目標(坦克朝着目標方向發射,能檢測到目標)

即使這樣,坦克也還在撞牆……因爲設置的是離散的碰撞檢測,所以坦克偶爾會穿透外牆(真努力啊……)掉下去。可能覺得這樣的重置條件比較容易滿足……
覺得設成連續的成本太高了,於是隨手加了一道懲罰

  • -1 坦克撞牆

然後坦克果然不撞牆了——
它開始左右橫跳。

原因大概就是,我給(接近目的地)的獎勵太高了。讓它覺得(拿一半獎勵是一個不差的選擇……)
於是修改爲

  • -0.001 * 坦克到目標的距離

然後它也不跳了。我也不知道發生了啥全世界亂走……走到不知道哪就愣住不動了……啊啊啊……

因爲等很久也就偶爾的遇到那麼一兩次目標。感覺這樣訓練成本太高了……而且好像Unity的訓練還用的CPU……想想就很絕望。

於是懶惰的我開始尋找其他解決方案。
我找的兩個方案。
https://connect.unity.com/p/pancake-bot?_ga=2.77336086.286916845.1531878685-422510572.1515301463
這個網站中的Pass the butter
以及例程中的
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Examples.md#pyramids

非常的神奇的一點就是,Unity的ML感覺有一種看着它發展起來的感覺。對比一下中英文文檔可以看到歷史版本和現在的版本……這個例程也是這幾個月才發佈的。可能對於感覺自己一直學着上世紀知識的我第一次感覺到開發的進程?(霧)
或許幾個月後Unity就發展到,我就不需要思考這個問題了。

從效果看我選了例程那一個(突然找不到視頻了但是效果真的蠻好的……可以下下來跑跑看)。
它的條件非常的簡單,只有

  • Agent Reward Function (independent):
    • +2 For moving to golden brick (minus 0.001 per step).

不知道訓練了多久能到這個效果……
照這個情況,理論上我之前的模型效果肯定不會差啊(怎麼就這麼隨意的涼了)。

不管了努力的遷移一下……
(找不到視頻真難過)

黑色的射線是小物體在不斷的找開關,接觸到了開關之後會出現目標點,目標點還在空中。這個場景其實蠻好的,因爲它不需要全局信息,模擬出的結果就是(坦克在不知道敵人在哪的時候不斷的尋找,如果你能夠躲在什麼物體後面的話它會看不到你。)但是理想很美好……
不管怎麼說,我認爲只要讓本來傳入開關的參數一直設爲false,這樣這個物體就會不斷的尋找關閉着的開關。
爲了達到坦克遠程射擊的效果,在行爲樹的上層插入(判斷和目標直接的連線有沒有遮擋)。這樣就能實現和之前類似的效果。
我覺得效果還行,看起來最後的問題應該就是調整一下在真實場景裏的尺寸就行了。
於是我嘗試把坦克扔進了我們的遊戲場景。
但是一運行坦克又開始瘋狂撞牆……
調了很久的參數,還是沒有辦法達到一個足夠好的效果。總是轉個向就撞了之類的。

就這樣我發現我們的遊戲和訓練的場景還是有比較大的差距的。或許這個場景在它的眼中類似於
這裏寫圖片描述
我不是指只有一條可以到達的路……而是,我站在中間,可能周圍的東西離我非常的近。
之前的場景,agent可以做到一直往前移動,而訓練結果也確實是這樣的。它不斷交替轉向和前進的命令,就可以實現轉彎。而在現在的場景裏,很多時候僅僅轉彎是不夠的,很可能需要坦克在原地的轉向。而這種擁塞的地形是這個訓練模型無法達到的……

還能怎麼辦呢……我現在在認真考慮要不要手擼一個尋路算法…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章