はじめに

ロボットの開発で良く用いられるプラットフォームとしてはROSが挙げられると思います。しかしながら、複数人で開発をする場合に環境を合わせるのが大変、ライブラリインストールを失敗してOSを初期化せざるを得なかった、マシンスペックを柔軟に変えて試したい、など様々な課題も上がってくるかと思います。

もし、上記のような課題を抱えている場合はAWS RoboMakerを使った、クラウドでのロボットアプリケーション開発をおすすめします。

本記事ではAWS RoboMakerの概要と、大まかな開発の流れを紹介し、具体的なイメージをもっていただくことを目的としています。

AWS RoboMakerとは

AWS RoboMakerは、Amazonが提供する、クラウド上でロボットアプリケーションを開発できるサービスです。

RoboMakerを実際に使ってみて、私が感じたメリットを挙げさせていただきます。

  • OS/バージョンサポートへの対応がしやすい:ROSは数多くのライブラリが公開されていますが、メンテナンスがあまり良くされていないライブラリが多く、ROSバージョンによって使えないライブラリもあります。ROSのバージョンを変えて試したい時に、例えば、KineticはUbuntu 16.04、MelodicはUbuntu 18.04がサポート対象ですがそれぞれで環境構築をするのは非常に面倒ですが、対応した環境をボタン1つで作れるのはクラウドのメリットと考えられます。
  • マシンスペックのスケーリングがしやすい:例えば、シミュレーション時に動きがカクカクしてしまってマシンスペックが足りないと思えば、使用するシミュレーションユニット数を増やすだけで、サクサクとシミュレーションを動作させることが可能です。さらに、起動時間を指定できるので、無駄なコストを使わずに済みます。
  • サンプルが多い:1からROSの学習をしながら環境を作っていくのは非常に手間がかかります。しかし、RoboMakerであれば、ワールドのテンプレートから簡単にシミュレーション空間を生成できますし、サンプルプロジェクトが用意されているので初めてでもキャッチアップしやすい環境になっていると思います。

AWS RoboMakerのメニューについて

AWS RoboMaker 

AWS RoboMakerはAWSのコンソールで選択することが可能です。

選択後、RoboMakerのサービス画面に進みますが、メニューが少々多く、最初は戸惑うことも多いかと思いますので、それぞれの項目について説明をします。(記載は英語と日本語のものを2つ使用)

RoboMakerメニュー

開発環境(Development environments)

ROSのアプリケーション開発をクラウドで行うための環境で、実質はCloud 9というAWSのオンラインIDEが起動する形となります。環境を作成すると、ROSがプリインストールがされた状態でIDEが立ち上がります。

実質上、EC2インスタンス上にIDE環境が構築されますが、一定時間経過すると自動でインスタンスが停止するようになっているので、無駄なコストが発生しないようになっているのは良い点です。 cloud9

ロボットアプリケーション(Robot applications)

RoboMakerでは、ロボットアプリケーションとシミュレーションアプリケーションの2つのアプリケーションを開発することになります。

ロボットアプリケーションはロボットに搭載するアプリケーションで、センサー処理、自己位置同定、地図作成など、ロボットへの入力に対して処理を行うアプリケーションになります。

ロボットアプリケーションを開発後、bundleというコマンドを実行することでアプリケーションとそれに必要なライブラリ群を1つのtarファイルにまとめて圧縮して、S3にアップロードを行います。このセクションでは、ROSのバージョンとtarファイルの置いてあるS3のパスを指定するのみとなります。

シミュレーションアプリケーション(Simulation applications)

シミュレーションアプリケーションではGazebo等のシミュレーションソフトを起動し、シミュレーション空間(ワールド)の生成やロボットの生成を行うアプリケーションになります。

ロボットアプリケーションと同様、bundleしたtarファイルをS3にアップロードしますが、このセクションではROSのバージョン、使用するシミュレーションソフト、tarファイルが置いてあるS3のパスを指定するのみとなります。

ワールドテンプレート(World templates)

ワールドはシミュレーションを立ち上げた際に生成される空間です。ワールドテンプレートはワールドを生成するためのテンプレートで、部屋の数や広さ、設置されるオブジェクトなどの設定をすることができます。

ワールド(Worlds)

ワールドテンプレートから生成された、実際にシミュレーションで使用するワールドになります。シミュレーションジョブを立ち上げる際、「WorldForgeからワールドをインポート」の項目にてワールドを選択することが可能です。

ワールドをインポート

シミュレーションジョブ(Simulation jobs)

ロボットアプリケーションとシミュレーションアプリケーションで設定したbundleファイルを読み込んで2つのアプリケーションを起動します。

シミュレーションユニットはシミュレーション時のマシンスペックで、数を増やすほどシミュレーション動作が滑らかになります。ただ、その分、料金も多く発生するので、ちょうど良いシミュレーションユニット数を見つけていきましょう。

