トイドローン Tello をビジュアルプログラミングツール Node-REDで制御してみよう 最終回 操縦編

こんにちは。田中です。

第3回ではドローン状態確認編を行いましたが、今回はもう少し踏み込んで宙返り・前後・上下などの飛行命令を続けて命令して操縦してみましょう。今回が予定通りの最終回です。

今回の流れ

今回の流れはこちらです。

image.png (88.3 kB)

いろいろな指示を出してTelloを操作します。

Ryze Techの資料が集まっているページから現状のSDKの資料を見てみると、

Tello SDK Documentation EN_1.3.pdf

上昇・下降だけでなく、前進・後退など一通りの操作が揃っています。しかも、up 30と数字でするんですが、これが30cm上昇という意味でして、精密です・・・!

image.png (77.2 kB)

さらに、cw 90という形で命令すれば時計回り回転します。cw -90で反時計回りです。

image.png (73.4 kB)

そして、宙返りも flip f というもので指示が出せます。l や r は横回転の宙返り、 b だと後ろ宙返りだったり多芸です。

こちらを、Node-REDで指示が出せるようにします!

Node-REDの準備

Node-REDの準備を作っていきましょう。

まず、こちらのフローをインポートします。インポートの仕方は第2回を参考にしましょう。

[{"id":"53d38057.b774b","type":"tab","label":"Tello 第4回","disabled":false,"info":""},{"id":"192b1663.4fb17a","type":"udp out","z":"53d38057.b774b","name":"","addr":"192.168.10.1","iface":"","port":"8889","ipv":"udp4","outport":"45678","base64":false,"multicast":"false","x":650,"y":120,"wires":[]},{"id":"4c0a0401.9d47ec","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"takeoff","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":210,"y":400,"wires":[["192b1663.4fb17a"]]},{"id":"a58a8d19.3dee2","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"land","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":210,"y":440,"wires":[["192b1663.4fb17a"]]},{"id":"ff1edf37.020c7","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"command","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":200,"y":80,"wires":[["192b1663.4fb17a"]]},{"id":"afae356b.d34578","type":"comment","z":"53d38057.b774b","name":"離着陸操作","info":"","x":200,"y":360,"wires":[]},{"id":"1aab5579.0e732b","type":"udp in","z":"53d38057.b774b","name":"","iface":"","port":"45678","ipv":"udp4","multicast":"false","group":"","datatype":"utf8","x":600,"y":240,"wires":[["bfc1ece7.517ba"]]},{"id":"bfc1ece7.517ba","type":"debug","z":"53d38057.b774b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":750,"y":240,"wires":[]},{"id":"b0ebf2e4.2aa9","type":"comment","z":"53d38057.b774b","name":"ドローン命令の結果受信","info":"","x":650,"y":200,"wires":[]},{"id":"af5b7f88.b6e9","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"battery?","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":200,"y":160,"wires":[["192b1663.4fb17a"]]},{"id":"31dc4461.16232c","type":"comment","z":"53d38057.b774b","name":"コマンド開始","info":"","x":190,"y":40,"wires":[]},{"id":"25973dbe.1b46f2","type":"comment","z":"53d38057.b774b","name":"バッテリー残量問い合わせ","info":"","x":150,"y":120,"wires":[]},{"id":"15391a3c.bbdac6","type":"comment","z":"53d38057.b774b","name":"ドローンへ命令送信","info":"","x":630,"y":80,"wires":[]},{"id":"38abb324.c51b8c","type":"comment","z":"53d38057.b774b","name":"飛行時間(秒)問い合わせ","info":"","x":150,"y":200,"wires":[]},{"id":"77dc625b.e2ee9c","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"time?","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":210,"y":240,"wires":[["192b1663.4fb17a"]]},{"id":"4a86d1cc.1a95","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"height?","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":210,"y":320,"wires":[["192b1663.4fb17a"]]},{"id":"13f2a279.ebc32e","type":"comment","z":"53d38057.b774b","name":"飛行高度(cm)問い合わせ","info":"","x":140,"y":280,"wires":[]},{"id":"e6a44ee8.8efcd","type":"udp out","z":"53d38057.b774b","name":"","addr":"192.168.10.1","iface":"","port":"8889","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":650,"y":680,"wires":[]},{"id":"c34ae33b.fee11","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"down 30","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":320,"y":680,"wires":[["e6a44ee8.8efcd"]]},{"id":"257be18d.038a1e","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"up 30","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":330,"y":720,"wires":[["e6a44ee8.8efcd"]]},{"id":"5901d58.be44b2c","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"flip f","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":330,"y":600,"wires":[["e6a44ee8.8efcd"]]},{"id":"819f3224.81443","type":"comment","z":"53d38057.b774b","name":"ドローンへ命令送信","info":"","x":630,"y":640,"wires":[]},{"id":"660a9107.14db5","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"cw 90","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":330,"y":780,"wires":[["e6a44ee8.8efcd"]]},{"id":"a4bc748c.0e94d8","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"cw -90","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":330,"y":820,"wires":[["e6a44ee8.8efcd"]]},{"id":"c95b59e.ee6faa8","type":"comment","z":"53d38057.b774b","name":"いろいろな操縦 ------------------------------------","info":"","x":180,"y":520,"wires":[]},{"id":"3c884a90.c70ef6","type":"comment","z":"53d38057.b774b","name":"宙返り(前)","info":"","x":150,"y":600,"wires":[]},{"id":"b815d4f5.520568","type":"comment","z":"53d38057.b774b","name":"下(地面)へ50cm","info":"","x":130,"y":680,"wires":[]},{"id":"b93f4cf2.1a01","type":"comment","z":"53d38057.b774b","name":"上(上空)へ50cm","info":"","x":130,"y":720,"wires":[]},{"id":"74ab7a99.d2b754","type":"comment","z":"53d38057.b774b","name":"180度回転","info":"","x":160,"y":780,"wires":[]},{"id":"c4fc8c94.57d7a","type":"comment","z":"53d38057.b774b","name":"180度逆回転","info":"","x":150,"y":820,"wires":[]},{"id":"ec8c50c5.0abfd","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"forward 30","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":320,"y":880,"wires":[["e6a44ee8.8efcd"]]},{"id":"946fbb95.3a2228","type":"inject","z":"53d38057.b774b","name":"","topic":"","payload":"back 30","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":330,"y":920,"wires":[["e6a44ee8.8efcd"]]},{"id":"f332bfb3.80eaa","type":"comment","z":"53d38057.b774b","name":"前方へ50cm","info":"","x":150,"y":880,"wires":[]},{"id":"b7ac10d0.84c07","type":"comment","z":"53d38057.b774b","name":"後方へ50cm","info":"","x":150,"y":920,"wires":[]}]

