1. 程式人生 > >Unity3D環境 強化學習 訓練機器人(TCP通訊機制)

Unity3D環境 強化學習 訓練機器人(TCP通訊機制)

前言:

         已入強化學習一個學期了,發現自己急需一個物理環境來進行訓練機器人,前前後後參考過過許多環境,但是最後選擇了Unity3D,這是因為其足夠簡單,不用費很大的功夫就可以建立一個簡易的機器人,只需要編寫C#指令碼和tensoflow進行通訊,立馬就可以生成一個模型。對於這點,之前我找過資料看是否unity 支援python指令碼,國外一老哥介紹了方法,但是我的電腦在安裝一些內容時就出錯,當我確定通訊方案已經開干時,後面忽然發現,unity 官方也在支援機器學習,也就是2018年的事情,本質上也是通訊,但是他有許多內容都已經打包,所以需要原生態的還是需要自己建立。我採用TCP的方式,建立通訊機制,採用PPO的學習演算法來進行了一些簡單的測試,效果還行,仍有許多問題需要解決。

一,建立自己的方塊機器人(Box Robot)

       建立robot是一個很有意思的過程,如下就是在多次嘗試之後的柯基犬:

 1.新增受物理環境影響的屬性

   新增該屬性,所建立的模型就會受到物理環境的影響,這裡至關重要,裡面可以設定運動的自由度,運動粘滯。

 2.物理的關節建立

   在嘗試unity時,一窮二白,在多次嘗試之後發現,可以使用

這個就是旋轉Joint,裡面可以設定旋轉的上下限,可以使用馬達並設定旋轉速度,單位(deg/s),可以是用彈簧等。我建立的BoxRobot 利用了他的關節角度限制,馬達旋轉速度等引數。裡面比較重要的就是Connected Anchor這個屬性的設定,他的座標不是依據該物體的座標!(肢體關節不可過長,否則會在一個自由度方向發生振動,這個吃了大虧)

  3.新增摩擦

   在unity中,我所知道的是利用新增物理材質Physic Material ,裡面可以進行設定滑動摩擦和靜態摩擦,我只在地面和腳的的地  方添加了摩擦。

 4.編寫指令碼

     對每個肢體都編寫了指令碼,有資訊反饋函式和引數設定函式。最後這些指令碼在總的執行腳本里面呼叫,執行。通訊指令碼的編寫參考:unity 與 python 通訊(demo)

    對於觀測狀態,有X軸角度,Y軸角度,每條腿的角度值。激勵策略:X軸方向位移差*50 。行為:每條腿下次要轉動的角度,速度依據角度差! (我這裡的策略可能有問題,在完善中) Z軸位移為固定,只訓練前進速度。

二,python端

       在python 端我利用了PyQt的訊號機制,當然也是用了他的TCP介面,這樣做的目的使得效率較高。而且我訓練的過程也是放在了槽函式裡面!

       PPO(Proximal Policy Optimization近端策略優化)是OpenAI提出的一種DRL演算法,其對於連續控制問題具有比較好的效果,已經是OpenAI在強化學習上的預設演算法了。還是基於基於 Actor-Critic 演算法,這點我比較喜歡。通俗的來講利用綜合價值優勢來進行梯度下降的,而且下降依據綜合價值*clip(0.8,1.2) (舉例),在policy上採用比例的方式,比較好的解決了步長問題。總的來說比較簡單,而且paper裡面公式都很簡單,相比DDPG來說,省了很多功夫。而且大佬們說好或許就真的好。由於可憐的硬體和時間問題,我只嘗試了PPO演算法。

三,實際結果

早期的dog:

現在的:

可以看出柯基的步態很有意思,在其他次的訓練中,他總是到一種區域性最優的情況,就不思進取了,這裡需要改善和一些經驗指導,有可能問題就出現在機器人的模型上。

依據tensorboard顯示的Loss我的後面波動比較大,這裡就不展示了。

接下來,準備嘗試自由度更高的模型,在激勵策略上進行優化!