MySQL道普請便り

第105回 MySQLでドローンを飛ばしてみる

この記事を読むのに必要な時間:およそ 2 分

去年のクリスマスに第87回 MySQLでケーキを焼いてみるという記事を発表させていただきました。その後ご縁がありまして8月29日から8月31日まで開催されていたBuilderscon 2019の前夜祭で発表を行ってきました。Buildersconでよく言われることは「ブログを書くまでがBuilderscon」という話がされます。

今回はそのブログに代わりまして,Buildersconで学んだことを利用してMySQLでドローンを飛ばしてみようと思います。この記事では実際にドローンを飛ばす記事となります。この記事を追試される場合には,ドローンを飛ばす際の法律などに注意して飛ばしましょう。

また,落下や破損などで怪我をする可能性も普段の記事と比べて高いので,周りをよく見て注意をして安全を確認して行いましょう。

参考にさせていただいた発表

今回の道普請便りの発端としては,同じくBuildersconの前夜祭で発表されていたHiromuKatoさんの「前夜祭 (1)「HoloLensとドローンの(間違った)活用方法」という発表に触発されて作成しております。こちら非常に面白い内容でしたので,発表が公開されましたら是非とも見ていただきたいです。

発表の中では,笛を使って音階をベースにドローンを操作していたり,Hololensでの面白い活用方法が紹介されていたのですが,私が特に驚愕したものとしては,ExcelでもPhotoshopでもドローンを飛ばせるという部分でした。ExcelやPhotoshop今回というソフトウェアでもドローンが飛ばせるという事実を知ってしまったので,今回私は,Excelでドローンを飛ばす方法とMySQLでケーキを焼く手法とミックスして,MySQLでドローンを飛ばしてみたいと思います。

開発環境

今回はMacにHomebrewを利用して導入したMySQL8.0.15を利用していきます。UDFのコンパイルが必要なため必要に応じてソフトウェアを利用してください。また,node.jsを利用してdroneを飛ばすのでnodeのインストールが必要です。node.jsのバージョンは v12.9.1を利用しております。Homebrewの導入方法に関しては紹介を行いませんが,homebrew install nodeとしてインストールしたものを利用しております。

またWindowsやLinuxで挑戦される方はBluetooth接続ができないとドローンと通信することができないので,Bluetooth接続ができるPCか,アダプターを準備して挑戦してください。

使用したドローン

今回使用したのは,Parrot社のParrot Mambo flyです。こちらのドローンはBLEで操縦することができます。Bluetoothで接続することができる端末であれば,基本的には相性の問題などを除けば利用することができます。プログラムでの操作も簡単に行えるシンプルなドローンです。63gと非常に軽く法律的にも200g以下でもあり扱いやすいため今回は利用しました。

画像

飛行時間は9分程度なので,連続して飛行を行う際などには注意をしましょう。

ドローンを飛ばすための準備

さてMySQLでドローンを飛ばす方法ですが,ケーキを焼いた時と同じ方法を取っていきます。第70回 UDFを動かしてみようで紹介させて頂いたUDFをまたまた利用していきます。

今回はMySQLからnode.jsで書かれたプログラムをキックしてドローンとMacでBLE通信を行いドローンが飛行させます。

まずはドローンを飛ばすためのプログラムを用意しましょう。今回はParrot MamboをMac(Mojave)から操作する - 2019版という記事を参考に上昇と下降だけできるプログラムを用意します。まずは必要なモジュールをインストールしましょう。今回必要なのは ,ドローン操作用のminidroneと同期処理を行うためのライブラリのtemporalです。

$ npm install minidrone
$ npm install temporal

用意したプログラムはこちらになります。

const minidrone = require('minidrone');
const temporal = require('temporal');
const drone = new minidrone.Drone();

drone.connect(function() {
  drone.setup(function() {
    drone.flatTrim();
    drone.startPing();
    drone.flatTrim();
    console.log('Connected to drone', drone.name);

    temporal.queue([
      {
        delay: 2000,
        task: function() {
          drone.takeOff()
          drone.flatTrim()
        },
      },
      {
        delay: 2000,
        task: function() {
          drone.land()
        },
      },
      {
        delay: 2000,
        task: function() {
          temporal.clear()
          process.exit(0)
        },
      },
    ]);
  })
});

2秒間飛び上がって,その2秒後に降りてきて,最後に終了処理をしているタスクです。

続いてMySQL側の準備をしていきます。今回は,ドローンを飛ばすのに必要なflightコマンドを実装していきます。まずは飛ばすために作成したUDFは以下のものになります。System関数で上記で書いたnodeスクリプトを実行しています。

#include <mysql.h>

extern "C" {
bool flight_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void flight(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
void flight_deinit(UDF_INIT *initid);
}

bool flight_init(UDF_INIT *initid, UDF_ARGS *args, char *message){
    return 0;
}

void flight(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error){
    system(node /usr/local/bin/flight/flight.js");
}

void flight_deinit(UDF_INIT *initid){
}

これを以下の様にコンパイルして配置します。今回はMacでのコンパイルのため一部オプションが変更されています。コンパイル時にmysql_configでプラグインのディレクトリを指定して直接配置します。

$ gcc --shared -o  `mysql_config --plugindir`/udf_flight.so `mysql_config --cflags` flight.cc

コンパイルが終わったらmysqlコマンドラインクライアントでMySQLにログインして,MySQLのUDFとして登録を行います。

mysql>  CREATE FUNCTION flight RETURNS STRING SONAME 'udf_flight.so';

最後にmysqlコマンドラインクライアントからflightコマンドを実行すると,ドローンが浮かび上がります。

mysql> select flight();
+----------+
| flight() |
+----------+
| NULL     |
+----------+
1 row in set (9.68 sec)

ということでMySQLからドローンを飛ばすことができました。

まとめ

というわけで今回はBuildersconで学んだことを組み合わせて,MySQLでドローンを飛ばしてみました。何か新しい技術や発想を見かけたら,皆さんも是非模倣をして遊んでみると良いのではないでしょうか。

その際には単純に模倣するだけではワクワク感が少ないので,ぜひ皆さんの好きな,得意な分野で挑戦してみると良いのではないでしょうか。

また今回の不満点としましては,今回プログラムした動作で飛行させることはできたのですが,コマンドを叩いてドローンを操作し続けることができなかったことが残念です。今後改良してMySQLから簡単に飛ばせるようにしていけたらと思っております。

著者プロフィール

木村浩一郎(きむらこういちろう)

株式会社オプティム 技術統括本部のエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170