インポートして読み込むと1つタブが増えています。

image.png (28.9 kB)

前回のフローは削除

前回のフローについては、今回のフローに注力するために削除しておきます。第3回の記事を参考にして削除しておきましょう。

image.png (19.0 kB)

読み込まれたフロー

今回読み込まれたフローです。

image.png (168.3 kB)

第3回の記事で構築したドローンの状態把握のフローが上部にあって、今回は下部にいろいろな操縦のフローがあります。

image.png (167.8 kB)

今回もinjectノードで命令を出していて、injectノードに書かれている文字がそのまま命令です。

image.png (27.7 kB)

この場合は、down 30というのがTelloに対する命令で、下(地面)へ30cmに移動する指示です。

動かしてみる

さて、Telloを起動して動かしてみましょう。

image.png (345.1 kB)

動かすたびにTelloは「この指示は無事に受け取って動かしましたよ」という意味で ok を返答してきて debug タブに表示されます。okが帰ってくるまでは他の指示は受け付けないので、確認しながら操作しましょう。

実際に動いた様子がこちらです。楽しいですね!

連載してきて考えること

今回、4回をかけてトイドローン Tello をビジュアルプログラミングツール Node-REDで制御する記事を書かせていただきました。記事を読まれたみなさんにも「ドローンが自分の指示で制御できるんだ!」ということを体験いただけたかとおもいます。

