Skip to main content

Raspberry Pi 4でVR監視カメラを作ってみたい!

ジュエ株式会社の映像ネットワークエンジニア部です。Raspberry Pi 4で低遅延&高品質な超広角220°全天候型リモート監視カメラを作ります。工夫次第でVR監視カメラにも利用できます。

Raspberry Pi 4でVR監視カメラを作ってみたい!


Raspberry Pi 4でVR監視カメラを作ってみたい!と考える人は多いでしょう。220°の視野角があれば、映像をエクイレクタングラー形式(VR視聴用のフォーマット)に変換することでVR映像として視聴できます。

Raspberry Pi 4などのエッジコンピューターやIotデバイスは、処理能力が低いため映像をリアルタイムで処理することは困難です。できてもフレームレートなどに課題が残るでしょう。

カメラ側(Raspberry Pi 4側)は映像を送信する機能に専念して、処理能力の高いPCを映像受信側に用意して、超広角220°の映像をエクイレクタングラー形式に変換するのが良いと思われます。

処理能力が低いRaspberry Pi 4を使用するメリットは、小型、低価格、低消費電力です。簡単に使えて、さまざまな場所に設置できます。利用者も多く情報も豊富です。対応製品も多いため実験や検証、初期のプロダクトとしては最適なシングルボードです。

以上からRaspberry Pi 4を使って超広角220°全天候型リモート監視カメラの映像送信部分を作るというのが今回のコンセプトです。

カメラケースは、Raspberry Pi カメラV2用全天候型ケース (201-1438) を使います。屋外での使用を考慮して、耐光性、耐候性に優れたASA樹脂を採用しているとのことです。お値段5,280円(税込)とお買い得です。

カメラはRaspberry Pi VR220カメラ (184-3079) を使います。Raspberry Pi Camera V2 (913-2664) を改造して220°レンズに変更したものです。価格は9,845円(税込)です。

Raspberry Pi 4本体を入れるケースには、全天候型防塵防滴対応のEntaniya キューブケース 01を使います。価格は26,928円(税込)です。少し高めですが、アルミブロックから削り出した継ぎ目の無いフレームとしてみれば安いです。

低遅延&高品質な映像伝送としてSRT(Secure Reliable Transport)を使います。SRTとはHaivision社が開発した映像プロトコルで、説明を省略しますが低遅延&高品質なプロトコルとして人気です。映像の現場で使用される他にRTMPやRTSPの代わりとして採用が増えるでしょう。

Raspberry Piで低遅延といえば、WebRTCの利用を思いつきます。WebRTCはビデオ通話などには適していますが、映像を主とする伝送には画質やフレームレートに不安が残ります。いくつかの検証記事を見ても映像に関してはSRTが良いようです。

もちろんインターネット環境、配信サーバー、コンテナ、圧縮、再生環境 etcを調整した高画質なWebRTCもあると思いますが、監視カメラ的な利用にはSRTを考えてもよいでしょう。

WebRTCの記事は沢山あります。SRTの記事は少ないので、SRTでRaspberry Piで低遅延&高品質な超広角220°全天候型リモート監視カメラを作ってみたいと思います。

結果、1秒遅延で安定した接続を確認

結果からお伝えすると、カメラ側(SIMルーターでVPNを経由して映像)から、視聴端末まで約1秒の遅延で表示できました。低遅延のチューニングはしていません。数時間接続しても安定しました。細かい設定でもっと低遅延になるでしょう。

準備した物やソフトウェア環境------------------------------
Raspberry Pi VR 220 Camera  (184-3079)
Raspberry Pi カメラV2用 全天候型ケース (201-1438)
Entaniya キューブケース 01
Raspberry Pi 4 Model B(MicroSDなど起動に必要なもの一式) (182-2098)
balenaEtcher
ubuntu
ffmpeg
OBS
---------------------------------------------------------------------------

1.インストール用のOSイメージ作成

普段ubuntuを使っているため、RaspberryPi OSのちょっとした違いが面倒です。嫌だ嫌だと思いながらRaspberry Pi サイトを調べると、ubuntu-21.10 64bit arm版が出ていました。しかも64bit。素晴らしいことです。今回はubuntu-21.10を使います。

