【Unity 6 × ML-Agents】AIに二足歩行を学習 Vol.1(物理セットアップ編)

「Unityでキャラクターを動かす」とき、あなたはAnimatorを使いますか?
それともスクリプトで座標を動かしますか?

今回は、そのどちらでもない「第3のアプローチ」を紹介します。
それは、「AIに体(物理モデル)だけを与えて、転びながら歩き方を覚えさせる」という方法です。

この記事は、Unity 6の最新環境を使い、機械学習ライブラリ「ML-Agents」で人間型ロボットを歩かせるチュートリアルの第1回(全3回予定)です。
特に、初心者がつまずき易い「関節の設定」「重さのバランス」について
「なぜその数値なのか?」を徹底的に解説します。


第1章:開発環境の準備(Unity 6対応)

まずは道具を揃えましょう。機械学習は「環境構築が一番難しい」と言われますが、Unity 6とML-Agentsの組み合わせなら比較的スムーズです。

1-1. 必要なソフトウェアとバージョン

以下の構成で進めます。バージョンが違うと動かないことがあるので注意してください。

  • Unity Editor:Unity 6 (6000.0.x) 以降
    • 推奨:Unity Hubから最新のLTS(Long Term Support)版をインストールしてください。
  • Python:Version 3.10.x
    • Unityでの学習にはPythonが必要です。最新すぎると動かないことがあるため、安定している 3.10 系を推奨します。
    • Python公式サイトからインストール時、「Add Python to PATH」に必ずチェックを入れてください。
  • ML-Agents以降
    • UnityのPackage Managerから導入します。

1-2. Unityプロジェクトの作成

  1. Unity Hub を起動し、「New Project」をクリック。
  2. テンプレートは 「3D (URP)」 を選択します。
    • ※Unity 6ではURP(Universal Render Pipeline)が標準となり、描画負荷が軽いため学習に向いています。
  3. プロジェクト名(例:AI_Walker_Project)を入力して作成。

1-3. ML-Agentsパッケージのインストール

  1. Unity画面上部のメニューから Window > Package Manager を開く。
  2. 左上の「+」ボタン > Add package by name… を選択。
  3. 入力欄に com.unity.ml-agents と入力して「install」をクリック。

第2章:キャラクター(ラグドール)の用意

AIに学習させるための「体」を用意します。

アニメーションで動くモデルではなく、物理演算でグニャグニャ動く「ラグドール(Ragdoll)」である必要があります。

2-1. 3Dモデルの入手

今回は、Adobeが提供する無料の3Dアニメーションサイト Mixamo のモデル(Y Botなど)を使用するのが一般的です。

  1. Mixamoから「Y Bot」などをダウンロード(Formatは FBX for Unity を選択)。
  2. UnityのProjectウィンドウにドラッグ&ドロップしてインポート。(その時Animationなどのフォルダを作り、その中に入れると整理できる。)
  3. Hierarchy(ヒエラルキー)にモデルを配置します。

2-2. ラグドール化(Ragdoll Wizard)

モデルに骨と肉(Collider)を入れます。

  1. Hierarchyで配置したモデルを選択。
  2. メニューの GameObject > 3D Object > Ragdoll… を選択。
    Advanced Bone Setupを開く
  3. 「Create Ragdoll」ウィンドウが開くので、各パーツをドラッグ&ドロップで割り当てます。
    【Y Bot】Ragdoll Builder 対応
    ヒエラルキーにある mixamorig:Hips の中身を順番に開いていき、以下のボーンを探してセットしてください。
    Ragdoll Builder の項目名
    Y Bot (Mixamo) のボーン名
    解説・注意点
    Pelvis (骨盤)
    mixamorig:Hips
    体の中心です。
    Left Hips (左太もも)
    mixamorig:LeftUpLeg
    ※ “LeftLeg” ではありません!
    Left Knee (左ひざ/すね)
    mixamorig:LeftLeg
    太ももの下にある骨です。
    Left Foot (左足)
    mixamorig:LeftFoot
    つま先(ToeBase)は使いません。
    Right Hips (右太もも)
    mixamorig:RightUpLeg

    Right Knee (右ひざ/すね)
    mixamorig:RightLeg

    Right Foot (右足)
    mixamorig:RightFoot

    Left Arm (左腕/二の腕)
    mixamorig:LeftArm
    【重要】 LeftShoulder (鎖骨) ではありません!
    Left Elbow (左ひじ)
    mixamorig:LeftForeArm

    Right Arm (右腕/二の腕)
    mixamorig:RightArm
    【重要】 RightShoulder (鎖骨) ではありません!
    Right Elbow (右ひじ)
    mixamorig:RightForeArm

    Middle Spine (背骨)
    mixamorig:Spine1
    胸とお腹の中間です。
    Head (頭)
    mixamorig:Head
  4. Total Mass20 くらいにして「Create」ボタンを押します。

これで、モデルに Rigidbody(重さ)と Character Joint(関節)と Collider(当たり判定)が自動でつきました。

