Parrot社のドローンManboをNode.jsで操作する簡単な方法

ドローン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-spider

nobleは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を参考にしてください。

 

とりあえず、これで飛びました。

次回は写真の取得にチャレンジしてみたいと思います。

 

 

それでまた。

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP