強化学習とロボティクスの基礎を体験しよう。 - 迷路から抜け出す方法を学習するロボット (第 3 回)

2020-10-01
デベロッパーのためのクラウド活用方法

Author : 河田 卓志 

今回はこれまでシミュレータの中で確認をしてきたロボットアプリケーションを実際のロボットにインストールし、動作を確認します。

ロボットアプリケーションのインストールには AWS RoboMaker の「フリート管理」という機能を使います。「フリート管理」を使うことで、クラウドで登録、管理されているロボットアプリケーションを、実際のロボットに任意のタイミングでインストールし、実行させることができます。

シミュレータの中では ROS のリファレンスロボットの一つであるTurtleBot3 Burger というロボットを制御しました。今回実際にアプリケーションをインストールし制御する対象も同じく TurtleBot3 Burger とします。TurtleBot3 Burger は Raspberry Pi 3 を搭載しており、ROS を利用したロボットの制御、ロボットのセンサー情報の取得を可能にしています。アプリケーションロジックもこのロボット本体の CPU で実行させることも可能ですが、別のマシンで実行、処理を分散させることも可能です。

今回の課題で利用する機械学習のライブラリは処理負荷が高くなる可能性があるのでロボットを安定して稼働させるためにローカルネットワーク内のロボット本体とは別の CPU で処理をさせたほうがよさそうです。ローカルネットワーク内での分散処理は ROS の標準仕様が提供するものをそのまま使います。これはノードという実行単位での分散処理を簡単に実現することがきるものです。

今回紹介する手順ではロボット本体とは別のデバイスにロボットアプリケーションをインストールし、これがローカルネットワークでロボット本体と通信し、本物のロボットを制御させるように構成をしていきます。

最後の章ではもう一つのアプローチ、「ロボット本体の中にアプリケーションをインストールさせる」場合に必要な追加の作業(また不要になる作業)についても簡単に紹介します。

AWS RoboMaker のフリート管理機能はロボット本体の中でアプリケーションを動かす場合も、ロボット本体以外のデバイスでロボットアプリケーションを動かす場合も、いずれの手法にも対応させることができます。いずれの手法を取るかはケースバイケースです。次にそれぞれの手法の簡単な比較を示しておきます。

ロボットアプリケーションをロボット本体にインストール vs 別デバイスにインストール

 

利点

欠点

ロボット本体にアプリケーションをインストール

  • ロボット本体内でアプリケーションが稼働するので、機器構成をシンプルにできる
  • ロボット本体の CPU の処理能力が高くない場合、アプリケーションロジックを処理できない可能性がある
  • ARM 系 CPU の場合、ARM 向けバンドルを作成する必要がある

ロボットと別にインストールのターゲットとなるデバイスを用意

  • 負荷が高いアプリケーション処理も実行可能
  • x86 系のターゲットデバイスであればシミュレータで使ったバンドルをそのまま活用することも可能
  • ロボット本体と別にアプリケーションを実行する機器 (Linux PC)と、ロボットとこの機器が接続するローカルネットワーク環境を用意する必要がある

それでは手順をみていきましょう。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

builders.flash メールメンバーへの登録・特典の入手はこちら »

*ハンズオン記事およびソースコードにおける免責事項 »


1. ロボットが動作するネットワークと機器の環境を用意する

今回は実際に本物のロボットを動かすので、ロボット本体とそれを稼働せる環境が手元に必要になります。

今回のロボット実行環境に必要な機器とネットワーク構成を示しました。この図に示すようにインターネットにつながる WiFi 環境を用意し、この WiFi ネットワークに Linux PC マシンと、TurtleBot3 Burger をつなげます。

TurtleBot3Burger 本体について詳細はメーカーの Web サイトをご確認ください。

img_robotics-03_01

この構成の中で Linux PC の中にシミュレータで試したロボットアプリケーションがインストールされ、TurtleBot3 Burger を制御します。それぞれの機器の IP アドレスは指定のものと全く同じである必要がありませんが、何らか固定のローカル IP アドレスが割り当てられている必要があります。

