エアホッケーを目指したロボットの実験のの忘備録です。

—–

ボールを向こう側に押し出す動作を学習させた。

報酬は、赤いディスクが落ちた時の縦方向の速度(向こう側が正)とした。結構激しい動きだが、ディスクは向こう側に押し出されている。

前回は、稼働部分をHinge で実装したが、
今回は、ArticulationBody という、Unity2010.1からの新機能で実装した。
そのおかげで、関節部分がぶれずにしっかりしている。

ArticulationBody の使い方は、npaka さんの「UnityのArticulationBodyの使い方」がとても参考になった。

ゲームオブジェクト

アームは、アンカー部分となるJoint0、そこにRevolute でつながるJoint1、さらにそこにつながるJoint2からなる。

Joint2は、Endeffectorとなずけた緑の円盤状のパッド(Endeffector)も含む。

これらは、階層構造で定義しており、Joint0 > Joint1 > Joint2 の関係がある。
さらにJoint0は、Worldというゲームオブジェクトの下の階層となっている。

Joint0のパラメータは以下の通り。

Articulation Body をAddして、Immovableをチェック。Regidbodyはいらない。

Joint0をエージェントとしたので、Behavior ParametersとDecision RequesterをAddしている。Decision RequesterのDecision Period はきめ細かい動きにしたくて、最終的にDecisionは2まで下げた。

Joint1のパラメータは以下。

Articulation Body は、Hinge のような可動部を表すRevolute にして、方向と位置を設定。

Joint2のパラメータは以下。

今気づいたが、Articulation Body のDamping がJoint1では100で、Joint2では1000だった。これは意図していなかったが、これでも学習できた。

Joint2の先にパッドがついている。これをEndeffectorと名付けた。ディスクをはじくために、RigidbodyとMesh ColliderをAddしている。

赤のデスクがTarget。これにも、RigidbodyとMesh Collider をAddしている。

以上がWorldの中身で、最終的にはこのWorldをプレファブ化して、16個並べた。

プログラム

並列に並べて実行するために、ローカル座標を使って制御や報酬を定義するようにした。

プログラムは、Joint0にAdd Component(多分、何にAddしても大丈夫そう)。

プログラムのパラメータは以下の通り。

Config.yaml

Config.yaml はいつもと同じ。

実行コマンド

–force は上書きオプション。[name]はシミュレーションのID。

途中から再開するときには –resume オプション。

グラフを見るためのコマンド

グラフがうまく書けていない場合には、ctrl + c で止めてもう一度実行すると見えたりする。
いろいろな条件で試した。計算はmax_steps = 500000でも20分くらいだったと思う。