LoginSignup
6
5

More than 5 years have passed since last update.

ミニドローン Parrot MAMBO を Leap Motion で操縦する(Node.js & Windows 編)

Last updated at Posted at 2017-10-13

目的

以前(2017年4月25日)、ミニドローン Parrot MAMBO を Node.js で飛ばす(Windows 編)という記事を投稿し、その時は PC のキーボードでミニドローンを操縦するサンプルを紹介しました。

ふと思い立ち、Leap Motion (手のジェスチャ)で操縦できるようにしました。

既にある先人の記事と、やっていることは変わりません。違いは、Windows マシン 1台で完結していることくらいです。

以下、私自身の過去の記事と重複する部分も多いですが、この記事だけ見れば済むように、省略せずに全体を書きました。

機材・環境

ハードウェア

ソフトウェア

環境構築

Node.js のインストール

  • 通常どおりインストーラでインストール
    • 私は C:\nodejs にインストールしました

windows-build-tools のインストール

  • 今回の用途に限らず、各種の Node モジュールを Windows ネイティブでコンパイルするための環境一式で、以下を一括でインストール・各種設定できます(こちらをご参考)。

    • Visual C++ Build Tools 2015
    • Python 2.7.13
  • コマンドプロンプト(cmd.exe)を 管理者として実行 して、以下を実行

npm install --global windows-build-tools
  • インストールが終わるまで気長に待ちます

rolling-spider モジュールのインストール

  • Parrot のミニドローンと Bluetooth でやりとりできるモジュールです
  • これからアプリケーションを作るフォルダを適当に作成
    • 例 C:\Users\(ユーザ名)\leapdrone
  • コマンドプロンプトでそのフォルダに移動
  • 以下のコマンドを実行
npm install rolling-spider
  • 黄色い文字で「WARN」がいくつか出てくると思いますが、たいてい大丈夫です
  • 赤い文字で「ERROR」の場合はネイティブコンパイル等に失敗しているので、windows-build-tools をインストールし直したり、エラーメッセージをもとに試行錯誤してください

Bluetooth アダプタの設定

  • Bluetooth アダプタをパソコンの USB ポートにさします(自動的に Bluetooth デバイスとして認識されますが…)
  • 上記 node-rolling-spider が依存している node-bluetooth-hci-socket というモジュールを通じて使う場合は、「WinUSB」というドライバに書き換える必要があります(こちらに記載)。
  • Zadig というドライバ書き換えツールをこちらからダウンロードします
  • zadig-2.3.exe をダブルクリックで実行します
  • Options メニュー -> List All Devices を選択するとデバイスの一覧が出ます

zadig.PNG

  • デバイスの一覧から Bluetooth アダプタ(今回の場合は「CSR8510 A10」)を選ぶと、左側に現在のドライバが出ます
  • これを「WinUSB」に書き換えるため、「Replace Driver」をクリックします

zadig2.PNG

  • 「The driver was installed successfully.」と出れば成功です。

zadig3.PNG

  • するとこれまで「デバイスマネージャー」で「Bluetooth」として認識されていたアダプタが、「ユニバーサル シリアル バス デバイス」として認識されるようになります。こうなれば OK です。

Leap Motion のドライバ・SDK のインストール

  • ここからダウンロードした「LeapDeveloperKit_3.2.0+45899_win.zip」を解凍
  • ドライバをインストーラ(Leap_Motion_Orion_Setup_win_3.2.0.exe)でインストール
  • Leap Motion を PC に接続し、「Leap Motion コントロールパネル」の「診断ビジュアライザー」などを使って動作を確認
    • なお、この「Leap Motion コントロールパネル」はタスクバーに常駐させておかなくても Leap Motion でのデータは取得できます

leapjs モジュールのインストール

  • Leap Motion 純正の JavaScript モジュールです
  • コマンドプロンプトで、これからアプリケーションを作るフォルダに移動
    • 例 C:\Users\(ユーザ名)\leapdrone
  • 以下のコマンドを実行
npm install leapjs
  • 黄色い文字で「WARN」がいくつか出てくると思いますが、たいてい大丈夫です
  • 赤い文字で「ERROR」の場合はネイティブコンパイル等に失敗しているので、windows-build-tools をインストールし直したり、エラーメッセージをもとに試行錯誤してください

実装

コーディング

以下のコードをテキストエディタで入力し、さきほど rolling-spider と leapjs をインストールしたフォルダ(例 C:\(ユーザ名)\leapdrone)内に「app.js」として保存します。

app.js
"use strict";

// モジュールの読み込み
const Drone = require("rolling-spider");          // rolling-spider モジュールを使う 
const Leap  = require("leapjs");                  // leapjs モジュールを使う

// 各インスタンスを作る
const drone = new Drone();                        // Drone のインスタンス
const leap  = new Leap.Controller();              // Leap の Controller のインスタンス

// 各種変数
drone.isActive = false;                           // ドローンがアクティブか否か
const STEPS = 2;                                  // 各種操作のステップ数

// ドローンの初期設定
drone.connect( () => {                            // BLE でドローンに接続し、接続できたらコールバック
  drone.setup( () => {                            // ドローンを初期設定してサービスや特徴を取得、その後コールバック
    drone.flatTrim();                             // トリムをリセット
    drone.startPing();                            // 継続的に接続させる
    drone.flatTrim();                             // トリムをリセット
    drone.isActive = true;                        // ドローンをアクティブ状態にする
    console.log(drone.name + "is ready.");        // 準備OKなことをコンソール出力
    console.log("battery: " + drone.status.battery + "%");  // バッテリ残量
  });
});