ロボット本体はこちらの手順に従い標準セットアップを行います。
ここで説明の中にある、Remote PC’s IP address は 上記 Linux PC の IP アドレスに、 TurtleBot PC のIP アドレスは上記 TurtleBot3 Burger の IP アドレスに読み替えて設定を進めてください。


2. ロボット本体用の IAM ロールを準備する

これはフリート管理をセットアップする際に一度だけ行う作業です。
デバイスが 適切な権限で AWS にアクセスできるようにするため IAM ロールと IAM ポリシーを作成します。

この作業は RoboMaker 開発ガイドの「デプロイロールを作成する」に従って行います。ポリシーのコードにある my-robot-application-source-bucket は開発環境にある ws_settings.yaml ファイルの bucket_name の値で書き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "robomaker:UpdateRobotDeployment"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],
            "Resource": ["arn:aws:s3:::my-robot-application-source-bucket/*"]
        }
    ]
}

* (my-robot-application-source-bucket は開発環境にある ws_settings.yaml ファイルの bucket_name の値で書き換える) 


3. フリートの作成

これはフリート管理をセットアップする際に一度だけ行う作業です。
AWS RoboMaker のフリート管理機能を使って機器へのアプリケーションのインストールを行うことができますが、ここではまずその管理の単位である「フリート」を一つ作成します。 

AWS RoboMaker コンソールを開きます。

左のナビゲーションペインから 「フリート管理」の「フリート」を選び、開かれた「フリート」の一覧の右上の [フリートを作成する] ボタンをクリックします。

img_robotics-03_02

クリックすると拡大します

フリートの作成画面が開かれます。名前に任意の名前を設定して [作成] ボタンをクリックします。 

これでフリートが一つ作成されました。

img_robotics-03_03

クリックすると拡大します


4. ロボットアプリケーションのインストールターゲットの登録しデバイスをセットアップする

これはインストール先のデバイスを追加するたびに行う作業です。

AWS RoboMaker にロボットアプリケーションのインストール先のデバイスを登録し、デバイスには AWS RoboMaker と連携ができるように専用のソフトウェアコンポーネント (AWS IoT Greengrass) をセットアップします。

この作業は AWS RoboMaker 開発ガイドの「ロボットを作成する」に従って行います。

なお、開発ガイドでは 「Greengrass setup method」 で「手動セットアツプ方法を使用する」を選択した場合の手順を示しています。「デバイス上のスクリプトを使用する」の手順でセットアップを進めることも可能です。この場合、画面で指示されるそれぞれのコマンドをターゲットデバイスで実行します。
 

img_robotics-03_04

クリックすると拡大します


5. ロボットをフリートに登録する

これはインストール先のデバイスを追加するたびに行う作業です。

フリートは複数のロボットを束ねたグループのようなもので、このフリートに対してアプリケーションのインストールを指示することで、フリートに登録されている全てのロボットにアプリケーションをインストールさせることができます。

前の手順でロボットの登録が終了し、[ロボットの表示] ボタンをクリックすると、コンソールには「詳細」画面が開かれ、その上方に以下のような表示が現れているかと思います。この[登録] ボタンをクリックして、先ほど作成したフリートへのロボットの登録を済ませます。または AWS RoboMaker コンソール左側の、フリート管理 から フリート を選択、先ほど作成したフリートを開き、「登録されたロボット」の一覧の右の [新規登録] ボタンをクリックしてフリートへのロボットの登録を行うこともできます。 

img_robotics-03_05

クリックすると拡大します

登録がうまくいくとフリートのステータスで、合計ロボット数が 1 になります。

img_robotics-03_06

クリックすると拡大します


6. デバイスへのインストール(デプロイ)用にアプリケーションを登録する

これはアプリケーションコードが更新され、この最新のコードを実際のロボットにインストール(デプロイ)させるたびに行います

まず最新のコードでバンドルを作成する必要があります。バンドルは開発したコードとそれを実行するために必要なすべての依存関係をひとつのファイルにアーカイブしたものです。バンドルを作成するまでの手順は前回「強化学習とロボティクスの基礎を体験しよう。 - 迷路から抜け出す方法を学習するロボット (第 2 回)」の内容をご参照ください。

