TinyViewPlusの受信機回りをスッキリさせたい。

# 0. はじめに

TinyViewPlusやその派生品（TVPAS）では、同時飛行する機体の数だけUSB接続の受信機（当時もっとも入手性に優れていたEachineのROTGシリーズなど）を用意する必要があります。

この制約により、特にWindowsのノートPCやミニPCでは、  
- USBポートが不足する  
- PC周りがUSBケーブルだらけになり、すっきりしない

といった問題が発生しがちです。

一方、海外のFPVレース事情を調べてみると、レースバンドで6機同時飛行する際、**複数のVRX映像を1画面にまとめて表示し、それを1つのWEBカメラとしてPCに取り込み、PC上で各機体の映像に分割**していることが分かりました。  
（ただし、この映像を利用してラップタイムを計測しているわけではありません。）

今回のテーマは、この方法を**TinyViewPlus（および派生品のTVPAS）で実現する**という話です。

---

# 1. テスト用映像データ

HDMIを4つまとめて1画面に表示する機器として、Amazonでは[このような製品](https://www.amazon.co.jp/s?k=hdmi+%E7%94%BB%E9%9D%A2%E5%88%86%E5%89%B2)が販売されています。  
信頼性と性能は未知数（というか安すぎてダメな予感）ですが、私はAliExpressで約3,000円のものを購入しました。（まだ届いていません。）  

**想定スペック**
- __1080P 60FPSで出力出来る__
- __最低でも720P 60FPSは欲しい__  
このスペックは、HDMI4入力を1画面に合成して1本のHDMIで出力する機器と、厚生されたHDMIの信号をUVC(USB)に変換する機器の２つが満たしている必要があります。

本当は、[BlackmagicのATEM Mini Pro](https://www.blackmagicdesign.com/jp/products/atemmini/techspecs/W-APS-14)が欲しいところですね。  
USB（UVC）出力付きで、なんと48,980円!  
これにHDZero Event VRXを組み合わせれば……夢が広がります。

とはいえ、現実に戻り、今のところ4画面表示の機器(約3,000円)が手元に届いていないため、動画編集でそれっぽい素材を作成します。  
これらの素材をHDMI→USB変換アダプタでTinyViewPlusに入力すれば、テストが可能でしょう。

__テスト用動画の種類__
3パターンの映像を用意し、それぞれに対応できるかを検証します。  
各タイプには、私の独断で名前を付けました。

1. **DJIタイプ**  
   - 元々16:9のアスペクト比が4分割されている。
   - 各映像を元に戻せば、クロップ（トリミング）やアスペクト比の調整は不要。
![DJIタイプ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072330/c0127ab7-d751-481d-9d3a-f8ba74577edf.jpeg)


2. **Hawkeyeタイプ**  
   - [Hawkeye Little Pilot Four Eyes](https://ja.aliexpress.com/i/1005002715692548.html)のような製品を想定。
   - 4分割後、16:9のアスペクト比を4:3に変換する必要あり。
![HAWKEYEタイプ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072330/65840ad1-0c80-47f4-b02a-332a99d6c7c0.jpeg)


3. **HDZeroタイプ**  
   - 4分割後、左右の黒い部分をクロップする必要あり。
![HDZERO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072330/538c2969-aa2f-4b13-81d4-f0e5d578c182.jpeg)
---

# 2. 検証動画

これら3つの形式について、TinyViewPlus（および改造版TVPAS）がどのように対応するかを検証しました。

### TinyViewPlusの検証動画  
<iframe width="560" height="315" src="https://www.youtube.com/embed/sNuw7ecJjds?si=AxUXo6vU4ftEEWbT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### FPVTrackside + Rotorhazard + TVPASの検証動画  
<iframe width="560" height="315" src="https://www.youtube.com/embed/SVM34-hoJso?si=1bkaesUdPm_NPB5j" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

FPVTracksideの方が見た目が華やかですね。  
私自身、TVPASと連携してラップ計測に集中しているため、まだFPVTracksideを十分に活用できていませんが、レース運営に便利な機能がたくさんあるようです。  
いつか詳しく紹介できればと思います。

---

# 3. 使用方法

TinyViewPlus（改造版）は、[こちら](https://github.com/zubon2003/tinyviewplus/releases/tag/v0.9.33.beta6)からダウンロードできます。 
[FPVTracksideやRotorhazardと組み合わせて使うTVPASはこちら](https://qiita.com/zubon2003/items/47b7974db5154c11bf07)からダウンロードできます、(バージョン0,0,2)

バイナリは**Windows版のみ**ですが、Macユーザー向けに、リポジトリの`src`フォルダ内にソースコードが含まれています。  
本家をビルドできる方なら、以下の3つのファイルを上書きしてビルドできるかもしれません。（他に必要な設定ファイル等は、Windows版のリリースからコピーしてください。) 
- `main.cpp`  
- `ofApp.cpp`  
- `ofApp.h`  

### 設定ファイルの編集(1)(fpv.xml)

ダウンロード後、`/data/camera/fpv.xml`をテキストエディタ（メモ帳など）で開きます。

```xml:fpv.xml
<camera>
    <name>C8 USB3.0 Video</name>
    <camnum>4</camnum>
    <description>4:3</description>
    <grab>
        <width>1280</width>
        <height>720</height>
    </grab>
    <crop>
        <x>160</x>
        <y>0</y>
        <width>960</width>
        <height>720</height>
    </crop>
    <draw>
        <aspectRatio>4:3</aspectRatio>
    </draw>
</camera>
```
__name__ は、HDMI->USBにする機器の登録名をデバイスマネージャで確認して入力します。
__camnum__ には、1から4の数字を入力します。

 - __camnumが1の場合__　TinyViewPlusはHDMIの映像を分割しません。以前のTinyViewPlusと同じようにデバイスからの映像を１の受信機分として扱います。
 - __camnumが2から4の場合__　TinyViewPlusは、このデナイス以外を無視します。HDMIの映像は、camnumで指定された数字で分割されます。（3機同時飛行なら3分割。)

その他の指定パラメータについては、DJIタイプ、Hawkeyeタイプ、HDZeroタイプについてそれぞれ1080P,720Pの解像度の設定ファイルをsampleの中に入れてあります。fpv.xmlを上書きし、適宜修正して利用ください。

:::note info
まず、1080Pを試して、TinyViewPlusでSCREEN FPS:が60出るならそれで決まり。そこまでいかなければ720Pを試すのがいいでしょう。我が家のPCとHDMI-USB変換アダプタの組み合わせでは、残念ながら720Pで60FPSが最高でした。
![fps.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072330/252d8afa-0515-4e8b-976b-68990d14d0aa.jpeg)
:::

```xml:system.xml
<system>
    <sysStat>1</sysStat>
    <speechJpn>1</speechJpn>
    <allFrameDetect>0</allFrameDetect>
    <minimumGateCount>2</minimumGateCount>
    <smallSizeGateCheck>1</smallSizeGateCheck>
</system>
<view>
    <fullscreen>0</fullscreen>
    <camTrim>0</camTrim>
    <camFrame>0</camFrame>
    <bgImage>system/background.png</bgImage>
    <lapHistMode>1</lapHistMode>
</view>
<oscMonitor>
    <enabled>1</enabled>
    <host>127.0.0.1</host>
    <port>4001</port>
</oscMonitor>
<race>
    <arMode>1</arMode>
    <duraSecs>0</duraSecs>
    <duraLaps>10</duraLaps>
    <lapAfterTmo>0</lapAfterTmo>
    <minLapTime>1</minLapTime>
    <staggStart>0</staggStart>
</race>
```
### 設定ファイルの編集(2)(system.xml)
__allFrameDetect__ は通常0です。この場合、SCREEN FPS:の半分の頻度でマーカー検知を行います。
どうしてもSCREEN FPS:30になってしまう場合は、allFrameDetectを1にしてください。その場合、SCREEN FPS:と同じ頻度でマーカー検知を行います。

SCREEN FPS 60: allFrameDetect 0 だと検出頻度は1秒間30回
SCREEN FPS 30: allFrameDetect 0 だと検出頻度は1秒間15回
SCREEN FPS 30: allFrameDetect 1 だと検出頻度は1秒間30回

:::note info
PCが高スペック場合、SCREEN FPS 60でallFrameDetect1に設定すると、マーカー検出頻度を１秒間60回に設定することが出来るはずです。スペックが足りない場合、SCREEN FPS自体が下がります。
:::

### 設定ファイルの編集(3)(system.xml)TinyViewPlusのみ
TinyViewPlusの方のみのオマケです。
__minimumGateCount__ は通常２に設定します。(2に設定すると従来のTinyViewPlusと同じ設定になります。)
minimumGateCountが2だと、最低限２個のマーカーを認識した後でないと、ラップ通過として判定されません。1にすれば、1個のマーカー認識でゲート通過とみなします。1の方が、ラップの取りこぼしが少なくなりますが、マーカー以外のものをマーカーとして認識してしまうリスクもあります。

__smallSizeGateCheck__ はデフォルトでは1に設定してあります。(既存TinyViewPlusと同じ設定)この場合、1だと、どんなに小さなマーカーでも検出できれば認識しますが、以下のようなリスクもあるので是非0にするのをおすすめします。

- __OSDの文字をマーカーとして認識してしまうことがある__　時にsmallSizeGateCheckが1の場合は即ラップの誤検出につながるので危険です。以下の写真はF:1:25の1がマーカーとして検出された所です。
![誤検知.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072330/fe7fa778-431b-4fbd-a798-5377831c95a0.jpeg)

- __大規模レースによく見かけられる大き目なゲートでは、ゲートのかなり前からマーカーが検出されがちで、ゲートのかなり前にラップが計測される場合がある__
大抵の場合、その後にマーカーが検出されますが、後で計測されたラップは捨てられます。

:::note info
TVPASでは、設定項目ではなく、常時0の設定（小さなマーカーは検出しない。)の設定になっています。
:::

以上簡単に説明してみました。試してみていただければ幸いです。