犬ロボットを歩かせる シリーズ第3回です。

今回は、前回作りかけた犬の3DモデルをUnityにインポートして動かせるようにしてみよう。

ついでに!現状できている3Dモデルは胴体と前足の一部です!見方によってダックスフントの顔に見えるようです…

Fusion360からfbx形式でエクスポート

3D アプリケーションからモデルをインポートする方法をみると、Unityはfbx形式というのでも対応しているみたい。fbxはテクスチャも付けられるので、objよりも良さそうです。ということで、Fusion360からfbx形式で3Dモデルをエクスポートしてみます。

本当であれば、Fusion360でのアセンブリの拘束情報なども全部Unityに持っていってジョイントを楽に生成したいのですが、ぐぐった感じではそういうことはできなさそうです。(Gazebo使ってたときはInventorのアセンブリの拘束ごとSDF or URDF に書き出すツールはあった)

なのでUnityではジョイントを自分で設定していかなければならない心づもりで。

私自身まだFusion360のことはよくわかっていないのですが、ローカル上ではfbx形式でのエクスポートができず、AutodeskのWebサイト上でモデルを表示するとエクスポートできるようです。

まずは、左のパネルでアセンブリデータを選択し「ウェブ上の詳細を開く」をクリックします。

開いたページでは黒光りしたかっこいい犬モデルが表示されます。

右上のバー上のダウンロードマークをクリックし、「FBX」を選択して、モデルのfbxデータをダウンロードしましょう。

Unityでfbx形式をインポート

今度は、Unityにfbxデータをアセットにインポートしてみます。

アセットリスト上で右クリック→「Import New Asset」でfbxデータを選択します。すると、以下のようにアセットリストに犬モデルがインポートされます。

このデータをそのままヒエラルキーにD&D。ヒエラルキー内の犬モデルはわかりやすいように以下のようにrenameして、サーボモータやサーボホーンはシミュレーションでは利用しないので削除します。

  • 「dog-asm」を「Dog」に
  • 「body-front」を「body」に
  • 「leg-front」の2つを「LegLeft」と「LegRight」に

ステージに見えないくらい小さい犬モデルが配置されているので、以下のようにDogを50倍のスケールにするとちょうど良いサイズになります。

そして、ヒエラルキー上で右クリック→「3D Object」→「Plane」で、地面としてのPlaneを生成します。サイズは12くらいが良さそうです。

犬モデルを3次元物理シミュレーションする

Fusion360のこともあまりわかってないですが、Unityのことはもっとわかっていません。こういうときは先人の知恵を拝借しましょう。

【Unity強化学習】自作ゲームで強化学習 こちらのページでイチからUnityで3次元物理シミュレーションをするやり方を掴みました。

ざっくりいうと、オブジェクトに対してRididbodyを追加すると、そのオブジェクトが物理特性によって制御する事ができるようになります。また、オブジェクトにColliderを追加すると衝突判定するようになるみたいです。

Colliderにはいくつか種類があるようですが、本来使ったほうが良さそうなMesh Colliderは今はよくわからないので、とりあえずBox ColliderでなんとなくBodyやLegの衝突判定領域を設定します。

まずBodyの設定は以下。

次は足パーツです。

ボディと足はサーボモータでつながっていますが、サーボモータはUnityでどうやって表現できるのでしょうか。ぐぐってみると以下のページを発見。

【Unity】3dで人間の関節の角度調整方法がわかりません

つまりは「HingeJoint」を使い、ヒンジのSpringのバネの力をすごく強くして、spring.targetPositionで角度指定すれば一瞬でその角度にヒンジが固定されるようになるとのこと。このしくみを利用すれば擬似的なサーボモータを実現できそうです。さっそくやってみましょう。

LegRightの設定は以下です。LegLeftも同じような感じで設定していきましょう。

「Use Sprint」をtrueにし、「Spring」は「1e+07」、「Target Position」はプログラムから変更するようにすればサーボっぽく動かすことができそうです。

しかし、「Target Position」を目的のところにいきなり動かすとサーボモータっぽくありません。指定した角度にもたーっと回転して、サーボモータの回転速度をちゃんと再現するために、以下のコードを各Legに追加します。

このコードで、キーボード入力によって足の角度をサーボモータっぽくコントロールできるようにしています。

動かしてみる

Unityの再生ボタンを押して上下キー(LegLeft)と右左キー(LegRight)を操作してみると、想定していたような感じで動きました!やった!


コレだけでも歩けそうだから、このまま歩行スタイルの強化学習までいってしましょう。

前進すればするほど正の報酬を与えるようにすれば良い感じ。あとこのモデル、ひっくり返ったら全く動けなくなるので、ひっくり返ったら負の報酬を与えるようにしていこう。

次は…

この犬モデルを分身させつつ、ML-Agentsで前進する歩行を獲得させてみよう!