バンドルが作成されたらこれを Amazon S3 にコピーします。AWS RoboMaker 開発環境のターミナルで次を実行します。

cd ~/environment/MeiroRunner/robot_ws/ 
aws s3 cp bundle/output.tar s3://<bucket_name>/meirorunner-robot.tar

* <bucket_name> は ws_setting.yaml ファイルの bucket_name の値で読み替えてください。

次にデバイスインストール用のアプリケーションとして Amazon S3 にアップロードしたファイルを AWS RoboMaker に登録します。これは AWS RoboMaker のコンソールからも行うことができるのですが、今回はコマンドで行う方法を紹介します。

開発環境のターミナルのターミナルウィンドウで次を実行します。

aws robomaker create-robot-application \
--name meirorunner_robot_x86 \
--sources "s3Bucket=<bucket_name>,s3Key=meirorunner-robot.tar,architecture=X86_64" \
--robot-software-suite "name=ROS,version=Kinetic"

* <bucket_name> は ws_setting.yaml のbucket_name の値で読み替えてください。またもし、ws_setting.yaml で ros_version の値が Melodic となっていたら、最後の行の Kinetic は Melodic に替えます。



7. アプリケーションをインストール (デプロイ) する

いよいよアプリケーションをデバイスにインストールします。ステップ 5 までは環境の構築作業でした、アプリケーションを更新し、また更新したアプリケーションを各デバイスに配布する一連の作業はステップ 6 とここステップ 7 で行なっています。

このステップで行う一連の作業はこれまで紹介したほとんどの作業と同様コマンドラインや API 呼び出しから行うことも可能です。実際に運用で活用する場合は、コマンドスクリプトなどを用意して自動化する場合の方が多いと考えられますが、ここでは AWS RoboMaker コンソールからの方法を紹介します。なお、コマンド (AWS CLI) からの方法、そのほか詳細についてはこちらを参考にしてください。


AWS RoboMaker コンソールを開き、デプロイを開き、右上の [デプロイの作成] ボタンをクリックします。

デプロイの作成」画面が開かれます。「フリート」でステップ 3 で作成したフリートを選びます。

ロボットアプリケーションで、meirorunner_robot_x86 を選びます。
(この名前はステップ 6 の create-robot-application コマンドの中で命名しています)

ロボットアプリケーションバージョンはプルダウンから「新規作成」を選びます。バージョン 1 が作られ、設定されます。

続いて次の通りそれぞれ入力します。

デプロイの起動設定の「パッケージ名」: meiro_runner_robot

デプロイの起動設定の「パッケージ名」: bringup_RL_worker.launch

環境変数 : 次を追加

「キー」: MODEL_S3_BUCKET 「値」: <bucket_name>

「キー」: ROS_AWS_REGION 「値」:<aws_region>

「キー」: ROS_HOSTNAME 「値」:<remote_PC_IP>

「キー」: ROS_MASTER_URI 「値」: http://<remote_PC_IP>:11311

「キー」: MODEL_FILE 「値」:model/model.pb

「キー」: MODEL_S3_PREFIX 「値」: model-store

* <bucket_name> は 開発環境 ws_setttings.yaml ファイルの bucket_name の値と読み替えてください
* 
<aws_region> は 開発環境 ws_setttings.yaml ファイルの aws_region の値と読み替えてください
* 
<remote_PC_IP> はアプリケーションインストール先 PC のローカル IP アドレスを設定して下さい (ステップ 1 の例で 192.168.0.100)

次は一通りの入力を完了させた例です。 

img_robotics-03_07

クリックすると拡大します

入力が一通り完了したら画面右下の [作成] ボタンをクリックします。インストール (デプロイ) が開始されます。

デプロイ画面が表示され、「デプロイのステータス」に進行状況が表示されます。
 

img_robotics-03_09

クリックすると拡大します

デプロイが成功するとロボットのステータスが 「同期中」に変わり、デプロイのステータスは「成功」のカウントが 1 になります。

