はじめに
本記事では、ROBOTIS OP3ヒューマノイドロボットがGazeboシミュレーション環境内で強化学習を用いて歩行を獲得するROS(Robot Operating System)パッケージのコードについて解説します。
- 関連リポジトリ: 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] $$
プログラムの構成
本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系で実行する必要があります。
 
学習曲線
学習の進行に伴う歩行距離の変化を示したグラフです。世代が進むにつれて歩行距離が伸び、エージェントが効率的な歩行を学習していることがわかります。
