【レポート】JetBotを動かそう!クラウドロボティクスのワークショップに参加してきました #ROB303 #reinvent

Las Vegasで開催中のre:Inventにて、「クラウドロボティクス」AWS RoboMakerのワークショップROB303に参加してきました。JetBotを動かすためのシミュレーションとデプロイをハンズオンするワークショップです。
2019.12.04

Las Vegasで開催中のre:Inventにて、「クラウドロボティクス」AWS RoboMakerのワークショップROB303に参加してきました。JetBotを動かすためのシミュレーションとデプロイのプロセスについてのハンズオンです。

ワークショップ概要

AWS RoboMaker makes it simple to build and deploy software to your robots. In this workshop, learn how to develop, test and deploy a robot application to a physical robot. You'll learn about the Robot Operating System (ROS) and you'll push ROS application changes to a robot. Finally, you'll run your application on the device to see it operate in the real world.

登壇者

  • Tristan Li - Solutions Architect, Amazon Web Services
  • Wayne Davis - Principal Solutions Architect, Amazon Web Services
  • Abby Xu - Software development engineer, Amazon Web Services
  • Chitoku YATO - Senior Technical Product Marketing Manager, NVIDIA

レポート

ワークショップは、Webに掲載されているその資料を参加者が参照しながら進める自習タイプのセッションでした。

会場をスタッフの方が何人も回ってくださるので、質問やトラブルがあったときには声を掛けて助けてもらうというスタイルです。トータルで2時間と長丁場ですが、作業を進めたり、トラブルに対応してもらったりしているうちに、あっという間に時間は過ぎてしまいました。

資料は下記です。

https://robomakerworkshops.com/

自分のPCから、配布されたチケットのURLとハッシュキーで必要な権限が付与されたRoleでAWSマネージメントコンソールにアクセスできる仕組みでした。ワークショップでは、リージョンはap-east-1を使用することが指示されました。

アジェンダ

  • Activity #1: An introduction to ROS development
  • Activity #2: Deploying ROS Applications

#1では、AWS RoboMakerを使用して、ROSアプリケーションを作成しシミュレータ環境で動作することを確認します。 引き続いての#2では、Jetson Nanoを搭載したロボカーであるJetBotを使用して、開発したアプリケーションを実機にデプロイする手順を学びます。

#1: ROS開発のイントロダクション

AWS RoboMakerを使用して、ROSアプリケーションのハンズオンを行います。 まずはワークショップ用に提供されたAWSアカウントのマネージメントコンソールから、AWS RoboMakerを開きます。

そして、開発環境を作成します。Createボタンを押して、少数のパラメータ等を設定することで、簡単に開発環境が作成され、Cloud 9のIDE環境が立ち上がります。

開発環境が立ち上がったら、テキストの指示にしたがい、マネージメントコンソールからCloudFormationを開き、開発環境作成時に作成されたスタック名 mod-xxxxxxxxをメモしておきます(後ほど設定で使用します)。

続いてこれもテキストにしたがって、IDEのTerminal画面から、下記のコマンドで、ソースコードをgithubからcloneしてきます。

$ cd ~/environment 
$ git clone https://github.com/codingphun/aws_robomaker_jetbot_reinvent_workshop.git jetbot

さきほどメモしておいたCloudFormationのスタック名を引数にして、スクリプトを走らせます。

$ cd ~/environment/jetbot/assets/scripts 
$ chmod +x compile_arm64.sh install_deps.sh configure_docker.sh
$ sudo ./install_deps.sh mod-xxxxxxxxxxx

実はここでエラーが発生してしまいました。

...snip...
Step 2/6 : COPY deps/ /etc/ros/rosdep/sources.list.d/
 ---> 368177b6fab7
Step 3/6 : RUN printf "yaml file:///environment/jetbot/assets/scripts/jetbot.yaml" > /etc/ros/rosdep/sources.list.d/21-customdepenencies.list
 ---> Running in dc4147f6e161
