はじめに
本記事では、ROBOTIS OP3ヒューマノイドロボットがGazeboシミュレーション環境内で強化学習を用いて歩行を獲得するROS(Robot Operating System)パッケージのコードについて解説します。DQNの数式的な導出は姉妹記事に譲り、本記事では「連続な状態」「離散化された行動」「バランス維持と前進のトレードオフ」という、実機を想定した二足歩行ロボット特有の設計判断に焦点を当てます。また、実際のGazebo/ROS環境を本サンドボックスで動かすことはできないため、後半では同じ本質的な構造を持つ縮小版のタスクを実際に実行し、報酬設計と探索スケジュールという2つの実装判断が学習にどう影響するかを実データで検証します。
- 関連リポジトリ: op3_walk
結果の動画
学習によって歩行を獲得したOP3の動作は、以下の動画で確認できます。
手法の説明
本プロジェクトでは、深層Qネットワーク (Deep Q-Network, DQN) を使用しています。DQNは、Q学習に深層学習を組み合わせた手法で、行動価値関数をニューラルネットワークで近似します。
行動価値関数 \(Q(s_t, a_t)\) は、3層のニューラルネットワークとして定義され、次のQ学習の更新式に基づいて学習されます。
\[ Q(s*t, a_t) \leftarrow Q(s_t, a_t) + \eta (R*{t+1} + \gamma \max*{a'} Q(s*{t+1}, a') - Q(s_t, a_t)) \]ここで、\(\eta\) は学習率、\(R_{t+1}\) は即時報酬、\(\gamma\) は割引率です。
ニューラルネットワークの更新には、次の損失関数 \(L\) を用いて誤差逆伝播を行います。
\[ L = \mathbb{E}[(R_{t+1} + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t, a_t))^2] \]なぜ素朴なQ学習の拡張だけでは不安定になるのか
この損失関数 \(L\)
をベルマン最適方程式 \(Q^*(s,a) = \mathbb{E}[R_{t+1} + \gamma \max_{a'}Q^*(s_{t+1},a') \mid s_t=s,a_t=a]\)
から導く過程、および素朴にニューラルネットへ適用すると学習が不安定・発散しやすくなる2つの原因(サンプルの時間相関、TDターゲット自体が学習中のパラメータで動いてしまうこと)、それを解決する経験再生 (Experience Replay) とターゲットネットワーク (Target Network) の仕組みは、姉妹記事
強化学習の全体像
の「関数近似」節で数式付きに詳しく解説済みです。本記事の function.py の ReplayMemory クラスはまさに経験再生バッファの実装であり、同記事の議論がそのまま当てはまります。以下では同記事と重複しないよう、OP3という実機を想定したロボット特有の設計判断に焦点を当てます。
OP3ロボットにおける状態・行動空間の設計
controller.py が公開する状態は、関節角度や重心位置などGazebo上のロボットモデルから得られる連続値です。理論上、二足歩行ロボットの行動(各関節への目標トルクや目標角度)も連続量として扱うことができ、実際に2020年代の多くの脚ロボットRL研究ではPPOやSACのような連続行動空間向けの方策勾配法が主流になっています。しかし本プロジェクトでは、motion.py にあらかじめ定義された離散的な行動(関節目標角度の組み合わせ)の中からDQNが1つを選択する設計になっています。
これは実装上・安全上の観点で理にかなった選択です。あらかじめ用意した少数の行動候補(人手や運動学的制約によって「転倒しにくい」ことがある程度担保された姿勢のセット)に限定することで、学習初期のランダムな探索がロボットモデルを破壊的な姿勢に追い込むリスクを抑えられます。また、DQNのように離散行動空間を前提とするアルゴリズムは実装が比較的単純で、Brainクラスのようなシンプルな全結合ネットワークで行動価値を近似できます。代償として、行動の粒度が粗いぶん滑らかな連続的な歩容を獲得することは原理的に難しく、行動候補の設計(motion.py の質)が学習可能な歩行パターンの上限を事実上決めてしまいます。
報酬設計と歩行距離
後述する学習曲線は「歩行距離」の推移を示しており、世代が進むにつれて距離が伸びています。これは、本プロジェクトの報酬関数が(少なくとも部分的に)歩行距離や前進速度に基づく密な(dense)報酬であることを示唆します。もし仮に「目標距離に到達したときだけ報酬を与える」ような疎な(sparse)報酬だった場合、ロボットが偶然その距離を歩き切るまで学習信号が一切得られず、学習が事実上進まない可能性があります。この「報酬設計の違いが学習速度にどれだけ影響するか」という問題は数式だけでは実感しにくいため、後半では縮小したアナログ環境を使って実際に数値で確認します。
プログラムの構成
本ROSパッケージは、主に次のPythonスクリプトで構成されています。
1. function.py および motion.py
function.py: 強化学習エージェントの基本的な定義が含まれています。Agentクラス: ニューラルネットワークを定義するBrainクラスを内包しています。ReplayMemoryクラス: エージェントが環境から得た経験(行動と状態)を蓄積し、Brainがこのメモリからサンプリングして損失計算とニューラルネットワークの更新を行います。- 行動は離散化されており、
epsilon-greedy法に基づいて選択されます。
motion.py: ロボットの具体的な離散行動(例: 各関節の目標角度)が定義されています。
これらのスクリプトは、以下の書籍のコードを参考にしています。
2. learning.py
learning.py:function.pyで定義されたAgentクラスを継承し、ROSノードとして動作します。controller.pyからロボットの状態をROSトピックとして購読(subscribe)します。- 購読した状態を入力として、エージェントが行動を計算し、その行動をROSトピックとして公開(publish)します。
- ニューラルネットワークの定義にはPyTorchを使用しているため、Python 3系で実行する必要があります。
3. controller.py
controller.py:learning.pyから公開された行動をROSトピックとして購読し、実際にROBOTIS OP3をGazeboシミュレーション内で動かします。- ロボットの現在の状態(関節角度、重心位置など)をROSトピックとして公開します。
- このスクリプトは、OP3のROSパッケージの依存関係上、Python 2系で実行する必要があります。
学習曲線
学習の進行に伴う歩行距離の変化を示したグラフです。世代が進むにつれて歩行距離が伸び、エージェントが効率的な歩行を学習していることがわかります。