Ubuntu Desktopは重たいので、Ubuntu Serverを使います。Raspberry PiはARMなので、間違えないようにARM版をダウンロードします。※本記事ではubuntu-21.10-preinstalled-server-arm64+raspi.img を使います。
https://ubuntu.com/download/raspberry-pi

OSイメージをMicroSDに書き込む方法はいろいろあります。Raspberry Pi ImagerかbalenaEtcherなどをよく使います。今回はWindowsでbalenaEtcherを使います。好きなものを利用してください。

Raspberry Pi Imager: https://www.raspberrypi.com/software
balenaEtcher: https://www.balena.io/etcher/

ubuntu-21.10をダウンロードしたらbalenaEtcherにドロップして、差し込んだMicroSDを選択して書き込みボタンを押して完成です。しばらく待ちましょう。書き込みが完了したらMicroSDをRaspberry Pi 4に刺します。

2.モニター、LAN、周辺機器の準備

最初のセットアップは、モニターや周辺機器を接続したほうが簡単です。映像を送受信するためルーター等のネットワーク環境も使います。
本記事ではRaspberry Pi VR 220 Cameraなどは、すでにセットアップ済みです。Webページを調べて設定ください。
Raspberry Pi 4にMicroSDを差し込み電源を入れると、初期設定が開始されます。Ubuntu Serverの初期IDとパスワードは、ubuntuとubuntuです。パスワードの変更が求められるので適当なものを入力します。

3.SSH接続の準備

作業がしやすいようにSSH接続の準備をします。下記のコマンドでは最新環境にアップデートして、SSHサーバーを動かして、22ポートを開きます。OSのバージョンやアップデート環境の違いによって、さまざまな現象が発生すると思います。検索すれば対処方法が見つかりますので適宜対応ください。SSH用のポート22を開いて完了です。

sudo apt update 

sudo apt dist-upgrade

sudo apt install openssh-server

sudo systemctl start ssh

sudo apt install ufw

sudo ufw enable

sudo ufw allow 22

ip aなどで自分のIP(Raspberry Pi 4 )を確認して、Windowsパソコン等からSSH接続します。ソフトはTera Termを使っています。あとはubuntuにV4L2、ffmpegを入れてちょっと作業をすれば完了です。

4.V4L2とffmpeg環境の準備

V4L2は汎用的なドライバみたいなものです。v4l-utilsをインストールします。

sudo apt install v4l-utils

v4l2のカメラデバイスがあるか確認します。

v4l2-ctl --list-devices

Cannot opne device /dev/video0と表示されました。

configを書き換えます。vimは苦手なのでnanoです。つねに初心者です。

sudo nano /boot/firmware/config.txt

config.txtの一番したに追記します。start_x=1でカメラを認識させます。gpu_mem=256は、大きな映像サイズを扱えるようにGPUメモリを増やす設定です。

start_x=1

gpu_mem=256

再起動してから、デバイスリストを確認します。

sudo reboot

v4l2-ctl --list-devices

今度は出てきました。カメラを正しく認識できました。

ffmpegをインストールします。apt installやソースからビルドするやり方もありますが、簡単なStatic Buildsを利用します。ダウンロードするだけで使える優れモノです。

※記事作成時では、apt installでインストールできるffmepgバージョンはSRT非対応でした。SRT対応のffmpeg-5.0-arm64-staticを利用します。その時に一番新しいものを使うのがよいでしょう。
https://johnvansickle.com/ffmpeg/

wgetのあとにURLを貼り付ければダウンロードできます。リンク先は変わることがあるので、Webページのリンクをつかいましょう。

wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-arm64-static.tar.xz

lsコマンドで確認します。無事ダウンロードできています。

圧縮ファイルになっているので解凍します。

tar -xf ffmpeg-release-arm64-static.tar.xz

lsで確認します。 ffmpeg-5.0-arm64-staticがあるので、無事に解凍されました。

ffmpeg-5.0-arm64-staticに移動してファイル構成を見ます。

cd ffmpeg-5.0-arm64-static