1. 床(Plane)を作成する

  1. Unityのメニューから GameObject > 3D Object > Plane を選択します。
  2. シーン上に白い板が現れます。これが地面になります。

2. 位置と大きさを調整する(重要)

床とロボットの位置関係を整理します。

  1. 床(Plane)の設定:
    • Hierarchyで Plane を選択。
    • Inspectorの Transform で、Positionを (0, 0, 0) にリセットします。
    • Scale(大きさ)(20, 1, 20) くらいに大きくしておきます(後で歩き回るため)。
  2. ロボットの設定:
    • Hierarchyでロボット(Y bot)をWalkerにする。
      Walkerの親オブジェクトを選択。
    • Positionの Y(高さ)0.51.0 くらいにして、「床から少し浮いた状態」にします。

3. 実行(Play)して確認する

画面上部の 再生ボタン(▶) を押してください。

再生ボタンを押して、キャラクターが「崩れ落ちれば」成功です。

2-3. Character Joint を Configurable Joint に置換する

【選択対象リスト】(全12個)

mixamorig:Hips含めないでください!

■ 体幹・頭(2つ)

  1. mixamorig:Spine1 (背骨・腹)
  2. mixamorig:Head (頭)

■ 左足(3つ) 3. mixamorig:LeftUpLeg (左太もも) 4. mixamorig:LeftLeg (左すね) 5. mixamorig:LeftFoot (左足)

■ 右足(3つ) 6. mixamorig:RightUpLeg (右太もも) 7. mixamorig:RightLeg (右すね) 8. mixamorig:RightFoot (右足)

■ 左腕(2つ) 9. mixamorig:LeftArm (左腕) 10. mixamorig:LeftForeArm (左ひじ下)

■ 右腕(2つ) 11. mixamorig:RightArm (右腕) 12. mixamorig:RightForeArm (右ひじ下)

ML-Agentsでは、標準の Character Joint よりも、より細かい制御ができる Configurable Joint が推奨されています。

  1. Hierarchyで、Hips以外のすべての骨(LeftUpLeg, LeftLeg, Spineなど)を複数選択します。
  2. Inspectorで Character Joint を右クリック > Remove Component
  3. そのまま Add Component > Configurable Joint を追加。
  4. 重要: 各パーツの Connected Body が外れてしまっているので、手動で「親の骨」をセットし直します。
    • 例:LeftLeg(すね)の Connected Body には LeftUpLeg(太もも)をセット。
    • 設定するパーツ (Jointを持っている)Connected Body に入れる親
    • 親にRigitbodyコンポーネントが無い下記の場合
      mixamorig:Head (頭) mixamorig:Spine1
      mixamorig:LeftArm (左腕)mixamorig:Spine1
      mixamorig:RightArm (右腕)mixamorig:Spine1
      mixamorig:Spine1 (腹)mixamorig:Hips
    • これを行わないと、体がバラバラに散らばります。

第3章:【最重要】重さ(Mass)の「黄金比」設定

ここからが本番です。 初心者の9割がここで失敗します。

デフォルト設定のままだと、AIロボットは「風船のように空へ飛ぶ」「生まれたての子鹿のように立てない」かのどちらかになります。

3-1. なぜデフォルト(Mass: 1)ではダメなのか?

Unityの物理エンジン(PhysX)において、軽い物体を強力なモーター(関節)で動かそうとすると、計算が不安定になり、接触した瞬間に彼方へ吹っ飛ぶ現象が起きます。

これを防ぐには、現実に近い「重み」を持たせる必要があります。

3-2. 推奨設定値(これを入力してください)

Hierarchyで各ボーンを選択し、Inspectorの Rigidbody > Mass を以下の数値に書き換えてください。

部位推奨Mass理由(なぜ?)
Hips (腰)15最重要。ここが「重心」です。ここを一番重くしないと、足の動きに振り回されて体が安定しません。
Spine15 〜 8上半身に適度な重みがないと、振り子運動が使えず歩けません。
UpLeg (太もも)2.5足の根元は少し重めに。
Leg (すね)2太ももより少し軽くします。
Foot (足先)1先端は軽くします。重すぎると足を上げるのが大変になります。
Arm (腕)1腕はバランスを取るための「重り」ですが、重すぎると肩が脱臼します。

【チェックポイント】

すべて設定したら再生してみましょう。以前より「ドスン」と重そうに床に落ちるはずです。この「重量感」がリアルな歩行を生みます。


第4章:関節(Joint)の可動域を「人間」にする

次は関節です。ここを適当にすると、膝が逆に曲がるなどおかしな動作となります。

特に「膝(Knee/Shin)」の設定は、以下の数値を厳守してください。

4-1. Configurable Joint の基礎知識

設定項目が多すぎてパニックになりますが、見るべきは以下の3つだけです。

  1. Motion (X, Y, Z):
    • Locked: 全く動かない(固定)。
    • Limited: 決められた角度まで動く。
    • Free: 360度回転する(首が回るホラー映画状態)。
  2. Limit (Angular Limit):
    • Limited を選んだ場合、何度まで曲がっていいか。
  3. Drive (Spring / Damper):
    • 関節の「筋力」。

