Apple WatchでDroneを制御してみた

# 概要
そのまんまなんですが、Apple WatchでDroneを制御するということをやってみました。

# 開発環境

## 使ったデバイス
- [Parrot Rolling Spider](http://www.parrot.com/jp/products/rolling-spider/)
- iPhone 6
- Apple Watch

## SDKなど
- [ARSDK3 version3_7_5 for iOS](https://github.com/Parrot-Developers/ARSDKBuildUtils/releases/download/ARSDK3_version_3_7_5/ARSDK3_iOS_3_7_5.zip) (※)
- watchOS 2
- iOS9

※ 現在最新のSDKは3.8です。 (2016/01/22 時点)

- [SDK version 3.8 iOS libs](https://github.com/Parrot-Developers/arsdk_manifests/releases/download/ARSDK3_version_3_8/ARSDK3_iOS_3_8.zip) 

# 仕組み
現状Apple WatchとDroneを直接接続することはできないので、各々iPhoneを経由して通信します。

Apple Watch (watchOS 2)
　⇅ Watch Connectivity
iPhone (CoreBluetooth / ARSDK3)
　⇅ BLE
Drone (Rolling Spider)

ざっくりした流れは下記です。

1. iPhoneとRolling Spiderを接続 (**ARSDK3**を利用)
1. Apple Watchの加速度センサ情報を取得、**Watch Connectivity**を利用してデータをiPhoneに送信
1. Apple Watchの角度に応じて、Rolling Spiderにコマンド送信


## 1. iPhoneとRolling Spiderを接続 (ARSDK3を利用)

[公式Documentation](http://developer.parrot.com/docs/bebop)に従い、iOS用のSDKをダウンロードして組み込み。(※)
接続部分は、下記Sampleに含まれているRSPilotingNewAPI を参考にしました。

[Parrot-Developers/Samples](https://github.com/Parrot-Developers/Samples)

※ SDKアップデートに伴い、Documentationの説明がver 3.8用のものになっています。
3.7.5と3.8で組み込み時の手順が若干異なるのでご注意ください。

## 2. Apple Watchの加速度センサ情報を取得、Watch Connectivityを利用してデータをiPhoneに送信

データは逐一送るのではなく、コマンド単位で送信するようにしました。（データ送信がボトルネックになるのを避けるため）
Watch Connectivityについては下記を参考にさせていただきました。

- [Watch Connectivity Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html)
- [watchOS 2 の Watch Connectivity を使ってみた - Qiita](http://qiita.com/koogawa/items/b39e1419cbbcda8efc07)


## 3. Apple Watchの角度に応じてRolling Spiderにコマンド送信

今回Apple Watchを装着した腕を前に突き出した状態で、Rolling Spiderをコントロールするようにしています。
そのため、Apple Watchの座標系とRolling Spiderの座標系がz軸を中心に90度ずれている形になります。

- ホバリング中
    - Apple WatchのPitch ⇒ Rolling SpiderのYaw
    - Apple WatchのRoll ⇒ Rolling SpiderのGaz
- 移動中
    - Apple WatchのPitch ⇒ Rolling SpiderのRoll
    - Apple WatchのRoll ⇒ Rolling SpiderのPitch

また、その場にホバリングしてYaw/Gaz(高度)を制御するモードと、
Roll/Pitchを制御して移動するモードの2つのモードに分けました。


# デモ
[![Apple Watch x Drone](https://i.vimeocdn.com/video/550481461.webp?mw=500&mh=281)](https://vimeo.com/150883834)
[Apple Watch x Drone](https://vimeo.com/150883834) from [syug](https://vimeo.com/syug) on [Vimeo](https://vimeo.com).

## デモ時の注意点

#### Apple Watchの自動スリープを解除しておく
Apple Watchは手首の動きに応じて画面をスリープしてくれて便利なのですが、制御時はスリープされると困るので解除しておきます。

- 設定 > 一般 > 画面をスリープ解除
    - 「手首を上げてスリープ解除」をオフに
    - タップ時「70秒間スリープ解除」に

![IMG_7617.PNG](https://qiita-image-store.s3.amazonaws.com/0/5934/46cfa46f-e1d9-50aa-8c6c-87657597d6db.png) ![IMG_7616.PNG](https://qiita-image-store.s3.amazonaws.com/0/5934/2751e152-4f8a-32c1-8a9d-5dcf590ee0a2.png)


# 感想

#### 操作感
- 片手で操作できるというのは楽かも
    - ただコントロールが難しいのでもろもろ要改良
- （当たり前ですが）操作者がよろけたりすると変な方向に飛んでっちゃうので、不慮の動きへの対処が必要
- Watch + 音声入力とかもやってみたい

#### 開発面
- ARSDKはらくちん
    - Droneのスキャンや接続周りなど、面倒そうなところはカバーしてくれてる
    - DocumentとSample通りに組めばOK

#### Rolling Spiderすごい
- ほっといてもホバリングしてくれるので、Drone初心者にも扱いやすい

# コード
https://github.com/syug/control-drone-by-watch

接続周りとか、かなりざっくりした作りなのでご注意ください m(_ _)m


# 参考リンク
- [Parrot for Developer](http://developer.parrot.com/index.html)
    - [ARDroneSDK3 Documentation](http://developer.parrot.com/docs/bebop/)

- [Watch Connectivity Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html)
- [watchOS 2 の新機能のサンプルコード集 - Qiita](http://qiita.com/shu223/items/0a005628f488b9059753)
    - [watchOS-2-Sampler](https://github.com/shu223/watchOS-2-Sampler)
- [watchOS 2 の Watch Connectivity を使ってみた - Qiita](http://qiita.com/koogawa/items/b39e1419cbbcda8efc07)