前言:
已入強化學習一個學期了,發現自己急需一個實體環境來進行訓練機器人,前前後後參考過過許多環境,但是最後選擇了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我的後面波動比較大,這裡就不展示了。
接下來,準備嘗試自由度更高的模型,在激勵政策上進行優化。
-------------------------------------------------------------------
新的訓練模型