アプリケーションが起動すると下記ツールが使用可能になるのでデバッグを行います。ライブラリが足りないなどで起動が失敗するとそのままジョブが終了してしまいます。CloudWatch上に起動時のログが出力されているので、ログを参照して原因を調査しましょう。

それぞれのツールの概要は下記です。

  • GZClient:シミュレーションソフト(Gazebo)が立ち上がり、3DCGのシミュレーション世界の状態を把握することができます。
  • Terminal:ターミナルが立ち上がります。rostopic、rosnode等、コマンドでROSの状態を知りたいときや、手動でnodeを立ち上げたい時など、様々な場合に有用です。
  • RViz:ROSのtopicを3D空間上に可視化してくれるツールで、ロボットが認識している世界を把握するのに有用です。むしろrvizが無いとROSアプリケーションのデバッグは不可能と言っても良いでしょう。
  • Rqt:ロボットを動かす指示(cmd_velトピック)を送ったり、tfの状態を表示したり、便利なツール群が詰まっています。

AWS RoboMakerでの開発の流れ

RoboMakerを用いた開発は次のような流れになります。各パートの詳細な説明やTIPSに関しては別記事にて解説をしていきますので、本記事では大まかな流れを捉えていただければと思います。

1. 開発

開発環境のIDE上で開発を行います。

サンプルアプリケーション

初回は、Resources > Download Samples > Hello World からサンプルプロジェクトをダウンロードして動作させてみると良いでしょう。

robot_wsとsimulation_wsという2つのディレクトリがあり、これらがそれぞれ、ロボットアプリケーションとシミュレーションアプリケーションに対応します。 

2. ビルド・バンドル・S3アップロード

開発後は、プロジェクトをビルドして1つのtarファイルに圧縮(bundle)した後に、ロボットアプリケーション、シミュレーションアプリケーションで設定したS3のパスへtarファイルをアップロードします。

cd robot_ws/
colcon build && colcon bundle 

RoboMakerのビルドツールとしてはcolconが使われています。例えば上記のようにrobot_ws内でbuildとbundleを行うと、 robot_ws/bundle/output.tar というファイルができあがるので、ロボットアプリケーションで設定したS3のパスへアップロードします。

aws s3 cp bundle/output.tar s3://your_bucket_name/output.tar

3. シミュレーションジョブを起動

S3にbundleしたtarファイルをアップロード後、シミュレーションジョブを作成すれば最新の実装が反映された状態でシミュレーションが立ち上がります。

すでに実行中の場合は、シミュレーションジョブを選択して「アクション」から「再起動」、停止している場合は、以前の設定のままで良ければ、停止したシミュレーションジョブを選択して「アクション」から「クローン」で起動すれば大丈夫です。

この際、IDEメニューの Simulation > Restart With New Bundles からもシミュレーションの反映ができますが、実質、bundleしたtarファイルをS3にアップロードしてシミュレーションジョブを再起動しているだけです。

毎回Restart With New Bundleでファイルを選択するのが面倒なので、私の場合は下記のようなスクリプトを、プロジェクトディレクトリ直下にscriptsディレクトリを作って下記コマンドでS3のアップロードまでする形にして、コマンド実行完了後にシミュレーションジョブを再起動しています。

cd ../robot_ws
colcon build
colcon bundle
aws s3 cp bundle/output.tar s3://your_bucket_name/output.tar

cd ../simulation_ws
colcon build
colcon bundle
aws s3 cp bundle/output.tar s3:/your_bucket_name/output_sim.tar

プロジェクトディレクトリ直下の roboMakerSettings.json 内にビルドやバンドルの定義を書くことも可能です。この場合は、Runメニューから設定したコマンドを実行することが可能になっています。 

robomakersettings.json

最新の実装を反映する際にはいくつか方法がありますが、やりたいこととしてはどれも同じで、

colcon build / colcon bundleをして出来上がったtarファイルをS3にアップロードしてシミュレーションジョブを起動する

ということです。

Aws robomaker

Related Posts

L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
概要 DCモータを制御する際にモータコントローラを使用すると思いますが、複数のモータを制御する際は配線が複雑になってしまいがちです。   RoboStation https://rb-station.com/blogs/arti...
Read More
Arduinoのrosserialで「Unable to sync with device」というエラーが出た場合の対処
Arduinoのrosserialで「Unable to sync with device」というエラーが出た場合の対処
概要 ArduinoでROSのトピックを受信して動作をさせたいときに、使うのがrosserialです。 rosserial_arduino このrosserial_arduinoを用いてArduinoと繋げてROSトピックを投げ...
Read More
Arduinoのコードでキュー(Queue)を使う
Arduinoのコードでキュー(Queue)を使う
概要 Arduinoのコードを書く際に、処理をキューイングして順番に処理をしていきたい時がありました。Arduinoにはarrayはありますが、FIFO(後述)型のキューはデフォルトでは無いため、外部ライブラリをインクルードする必要が...
Read More