4-2. 【超重要】膝(Leg / Shin)の完全設定マニュアル

Hierarchyで mixamorig:LeftLegmixamorig:RightLeg (すね)を選択し、以下のように設定します。

① Motion(回転の許可)

  • Angular X Motion: Limited (縦の曲げ伸ばしはOK)
  • Angular Y Motion: Locked (重要!膝は横には回転しません)
  • Angular Z Motion: Locked (重要!膝は横には折れません)

なぜ?

YとZを Locked にしないと、体重をかけた瞬間に膝が横にグニャッと折れてしまい、AIはどうやっても立てなくなります。

② Limit(可動範囲の制限)

ここが最大の落とし穴です。

  • Linear Limit (Move): 全部 0(関節は伸び縮みしません)
  • Low Angular X Limit: -120
  • High Angular X Limit: 0

なぜ「0」なのか?

自分の膝を見てください。後ろ(マイナス方向)には曲がりますが、真っ直ぐ(0度)より前には曲がりませんよね?

High Limit を 0 に設定することで、膝が逆に曲がる(逆関節)のを物理的に防ぎます。 これをやらないと、AIは「逆に曲げたほうが安定する」と学習してしまい、フラミンゴ歩きになります。

4-3. 股関節(UpLeg / Thigh)の設定

太ももは比較的自由に動きますが、脱臼を防ぎます。

  • Angular X Motion: Limited(前後の足振り)
  • Angular Y Motion: Limited(ガニ股・内股)
  • Angular Z Motion: Limited(足を開く動作)
  • Angular X Limit: High 30, Low -90 (後ろにはあまり行かないが、前には足が上がる)

第5章:筋力(Drive)の設定

最後に、ロボットに「筋肉」をつけます。

これがないと、設定した関節はすべてプランプランの操り人形状態で、床に崩れ落ちて終わりです。

5-1. Spring(バネ)と Damper(減衰)

Configurable Joint の Angular X Drive を開いて設定します。

  • Position Spring (バネ):
    • 「指定した角度に戻ろうとする力」です。これが筋肉の強さになります。
    • 数値が高い=マッチョ(姿勢が良いが、カクカクする)。
    • 数値が低い=脱力(柔らかいが、体を支えられない)。
  • Position Damper (減衰):
    • 「動きの粘り気」です。
    • 水の中で動くような抵抗力を与えます。これがないと、バネの力でビヨンビヨンと永遠に振動し続けます。

5-2. 部位別の推奨設定値

Mass(重さ)に対して、適切なSpring(筋力)を設定しないと動きません。

先ほど設定した重さに基づき、以下の値を入力してください。

設定する部位 (Inspectorで選択)Angular X Drive > Position SpringAngular X Drive > Position Damper
mixamorig:Spine1 (腹)3000 〜 5000100
mixamorig:LeftUpLeg (左もも)2000 〜 300050
mixamorig:RightUpLeg (右もも)2000 〜 300050
mixamorig:LeftLeg (左すね)1500 〜 200050
mixamorig:RightLeg (右すね)1500 〜 200050
mixamorig:LeftFoot (左足)500 〜 100020
mixamorig:RightFoot (右足)500 〜 100020
mixamorig:LeftArm (左腕)50010
mixamorig:RightArm (右腕)50010
mixamorig:Head (頭)50010

部位Spring (筋力)Damper (粘り)解説
Spine13000 〜 5000100体幹は強く!重い上半身を支えるため、最強の筋力が必要です。
UpLeg (太もも)2000 〜 300050足を持ち上げ、蹴り出すための強い力。
Leg (すね)1500 〜 200050重要。 強すぎると「竹馬」のように膝が棒になります。少し弱めにして、着地の衝撃を吸収させます。
Foot (足首)500 〜 100020地面の傾きに合わせるため、適度に柔らかく。
Arm (腕)50010ブラブラしない程度に弱く。

【トラブルシューティング】

  • 膝が曲がらない(竹馬状態): LegのSpringを 1000 くらいまで下げてください。
  • 腰が砕ける: Hips/SpineのSpringを 6000 くらいまで上げてください。

第1回のまとめと次回予告

これで「物理的に歩く準備が整った体」が完成しました。

今の状態で再生ボタンを押すと、キャラクターは崩れ落ちることなく、少し耐えてからドスンと倒れる、あるいは膝を少し曲げてバランスを取ろうとするはずです。

次回(Vol.2)は、いよいよAIの「脳」を作ります。

  • 目を作る: 「地面はどこ?」「体は傾いてる?」という情報を取得するスクリプト。
  • 筋肉を動かす: AIからの命令を、今設定したJointのモーターに伝える方法。
  • 報酬を決める: 「前に進んだら褒める」「転んだら罰」というルールの記述。

この物理設定さえ完璧なら、学習は8割成功したも同然です。

今のうちにProjectを保存し、次回の更新をお待ちください!


[使用したアセットリンク]

  • [Mixamo (3Dモデル)]
  • [Unity ML-Agents]