簡易実験による検証:CartPoleを使った縮小アナログ
実際のOP3をGazebo上でフルに動かして学習させるには、ROS・Gazebo・実機相当の関節モデルなど、本サンドボックス環境には存在しない依存関係が必要です。そこで本節では、op3_walkプロジェクトそのものの再現ではなく、その本質的なRL構造――「連続な状態」「離散化された少数の行動」「バランス維持と前進のトレードオフ」――を保った、規模を大きく縮小した代替タスクで実験を行い、前節までの議論を実際の数値で検証します。
環境: Gymnasiumの CartPole-v1(台車の上に立てた棒を、台車を左右に押す2つの離散行動だけで倒さないように保つ、物理エンジンによる実際のシミュレーション)を使用しました。CartPoleは二足歩行そのものではありませんが、(1) 連続な状態(台車位置・速度、棒の角度・角速度)、(2) 離散的な2行動、(3) 「動かす(前進に相当)」と「倒れない(バランス維持)」の間のトレードオフ、という本記事のOP3タスクと骨格を共有する、広く使われる縮小版のバランス制御問題です。
手法: DQNの核心である「ベルマン最適方程式に基づくTDターゲットで価値を更新する」という部分は変えず、関数近似にはニューラルネットワークではなくテーブル型のQ学習を用いました。状態空間はBarto, Sutton & Anderson (1983) の"BOXES"法に倣い、台車位置・速度をそれぞれ3区分、棒の角度を6区分、角速度を3区分の合計162状態に離散化しています。ニューラルネットではなくテーブルを選んだのは、本節の主眼が「経験再生・ターゲットネットワークの効果」ではなく「報酬設計と探索スケジュールという2つの実装判断」の影響を、NNの初期化や層構成といった他の要因に邪魔されずクリーンに見るためです(DQN自体の安定化技術は前述の通り姉妹記事を参照してください)。
学習率 \(\alpha=0.3\)
、割引率 \(\gamma=0.99\)
、1エピソード最大200ステップとし、3000エピソードの学習をシード 1000〜1007 の8回独立に繰り返して平均を取りました。以下の数値・図はすべて実際にこのコードを実行して得られたものです。
(a) 報酬設計の影響:疎な報酬 vs 前進速度ボーナス付き報酬
- 疎な報酬 (sparse): 200ステップ生き残った(=目標を達成した)場合にのみエピソード終端で報酬 \(+1\) 、それ以外は常に \(0\) 。OP3で言えば「目標距離に到達したときだけ報酬を与える」設計に相当します。
- shaped報酬: 生存している間、毎ステップ \(1.0 + 0.3|\dot{x}|\) (\(\dot{x}\) は台車速度)を報酬として与えます。台車速度に比例するボーナス項が、OP3の「前進速度に応じたボーナス」に対応する部分です。
8シード平均でのエピソード長(=何ステップ倒れずにいられたか)の推移は次の通りです。