lsで構成ファイルを確認します。ffmpeg やffprobeがありました。

ffmpegとコマンドを入力したときに、ffmpegが実行されるようにします。パスを通す方法でも良いですが、簡単に済ませるためにパスが通っているフォルダーに移動します。

sudo mv ffmpeg /usr/bin/

/usr/bin/フォルダーにffmpegが移動されました。ffmepgが実行されるか試してみます。はい、ffmepgが動きました。バージョンも5.0です。

ffmpegにsrtが入っているか確認します。

ffmpeg -protocols

最後のほうにsrtがありました。ffmpegの準備完了です。

5.映像受信用にOBSインストール

映像の受信にはWindowsのOBSを使います。ubuntuやffmpegでも良いのですが、汎用的な検証としては、Windows&OBSが使いやすいでしょう。映像を録画することもできるし、再エンコードして再配信することもできます。

最新のOBSをインストールします。最新版であればSRTに対応しています。記事作成時は27.2.1でした。OBSの使い方は、検索して確認してください。
https://obsproject.com/

記事内の環境では、次のIPを利用します。使用するポートは10000とします。実際に利用する環境に合わせて設定してください。

Raspberry Pi:192.168.100.4 とします。
Windows:192.168.100.2 とします。

OBS側でSRTを受信できるようにします。メディアソースを追加します。

ローカルファイルのチェックを外します。ネットワークバッファリングも0MBにします。

入力URLに
srt://192.168.100.2:10000?mode=listener
と入力します。

入力フォーマットは
mpegts
とします。

設定から解像度は1920×1080の29.97にします。OSBのセットアップ完了です。

6.ffmepgでsrt送信テスト

SSH接続でRaspberry Piに接続します。IPアドレスはご利用の環境のIPに書き換えてください。

ffmpeg -f v4l2 -s 1920x1080 -i /dev/video0 -c:v h264_v4l2m2m -framerate 29.97 -b:v 2M -f mpegts "srt://192.168.100.2:10000"

と入力します。Windows側のIPへsrtで映像を送ります。

※多くの場合、Windowsのファイアウォールの設定が必要です。対象のポートを開けば受信できると思います。アプリケーション等の許可も必要になるかもしれません。

映像を受信するために一時的にファイアウォールを無効にした場合は、作業が終わったら元に戻しましょう。セキュリティの変更は自己責任です。

OBSで受信できれば、ほぼ完成です。先ほどのffmpeg コマンドを簡単に説明します。さまざまなオプションがありますので、お好みで追記してもらえればと思います。

-f v4l2 :v4l2を使います。
-s 1920x1080 :ピクセルサイズを指定します。
-i /dev/video0 :カメラデバイスを指定します。
-c:v h264_v4l2m2m :Raspberry Piのh264ハードウェアエンコードを使います。
-framerate  29.97 :fps29.97に指定します。(30と変わらないかも)
-b:v 2M :ビットレートは2Mbpsを指定します。
-f mpegts :映像のコンテナです。
"srt://192.168.100.2:10000":SRTの配信先URLと使用するポートを指定します。

設定から受信までの動画です。このような感じで受信できます。OBS側で受信を待機していないとSRTの映像は送信されませんので注意です。OBS側を先に準備しましょう。

ここで問題です。fpsが5しかでません。

bcm2835モジュールを読み込み解像度を指定します。カメラの最大の解像度を入力します。

sudo modprobe -r bcm2835-v4l2

sudo modprobe bcm2835-v4l2 max_video_width=3280 max_video_height=2464

もう一度、ffmpegを実行します。

ffmpeg -f v4l2 -s 1920x1080 -i /dev/video0 -c:v h264_v4l2m2m -framerate 29.97 -b:v 2M -f mpegts "srt://192.168.100.2:10000"

今度は綺麗に30fps出ました。

30fpsが出せる1920×1080ピクセルは、映像がクロップされます。220°の超広角を活かすために1600×1200(4:3)に変更します。

ffmpeg -f v4l2 -s 1600x1200 -i /dev/video0 -c:v h264_v4l2m2m -framerate 29.97 -b:v 2M -f mpegts "srt://192.168.100.2:10000"

