YAD2U Unity&C#編


## YAD2U C#編
Yet Another Deepmimic to Unity !
 

## Other References
- Environmental Setting
https://qiita.com/tanakataiki/items/40f54b3851c2ed3e09ec

- Tensorflow　Search
https://qiita.com/tanakataiki/items/8655c76b68933905f3ea

- Unity&C Sharp
https://qiita.com/tanakataiki/items/fbb3a4782add01d73428


## 対象
- Unity(Mocapデータ,Kinematic tree，Animation)
- C#(物理エンジン，幾何学計算)
- mlagent(強化学習SDK)

以上の3つに慣れ親しんでいる人の参考に少しでもなればいいなぁと思った．

## 略語
- Additional　Task　Objective
- Immitation Objective

## 概要
YAD2U yet another deepmimic to unity deepmimicの理論を用いた
非公認プロジェクトです．


## Unity Editor側
Scene内のParentから順に説明していきます．
Deepmimicにある観測するStateを以下を参考にmlagentにおけるvector observationの変数として設定.
https://qiita.com/tanakataiki/items/94c7778341a40438cc99#state
アーム版のAgentでは両手首は両前腕に固定しているため，Observationは冗長なので，はじきました．
Actionは各関節のTargetRotationとしました．

## EarlierTermination(ET)の実装
OnCollisionEnterの時にAgentをDoneして終了します．（mlagentのC#の変数として定義されています）
その場合Penaltyとして，SetRewardを０にします．
ETは歩く場合足以外のCollisionに対して，行います．歩行，走る，バク転など
復帰できない動作に対して有効です．
ArmerAgentを動かす際はいりません．


#Mimic Pairについて
AgentとReference Record,Goal(AditionalTaskObjectiveの時今回はStrike）のセットになるように作成します．

![editRecording.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/8579537c-f449-721d-11b4-d2b7234a9c2b.png)

これをInitialize Academy時に複数Instanciateすると並列分散学習ができるはず！



##Agentの作成
作成したAgent赤いのはMaterialエラーです．．なるべくMocapのアセットに近い体形にしました．
![deepmimicagent.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/afb86ebd-8d14-a995-9f18-f2019d4fc7b9.png)
### Agentの設定
Massを以下参考に設定
https://qiita.com/tanakataiki/items/94c7778341a40438cc99#body-parts-info
すべてKinematicsはFalse

### Referenceの設定
isKinematicはTrue
CollisionもOff
AnimationのKinematicTreeの中にそれぞれのPartsを入れ込む．

#Mimicの概要
https://qiita.com/tanakataiki/items/94c7778341a40438cc99#immitation-objective

#Recordの実装
ここに実装しておきました．
MocapDataや，自分で作成した，ImmitationしたいMotionをRecordし，学習時に読み込むことで，ReferenceMotionを再現することができます．


#RSIの実装
RSIは今回TaskObjectiveも加味して，半分より前の状態すなわちArmerAgentではボールに触りに行く状態から始めています．



#Skill Selector UIの実装
![selector.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/650237d8-2981-055d-1787-99c67eb08070.png)

こんな感じでスキルごとのボタンを用意しておきました

#つぶやき
うまいなぁと思った点は，Strikeって１度Strikeできたかどうか判定するのに，LSTMやRNNなど，時系列を使うこともできるんだけど，ものすごく複雑になるので，今回はHitしたら，以降Stikeによる報酬は１に設定することで，それ以上無駄なStrikeをしなくなる．（逆にこのようなフラグを設定しないと，いつまでも触り続ける）

微妙だなぁと思った点は，Targetでかいし，芯をとらえていない．
まあ，ただ，芯をとらえるMotivationはImmitationに比べると，あまり大きく無くて，指示通りのこと以上はしてくれない．
![taskObj.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/74729d6e-11a7-78f6-906a-02eb031bce8d.png)

確かに，Targetの距離からEndEffector（ここでは右足）が近づけばRewardはExpに比例して(表現あってる？)大きくなるけど，一定の範囲内に来れば１，になるので，Rewardの７割を占めるImmitationを優先し，残り３割のStrike判定ぎりぎりのところを狙って蹴るのはRewardを最大にするうえで，重要で，まあある意味賢い
![differenceBetweenReference&Agent.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/ad95242c-c3e8-0b2d-a262-e6fbeb1acc81.png)

TaskのRewardの割合を大きくすると，Immitationしなくなるため，やっぱり暴れる...以下はイメージです．．．
![walker.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/c5f841cf-6caf-ec88-c474-d258a4bd5283.png)

ここら辺の感覚は実装してみるとわかる．

筆者が頑張って追実装していた去年の9月ごろにはDeepmimicのOpenなRepositoryはなかったので，お，これは作るしか！とか思ってたんだけど，今となってはコードはGithubにあるし，詳細が見放題（HyperParameter論文と違くねとか結構思ったけど，試行錯誤の上なのかなあ．）
https://github.com/xbpeng/DeepMimic

公式のDeepmimic（windows版）は依存環境が多く，環境構築が鬼めんどいので，結局途中であきらめた．誰か環境構築の記事書いて～～