// LeapMotion の Frame ループ
leap.loop( (frame) => {                           // Frame データが取得される度に呼ばれるコールバック
  if (!drone.isActive) { return; }                // ドローンがアクティブれなければ抜ける
  if (frame.hands.length > 0) {                   // 手が1個以上あれば
    const hand = frame.hands[0];                  // 手の取得
    // 離陸
    if (!drone.status.flying) {                   // ドローンが離陸していなければ
      drone.takeoff();                            // 離陸させる
      rest();                                     // 一時的に入力を受け付けない(以下同様)
    }
    // 上昇下降
    if (hand.sphereRadius > 100) {                // 手のひらで作る球の半径が 100 mm より大きい時
      drone.up( {steps: STEPS} );                 // 上昇させる
      rest();
    } else if (hand.sphereRadius < 50) {          // 半径が 50 mm より小さい時
      drone.down( {steps: STEPS} );               // 下降させる
      rest();
    }
    // 左右旋回
    if (rad2deg(hand.yaw()) > 30) {               // 手の yaw が 30 deg より大きい時
      drone.clockwise( {steps: STEPS} );          // 右(時計回り)に旋回させる
      rest();
    } else if (rad2deg(hand.yaw()) < -30) {       // -30 deg より小さい時
      drone.counterClockwise( {steps: STEPS} );   // 左(反時計回り)に旋回させる
      rest();
    }
    // 左右移動(ロール)
    if (rad2deg(hand.roll()) > 30) {              // 手の roll が 30 deg より大きい時
      drone.left( {steps: STEPS} );               // 左に移動させる
      rest();
    } else if (rad2deg(hand.roll()) < -30) {      // -30 deg より小さい時
      drone.right( {steps: STEPS} );              // 右に移動させる
      rest();
    }
    // 前後移動(ピッチ)
    if (rad2deg(hand.pitch()) < -20) {            // 手の pitch が -20 deg より小さい時
      drone.forward( {steps: STEPS} );            // 前進させる
      rest();
    } else if (rad2deg(hand.pitch()) > 20) {      // 20 deg より大きい時
      drone.backward( {steps: STEPS} );           // 後退させる
      rest();
    }
    // 宙返り(後方)
    if (hand.pinchStrength === 1) {               // 手で pinch (親指と人差指を付ける)していたら
      drone.backFlip( {steps: STEPS} );           // 後方宙返りさせる
      rest();
    }
  } else {                                        // 手が1個も無ければ
    // 着陸
    drone.land();                                 // 着陸させる
  }
});

// 一時的に入力を間受け付けないようにする関数
function rest() {
  drone.isActive = false;
  setTimeout( () => {
    drone.isActive = true;
  }, 50);
}

// ラジアンを角度に変換する関数
function rad2deg(rad) {
  return rad * 180 / Math.PI;
}

動作確認

  • ミニドローンにバッテリーを装着し、電源を ON にします
    • Parrot MAMBO の目が緑色に点滅します(ペアリングモード?)
  • コマンドプロンプトで、上記の app.js があるディレクトリ(例 C:\(ユーザ名)\drone)に移動し、以下を実行します
node app.js

コンソールに以下のように表示され、MAMBO の目が緑色の「点灯」になったら準備OKです(xxxxxxは個体の番号)。

Mambo_xxxxxx is ready.

操縦方法

Leap Motion を机上などに(カメラを上向きに)置いて、そこに手をかざしつつ(手のひらは下向き)、以下のようなジェスチャで操縦します。

手の動作 MAMBO の動作 メソッド
Leap Motion に手をかざす 離陸(飛行中でなければ) takeOff()
Leap Motion から手をどかす 着陸 land()
手のひらを大きく開く 上昇 up()
手のひらを脱力する その場ホバリング -
手のひらを軽く握る 下降 down()
手首を右に水平に曲げる 右旋回 clockwise()
手首を左に水平に曲げる 左旋回 counterClockwise()
手のひらを左に傾ける 左に移動 left()
手のひらを右に傾ける 右に移動 right()
手首を下に曲げる 前進 forward()
手首を上に曲げる 後退 backward()
ピンチ(親指と人差指を付ける) 後方宙返り backFlip()
キーボードで Ctrl + c プログラム終了 -

まとめ

rolling-spider と leapjs のサンプルを合体させただけですので、「だからどうした」な作例で恐縮ですが、どなたかのお役に立てば幸いです。

付録

Bluetooth アダプタのドライバの戻し方

  • デバイスマネージャーで WinUSB ドライバで書き換えていた Bluetooth アダプタを右クリックし、「ドライバーの更新」を選択

zadig4.PNG

  • 「コンピューターを参照してドライバーソフトウェアを検索」を選択
  • 「コンピューター上の利用可能なドライバーの一覧から選択します」を選択
  • 「Generic Bluetooth Radio」(当初に認識されていたデバイス名)を選択し、「次へ」でドライバをインストール
  • デバイスマネージャーで当該のアダプタが「Bluetooth」として認識されていれば OK です
  • 念のため zadig-2.3.exe を実行し、「List All Device」して、当該アダプタを選択して、もとのドライバになっていることを確認します
6
5
0

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
6
5