そして、この記事から、さらにいろいろな可能性を感じられると思います。

自動操縦など仕組みがわかることで発想が広がる

まず、ひとつに制御を体験した上で見えてくる仕組みとしての広がりです。

今回は ok が来たら操縦、さらに、操縦、、、という形で目で見ながら操作というところにとどめましたが、これを処理を自動でいくつもリレーさせる形で行うと、ドローン活用ででてくる自動操縦につながってきます。もし興味があればぜひ拡張してみてください。

image.png (84.9 kB)

そして自動操縦を運用していくとなればただ自動で動かすだけではない、その先が見えてきます。自動操縦では手元から離れ、いつも目で見るのではなくGPSといった位置把握を人の代わりに行いながら目的地にたどり着く運用面など見えてくるでしょう。

トイドローンとはいえ、このあたりは体験するとうまく見立てて考察ができます。

動かして利用時の注意点が見えてくる

動かしてみると、利用時の注意点も見えてきます。

image.png (79.2 kB)

今回ここまで動かすために、バッテリーといったドローンの健康状態を把握できるようにして快適な操作をするための実装を行ったり、Node-REDを使うことでグラフィカルに目で見て操作できる実装をしました。

これらは動かすために必要なことで、もし実際にドローン運用をしていく上では大切なことです。もしも「すぐに機材の状態がわかる」「なにか起きたときにすぐ操作できる」ということが不自由だと、運用上は思わぬトラブルが起こりえます。

もちろん、トイドローンですので機能は限定的で、しっかりしたハイレベルな商業ドローンとは比べ物にならないところもありますが、動かしてみることで具体的な注意点がいろいろと見えてきます。

現実の世界へのハードウェアとソフトウェアで関わる手法を感じられる

いままでですと、スマートフォンやパソコンでの情報閲覧が中心でしたが、最近は、IoTで代表されるセンサーによるデータ蓄積やデータ分析のようにハードウェアとソフトウェアの合わせ技で、より深く現実世界のことを情報と見る手段が増えてきました。

ドローンもまた同じです。Telloというネットワークから制御できるハードウェアと、ネットワークとデバイスの制御を得意とする現実の世界にソフトとハードで関わることができるビジュアルプログラミングツール Node-REDを合わせることで、現実世界に関わる一つの手段ということが見えてきます。

しかもこうやって実際に動かすことで、自動操縦など仕組みがわかることで発想が広げられたり、動かして利用時の注意点が見えてきたりと、このような手段を手軽な形で体験できます、みなさんにもこの連載を通じて面白さが伝わったら嬉しいです!

それでは、ここまで連載をお付き合いいただき、ありがとうございました!


この記事を書いた人
SeigoTanaka
2004年よりフリーランス。以後、FLASH制作を中心にインタラクティブコンテンツを主に行い現在に至る。最近ではWEBフロントエンドをベースにしながらも、情報とインターフェースが合わさるアプローチという視点でIoTやMixed Realityといった技術も取り入れながら活動しています。ウォンバットが好き。 2018-2019 Microsoft MVP ( Windows Development ) 2018-2019 IBM Champion。

週1日~/リモートの案件に興味はありませんか?

週1日~/リモートの関わり方で、「開発案件」や「企業のIT化や設計のアドバザリーなどの技術顧問案件」を受けてみませんか?副業をしたい、独立して個人で仕事を受けたエンジニア・デザイナー・PM・技術顧問の皆様のお仕事探し支援サービスがあります。

お仕事をお探しの方へ

お仕事をお探しの方(無料登録)
法人の方(IT課題の相談)