standard_init_linux.go:211: exec user process caused "exec format error"
The command '/bin/sh -c printf "yaml file:///environment/jetbot/assets/scripts/jetbot.yaml" > /etc/ros/rosdep/sources.list.d/21-customdepenencies.list' returned a non-zero code: 1
Recursively changing ownership of ros home directory '/home/ubuntu/.ros' to 'ubuntu:ubuntu' (current user)...
Done.

Dockerイメージを生成する途中でエラーが発生しているようです。

エラーメッセージから一部のファイルの所有権を修正して、再実行したところ、今度は無事に成功しました。

...snip...
Step 2/6 : COPY deps/ /etc/ros/rosdep/sources.list.d/
 ---> Using cache
 ---> 368177b6fab7
Step 3/6 : RUN printf "yaml file:///environment/jetbot/assets/scripts/jetbot.yaml" > /etc/ros/rosdep/sources.list.d/21-customdepenencies.list
 ---> Running in d94fa90830d3
Removing intermediate container d94fa90830d3
 ---> d784736b58d6
Step 4/6 : WORKDIR /environment/jetbot
 ---> Running in 7737b2997aea
Removing intermediate container 7737b2997aea
 ---> bb4945324cca
Step 5/6 : RUN echo "source /opt/ros/melodic/setup.bash" >> /root/.bashrc
 ---> Running in 91183030f41c
Removing intermediate container 91183030f41c
 ---> 33bde76d3839
Step 6/6 : RUN wget -q http://packages.osrfoundation.org/gazebo.key -O - | apt-key add -
 ---> Running in 17e4d07dded6
Warning: apt-key output should not be parsed (stdout is not a terminal)
OK
Removing intermediate container 17e4d07dded6
 ---> 8ab57b637a16
Successfully built 8ab57b637a16
Successfully tagged jetbot-ros:latest
Recursively changing ownership of ros home directory '/home/ubuntu/.ros' to 'ubuntu:ubuntu' (current user)...
Done.

エラーなしに成功したら、続いてはROSアプリケーションのビルドです。IDEのメニューから、Run>Workflow>JetBot Simulation - Build and Bundleを選択すると、ビルドが始まります。 このステップはかなりの時間がかかりました。

ビルドが成功したら、つづいてRun>Launch Simulation>JetBot Circle Simulationを選択します。そうするとシミュレーションが起動するのですが、これにも少々時間がかかります。 画面が更新されなかったのでリロードを行ったところ、無事Runningというステータスになったことが確認できました。

Simulation(Running)のメニューから、Applications>Gazeboを選択すると、新たにウインドウが表示され、3D空間が表示されます。真ん中を拡大してみると、ロボットがその場所ですこしづつ転回して回っている様子が確認できました。 シミュレーションが動いていることが確認できました。

一度、メニューからシミュレーションをStopします。

teleop

今度は、メニューからRun>Launch Simulation>JetBot Teleop Simulationを選び、別のシミュレーションを動作させます。そしてGazeboを起動し、今回もロボットが見えるようにズームしました。

IDE環境のなかに、リモートコントロールためのツールとしてteleop.zipが用意されています。これをPCにダウンロード&展開し、中にあるrobogui.htmlを開きます。ブラウザでマウスコントロールできる画面が現れます。Connected状態になったら、シミュレーション環境の中でリモコン操作が行えます。

画面上の円をドラッグ操作するとロボットが動くのがわかります。

#2: ROSアプリケーションをデプロイする

ワークショップが進行すると、各テーブルにJetBotが2台づつ配布されました。同じテーブルのメンバーで共同で使うようです。

JetBotは、Jetson Nanoが搭載された2ホイールの車両型ロボットです。電源が入った状態で、小さなOLEDディスプレイにIPアドレスが表示されていました。会場のWiFiに接続されているようです。PCからJetBotへの接続を行うために、PC側のネットワーク接続も会場のWiFiに接続するよう指示がありました。

