この前作ったダイレクトドライブなラジコンにカメラを搭載してFPVで操作してみたいと思って、LuckFox上でμStreamerを動かしたやつを載せてみたんだけど、このモータが結構早いのでもっと低遅延にしたい。
ということでもっと低遅延にできる方法が無いかどうか試してみることに。LuckFoxはビルドしてFlashに書き込んでっていうのが何回も往復するのが面倒なので、まずはRaspberry Pi Zero上で試してみることに。
久しぶりにRaspberry Pi Zeroを出してきたのでまずはOSをクリーンインストール。Raspberry Pi Imagerからセットアップして、WiFi設定までできるのは便利になったなぁ。Debian Trixieになった。
カメラ回りも少し仕様が変わっているみたい。raspi-configからの設定はいらなくて自動で認識するとか。
とりあえずセットアップが終わったRaspberry Pi Zeroに昔購入したRaspberry Pi Camera V1の互換品を取り付けて起動してみる。この前uStreamerで不安定だったリベンジ。
起動したら
rpicam-hello --list-cameras
と実行してみる。前のバージョンではlibcameraだった部分がrpicamに変更になっている感じかな?
Available cameras ----------------- 0 : ov5647 [2592x1944 10-bit GBRG] (/base/soc/i2c0mux/i2c@1/ov5647@36) Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop] 1296x972 [46.34 fps - (0, 0)/2592x1944 crop] 1920x1080 [32.81 fps - (348, 434)/1928x1080 crop] 2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]
こんな感じで差し込んだだけで認識してるみたい。互換品でもとりあえず問題なく自動で認識できた。確かに電源を入れたときに一瞬カメラのLEDが点灯したのでその時に確認してるのかな?
rpicam-jpeg -n --output test.jpg
次に静止画を撮影するコマンドで写真を撮影して、WinSCPでPCに転送して確認してみた。(SSHで作業しているため)
写真もバッチリ取れてるのでまずはカメラの動作確認はOK。
カメラの動作確認ができたのでMediaMTXをダウンロードして実行可能にする。MediaMTXはWebRTCを使ってカメラの映像をブラウザからストリーミングできる。
wget -P ./mediamtx https://github.com/bluenviron/mediamtx/releases/download/v1.15.1/mediamtx_v1.15.1_linux_armv6.tar.gz cd mediamtx tar xzf mediamtx_v1.15.1_linux_armv6.tar.gz chmod +x mediamtx
ラズパイZeroWにはH264のハードウェアエンコーダが内蔵されてるのでせっかくなので使ってみようということでH264でWebRTCでストリーミングのテストをしてみる。同じフォルダのmediamtx.ymlを開いて一番下の方のpaths:っていうサンプルがあるところをまるっと下記のように置き換える。
paths: cam0: source: rpiCamera sourceProtocol: automatic rpiCameraWidth: 1296 rpiCameraHeight: 972 rpiCameraFPS: 30 rpiCameraBitrate: 2000000 rpiCameraCodec: hardwareH264
保存したらあとは./mediamtxでMediaMTXを起動するだけ。
ブラウザからhttp://raspberrypi.local:8889/cam0/にアクセスしてみるとカメラの映像が見れるようになってるはず。MediaMTX簡単で良いな…
早速遅延を図ってみた。前に使ったように画面にストップウォッチを表示して、その隣にストリーミングの映像を表示させてスクショを撮るという方法。
遅延は440msぐらい?ラズパイZero WはWiFiでルータに接続してる状態で測定。ハードウェアエンコーダとはいえH264に変換してるからかなぁ?カメラの方が赤みがかっているのはレンズ改造のところに隙間ができていたからかな。隙間埋め無いと…
UVC対応のWebカメラでuStreamerを同じラズパイZero Wで試してみた。
とりあえず前と同じ感じで最新版をビルドした。
ustreamer -m MJPEG -f 30 -s 0.0.0.0 -p 8080 -r 1280x720
解像度はLogicool C270の解像度に合わせて近いところに合わせてみた。
そんでもって遅延を測定すると140msぐらい。ラズパイ上だと結構低遅延じゃん…
しかしこの解像度でもMJPEGだと帯域は8.5Mbpsぐらいあったので、H264の2Mbpsだと電波状況が悪いときは有利かも。
H264ハードウェアエンコード対応のWebカメラも試してみたいな。UVCのH264も実装が色々あるみたいでLinuxで使う場合はUVC1.5対応じゃないとちょっと大変そう。DJI Osmo Action 4とかもUSBカメラモードでH264に対応してるっぽいけど、UVC1.0なのでV4L2からそのまま取り出せなさそう。