学習序盤(1〜100エピソード目)の平均エピソード長は両条件でほぼ同じでした(shaped: 22.12ステップ、sparse: 22.19ステップ。ε-greedyのランダムな初期方策なので当然です)。しかし終盤(2901〜3000エピソード目)では、shaped報酬が103.22ステップまで伸びたのに対し、sparse報酬は9.60ステップまで悪化しました。さらに、sparse条件では8シード×3000エピソード=24,000エピソードの中で目標(200ステップ生存)を達成した回数は0回でした。
この結果は理論から予想される通りの方向ですが、悪化のメカニズムを具体的に見ると学びが多くなります。sparse条件ではQテーブルが一度も非ゼロの報酬を観測しないため、ブートストラップのターゲットも恒久的にゼロのままとなり、Qテーブルは初期値(全ゼロ)から一切更新されません。全ての状態でQ値が同じ(ゼロ)である場合、argmaxは常に先頭のインデックスの行動を返すため、方策は実質的に「常に同じ行動を選び続ける」退化した固定方策になります。ε-greedyの探索率がエピソードを重ねるごとに減衰していく(本実験では1.0→0.05)につれ、この退化方策に従う頻度が増え、ランダム行動(結果的に棒を立て直すのに役立つこともある行動)が減るため、エピソード長がむしろ悪化するという結果になりました。これは「疎な報酬は学習が遅い」という以上に、「疎な報酬は学習が全く起きず、探索率の減衰がその欠陥を悪化させる」という、より厳しい失敗モードを具体的に示しています。
(b) 探索スケジュールの影響:固定ε vs 減衰ε
同じshaped報酬の設定のまま、探索率εのスケジュールだけを変えて比較しました。
- 固定ε: 常に \(\varepsilon=0.1\)
- 減衰ε: 学習の最初70%のエピソードにわたり \(\varepsilon=1.0\) から \(0.05\) まで線形に減衰させ、以降は \(0.05\) で固定

