TouchDesignerによるドローン操作方法

TouchDesignerを用いると、映像と合わせてドローンを飛ばしたり、ドローンのアクションに応じて映像を変化させることなどが可能です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">映像と共にtelloを飛ばしてみる、その3。暗いとtelloは制御困難になるけど、部屋の明るさ調整とプロジェクタ3700lmにしてなんとか制御可能なレベルで、映像も見えるかな。<a href="https://twitter.com/hashtag/touchdesigner?src=hash&amp;ref_src=twsrc%5Etfw">#touchdesigner</a> <a href="https://twitter.com/hashtag/tello?src=hash&amp;ref_src=twsrc%5Etfw">#tello</a> <a href="https://t.co/xmQ7TeqB26">pic.twitter.com/xmQ7TeqB26</a></p>&mdash; Tomoya@∀RroWs (@snufkinliberty) <a href="https://twitter.com/snufkinliberty/status/1106804632418803717?ref_src=twsrc%5Etfw">2019年3月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
今回、ドローンの[Tello](https://www.ryzerobotics.com/jp/tello)を用いて次のような映像と合わせたFlip動作などを行ってみました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ドローンのTelloの操作をTouchDesignerで行い、Flipの動作に合わせてワープっぽい映像に変化するようにしてみる。音に注意。<a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://t.co/1JrPgHXLmj">pic.twitter.com/1JrPgHXLmj</a></p>&mdash; Tomoya@∀RroWs (@snufkinliberty) <a href="https://twitter.com/snufkinliberty/status/1107985013704806401?ref_src=twsrc%5Etfw">2019年3月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Telloを用いると、比較的簡単にこのようなことができるので、今回はTouchDesignerを用いてTelloを制御する方法をまとめたいと思います。

#はじめに
ドローンの中でもTelloを選んだのは、様々な言語でプログラミングが可能であり、低価格なものの中で性能が高く、wi-fi接続で操作ができ(アマチュア無線の免許が不要)、TouchDesignerのudpoutDatで制御ができそうだったので、試しました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なかなかトイドローン小さい。次のライヴ演出の新たな試みとしてドローンとDMX制御で照明をやろうと検証開始。 <a href="https://t.co/QWUuAYQm7j">pic.twitter.com/QWUuAYQm7j</a></p>&mdash; Tomoya@∀RroWs (@snufkinliberty) <a href="https://twitter.com/snufkinliberty/status/1104575136072491008?ref_src=twsrc%5Etfw">2019年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
早速、TouchDesignerでTelloを操作する方法に入りましょう。

#1.udpoutDatの設定
udpoutDatを作成し、パラメータを画像のように設定します。画像では、udpoutDatの初期値から変更している項目のみ表示しています。
Row/Callback FormatはOne Per ByteかOne Per Messageならうまくいきました。
Network AddressやPortはTelloのSDKなどに記載されている固定値になります。
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/311653/f1b1ad3a-ee0c-29b6-194c-688ce7855293.jpeg)
（後の**4 Telloの制御**のコマンドを実行するとこのmessageの下にOKなどTelloからの応答が返ってきます。）
これでudpoutDatの設定は終わります。次に、制御コマンドの送信方法に入ります。

#2 制御コマンドの送信方法
Telloの制御コマンドは、元々決まっていて[SDKのpdfファイル](https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf)に記載されています。
このpdf資料の4. Tello Commandsに従いコマンドを送ると実際に動きます。

コマンドの送り方ですが、これはHelpのOperator Snippetsを開き、
![4.png](https://qiita-image-store.s3.amazonaws.com/0/311653/0429e99b-a46f-c647-52e9-42eeff90b9a3.png)
oscinDatの項目を見るとudpoutDatのサンプルがあるので、これを流用すると良いです。
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/311653/397a3b8a-6f28-0139-6d68-29a9109945ee.jpeg)
実際にこれをコピペして以下のように改変しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/311653/b26d57b0-11f7-44e3-e88e-3635f4d710d3.png)
panelexecuteDatの中で、a = ''のところにコマンドを入力します。

まずはcommandを作成し、さらにtakeoff、landなど同様に、このbuttonCompとpanelexecuteDatをコピーして作成し、UIを作っていきます。

#3 UIの構築
僕自身が作ったプロトタイプのperformモードの画面はこんな感じです。直観的に操作できるように、コマンド実行ボタンは配置しています。
webカメラでモニターして画面を見ながら制御できるようにしています。

UIの作り方は基礎的で本(「Visual Thinking with TouchDesigner - プロが選ぶリアルタイムレンダリング&プロトタイピングの極意」)にも書いてあるので、参照して作成してみてください。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/311653/2d4af37a-b3ad-9220-01c0-eedd6730955d.png)

#4 Telloの制御
Telloのコマンドボタン一式を作ったら、Telloにwi-fi接続し、まずはcommandを実行します。
これでコマンド入力を受け付けてくれるようになります。
次にtakeoffで離陸します。
あとはleft 20, right 20などで移動したり、flip lなどでアクションしてくれます。
最後にlandで着陸します。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">TelloをTouchDesignerから操作してみる。一応操作通りには動きますね。<a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://twitter.com/hashtag/tellodrone?src=hash&amp;ref_src=twsrc%5Etfw">#tellodrone</a> <a href="https://t.co/pIO1pUDDp5">pic.twitter.com/pIO1pUDDp5</a></p>&mdash; Tomoya@∀RroWs (@snufkinliberty) <a href="https://twitter.com/snufkinliberty/status/1106548538513592321?ref_src=twsrc%5Etfw">2019年3月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#終わりに
2つ目の動画で、映像と動きを同期する部分は、ボタンを押した際にtriggerChopをかけて、switchTopで別映像をoverTopで重ねる処理をしています。

ここまで情報があれば、TouchDesignerを使っている方なら、同様のことができるかと思います。

面白いのでぜひ、試していただければと思います。

なお、Telloは暗いと制御が不安定になります。そのため、ある程度の明るさが必要になるのでご注意ください。
プロジェクターの映像に合わせるには部屋を暗くしますが、プロジェクターは明るいものを使用し(今回は3700lmのものを使用しています)、部屋の明るさは制御可能な下限以上にすれば、上記の動画レベルで飛ばせます。

**＜制作環境＞**
　TouchDesigner099 COMMERCIAL 64-Bit Build 2019.12330
　CPU Corei9 9900K
　GPU Geforce RTX 2080Ti
　Windows10

**＜∀RroWs＞**
　[HomePage](https://www.arrowsofficial.com/)