img_robotics-03_08

クリックすると拡大します

ロボットの電源を入れます。
ロボット本体では次のコマンドを実行します。

roslaunch turtlebot3_bringup turtlebot3_robot.launch

メモ

ロボット本体を ROS 経由で制御するために制御用のノードを起動しています。
新しいアプリケーションがデプロイされるたびに、それに合わせてロボット側のノードも立ち上げ直す必要があります。この操作は今回の手順では毎回マニュアルで行う必要がありますが、例えばアプリケーションがデプロイされる PC からロボットにログインしてノードを自動起動するようなスクリプトを用意して、デプロイの際の「起動後のファイル- オプション」でこれを指定することで自動化も可能でしょう。

「起動後のファイル- オプション」はデプロイが成功した際、そのあとに実行させたいスクリプトを記述します。スクリプトファイルはバンドルの中に含めておく必要があります。

詳細はこちらをご確認ください。

ロボットはシミュレータで学習させた強化学習のモデルをダウンロードし、これを使って壁にぶつからないように走行を行おうとします。障害物を回避することができず、壁などにぶつかってしまうようであれば、まだモデルが十分に学習できていないのかもしれません。シミュレータに戻り再度学習を今度は少し長い時間実施してみてください。

こちら実際に強化学習のモデルを用いて TurtleBot3 Burger が動いている様子です。

何らかの理由で起動がうまくいかないかもしれません。参考まで問題切り分けのヒントを次に紹介します。

  • アプリケーションのデプロイは AWS IoT Greengrass というソフトウェアがデバイス上で稼働し、これが AWS RoboMaker からの指示を処理することで実現されています。AWS IoT Greengrass はアプリケーションのインストール対象のデバイス (PC) で次のようなコマンドが実行されることで起動されます。
cd /greengrass/ggc/core/
sudo ./greengrassd start
  • AWS IoT Greengrass のシステムログは /greengrass/ggc/var/log 配下にあります。うまくデプロイが開始されない場合チェックしてみてください。なお、 log 配下のディレクトリには root ユーザーしかアクセスすることができません。Greengrass 立ち上がりまでのログは system ディレクトリ配下で、デプロイが開始されたのちのログは user ディレクトリ配下で確認すると良いでしょう。
  • アプリケーションのコードはダウンロードされ、/home/ggc_user 配下に展開されます。
  • ROS 実行時のランタイムのログは /home/ggc_user/ros 配下に展開されます。

参考. ロボットに直接アプリケーションをデプロイする場合

今回はロボット本体とは別のデバイスにアプリケーションをインストールし、ロボットを分散処理形式で制御しましたが、ロボット本体を AWS RoboMaker にロボットとして登録し、連携のために必要なコンポーネントである AWS IoT Greengrass をインストールしておくことで、ロボット本体に直接アプリケションをインストール、実行させることも可能です。

この構成を取る場合、注意をしなければならないのが、ターゲットデバイスの CPU アーキテクチャです。シミュレーション用に作成し、また今回実際のロボットの制御用にも使ったバンドル は x86_64 系の CPU で実行をすることが可能なバンドルです。CPU が ARM 系のものである場合、そのアーキテクチャ向けのバンドルを別途作成する必要があります。

バンドルの作成は colcon bundle というコマンドを実行することで可能になっています。ARM 向けのバンドルを作る方法は代表的には次の 2 つの方法が考えられます。
 

ARM CPU 向けバンドルの作り方

手法

利点

欠点

ARM 環境で colcon bundle を実行する。ツールは オープンソースで公開されているものを ARM 環境にインストールして利用する EC2 内の高速な ARM インスタンスなどを利用することで高速なバンドル作成環境を構築可能

環境構築に手間がかかる

ARM RoboMaker 開発環境で提供されているクロスコンパイル環境を利用する

環境構築が簡単

クロスコンパイルが行われるためネイティブで高速な環境と比較するとバンドル作成完了まで時間がかかる

ここでは下段「AWS RoboMaker 開発環境で提供されているクロスコンパイル環境を利用する」での方法について説明します。

