強化学習とロボティクスの基礎を体験しよう。 - 迷路から抜け出す方法を学習するロボット (第 2 回)
Author : 河田 卓志
この連載記事のその他の記事はこちら
🤖 第 1 回
🤖 第 2 回
こんにちは。
この記事は「強化学習とロボティクスの基礎を体験しよう。 - 迷路から抜け出す方法を学習するロボット (第 1 回)」 の続編です。
今回はプログラムの中身を確認し AWS RoboMaker を用いた基本的な開発のワークフローを見ていきたいと思います。
1. ソースコードを理解する
ソースコードは大きく、robot_ws というディレクトリと simulation_ws という2つのディレクトリから構成されています。
robot_ws ディレクトリ配下のプログラムはロボットアプリケーションとしてパッケージされます。ここには強化学習のモデルを作り、強化学習でロボットをコントロールするプログラムが含まれています。
simulation_ws ディレクトリ配下のプログラムはシミュレーションアプリケーションとしてパッケージされます。シミュレーションアプリケーションではシミュレーション環境を立ち上げ、仮想ロボットをシミュレーション環境上に稼働させています。
ロボットアプリケーションはシミュレーション環境に加え本物のロボットでも起動します。対してシミューションアプリケーションは AWS RoboMaker のシミュレータ内でだけで利用されます。
ロボットのタイプ | 実行される場所 | 用途 | サンプルアプリケーションでの構成 |
---|---|---|---|
ロボットアプリケーション | ロボット本体、シミュレーション環境 | ロボットを操作するアルゴリズム | robot_ws 配下 |
シミュレーションアプリケーション | シミュレーション環境 | シミュレーション環境の構築、バーチャルロボットの起動 | simulation_ws 配下 |
ソースコードの中で重要な箇所をいくつか紹介します。
robot_ws/src/rl_agent/markov 配下
environments/meiro_runner_env.py
OpenAI の Gym ライブラリを利用して強化学習における「環境」が実装されています。ここではエージェントからの指示に従いロボットを操作し、その結果起こったロボットの変化 (LiDARのセンシングデータの変化など) から報酬を計算し、更新されたステートと報酬をエージェントに返します。報酬関数はこのファイルの中に実装されています。関数名は infer_reward_state です。また ロボットの操作は send_action 関数を呼び出すことで行われています。ROS の観点ではここで rl_coach というノードを起動しています。
presets/meiro_runner.py
機械学習のモデルや学習アルゴリズム、各種パラメータを設定しています。
single_machine_training_worker.py
単一マシンでの強化学習を開始します。今回の作業では、これを実行することで機械学習を開始しています。ROS の観点ではこのプログラムは meiro_runner_robot パッケージの local_training.launch ファイルから run_local_rl_agent.sh というスクリプトファイルを経由して実行されています。
evaluation_worker.py
学習ずみのモデルを評価します。開発環境のメニューから Run -> Launch Simulation -> MeiroRunner Evaluate を選択することで、これを実行することができます。
rollout_worker.py
分散強化学習を開始します。Amazon SageMaker で機械学習を、その環境に AWS RoboMaker という構成をとることができます。ここでは具体的な方法については扱いませんが、AWS DeepRacer が Amazon SageMaker と AWS RoboMaker で分散強化学習を行なっている例の一つです。
たとえば environments/meiro_runner_env.py を変更することで、強化学習のアルゴリズムが受け取る環境情報を変更したり、ロボットのアクションを変更したりすることができます。
2. AWS RoboMaker を使ったロボティクスアプリケーションの開発のワークフロー
ここでは実際にサンプルアプリケーションの中身を変更し、AWS RoboMaker の開発環境を使ったロボットアプリケーションの開発のフローを確認していきます。
2-1. 迷路を変える
ここではシミュレーションワールドに展開される迷路を変更していきます。
AWS RoboMaker 開発環境を開きます。ナビゲーションペイン (ウィンドウ左のファイル選択域) でファイル MeiroRunner -> simulation_ws -> src -> meiro_runner_simulation -> launch -> create_maze_world.launch を選択、ダブルクリックして開きます。
(クリックすると拡大できます)
ファイルの 8 行目を次のように書き換えます。
変更前
<arg name="world_name" value="$(find meiro_runner_simulation)/worlds/maze.world"/>
変更後
<arg name="world_name" value="$(find meiro_runner_simulation)/worlds/maze_large.world"/>
これはシミュレーションワールドの環境情報を読み込んでいる箇所です。読み込むファイルを maze.world から maze_large.world に書き換えました。書き換えたら変更を保存するために [Ctrl] + s を押します。
メモ :
create_maze_world.launch はシミューレション起動時に読み込まれるファイルで、シミューションワールドに中に展開するワールド情報や、プログラムノードなどを指定しています。
変更した箇所はシミュレーションが起動された時 meiro_runner_simulation / worlds 配下の maze_large.world を参照します。maze_large.world ファイルは迷路の壁の 3D モデルをロードします。
迷路の壁のモデルは meiro_runner_simulation / meshes 配下の mazeroom_large.dae です。 .dae は COLLADA と呼ばれる 3D モデル交換用のファイルの形式で、多くの 3D 編集ソフトウェアがこの形式に対応しています。AWS RoboMaker がサポートするシミュレータである Gazebo は 3D モデルの外観を定義するファイルの形式として STL, OBJ, Collada 形式をサポートしています。
変更した内容を反映するためのビルドを行います。ビルドはターミナルから行うかメニューから行うこともできます。今回はメニューから行いましょう。開発環境のメニューから Run -> Build -> MeiroRunner simulaiton を選択します。
(クリックすると拡大できます)
ビルドの途中経過はターミナル表示領域に表示されます。
終了するとターミナルの表示は次のようになります。
(クリックすると拡大できます)
ビルドが無事完了したら、次はバンドルを行います。バンドルはビルドしたファイルを一つのアーカイブファイルにまとめる作業です。ビルドと同様バンドルもターミナルから行うかメニューから行うこともできます。今回はメニューから行いましょう。
開発環境のメニューから Run -> Bundle -> MeiroRunner simulation を選択します。
(クリックすると拡大できます)
バンドルの途中経過はターミナル表示領域に表示されます。
終了するとターミナルの表示は次のようになります。
(クリックすると拡大できます)
メモ :
ビルド、バンドルがメニューから操作ができるのは、roboMakerSettings.json ファイルに該当の設定が記述されているからです。 roboMakerSettings.json ファイルはメニューから操作できる内容を定義します
シミュレーションを起動します。
(クリックすると拡大できます)
シミュレーションジョブの詳細画面を開きます。
(クリックすると拡大できます)
シミュレーションジョブ詳細画面より [Gazebo] をクリックして、シミュレータ画面を開きます。
迷路が切り替わっていることを確認してください。
(クリックすると拡大できます)
メモ :
シミュレーションは 1.5 時間で自動的に終了します。おそらく 1.5 時間はこの迷路を脱出するためのモデルを構築するには学習時間として不十分でしょう。シミュレーションの継続時間を延長するには roboMakerSettings.json ファイルの MeiroRunner Training の項目の maxJobDurationInSeconds の値を変更します。
roboMakerSettings.json ファイル
{
"id": "MeiroRunner_SimulationJob2",
"name": "MeiroRunner Training",
"type": "simulation",
"cfg": {
: :
},
"simulation": {
"maxJobDurationInSeconds": 5400,
: :
}
}
},
シミュレーション時間を延長するときはこれに対してかかる課金についても注意してください。AWS RoboMaker のシミュレーションにかかる費用はこちらをご参照してください。
2-2. 報酬関数、アクションスペースを確認と変更
ここではプログラムの中を少しみていきます。強化学習における、報酬関数、アクションスペースなどをみていきます。またターミナルウィンドウからビルド、バンドルを行う方法もみていきます。
AWS RoboMaker 開発環境を開きます。
ナビゲーションペイン(ウィンドウ左のファイル選択域)でファイル MeiroRunner / robot_ws / src / rl_agent / markov / environments / meiro_runner_env.pyを選択、ダブルクリックして開きます。
このファイルには強化学習における「環境」が実装されています。ここではエージェントからの指示に従いロボットを操作し、その結果起こったロボットの変化 (LiDAR のセンシングデータの変化など) から報酬を計算し、更新されたステートと報酬をエージェントに返しています。
強化学習についての詳細は利用している強化学習フレームワーク Coach を参考にしてください。
報酬関数は infer_reward_state 関数の中で実装されています。
- LiDAR センサーがセンシングした周辺の壁までの距離は self.ranges の中に入っています。self.ranges は 1 度刻みで周辺 360 度の距離をメートル単位で保存する配列です。
- self.ranges から壁までの最短距離を求め min_distance という変数に保存しています。
- 壁に近づきすぎたら (13 cm より壁に近い) 壁に衝突したこととして、試行を終了させます
- 壁から十分に離れている(19 cm 以上離れている)場合進行速度を報酬値としています
- 壁に近いところを移動している場合、壁からの距離に応じて報酬を与えています。また壁から離れる方向に移動している場合は追加の報酬を与えています
- 通過地点を footsteps_marker という変数に保存し、同じエリアを通過すると報酬を減らします。同じエリアを 3 回以上通過すると、クラッシュ扱いとして試行を終了させます
アクションスペースは 5 つの連続性のない動作として定義しており、5 つの動作は次の通り定義されています。
TurtleBot3MeiroRunnerDiscreteEnv クラスの step 関数 (286 行目-)
def step(self, action):
# Convert discrete to continuous
if action == 0: # turn left
steering = 1.159
throttle = 0.08
elif action == 1: # turn right
steering = -1.159
throttle = 0.08
elif action == 2: # straight
steering = 0
throttle = 0.1
elif action == 3: # steer to the left
steering = 0.6
throttle = 0.09
elif action == 4: # steer to the right
steering = -0.6
throttle = 0.09
else: # should not be here
raise ValueError("Invalid action")
continous_action = [steering, throttle]
return super().step(continous_action)
ここで action がエージェントから与えられたアクションの番号、これに対し旋回速度を steering で 前進するスピードを throttle で求めています。求めた値は super().step(continous_action) で、このクラスの親クラスである TurtleBot3MeiroRunnerEnv クラスの step() 関数に送られ、ここで実際にロボットを操縦しています。
試しに
elif action == 2: # straight
steering = 0
throttle = 0.1
の箇所を
elif action == 2: # straight
steering = 0
throttle = 0.2
としてみます。これは直進時の速度を 2 倍にしています。
修正を保存したらビルドします。
ビルドは今度はターミナルから行ってみましょう。まず、ターミナルウィンドウを一つ開きます。ターミナルをターミナル表示領域の [+] ボタンをクリックして、プルダウンメニューを開き [New Terminal] を選びます。
(クリックすると拡大できます)
ターミナルウィンドウで次を実行します。
cd MeiroRunner/robot_ws
rosdep install --from-paths src --ignore-src -r -y && colcon build
ビルドが成功したら次はバンドルです。バンドルもターミナルから実行できます。
colcon bundle
(クリックすると拡大できます)
(クリックすると拡大できます)
“Archiving Complete !” のような表示が現れるとバンドル成功です。変更した内容でシミュレーションを実行する準備ができました。シミュレーションを開始して、ロボットの直進速度が速くなったことを確認します。
メモ :
colcon build は ROS アプリケーションのビルドツールの一つです。
また、colcon bundle は colcon のビルドツールにプラグインされる追加機能で、これもオープンソースで公開されています。
https://github.com/colcon/colcon-bundle
つまりビルド、バンドルの開発フロー自体は AWS RoboMaker の開発環境以外でも構築可能で、このように AWS RoboMaker 以外でビルド、バンドルされた生成物を RoboMaker のシミュレーションやフリート管理に持ってきて、実行することも可能です。
この場合、シミュレーションやフリート管理の呼び出しもコマンドラインからまたは自動処理で行いたいかもしれません。
AWS CLI / API からの RoboMaker の各機能へのアクセス方法は次を参考にしてください。
https://docs.aws.amazon.com/cli/latest/reference/robomaker/index.html
https://docs.aws.amazon.com/robomaker/latest/dg/API_Reference.html
今回は以上です。次回はアプリケーションを実際のロボットにデプロイし動かす方法を見ていきます。
筆者紹介
河田 卓志
アマゾン ウェブ サービス ジャパン合同会社
デジタルトランスフォーメーション本部
RoboMaker シニア・ソリューション・アーキテクト
2019 年 4 月アマゾン ウェブ サービス ジャパン合同会社入社。前職はアマゾンで Alexa スキルのソリューションアーキテクト、また複数のロボット関連会社でマーケティングとエンジニアリングを担当。自律型ロボットや音声アシストデバイスのような新しいデバイスがより一般的になり、そのソフトウェア開発手法がより標準化され、誰でも扱える技術になることを目指し日々業務に取り組む。
AWS のベストプラクティスを毎月無料でお試しいただけます
さらに最新記事・デベロッパー向けイベントを検索
AWS を無料でお試しいただけます