LoginSignup
9
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-12

動機:プログラムで思い通りに自動巡回をさせてみたい
結論: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 左右に傾く(傾くため、傾いた方向に進む)
-方向 = 左下に傾く(左に水平移動)
+方向 = 右下に傾く(右に水平移動)
forward 1 <= 100 前進するスピードを指定。大きいほど早い
turn -100 <= 0 <= 100 回転角度
-方向 = 左回転
+方向 = 右回転
up -100 <= 0 <= 100 上下動のスピード
-方向 = 下降
+方向 = 上昇

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

動作 次の動作に必要な待機時間(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を楽しんでください。

9
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6