【レポート】JetBotを動かそう!クラウドロボティクスのワークショップに参加してきました #ROB303 #reinvent
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が欲しくなりました。
解決を手伝ってくださったスタッフは、時間切れの際に申し訳なさそうに「明日もワークショップあるから来いよ、俺が入れるように手配するから」と親切にも言ってくださいました。あいにく予定が付かず再参加は叶いませんでしたが、ワークショップの最中は何度も助けていただきました。スタッフの皆様に感謝です。