AWS IoT ShadowとROSのDynamic Reconfigureを同期するノードを作った

この記事は[ROSアドベントカレンダー](https://qiita.com/advent-calendar/2019/ros) 14日目の記事です。

こんにちは、WHILLの杉浦です。今年もアドベントカレンダーの時期がやってきましたね。
以前、[ROSCon JP](http://roscon.jp/) 2019で発表させていただいたのですが、AWS IoTのThingShadowとDynamic Reconfigureのパラメータを同期するノードを作りました。もっと早く公開する予定だったのですが、いい機会なのでROSアドベントカレンダーのネタにさせてください。

このノードは、他ノードのDynamic Reconfigureインターフェースにアクセスして、AWSIoT ThingShadowとパラメータを同期してくれるものです。
この仕組みを使うと、既にDynamic Reconfigureインターフェースを実装しているノードをすぐにクラウド対応することができます。今年１月にラスベガスで開催されたCES 2019で発表した仕組みも、この仕組みを使ってクラウドと連携しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"> <a href="https://t.co/Zs4b1tE4d6">pic.twitter.com/Zs4b1tE4d6</a></p>&mdash; Hikaru Sugiura (@aquahika) <a href="https://twitter.com/aquahika/status/1205790423916204033?ref_src=twsrc%5Etfw">December 14, 2019</a></blockquote> 
フル動画はこちら http://www.youtube.com/watch?v=JVf-OTqWyKM

## AWS IoT ThingShadowとは？
[AWS IoT](https://aws.amazon.com/jp/iot/)の機能です。自身でサーバーを用意しなくてもJSON形式でIoT機器のパラメータの保持および状態の管理を行ってくれます。またパラメータの先祖返りを防ぐ機能なども持っています。
AWSの他サービスとの連携が取りやすく、ThingShadowのパラメータによってLambdaを起動したりもできます。

## 仕組み
(ROSConJPで発表した内容とは微妙に異なります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93722/95ebfa5f-876d-b01d-0120-8dd33cbf0d38.png)

今回作ったdyn_reconf_shadowノードは設定ファイルに基づき、他ノードのdynamic reconfigureサーバーの要素をThingShadowと同期してくれます。
設定ファイルはYamlで記述します。設定ファイルではDynamic reconfigureのサーバー名と、どの項目を同期するかを指定できます。

### 動かしてみる
あらかじめ、AWS IoTでThingを作っておきます。Thing名は`specialdevice`とします。
AWS IoTでポリシーを作成した時に発行される証明書をダウンロードし、次の名前に変更して`~/.awsiot`以下に配置します。
- 公開鍵: `certificate.pem.crt`
- 秘密鍵: `private.pem.key`
- ルート証明書: `AmazonRootCA1.pem`

また、以下のような設定ファイルを適当な場所に作っておきましょう

```yaml:config.yaml

dyn_reconfigures:
  /sample_dyn_server/testServer1:
    - int_param
    - str_param
    - double_param
  /sample_dyn_server/testServer2:
    - double_param
```

テスト用のDynamic reconfigureサーバーを起動します。`roscore`は別ウィンドウで立ち上げておいてください。

```shell

$ rosrun dyn_reconf_shadow dyn_server_for_test.py
```
これを立ち上げると、それぞれ `int_param`,`str_param`,`double_param`,`bool_param`,`size`というパラメータを持ったdynamic reconfigureサーバー`/sample_dyn_server/testServer1`と`/sample_dyn_server/testServer2`が起動します。

本体を立ち上げます

```shell
$ rosrun dyn_reconf_shadow sync.py _host:=<Your AWS IoT Hostname> _thingName:=specialdevice _dyn_reconf_args:=./config.yaml
```
<Your AWS IoT Hostname>はAWS IoTのコンソールのモノ、"specialdevice"画面にある"操作"から確認できます。おそらく、`XXXXXXXXXX-ats.iot.ap-northeast-1.amazonaws.com`のような形式になっているはずです。

rqt_reconfigureでDynamic reconfigureをGUIで見られるようにしましょう。
`$ rosrun rqt_reconfigure rqt_reconfigure`を開きましょう。

また、ブラウザでAWS IoTコンソールから、`specialdevice`のShadowを開きましょう。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AWS IoTとDynamic reconfigureの連携デモ: rqt_reconfigureで値を変更するとThing Shadowにも反映される <a href="https://t.co/iYrgLOaBuk">pic.twitter.com/iYrgLOaBuk</a></p>&mdash; Hikaru Sugiura (@aquahika) <a href="https://twitter.com/aquahika/status/1205825416314798082?ref_src=twsrc%5Etfw">December 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AWS IoTとDynamic reconfigureの連携デモ2: ThingShadow上で値を変更するとDynamic Reconfigure上の値が変更される <a href="https://t.co/OER24vy0bc">pic.twitter.com/OER24vy0bc</a></p>&mdash; Hikaru Sugiura (@aquahika) <a href="https://twitter.com/aquahika/status/1205825672343515136?ref_src=twsrc%5Etfw">December 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## パッケージはこちら
GitHubから落として`catkin_make`してください。
`rosdep install`も必要です。
**ros_dyn_reconf_shadow**
https://github.com/WHILL/ros_dyn_reconf_shadow/

# PR

現在WHILLでは 自動運転・障害物回避などの機能をもったパーソナルモビリティを用いたMaaSサービスを開発しています。
現在、MaaSアプリケーションとして空港利用者向けの移動サービスを世界各地の空港で展開する準備をしています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">このような形で羽田空港での自動運転は動いています。ユーザーからのフィードバックがなかなか嬉しい。さらに改善を進めています <a href="https://t.co/M42NCyuuAF">https://t.co/M42NCyuuAF</a></p>&mdash; Sugie @ WHILL Inc (@sugix_02) <a href="https://twitter.com/sugix_02/status/1196669013813678085?ref_src=twsrc%5Etfw">November 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

インターネットが繋がった移動体をクラウドから操作してサービスを提供できる事ってなんだかワクワクしませんか？ 
このワクワクを一緒に共有できるクラウドエンジニア、アプリエンジニアを大募集中です。ぜひ一緒に働きましょう！お気軽にTwitter:[@aquahika](https://twitter.com/aquahika)までリプライしてください。