さて、実機にデプロイするためには、Jetson用のバイナリを生成する必要があります。クロスコンパイルをおこなうためのDockerイメージを用意するためのスクリプトを実行します。

$ cd ~/environment/jetbot/assets/scripts
$ sudo ./configure_docker.sh

テキストの指示にしたがって、Dockerコンテナの中で、arm64用のバイナリを生成するためのシェルスクリプトを実行します。

$ cd ~/environment/jetbot
$ docker run --rm -ti -v $(pwd):/environment/jetbot jetbot-ros
# ./assets/scripts/compile_arm64.sh

このプロセスもそれなりに時間がかかりました。焦らず待ちましょう。

続いて設定情報roboMakerSettings.jsonをIDEで開き、記載されているS3バケット名と、IOT_ENDPOINT名をメモしておきます。

S3バケットに、生成されたバイナリのアーカイブをコピーしておきます。

$ aws s3 cp ./robot_ws/arm64_bundle/output.tar s3://<S3-BUCKET-NAME>/jetbot/aarch64/output.tar

RoboMakerのコンソールに戻り、

  • Robot Applicationの作成
  • Fleet ManagementからRobotの作成

を順次行います。後者では、Download Your Core Deviceという項目から証明書が含まれたzipファイルをダウンロードしておく必要があります。 ページ内に別なダウンロードできるリンクがいくつかありますので、間違わないようにしましょう(私は間違って、スタッフに助けを求めてしまいました)。

Robotへの証明書の導入

さきほどダウンロードしたZIPファイルをJetBotに設定するために、JetBotのOLEDディスプレイのIPアドレスを読み取ります。 このIPアドレスに対して、https://<IPアドレス>:8888/を開くと、Jupyter Notebookの画面が現れます。Jupyterのパスワードが要求されますので、スタッフから指示があったパスワードを入力します。

ファイルのアップロードを選んで、先程ダウンロードしたzipファイルをアップロードします。そして、Jupyter Notebookの画面でTerminalを開き下記のコマンドで、zipを展開、証明書を導入します。 sudoのパスワードは現場で指示がありました。

$ sudo su
$ unzip /home/jetbot/<greengrass-certs>.zip -d /greengrass
$ cd /greengrass/certs/
$ wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
$ sudo /greengrass/ggc/core/greengrassd start

実機側の準備はこれだけです。

またRoboMakerのコンソールに戻り、下記の作業を行います。

  • Fleetの作成とRobotの登録
  • Fleet ManagementからDeploymentの作成

ここで、環境変数として下記を設定します。

  • IOT_ENDPOINT 先程メモしたエンドポイント
  • ROBOT_NAME : joystick1

最後にCreate Deploymentをクリックすれば全ての作業は終了、うまくいけばステータスがLaunchingになって、先程と同じrobogui.htmlによるコントロールが 可能になるはずでした。

ところが、私のワークショップでは残念ながらこの段階でデプロイが、failedとなってしまい、ロボットを動作させることができませんでした。 スタッフの助けも借りながら、最後のプロセスを数回繰り返してみたのですが、時間切れで解決できませんでした。残念!

感想

というわけで、惜しい結果になってしまったのですが、RoboMakerのシミュレーションと、デプロイの主な流れは理解できました。 実機とシミュレーションが同じ環境で、開発やコントロールができることが新鮮でした。

あいにく自分は成功に至らなかったのですが、同じテーブルの方は最後ぎりぎりで動作成功して、大変エキサイトしました。やはり動くと嬉しいですよね。再チャレンジのため、JetBotが欲しくなりました。

解決を手伝ってくださったスタッフは、時間切れの際に申し訳なさそうに「明日もワークショップあるから来いよ、俺が入れるように手配するから」と親切にも言ってくださいました。あいにく予定が付かず再参加は叶いませんでしたが、ワークショップの最中は何度も助けていただきました。スタッフの皆様に感謝です。