序盤(1〜100エピソード目)の平均エピソード長は、固定εが15.25ステップ、減衰εが22.12ステップと、意外にも固定εの方が短い結果になりました。これは減衰εが学習開始時点で \(\varepsilon=1.0\) (完全なランダム行動)からスタートするのに対し、固定εは最初から \(\varepsilon=0.1\) とすでにある程度貪欲な行動を取るためです。しかし終盤(2901〜3000エピソード目)では、固定εが95.58ステップであるのに対し、減衰εは103.22ステップとわずかに上回りました。本実験の規模では両者の最終的な差は大きくありませんが、固定εは学習が進んだ後も常に10%の確率でランダム行動を混ぜ続けるため、すでに獲得した良い方策をランダム行動が壊してしまう分だけ、頭打ちになる水準がわずかに低くなっていると考えられます。減衰εは学習序盤で出遅れる代償を払いつつ、終盤の安定した活用(exploitation)でその差を取り戻し、わずかに上回ったというのが、この実験から読み取れる実際の挙動です。
実機移行(Sim-to-Real)の課題
ここまでの実験はいずれもシミュレータ内で完結する学習ですが、OP3のような実機の二足歩行ロボットに方策を移す際には、シミュレーションだけでは解決しない固有の課題が生じます。これは一般にSim-to-Realギャップと呼ばれ、脚ロボットの分野でよく知られた問題です。
- アクチュエータのダイナミクスの不一致: Gazeboなどのシミュレータが仮定するモーターのトルク特性・摩擦・バックラッシュは、実機のアクチュエータの挙動と完全には一致しません。シミュレータ内で最適化された方策が、実機ではわずかなズレの積み重ねでバランスを崩すことがあります。
- 接地・摩擦モデルの誤差: 足裏と床面の接触力学(摩擦係数、衝撃応答)はシミュレータでの近似が特に難しい部分であり、実際の床材や靴底の状態によって挙動が大きく変わります。
- センサノイズと遅延: 実機のIMUやエンコーダには、シミュレータでは見落とされがちなノイズや通信遅延が存在し、方策が想定する状態と実際の状態がずれる原因になります。
これらのギャップを埋めるための代表的な手法が**ドメインランダム化 (Domain Randomization)**で、学習時にシミュレータの物理パラメータ(摩擦係数、質量、遅延など)を意図的にランダムに変化させ、方策が特定のシミュレータ設定に過適合しないようにします。なお、本記事で参照している op3_walk リポジトリがGazeboシミュレーション上での学習にとどまるのか、実機での検証まで行っているのかは、公開されている情報からは判断できませんでした。本節はあくまで二足歩行ロボットのSim-to-Real移行における一般的な課題を説明するものであり、本プロジェクト固有の実機検証結果を主張するものではありません。
最近の研究動向(2023〜2025年)
Sim-to-Realギャップの克服は現在も活発に研究されている領域です。近年の代表的な方向性を2つ紹介します。
- Real-to-Sim-to-Realによるダイナミクス補正: He et al., “ASAP: Aligning Simulation and Real-World Physics for Learning Agile Humanoid Whole-Body Skills” ( arXiv:2502.01143 , 2025) は、実機から収集したデータを使ってシミュレータと実機の物理的な差分(デルタ・アクションモデル)を学習し、それをシミュレータでの方策学習にフィードバックすることで、俊敏な全身動作をヒューマノイド実機に移行する手法を提案しています。
- 地形にロバストな移動のための世界モデル学習: Long et al., “Advancing Humanoid Locomotion: Mastering Challenging Terrains with Denoising World Model Learning” ( arXiv:2408.14472 , 2024) は、ノイズ除去型の世界モデルを学習に組み込みドメインランダム化と併用することで、不整地でも頑健なヒューマノイドの移動方策を獲得する手法を報告しています。
いずれも本記事の縮小実験とは規模が大きく異なりますが、「シミュレータと実機の物理的な差分を明示的にモデル化する」「学習時に環境パラメータを積極的に変化させ、方策を頑健にする」という方向性は、本節冒頭で述べたドメインランダム化という考え方の自然な延長線上にあります。
関連記事
- 強化学習の全体像 - DQNの損失関数の導出、経験再生・ターゲットネットワークによる安定化の仕組み
参考文献
- Barto, A. G., Sutton, R. S., & Anderson, C. W., “Neuronlike adaptive elements that can solve difficult learning control problems,” IEEE Transactions on Systems, Man, and Cybernetics, 1983.
- He et al., “ASAP: Aligning Simulation and Real-World Physics for Learning Agile Humanoid Whole-Body Skills,” arXiv:2502.01143 , 2025.
- Long et al., “Advancing Humanoid Locomotion: Mastering Challenging Terrains with Denoising World Model Learning,” arXiv:2408.14472 , 2024.