調布祭プラレールのラズパイのお話

調布祭プラレールのラズパイのお話

この記事はUEC koken Advent Calendar 2020の23日目の記事となります。
調布祭プラレール企画の関連記事は以下の通りです。

概要

初めまして、ごっちです。最近工研に入ったのでslackのチャンネルにかたっぱしから入っていたらプラレール企画のチャンネルに入ってしまい、気がついたらタスクが割り当てられてデスマ真っ只中にいました。(こうは書きましたがプラレール企画楽しかったです、ありがとうございます。)
さて、調布祭お疲れ様でした! 鉄研と合同で工研では11/21~11/23の調布祭3日間プラレールの遠隔操作と自動制御という企画をやっていました。今回の記事ではプラレール記事のうちラズパイ関連について書きたいと思います。
これは準備日と1日目のデスマが終わりclusterで遊んでたときの様子

プラレールの全体像について

プラレールの遠隔操作企画ではポイントなどを遠隔操作することができます。1編成だけは速度の制御が可能(逆走も)で車載カメラによる映像配信も行なっていました。
私が担当したのはポイント遠隔操作用のラズパイと車載カメラのラズパイです。

遠隔操作のラズパイの話

遠隔操作部分はラズパイがWebAPIとのソケット通信を確立し、降ってくる命令に沿ってポイントを制御します。中心である調布駅にラズパイを設置しているので調布駅のサーボモーターはラズパイのGPIOから制御、ちょっと離れた駅(具体的には北野と笹塚)にはサーボモーターを繋いだESP32を設置しています。そのESP32のAPI(http)をラズパイから叩いています。また速度制御可能なスカイライナーにもESPが積まれており、それに対しても速度変更の命令を送信しています。
こんな感じの形式でw.deviceNum(ESP側のピン番号と対応)とb(onまたはoff)を設定する感じです。
go
req,err := http.NewRequest(http.MethodGet,"http://"+w.address+"/"+b+w.deviceNum,nil)
pofさんのWebAPIが早々に完成していたのでコーディングはかなり簡単に進みました。ありがとうございます。(デバッグに1,2日溶かしましたが...) Go言語を使っていますがGPIOはPythonの方が扱いやすいのでPythonも併用しています。

配信用ラズパイの話

プラレールの遠隔操作で最も問題となるのはカメラ映像の遅延です。今回、駅ごとに様々なアングルから撮影できるようにカメラを多数設置し配信していました。(詳しくはすてあさんの記事を参照してください。)これをYoutube liveなどを介して配信しようとすると、遅延最小の設定でも3秒ほどの遅延が発生するようです。そこでWebRTCを用いてYoutubeなどの中継なしでユーザーに映像を直接配信しています。
定点カメラはWebRTC(SkyWayというサービスを使っています。)で配信していたのですが、車載カメラにはSkyWayが使えません。RaspberryPi zeroでは複数台にWebRTCで配信する負荷に耐えられないですし、そもそもCPUがARMv6であるためSkyWay Gatewayは起動すらできません。(RaspberryPi zero以外はARMv8なので動きます。負荷は知りません。)
今回、ラズパイに最適化されたWebRTCツールであるMomo(https://github.com/shiguredo/momo)を用いました。これはRaspberryPi zeroでも720p20fpsで配信可能な優れものです。なんとJetson nanoを使えば4k30fpsで配信できるそうです。内部では血の滲むような最適化がされているはずです...。さらにRaspberryPi zeroでは複数台へ配信する負荷に耐えられないので一度配信用パソコンだけに送信して、そのデスクトップキャプチャをSkyWayで配信するごり押しで解決しています。もっとスマートにやりたかった...(遺言)。
RaspberryPi zeroは最初は電池がもたないから駄目だろうと考えていたのですが、2日目にモバブを買って載せてみたところ意外と動きびっくりしていました。1本の18650でおそらく1日の展示には余裕で耐えられる気がします。なお配信のために購入したモバブは体積と重量を減らすため一瞬でバラバラにされていました。(昇圧回路と18650がセットで売られておりオトク!)
なお車載カメラの配信は1日目はなし(遠隔操作系でデスマしていたので)、2日目はmomo+Youtube live、3日目はffmpeg+Youtube liveからmomo+SkyWayと次第に最適化?されています。なおそのあとラズパイが落ちて壊れました

反省点や改善