# 歩行方策を自分で学習する 第13章の四脚を歩かせている方策は、[配布済みのもの](walk.md)をそのまま使えば 学習しなくても動きます。ここでは**それを自分で学習し直す**手順をまとめます。 報酬を変えたい、速度の上限を上げてみたい、別の歩容を出したい——そういう ときの入口です。 学習の入口は 2 つあります。NVIDIA GPU があれば **mjlab 版**、無ければ **CPU 版**です。CPU 版は同じタスクを素の MuJoCo で回すもので、6 コアのノート PC で 2048 環境 × 2300 iteration が約 69 分です(環境は並列に動かす 1 台ぶんのシミュレーション、iteration は方策を 1 回更新するまでの区切り)。GPU が無くても、Google Colab (無料枠の T4)で mjlab 版を通す道もあります。どれで学習してもチェックポイント(途中で保存した学習結果(重み))の 形式は同じで、同じ手順で実機用のヘッダに書き出せます。 ## 学習コードの構成 学習は [unitree_rl_mjlab](https://github.com/unitreerobotics/unitree_rl_mjlab) ([mjlab](https://github.com/mujocolab/mjlab) + rsl_rl の PPO 学習基盤)の上で 行います。`docs/os-on-arduino/code/13_quadruped/rl/` はその上流に**被せる overlay** で、 それ自体は単体で動くプログラムではありません。 | ファイル | 中身 | |---|---| | `robot_cfg.py` | 機体定義(アクチュエータ、初期姿勢、`home` 角) | | `env_cfgs.py` | 観測・コマンド・ドメインランダマイゼーション(摩擦や質量などを学習中にランダムに変えること。{ref}`walk-training-code`) | | `rewards.py` | 報酬項(速度追従、歩容、姿勢、エネルギー等) | | `rl_cfg.py` | PPO のハイパーパラメータとネットワーク構成 [96, 64] | | `runner.py` | ERFI(extended random force injection。トルク外乱)を足した学習ランナー | | `scripts/` | 環境構築・学習・再生・動画書き出し | | `cpu/` | 同じタスクを mjlab なしで学習する CPU 版(下の「GPU なしで学習する(CPU 版)」) | `setup.sh` が上流を `.upstream/unitree_rl_mjlab` に clone し、`rl/` を `src/tasks/velocity/config/arduino_quad` として**シンボリックリンク**で 置きます。上流は `src/tasks/` 配下を自動 import するので、これだけで 次の 4 タスクが登録されます。 | タスク ID | 用途 | |---|---| | `ArduinoQuad-Flat` | 平地・素の velocity レシピ(立ち上げ確認用) | | `ArduinoQuad-Walk` | 平地 + 歩容シェーピング(**本命。トロット歩行はこれ**) | | `ArduinoQuad-Robust` | Walk と同じだが初期状態を崩す(実機前の頑健化) | | `ArduinoQuad-Recovery` | 転倒姿勢から立ち上がる | ## Google Colab で学習する(GPU が無い人向け) ブラウザだけで、環境構築から Arduino 用ヘッダの書き出しまで通せる ノートブックを用意しました。 ```{raw} html
``` ノートブックの流れ: 1. GPU の確認(**ランタイム → ランタイムのタイプを変更 → T4 GPU**) 2. コードを取ってきて、学習環境(mjlab + MuJoCo Warp + rsl_rl)を入れる 3. **配布済みの学習済み方策を再生して動画で見る** — ここまでで 「シミュレータ・方策・エクスポート」が揃って動いていることを確認できます 4. 割り当てられた GPU で 30 iteration 回して**学習速度を実測**し、 所要時間を見積もる 5. 学習する(チェックポイントは Google Drive に保存) 6. セッションが切れたら続きから再開する 7. 学習した方策を動画で確認して、`arduino_quad_policy.h` に書き出す ```{note} Colab の無料枠はセッションが数時間で切れます。学習ログを Google Drive に 逃がしておけば、`--agent.resume True` で何度でも続きから再開できます。 ノートブックの 6 章がその設定です。 ``` ### 無料枠の T4 でどれくらいかかるか 2026-08-31 に Colab の無料枠(Tesla T4 15 GB、Python 3.13)で、環境構築から `.h` の書き出しまで実際に通しました。そのときの実測です。 | | | |---|---| | 環境構築(`setup.sh`) | 約 1 分 | | 学習(2048 環境) | **1.42 秒/iteration、34,900 steps/s** | | 書籍と同じ 4,500 iteration に必要な時間 | **約 1.8 時間** | | 方策の再生(300 ステップの動画) | 初回 5〜6 分(GPU カーネルの生成を含む)、2 回目以降 3〜4 分 | | `.h` の書き出し | 約 1 分 | 参考までに、同じ設定を RTX 4090 で回すと 0.77 秒/iteration・63,700 steps/s でした。**T4 は 4090 の半分強の速度**で、無料枠でも書籍と同じ規模の学習が 現実的な時間で終わります。 ### 何 iteration で歩くようになるか ノートブック既定の設定(`ArduinoQuad-Walk`、2048 環境)で 1500 iteration 回し、100 iteration ごとのチェックポイントを**指令 0.09 m/s で 6 秒ずつ 再生した実測**です(RTX 4090、1 シード。シードは乱数の初期値)。 | iteration | 実測 前進 [m/s] | iteration | 実測 前進 [m/s] | |---|---|---|---| | 0 | −0.000 | 800 | 0.086 | | 100 | **−0.219** | 900 | 0.071 | | 200 | −0.194 | 1000 | 0.072 | | 300 | 0.005 | 1100 | 0.096 | | 400 | 0.014 | 1200 | 0.072 | | 500 | 0.046 | 1300 | 0.086 | | 600 | 0.046 | 1400 | 0.101 | | 700 | 0.058 | 1499 | **0.089** | **100〜200 iteration では後ろに進みます。** 前進報酬を拾うより先に 「転ばない」を覚えるためで、失敗ではありません。前進に転じるのが 300 付近、 指令の速度に届くのが 800 前後、そこから先は 0.07〜0.10 の範囲で揺れながら 追従します。各点は 1 エピソード(ロボットを置いてから倒れるか時間切れになるまでの 1 回)の測定なので、隣り合う点の ±0.02 m/s は 誤差の範囲です。 ```{note} これは**既定の設定で学習した別の方策**であって、[配布済み方策](walk.md) (home 高さ 0.11 m、歩容周期 0.32 s、3999 iteration、指令 0.12 m/s で 0.120 m/s)の再現では ありません。エクスポートされるヘッダには学習時の home 角が書き込まれるので、 実機側の整合はそのまま取れます。 ``` ## 手元の GPU で学習する 推奨環境は **Ubuntu** です。Windows でも WSL(Windows の上で Linux を動かす仕組み)を 入れれば動くはずですが、まだ確かめていません。どちらも用意できなければ、下の {ref}`train-cpu` を使ってください。 ```bash cd 13_quadruped # docs/os-on-arduino/code から ./rl/scripts/setup.sh # 上流を clone して overlay を置き、依存を入れる source rl/scripts/env.sh # 機体の MJCF の場所を教える ./rl/scripts/train.sh ArduinoQuad-Walk --env.scene.num-envs=4096 ``` `setup.sh --no-install` にすると、clone と配置だけ行って依存の導入を飛ばせます。 ### 版の固定について `setup.sh` は依存を**版で固定して**入れます。上流 (unitree_rl_mjlab) の `setup.py` が指すままでは、この機体の設定が読み込めません。 | | | なぜ固定するか | |---|---|---| | mjlab | 1.3.0 | サーボの逆起電力 (`viscous_damping`) と 27 ms の指令遅れ (`delay_min/max_lag`) が 1.2.0 に無い。後者は sim2real の要なので外せない | | mujoco-warp | 3.7.0.1 | mjlab 1.3.0 が要求する版 | | mujoco | 3.7.0 | 最新版が入ると mujoco-warp の import が落ちる | | warp-lang | 1.14.0 | 1.16 では学習開始時のカーネル生成が落ちる | | scipy | 1.15 以上 | mjlab 1.3.0 が使っているのに宣言していない | `setup.sh` は加えて、上流のロボット定義が使う `update_assets`(mjlab 1.3.0 で 削除された)を補う小さな互換パッチを、clone したチェックアウトに当てます。 当てないと `src/assets/robots` 全体が ImportError になり、`ArduinoQuad-*` の 登録まで巻き添えになります。 この組み合わせは **2026-08-31 に RTX 4090 で、環境構築から `.h` の書き出しまで 通して確認**しています(2048 環境で 0.77 秒/iteration、63,700 steps/s)。 学習した方策を見るには: ```bash ./rl/scripts/play.sh ArduinoQuad-Walk # ビューアを開く(画面のある環境) ``` 画面の無いサーバや Colab では、ビューアではなく mp4 に落とします: ```bash source rl/scripts/env.sh cd "$ARDUINO_QUAD_UPSTREAM" python "$ARDUINO_QUAD_ROOT/rl/scripts/record_video.py" \ --ckpt logs/rsl_rl/arduino_quad_velocity/