ロボコン!!映像高速伝送!

ロボコン!!映像高速伝送!

KINKI KINIGHTSでレスコンをしているらーめんおじさんです。
早いもので、ゴールデンウィークも半分が経過してしまいました。
この記事は、KINKI KINIGHTSのGWアドベントカレンダー5日目になります。

今回はレスコンで必須となる映像伝送について、書いていこうと思います。

レスコンにおける映像伝送

レスコンのデファクトスタンダード TPIPボード

冒頭でも触れましたが、レスコンでは映像伝送が必須となります。
学生ロボコンのような目視で確認しながらロボットを操縦する競技と異なり、レスコンではオペレーターはフィールドの様子を目視で確認することができません。
そこで、ロボットに搭載したカメラの映像を操縦スペースから確認する必要があるわけです。

通常、レスコンではサンリツオートメイション社製のTPIPボードが貸与されます。
このボードは、無線通信を通じてCANやI2C、PWM出力等のロボットに必要な入出力を制御できる遠隔計測制御モジュールです。

TPIPの大きな機能の一つに映像の圧縮・送信の機能があります。
これは、TPIPボードに接続したカメラの映像を専用回路でJPEG圧縮し、WiFiなどで他のコンピュータに低遅延で送信してくれるものです。 最大4ポートのカメラ入力を切り替え可能で、FullHD画質での映像伝送が可能となっています。
このような利便性からレスコンでは,、TPIPボードを用いた映像伝送が最もよく使用されています。

今年のKINKI KNIGHTSの映像戦略

今年のレスコンで、KINKI KNIGHTSはロボットの操縦性を向上させる挑戦を予定しています。

  • VRを用いて、ダミヤンや周囲との距離感を直観的にしたい!
  • 画像認識で半自動化させて操縦者の負担を減らしたい!

そんなわけで、現在のところレスコン機体から伝送される(予定の)映像は次の通りです。

  • アーム先端に付けるカメラの映像
  • RealSenseの左右のIRカメラ映像
  • いい感じに圧縮したRGBD映像

はい……合計4本の映像が流れます……
さらに上二つは操縦性に直結することから、可能な限りの低遅延化が求められます。
これらの情報を帯域を節約しつつ送信するために、ロボット側である程度の前処理をかませてやる必要があります。

残念ながらTPIPは専用のポートに直接入力される映像しか圧縮できないので、RealSenseの映像であったりソフトで前処理をかけたりといったことをしようとすると少し要件を満たしません。
自前で映像伝送の手段を用意する必要があるわけですね。

環境

ロボット側の処理:RaspberryPi 4
ロボット側ドングル:WI-U2-433DHP(理論値433Mbps)

伝送方式プロトコルの選定

低遅延の映像伝送は枯れた技術があるので、それをおとなしく利用することにします。 よく耳にするのはこの辺でしょうか?

  • RTMP
  • RTSP
  • HLS
  • WebRTC

この辺りの比較はすでにしてくれている人が多数いますので詳しくはそちらを読んでもらうとして、結論としてほぼWebRTCしか選択肢がありません。

ローカルなWiFI環境でのWebRTCだと(実装にもよりますが)、FullHDの映像で遅延を感じない程度で実現できます。

映像配信側の技術選定

さて、プロトコルは決まりましたが実装をどうするかです。 WebRTCの実装でよく知られているのはこの辺です。

個人的にはPionが結構好きなのですが、RealSenseのGo言語ライブラリがないため断念しました。 aiortcはもっさりしていたので、libWebRTCを選定しました。

しかし、libWebRTCでの開発は魔境でした。 半月ほど取り組んでみたのですが、ブラウザなどの実装にも利用されているだけあって高機能で、自分の技術力では無理だと判断しました。

そこで時雨堂さんが開発されているWebRTCクライアントOSSのMomoを利用させてもらうことにしました。

現在の実装

現在の実装は下記の通り、各カメラからの映像を前処理したうえで1本の4K出力にコンポジットし、v4l2loopbackを用いてMomoに入力しています。 image.png (23.9 kB)

Momoはハードウェアエンコーダの利用で4K60FPSまで出ますので、この映像を操作用のPCに4Kのまま転送し、リアルタイム性が最も求められるオペレータ用画面のブラウザで受信・必要箇所のみ表示しています。

その後ブラウザ側で映像を切り分け、録画や画像処理を行っているリアルタイム性の要求が低いプログラム用に再度配信します。
圧倒的にオペレータ用のPCがハイスペックなことに頼り切ったシステム設計ですが、SFUを間に挟んで負荷を軽減するよりも操縦者へのリアルタイム性を優先しています。

今後の展望

現状Pythonで前処理を回しているのをC++に置き換えることで高速化を図っています。
また、出来ればv4l2loopbackを通さずにWebRTCに映像を乗っけたいので、Momoの実装を頑張って読み込もうと思います。

初めての試みで心配なことだらけですが、会場で皆さんにお見せできることを楽しみにしています!!

最後に

今回は映像伝送の処理の概要だけに留めましたが、手が空いたら技術的な実装の部分も記事にしたいですね。
あわよくば、WebRTCがっつり触れる人に入ってきてほしいな…
明日のGWアドカレは、ぱぁさんの「ボルトで作るリンク機構」です!
おたのしみに!


All News →