強化学習とロボティクスの基礎を体験しよう。 - 迷路から抜け出す方法を学習するロボット (第 1 回)」で作成した RoboMaker 開発環境を開きます

開発環境のターミナルウィンドウで次のコマンドを実行して Raspberry Pi 用のバンドルを作成します。

cd /opt/robomaker/cross-compilation-dockerfile/
sudo bin/build_image.bash      
cd ~/environment/MeiroRunner/robot_ws
sudo docker run -v $(pwd):/ws -it ros-cross-compile:armhf
cd ws
apt update
rosdep install --from-paths src --ignore-src -r -y
colcon build --build-base armhf_build --install-base armhf_install
colcon bundle --build-base armhf_build --install-base armhf_install --bundle-base armhf_bundle --apt-sources-list /opt/cross/apt-sources.yaml
exit

meiroRunner/robot_ws ディレクトリの配下に armhf_bundle というディレクトリが作られ、この配下に output.tar というファイルが作られます。これが Turtlebot3 Burger 本体でアプリケーションを実行させるためのバンドルです。

次のコマンドを実行して Turtlebot Burger 用のバンドルを S3 にアップロードします。 

aws robomaker create-robot-application \
--name meirorunner_robot_armhf \
--sources "s3Bucket=<bucket_name>,s3Key=meirorunner-robot.tar,architecture=ARMHF" \
--robot-software-suite "name=ROS,version=Kinetic"

* <bucket-name> は ws_setting.yaml ファイルの bucket_name の値で読み替えてください。

次にデバイスインストール用のアプリケーションとして Amazon S3 にアップロードしたファイルを RoboMaker に登録します。 

aws s3 cp armhf_bundle/output.tar s3://<bucket-name>/meirorunner-robot.armhf.tar

* <bucket-name> は ws_setting.yaml のbucket_name の値で読み替えてください。またもし、ws_setting.yaml で ros_version の値が Melodic となっていたら、最後の行の Kinetic は Melodic に替えます。一つのアプリケーション登録の中に x86_64 用のバンドルと、ARM 用のバンドル両方を登録させることも可能なのですが、今回はそれぞれ別々のアプリケーションとして AWS RoboMaker に登録しています。

ステップ 7 の内容でデプロイを開始できますが異なる点がいくつかあります。

  1. ロボットアプリケーションは、meirorunner_robot_armhf を選びます。
  2. デプロイの起動設定の「パッケージ名」は bringup_robot.launch を設定します。これはロボット制御アルゴリズムと、ロボット制御ノードの両方を起動する launch ファイルです。
  3. 環境変数の次の 2 つの項目は不要です。これらはノードを分散処理させるために必要な環境変数でした
    「キー」:ROS_HOSTNAME 「値」: <remote_PC_IP>
    「キー」:ROS_MASTER_URI 「値」: http://<remote_PC_IP>:11311

TurtleBot3 Burger 単体の構成をとると IP アドレスを固定する必要もなく、また別途ロボット制御用のノードを立ち上げる必要もなくなり、構成を非常にシンプルにすることができます。例えば TurtleBot3 Burger 搭載の CPU を Raspberry Pi 3 から Raspberry Pi 4 に置き換えて単体構成をとるなどするとより運用をシンプルにすることができそうです。

今回の内容は以上です。是非色々な形で AWS RoboMaker を活用してみてください !

この連載記事のその他の記事はこちら

🤖 第 1 回 🤖 第 2 回 🤖 第 3 回

筆者紹介

photo_kawata

河田 卓志
アマゾン ウェブ サービス ジャパン株式会社 デジタルトランスフォーメーション本部
RoboMaker シニア・ソリューション・アーキテクト

2019 年 4 月アマゾン ウェブ サービス ジャパン株式会社入社。前職はアマゾンで Alexa スキルのソリューションアーキテクト、また複数のロボット関連会社でマーケティングとエンジニアリングを担当。自律型ロボットや音声アシストデバイスのような新しいデバイスがより一般的になり、そのソフトウェア開発手法がより標準化され、誰でも扱える技術になることを目指し日々業務に取り組む。 

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する