Parrot MamboをNode.jsのRolling Spiderで動かしてみる。

動機：プログラムで思い通りに自動巡回をさせてみたい
結論：Parrot MamboでRolling Spiderを使っている場合は制約が多い

今回調べていて色々わかったのでその結果を共有します。

------
今回の検証環境

| 構成環境 | 詳細 |
|:-----------------|:------------------|
| Mac Air | Mid 2014 |
| 機種       | Parrot Mambo |
| Node.js Library | rolling-spider |
|  | temporal |

-----

**基本的なこと**

**制御を失ったら**

手持ちのiPhone / Androidに必ずFreeFightMiniをダウンロードして
接続できるようにしておいてください。
制御不能になったらすぐにスマホのBluetoothをOnにして
Mamboの制御権を取得して、スマホでコントロールできるようにします。
あとはスマホで着陸などお好きなように。

**1. まっすぐ浮上しなくなったら**
　実は水平じゃないところで飛ばしている。
　　ちゃんと水平な場所に置きましょう。

　水平なのに横に飛ぶ。
　ぶつかって真っ直ぐ上に浮上しないときは、4つの羽のそれぞれの
　回転数が違うため、後ろに飛んだり前に飛んだり斜めに飛んだりします。

　**解決方法**
　　デコピンの要領で、羽を爪で弾いてくるくる回してみてください。
　　滑りが悪くて回転数が違う羽があると思います。
　　勢いよく弾くと滑りが元に戻ります。戻らないときは、羽の接続部を
　　軽く押し上げたり、押してみたりして、再度爪で弾いてみてください。
　　概ね回転数が揃えば、ある程度安定した浮上に戻せます。

**2. 動作が完了しないと次の動作はキャンセルされる**
　DriveメソッドやTakeOffなどのメソッドを連続実行させるためには
　前の動作が完了してからでないと、受け付けない。
　なので、実行する動作が何秒後に完了しているかを把握して、
　次の命令を発行する必要があります。

**3. 簡単なメソッドの使い方**

```
var RollingSpider = require("rolling-spider");
var d = new RollingSpider({uuid:"MamboのUUID"}); //各々書き換えましょう。

d.takeOff(); //浮上

var param = {tilt:0, forward:0, turn:0, up:0};
d.drive(param, 15); // 動作パターン, 実行時間(1-100) 1 = 56msecくらい
d.land(); // 着地
d.disconnect(); //切断

```

**パラメータの意味と動作**

| パラメータ名 | 値 | 動作 |
|------------|----|-----|
| tilt | -100<= 0 <= 100| 左右に傾く(傾くため、傾いた方向に進む)<br />-方向 = 左下に傾く(左に水平移動)<br>+方向 = 右下に傾く(右に水平移動) |
| forward | 1 <= 100 | 前進するスピードを指定。大きいほど早い |
| turn | -100 <= 0 <= 100 | 回転角度 <br>-方向 = 左回転 <br> +方向 = 右回転 |
| up | -100 <= 0 <= 100 | 上下動のスピード <br> -方向 = 下降 <br> +方向 = 上昇 |

----

**各種動作に必要な実行時間**

| 動作 | 次の動作に必要な待機時間(msec) | パラメータ | Drive第二引数 | 移動距離(概算) |
|:----|:-------|------|---|---|
| takeOff | 3500 | - |-|-|
| drive (回転:90度) | 1000 | turn:90 or -90 | 18 | 0 |
| drive (前進:50) | 2000 | forward: 50 or -50 | 20 | 30cmくらい |
| drive (傾き:50) | 2000 | forward: 50 or -50 | 20 | 30cmくらい |

**割り込みが許可される命令**

turnのみの命令であれば、land命令を同時実行できる。
なので、回転しながら着地なんかの動作が可能です。

-----

**左回りで旋回して戻ってくるサンプルプログラム**

``` autoflight.js
var RollingSpider = require("rolling-spider");
var temporal = require("temporal");

var ACTIVE = true;
var STEPS = 5;
var d = new RollingSpider({uuid:"MamboのUUIDを記入してください"}); //各々書き換えましょう。
 
d.connect(function () {
 
  d.setup(function () {
    console.log('Configured for Mambo! ', d.name);
    d.flatTrim();
    d.startPing();
    d.flatTrim();
    setTimeout(function () {
      console.log(d.name + ' => SESSION START');
      ACTIVE = true;

      temporal.queue(
        [
          {
            delay: 500,
            task: function() {
              d.takeOff();
              console.log("order take off.");
            }
          },
          {
            delay: 3500,
            task: function() {
              var param = {tilt:0, forward:50, turn:0, up:0};
              d.drive(param, 20);
              console.log("forward")
            }
          },
          {
            delay: 3500, // takeOff実行後3500msec経過してから実行
            task: function() {
              var param = {tilt:0, forward:0, turn:-90, up:0};
              d.drive(param, 18); 
              console.log("left turn.")
            }
          },
          {
            delay: 3500, // trun -90度実行後 3500msec後に前進実行 (50cm程度進みます)
            task: function() {
              var param = {tilt:0, forward:50, turn:0, up:0};
              // この20を小さくすると距離が短くなります。大きくすると長くなります。
              // 大きくする場合は次のtaskのdelay(このtaskではない）を長く設定してください。
              d.drive(param, 20); 
              console.log("forward")
            }
          },
          {
            delay: 3500,
            task: function() {
              var param = {tilt:0, forward:0, turn:-90, up:0};
              d.drive(param, 18);
              console.log("left turn")
            }
          },
          {
            delay: 3500,
            task: function() {
              var param = {tilt:0, forward:50, turn:0, up:0};
              d.drive(param, 20);
              console.log("forward")
            }
          },
          {
            delay: 3500,
            task: function() {
              var param = {tilt:0, forward:0, turn:-90, up:0};
              d.drive(param, 18);
              console.log("forward")
            }
          },
          {
            delay: 3500,
            task: function() {
              var param = {tilt:0, forward:50, turn:0, up:0};
              d.drive(param, 20);
              console.log("forward")
            }
          },
          {
            delay: 3000,
            task: function() {
              d.land();
              console.log("order landing.");
            }
          },
          {
            delay: 500,
            task: function() {
              d.disconnect();
              console.log('finish.');
              temporal.clear();
              process.exit(0);
              console.log('exit.');
            }
          }
        ]
        );

    }, 1000);
 
  });
});

```

ある程度は自由に飛ばせるようになると思います。
Mamboを楽しんでください。