SHOTOKU VRクレーンをTouchDesignerから使う

この記事はTouchDesigner Advent Calendar 2020の5日目の記事です。

前日（4日目）の記事は@YuskeGotoさんの「[TouchDesignerとGrblでやる貧乏人のためのステッピングピングモーター制御入門](https://qiita.com/YuskeGoto/items/c4de1f868d0d6cce6e03)」です。

翌日（6日目）の記事は@satoruhigaさんの「[感覚的に作るには](https://qiita.com/satoruhiga/items/77a183b6496334477080)」です。



#やりたいこと

お仕事でスポーツ中継のCGをしているのですが、その中でAR的なかっこいいCG（FOP上に浮かぶ選手紹介やスコア表示など）を表現したいのです。
そのためには、実世界のカメラ座標と、CGをレンダリングするためのカメラ（Camera COMP）座標が一致していないといけないのです。
ということで、カメラの情報（位置と角度、レンズ情報）をなんとかして取得しましょうという話です。

#トラッキング方法の検討

- 画像解析系（[ZED Stereo Camera](https://www.stereolabs.com/zed/ "ZED Stereo Camera")、[Kudan](https://www.xlsoft.com/jp/products/kudan/index.html "")など）
 - カメラに写っている画像を解析し、自分の座標を取得する（マーカー式、マーカーレス）
- レーダー式（Lidarなど）
 - カメラに写っている画像を解析し、自分の座標を取得する
- 光学式（[RedSpy](https://www.nacinc.jp/creative/virtual-products/redspy/ "RedSpy")、[StarTracker](https://www.for-a.co.jp/import/startracker/ "StarTracker")など）
 - カメラの近くに自分の座標を把握するためのセンサーやカメラを設置して、自分の座標を取得する
- 機械式（[SHOTOKU](https://www.shotoku.tv/jp/product/product_show?id=38 "SHOTOKU")、[Egripment](https://egripment.com/products/virtual-and-augmented-camera-systems/ "Egripment")）
 - 雲台などにロータリーエンコーダが内蔵されており、そこから取得できるパラメータから自分の座標を取得する

最初は画像解析系を検討していましたが、スポーツ中継というのは屋外だったり、演出のために暗転したりする（自分たちのコントロール配下にない）ので、明るさが一定ではなく、安定して動作することが期待できないのではないかということで却下。測定できる距離やフレームレートなどにも制限があります。
光学式は画像解析系と同じく、暗転した場合のことを考慮すると安定性に不安があります。
レーダー（Lidar）は自分に知見がなさすぎてどう検討してよいかわからず断念。

##機械式に決定

ということで消去法で機械式ということになりましたが、当然ながら高くて買えない。
悶々としていたところ、今年の3月にヤフオクでSHOTOKUのVRクレーンが出品されているという怪情報がどこからともなく流れてきて、次の日に[TK-59 VR](https://www.shotoku.tv/jp/product/product_show?id=38 "TK-59 VR")をゲットしました。
こんな奇跡があってよいのでしょうか。

![127468817_682078732735778_4657691756390692138_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198364/95ba8f57-f7a2-7883-158c-30d441b9b749.jpeg)

#TouchDesignerとの連携

ここからやっとTouchDesignerです。

本体からRS422でデータが取得できる（本体にSyncを入れると59.94fpsでデータが出力される）ので、Serial DATで受けてPythonでって一瞬考えましたが、どう考えても遅くて無理なのでCPlusPlus CHOPで書くことにしました。
それまでTouchDesignerのプラグインは書いたことがありませんでしたが、Derivativeのサンプルと諸先輩方（主にHigaさん）のコードを参考に書いたものがこちらです。
[touchdesigner-shotoku-vr-chop on GitHub](https://github.com/camikura/touchdesigner-shotoku-vr-chop "touchdesigner-shotoku-vr-chop")

ピンアサインやプロトコルについては、レントアクト昭特さんのサイトにある[取扱説明書](http://www.rentact.co.jp/pdf/torisetsu_TK-59VR.pdf "取扱説明書")に詳しく書いてあります。
基本的にはシリアルで受けた情報を29バイトずつに切って整形したものをCHOPのデータとして出力するだけです。

##レンズデータの取得

ズーム情報に関しては、レンズに装着したレンズエンコーダで回転角を取得します。
![127851212_369483054155646_1099960071309955482_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198364/486f7952-1b10-25fa-d9c6-1f38f86523bb.jpeg)
このCHOPを使えば、0-1で回転角を取得できるので、予め計測しておいたレンズ情報とLookup CHOPでカメラのFOV Angleを決定します。
![名称未設定-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198364/59699117-8b17-d49f-44e7-de7f42d3d7da.png)

##レンズの歪みについて
こちらは2020.42700から導入された[Experimental:Lens Distort TOP](https://docs.derivative.ca/Experimental:Lens_Distort_TOP)を使ってなんとかしようと実装中です。進捗があり次第、記事に出来たらと思います。

##出力
そうして出来上がった映像がこちらです。
[Tracking Test via D1 Protocol with TouchDesigner - YouTube](https://youtu.be/-NtjZBfWMLU "Tracking Test via D1 Protocol with TouchDesigner")

#今後
来年の2月に行われるボルダリングジャパンカップ2021でデビュー予定です。
コロナ騒動で延期とかにならないで欲しい。

#おまけ

当然ながら、稼働が非常に少ない（むしろまだ稼働していない）ので、だれか使いたい方、実験したい方がいましたらご相談ください。