DroooneアプリでTelloを音声操作! (2020/08/04 update)
はじめに
このTipsでは、Toy drone(ドローン)Telloを音声で操縦できるアプリ「Drooone」を紹介していきます。
昨今、市販の音声操作デバイス(device)といえばスマートスピーカー(smart speaker)ばかり登場しています。しかし、
「スマートスピーカーはもう飽きた!」、
「音声操作のメリットがあまり感じられない!」、
「もはや音楽再生装置になってしまった!」、
という方も多いのではないでしょうか。
そこで今回は、これまで紹介してきた技術を応用し、プログラムなどに興味がない一般の方でも楽しめるようにしました。
市販の空飛ぶIoT機器として注目されているドローン(drone)を利用しています。
アプリは無料で利用できるので、ドローンに興味がある方は実際に動かし試してみて下さい。
音声操縦のメリットなどを体験してみましょう。
また、音声操作の他にキーボードやタッチパネルでも操作できるようにUIを最適化しています。UIによる操縦性の違いなどを確認してみるのも面白いです。
プログラムに興味がある方であれば、実用的なアプリを開発するうえでの参考にもなると思います。
今回は、DroooneアプリとTelloで遊ぶための基本的な知識について説明します。
なお、離陸から着陸までの基本的な操作方法については、基本的な操作方法を参照して下さい。
Telloについて
Telloは、中国のRyze Technology社が開発及び販売しているToy(おもちゃ) ドローンです。
Toyドローンとは、撮影などに利用される民生用の本格的なドローンではなく、子供から大人までを対象とした室内での飛行を中心とする小型のドローンです。
(Telloは、全長約10cm弱で重量80g)
通常、本格的なドローンにはGPSが搭載されています。しかし、TelloはGPS非搭載にもかかわらず、安定したホバリング(hovering)を実現していることでも人気を得ています。
GPS電波が届きにくい室内では、現時点で最も安定しているドローンの一つです。
この安定した飛行を支える技術として、DJI製のフライトコントロールシステム(flight control system)が採用されています。
(DJIとは、ドローン業界で世界7割のシェアを持つ中国の企業)
2018年3月の発売から既に1年以上経過しているのですが、Toyドローンとしては未だに人気を得ている製品です。
Telloより格安な製品も多く販売されていますが、飛行が安定しない、直ぐに壊れる、技適未取得など信頼できる製品は少ないと思われます。
筆者としては、お金をケチって購入後に後悔するより、現状ではTelloを選択するほうが無難だと思います。
また、TelloにはプログラミングでコントロールできるSDKが提供されています。プログラム初心者でも、楽しみながらプログラミング学習ができることも魅力の1つだと思います。
Tello SDKについて
プログラムでTelloを制御するためには、Telloに搭載されているSDK(software development kit)を利用します。
Droooneアプリでは、この記事執筆時点で最新となる「Version 1.3.0.0」を採用しています(Tello EDUではVersion 2.0.0)。そのためバージョンが古いファームウェア(Firmware)では、動作しない可能性があります。その場合は、Tello純正アプリで最新のバージョンにアップデートを行って下さい。
このSDKを利用してどんなことができるかというと、当然SDK側の仕様次第ということになります。
プログラム初心者や、趣味でTelloを少しだけ制御してみたいというユーザーであれば、現在のSDK仕様でも問題ないと思います。実際にネット上で公開されているのは、ちょっとだけ動作させてみましたというプログラムばかりです。
ところが、Droooneアプリのように、誰でも利用できる実用的なアプリを開発しようとした場合、SDKの仕様としては色々と残念な仕様で有ることが判明しました。
以下に、残念な仕様についてまとめたので、今後、自分でも本格的なアプリを開発してみようという方は参考にして下さい。
残念度が高い仕様から番号順にリストアップしています。
-
複数ソケットを利用したコマンド送信時のレスポンス仕様が変態すぎる(基本的にNG仕様)
複数のソケットでコマンドを送信した場合に、全てのレスポンスが最初に接続されたソケット宛に返る。
通常のソケット通信では、接続したソケットを宛先として返す必要がある。そうしない場合は、レスポンスが混信状態になってしまう。
例えば、操縦系と設定系のコマンドを別のソケットで管理したい場合に大変迷惑。 -
コマンド送信後の割り込みができない
例えば、5m前進させるコマンド送信した場合、5m前進が終了するまでレスポンスが返ってこない。そのため、壁に激突しそうな状況での危険回避が困難。また、レスポンス受信前にコマンドを送信すると制御不能になる。 -
rcコマンドのレスポンスが返らない
仕様書では「ok or error」が返ると記載されているが返らない。また、指定した方向に移動するが停止せず最終的には自動的に着陸する。使用方法が不明。
例)「rc 20 0 0 0」を送信。右方向へ平行移動するが、停止せず。「rc 0 0 0 0」を割り込みで送信してみたが停止せず。最終的に自動着陸。 -
Tello EDUとコマンドが微妙に異なる
Tello EDUと基本的なハード仕様は同じなのに、商売のやり方がちょっと・・・。 -
動画の画質がさらに悪くなっている
SDKは、解像度が「960*720」で平均ビットレートが約3Mbps。純正アプリでは、1290*720で約8Mbps。(筆者解析での参考比較値) - 静止画取得用のコマンドが無い(動画のフレームから取得すると画質が悪い)
※上記は、筆者環境(屋内)における動作確認時の事象です。(SDK version 1.3.0.0及び2.0.0)
(仕様書:Tello SDK Documentation EN_1.3_1122.pdf, Tello SDK 2.0 User Guide.pdf)
特に上記1,2の項目に関しては、実務経験者であれば「SDKを修正して下さい」と突き返したいレベルの残念仕様です。(開発意欲を削がれる = モチベーション(motivation)低下)
3は、筆者が使用方法を理解できていないのか、それともバグだろうか・・・?(2と3は関連している可能性有り)
4,5,6に関しては、純正アプリと差別化することで、「通常は純正アプリを利用してね」というところでしょうか。
純正アプリを利用してもらいたい理由は、もちろん個人情報を・・・。
所詮おもちゃ用のSDKなので、満足いく品質のソフトウェアを開発することは難しいと考えて下さい。そのような訳で品質に責任が持てないため、筆者は有料アプリを開発するのは困難と判断しました。
(純正アプリとは、異なる楽しみを提供するという趣旨で開発しています。)
Tello利用時の注意点
Telloを飛行させる場合の注意点について説明します。
-
屋外で飛行させる場合は、航空法などの規制を厳守する
航空法以外にも地区ごとの条例などで規制されており、違反時は、罰金や書類送検の対象になる。(200g未満のドローンも同様ととらえる) -
騒音に注意する
ドローン(drone)という単語には、「ブンブン唸る」という意味があるようにかなりうるさい。
Telloも掃除機並みの音を発生するので注意する。 -
周辺の物や生物(人・動植物)に当たらないよう注意する
プロペラの回転力は強力。ダウンジャケットの様な薄い生地は簡単に裂けてしまう。コントロールを失うと、とんでもない方向へ吹っ飛んでいくことがあるため要注意。 -
バッテリーの残量に注意する
バッテリーの残量が少なくなると、コマンドを受け付けなくなったり動作が不安定になる。残量が50%未満になった辺りから注意する。 -
機体の温度に注意する
バッテリーの消耗より、機体が高温になる時間のほうが早い。オーバーヒート(over heat)させると故障の原因になる。なお、飛行中より地上で待機している時のほうが高温になる時間が早い。 -
明るい場所で飛行させる
カメラもセンサーの役割を果たしているため、暗い場所では制御不能になりやすい。 -
飛行させる前に、プロペラ装着箇所が緩んでいないか確認する
緩んでいると、フリップ時などにプロペラが外れ、機体も吹っ飛んで行く。 -
緊急時は自動ランディングが実行される
Telloは次のような状況になると、自動的に着陸を実行する。
ホバリング状態で、何も操作しない状態が15秒以上継続。バッテリー残量低下。機体温度の上昇。Tello内部で何らかの内部エラー発生。無線電波が弱いなど。
Droooneについて
Droooneアプリについて説明します。
実のところ筆者は、次の理由で現在のドローンには魅力を感じていません。
「しょせんプロペラ機である。」
そろそろ、実用性が有り騒音の無い反重力推進ドローンが登場しないだろうか・・・。
とは言っても、興味がないからと無視ばかりしていては、技術者として成長できないことになります。
そこで、ドローン飛行に重点を置かず、リアルタイムな動画処理に注目することにしました。(今後、カメラは機械の目になっていくため)
ネット上に公開されているTelloの動画処理といえば、OpenCVなどのライブラリを利用した方法ばかりです。
それではつまらないので、DroooneアプリではWindows標準の機能だけで開発しています。
ただし、受信したデータからMP4ファイルを生成する機能は用意されていません。そのため、自前で生成処理を実装しています。
基本的なMP4ファイルの生成については、MP4関連の仕様書(英語のみ)が読めてバイナリデータの解析ができれば、それほど難しことではありません。
飛行に関しては、せっかくなので音声操作ができるようにしています。実用的な音声操作を行うには、常時ハンズフリー(hands-free)状態を保持できる必要があるため次の機能を実装しています。
- 永続的な音声入力
- バッテリーや機体温度などの警告を音声で通知
- フレーズのカスタマイズ
- 多言語対応
音声関連の処理に関しては、Haruziraでの実装を利用できたため楽でした。
マイクとヘッドフォン付きのヘッドセットが有れば、ハンズフリーで操縦可能なので試してみて下さい。(タッチ操作などと兼用することも可能)
なお、内蔵マイクでは認識率が低くなる傾向があります。外付けの単一指向性マイクを推奨します。また、屋内でも風防スポンジを装着すると認識率が向上します。
音声操作の特性に慣れれば、カメラを手に持ち、飛行中のTelloを自分で撮影することも不可能ではありません。
Drooone利用時の注意点
スケジュールの関係で、当初予定していた機能を全て実装できていません。
そのため、RC版(release candidate)として公開しています。
正式なリリースに向けて改善中ですので、不安定な処理が残っている可能性もあります。
2019/09/13に正式版をリリースしました。(version 1.0.1)
1.フライトスケール
初めに、フライトスケール(flight scales)について説明します。
Tello SDKでは移動中にコマンドを割り込ませることができません。
そのため、純正アプリと同様な操縦を実現することが不可能でした。(Tello SDKについて)
室内が狭い場合、この仕様では移動距離のコントロールが難しい場合があります。
また、広い室内や屋外では1回での移動距離を変えたい場合もあります。
そこでDroooneでは、「フライトスケール」という飛行環境に応じたモードを選択できるようにしています。
選択しているフライトモードの情報は、インフォメーションパネルに表示されます。
- FB: Forward and Back
- LR: Left and Right
- UD: Up and Down
なお、飛行中でも音声やキーボードなどで常時切替可能です。
また、正式版では、任意の値でカスタマイズ可能になりました。
各モードを飛行中に適切に切り替えることで、移動距離制御の自由度が高まります。
各モードは、次のように移動距離などを割り当てています。(初期設定)
狭い室内(既定値) |
移動距離(cm): x:30, y:30, z:30 速度(cm/sec): 20 |
---|---|
広い室内 |
移動距離(cm): x:100, y:100, z:50 速度(cm/sec): 60 |
屋外 |
移動距離(cm): x:300, y:300, z:100 速度(cm/sec): 100 |
※速度は、音声操作またはサブパネルで任意の値(20, 60, 100の3段階)に常時変更可能
2.移動距離の手動調整
Version 1.0.15以降は、手動による前後・左右・上下への移動距離が任意調整できます。
飛行中でも変更できるので、移動の微調整ができるようになっています。
また、フライトスケールと兼用することでより操縦性を向上させることができます。
なお、フライトスケールのプライオリティ(priority)を高くしているので、フライトスケールの変更時に手動での設定が置き換えられます。
手動調整パネルは、次の方法で表示できます。
- タッチパネル: タッチジェスチャー領域で長押しする。(長押しでタッチジェスチャ領域と交互に切り替わる)
- キーボード: 'M'キーを押す。再度押すと非表示になる。
3.音声操作
音声操作の仕様について説明します。
音声操作で移動系のコマンドを認識させた場合、停止コマンドを認識させるまで処理を繰り返します。
例えば、「前進」を認識させた場合、「停止」と言うまで前進を継続します。
フライトスケールで「Small room」以外を選択する場合は、移動距離が大きくなり易いので十分に注意して下さい。
コマンドを正常に認識できた場合は、音声で「"Copy that" or "Copy"」の応答が通知されるので目安にして下さい。
Version 0.9.3 RCからは、上記の自動繰り返し仕様から、既定では音声コマンドの送信毎に1度のみ移動するように変更しています。
(Telloの内部負荷を軽減及び、初心者にも操縦しやすいようにしたかったため)
状来の仕様が好みの場合は、設定タブで変更可能です。また、音声認識でも設定の切り替えを行うことが可能なので、フライト中に移動操作に応じて自由に切り替えることもできます。
なお、キーボード及びマウス、タッチ操作でも、キーを離すまで処理を繰り返し継続することができます。
デフォルトではこの機能をOFFにしていますが、設定タブで変更できます。(Version 1.1.3以降)
Version 0.9.2 RCから、「低い認識信頼度の処理」を有効にできる機能を追加しました。機能の概要は次のようになります。
音声認識では、発生したフレーズを認識時の信頼度に基づいて処理します。信頼度は、「reject, Low, Middle, high」の信頼度レベルで判定されます。
通常、Middle以上が処理の対象となるのですが、この機能を有効にすることでLowレベルの信頼度も処理できるようになります。
特に、非ネイティブ(native)言語を話す時に認識率が向上します。例えば、日本人が英語を話す場合などです。
筆者の発音では、8割程Lowと判断されていたので効果がありました。(既定値:OFF)
利用可能な音声コマンド一覧については、こちらを参照して下さい。
4.その他
その他の注意点については、次のリストを参考にして下さい。また、Tello利用時の注意点も参照して下さい。
-
ファームウェアを次のバージョンに更新する
Tello: 01.04.91.01
Tello EDU: 02.04.93.01
ファームウェアが古い場合は、正常に動作しない可能性があるため純正アプリでアップデートを行う。 -
Wi-FiでTelloが検出できない
Tello側の検出準備ができていなと思われる。電源を入れた後、LEDがオレンジ色の速い点滅に変化した後でWi-Fiスキャンを実行する。
-
Telloに接続できない
デバイスに搭載されたWi-Fiドライバによっては、Telloにうまく接続できない症状が確認されている。(クアルコム(Qualcomm)製のWi-Fiなど)
そのためVersion 1.1.3以降では、「8秒 × 3回」接続を試行するように仕様を変更している。(従来は「5秒 × 1回」)
-
ライブ映像表示中にラグ(lag)やノイズ(noize)が発生する(デバイス環境により発生する可能性有り)
対策としてライブ映像表示中に、サブパネルの「ライブ映像」または「動画ストリームの受信」スイッチを切り替える。(ON → OFF → ON)
どうしても症状が改善しない場合は、ライブ映像スイッチをOFFにする。(OFFの状態でも録画は可能)
Version 1.2.2以降は、ライブ映像開始時の遅延時間設定機能が利用できます。 ラグ等が発生する場合は、最初にこの値を変更してみることを推奨。
-
フリップ(flip)が機能しない
フリップを実行するためには、50%以上のバッテリー残量が必要。この条件を満たさない場合は、Telloからエラーが返る。
フリップは、バッテリーを多く消費するので注意する。 -
飛行距離に注意する(特に屋外)
TelloのWi-Fi出力は弱い。コントロールを行うデバイスとの距離によっては通信できなくなる。特に、パケットロス(packet loss)などで動画の表示が乱れ安く、自動着陸する場合がある。