
ドローンManboをNode.jsで動かしてみた
こんにちは。
AI coordinatorの清水秀樹です。
Pepperに変わって、今度はドローンManboで物体検出にチャレンジしてみたいと思います。
このparrot社のドローンManboは写真が撮れるらしいのです。
ということは筆者が好きな物体検出にもチャレンジできるはず!
ということでparrot社のドローンManboを購入しました。
とはいえ、いきなり物体検出できるわけではないので、まずは簡単にドローンを操作できるプログラミングをNode.jsでやっていきたいと思います。
Node.jsは触ったことがないので勉強がてらのんびり紹介していきたいと思います。
参考にさせて頂いたサイトの紹介
homebrewのインストール方法についてはこちらのサイトを参考にさせて頂きました。
nodebrewのインストール方法についてはこちらのサイトを参考にさせて頂きました。
ソースコードについてはこちらのサイトを参考にさせて頂きました。
ありがとうございます。
ドローンManboを操作するコマンドはこちらを参考にしています。
環境の準備
homebrewのインストール
homebrewとは、Macにソフトウェアやライブラリをインストールするパッケージ管理システムです。
まずはhomebrewのインストールから始めましょう。
下記コマンドでhomebrewをインストールしましょう。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
nodebrewのインストール
nodebrewとは、node.jsを自分のマシン内でversion管理するためのツールです。
nodebrewは以下のコマンドでインストールできます。
brew install nodebrewインストールできたら、以下のコマンドでセットアップします。
nodebrew setup続いてパスの設定をしろ!というようなメッセージが出ますので以下のパスを.bash_profileに反映しましょう。
export PATH=$HOME/.nodebrew/current/bin:$PATH
node.jsのインストール
安定板をインストールしましょう。
stable: 安定版
latest: 最新版
nodebrew install-binary stableインストールしただけではまだ利用できません。
useコマンドで、利用するnode.jsのバージョンを指定してあげる必要があります。
下記コマンドは安定版の指定方法です。
$ nodebrew use stable
use v8.4.0
バージョンが表示されれば無事インストール完了です。
各モジュールのインストール
まずはdroneディレクトリを作成し、作成したディレクトリに移動しましょう。
$ mkdir drone
$ cd drone以下、3つのモジュールをインストールします。
$ npm i noble
$ npm i keypress
$ npm i rolling-spidernobleはBluetoothを使うためのモジュールです。
keypressはキーボード入力をサポートするモジュールです。
rolling-spiderはドローンを制御するためのモジュールです。
ソースコードの作成
ドローンを検索するfind.jsと、ドローンを操作するapp.jsを作成します。
参考元サイトのソースコードをそのまま流用しています。
find.js
'use strict';
var noble = require('noble');
var knownDevices = [];
var counter = 0;
if (noble.state === 'poweredOn') {
  start()
} else {
  noble.on('stateChange', start);
}
function start () {
  noble.startScanning();
  noble.on('discover', function(peripheral) {
    counter++;
    console.log(
      "------"+counter+"台目: \n",
      peripheral.uuid,peripheral.advertisement.localName);
    if(peripheral.advertisement.localName && peripheral.advertisement.localName.indexOf('Maclan_') === 0){
      console.log(peripheral.advertisement.manufacturerData.toString('hex'));
    }
    var details = {
      name: peripheral.advertisement.localName,
      uuid: peripheral.uuid,
      rssi: peripheral.rssi
    };
    knownDevices.push(details);
    console.log(knownDevices.length + ': ' + details.name + ' (' + details.uuid + '), RSSI ' + details.rssi);
  });
}
app.js
var RollingSpider = require("rolling-spider");
var keypress = require('keypress');
keypress(process.stdin);
process.stdin.setRawMode(true);
process.stdin.resume();
var ACTIVE = true;
var STEPS = 5;
var d = new RollingSpider({uuid:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}); //各々書き換えましょう。
function cooldown() {
  ACTIVE = false;
  setTimeout(function () {
    ACTIVE = true;
  }, STEPS);
}
d.connect(function () {
  d.setup(function () {
    console.log('Configured for Rolling Spider! ', d.name);
    d.flatTrim();
    d.startPing();
    d.flatTrim();
    setTimeout(function () {
      console.log(d.name + ' => SESSION START');
      ACTIVE = true;
    }, 1000);
  });
});
// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress" => ', key);
  if (ACTIVE && key) {
    var param = {tilt:0, forward:0, turn:0, up:0};
    if (key.name === 'l') {
      console.log('land');
      d.land();
    } else if (key.name === 't') {
      console.log('takeoff');
      d.takeOff();
    } else if (key.name === 'h') {
      console.log('hover');
      d.hover();
    } else if (key.name === 'x') {
      console.log('disconnect');
      d.disconnect();
      process.stdin.pause();
      process.exit();
    }
    if (key.name === 'up') {
      d.forward({ steps: STEPS });
      cooldown();
    } else if (key.name === 'down') {
      d.backward({ steps: STEPS });
      cooldown();
    } else if (key.name === 'right') {
      d.tiltRight({ steps: STEPS });
      cooldown();
    } else if (key.name === 'left') {
      d.tiltLeft({ steps: STEPS });
      cooldown();
    } else if (key.name === 'u') {
      d.up({ steps: STEPS });
      cooldown();
    } else if (key.name === 'd') {
      d.down({ steps: STEPS });
      cooldown();
    }
    if (key.name === 'm') {
      param.turn = 90;
      d.drive(param, STEPS);
      cooldown();
    }
    if (key.name === 'h') {
      param.turn = -90;
      d.drive(param, STEPS);
      cooldown();
    }
    if (key.name === 'f') {
      d.frontFlip();
      cooldown();
    }
    if (key.name === 'b') {
      d.backFlip();
      cooldown();
    }
  }
});
ドローンManboを探して接続する方法
早速、find.jsを使用してドローンを探してみましょう。
$ node findすると以下のような感じでドローンを検出できます。
1: Mambo_xxxxxx (yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy), RSSI -50
yyyyyyyyyyyyyyyyyyyyyとなっている部分がUUIDになります。
このUUIDをapp.jsに指定しましょう。
ドローンManboを飛ばしてみよう
以下のコマンドでドローンManboに接続できます。
$ node app
Configured for Rolling Spider!  Mambo_xxxxxx
Mambo_xxxxxx => SESSION START
キーボード:t 離陸
キーボード:l 着陸
上記以外はapp.jsを参考にしてください。
とりあえず、これで飛びました。
次回は写真の取得にチャレンジしてみたいと思います。

それでまた。







LEAVE A REPLY