OBSの解像度も1600×1200(4:3)に変更します。解像度も良い感じです。ホワイトバランスや露出などのカメラ調整を行えば、もっと画質が良くなるでしょう。

1日つけっぱなしにしましたが、途切れることもなく映像を送受信できました。基本的な動作の確認ができました。次は、Raspberry Pi カメラV2用 全天候型ケースとEntaniya キューブケースを組み立てます。

7.Raspberry Pi カメラV2用 全天候型ケースを組み立て

Raspberry Pi VR 220 Cameraを入れることができる全天候型ケースを組み立てます。組み立てマニュアルも入っています。乾燥剤も同梱されており、カメラの曇りを防ぎます。

phpZcyf9A_5cecb29da5ba32df89a8f79794142b0215da0cf3.jpgphpqK2cpR_776ef9b89fec41f640e639a4a332a50fd308a5d2.jpg
ドーム部分の組み立て注意

アウターカバーとドームカバーが一体化しています。ツメを外して、分離する必要があります。それに気がつかず作業を進めるとカバーがハマらず苦労します。かならずアウターカバーとドームカバーを分離して作業をしましょう。

※記事内の一部写真は、ドームの部分を間違った状態で設置しています。記事を書き終わったあとに、間違いに気が付きました。。。予めご注意ください。

8.Entaniya キューブケースの組み立て

このケースは、とても良く出来ています。アクリルパネルは2面だけ設置しました。全ての作業が終わったら残りのアクリルを取り付けるとします。

 php7zoyJ2_ac626c3b41ba8a2cc0154959cb83b92eef9275a6.jpg

カメラドーム取り付け用のアクリル板も付属しています。アクリル板には穴があり、面にカメラドームを取り付けできます。

キューブケースの底面にはゴム足やカメラネジ穴が用意されています。設置する場所に合わせてネジ穴を利用するのもよいでしょう。

Type Cの電源ケーブルは、L型コネクタを利用すると良いかもしれません。

キューブケース内には、まだまだスペースがあります。POE給電可能な基盤を入れたり、拡張できます。外に出すケーブル類などは、アクリルパネルに穴を空けてパテなどで塞げばよいでしょう。今回は仮組み立てとして、これで完成とします。

9.動作チェックと遅延テスト

カメラドームをつけても、画質はほぼ同じです。周辺に少しフリンジっぽい紫色が見られますが、クリアで均一なアクリルドームです。動作チェックを兼ねて遅延テストをしました。カメラ→ディスプレイ表示までの約1秒です。※ローカルネットワーク内で動作させています。

あとは必要に応じてシステムを追加することで、低遅延&高品質な超広角220°全天候型リモート監視カメラが完成します。

phpBROR7M_c9b6b04b001c8e0d5ba7e0c7627c6d2401f7abca.jpg

10.システム構築

ffmpegを自動起動するサービスにして、LANを繋いで電源を入れれば、映像が送信できるよにしました。VPN内で動作させれば、セキュリティも安全です。

カメラをインターネットに接続すれば、自動的に映像が送出されて、視聴側のシステムで表示できます。遅延もローカルと同程度の1秒でした。

同じVPN内からであれば、Raspberry Pi 4へSSH接続できます。カメラの設定変更などもリモート操作できます。現場にささっと持って行きLANを接続したり、適当なモバイルインターネット端末を接続すれば、映像を受信できます。

 

ハウジングは、防水ではなく防塵防滴の全天候型ケースです。監視カメラ的な用途であれば十分に機能すると思われます。映像受信側にパワフルなPCを設置して、映像を分析するような処理を行ってもよいでしょう。

ジュエ株式会社では、より高解像度、より低遅延を実現する超低遅延VRライブ配信のシステム開発及び製作しております。VRでは課題となる円周魚眼をリアルタイムステッチするシステムなどもご用意しています。ご興味がありましたらお気軽にお問い合わせください。
https://jouer.co.jp/distinations/ultra-low-atency-vr-livestreaming/



jouer is a filming company that provides VR live streaming and drone aerial photography in Asakusa, Tokyo. https://jouer.co.jp/
DesignSpark Electrical Logolinkedin