0,RC CAR用FPVは高い!!
カメラやボードの使っていたり ニーズが限定的であるため
市場に出ているFPVは高価である。
そのため、今回はRC CAR 用FPVを作成しようと思う。
当環境ではこのシステムで100ms未満の遅延になったため
比較的、実用的であると考える。
1,Rpi4を使うメリット
・安価である
・カメラとRpi4を用意すればPCやスマホを用いて受信することができる。
2,使用する機材
・Rpi4 4GB
・SD card 16GB~ class 10 推奨
・Picam v2.1 (V3広角だとより見やすい)
・Wifi ルータ(APとして使用)
・プログラム書き込み用/作業用PC
3,作業/PiOs 書き込み
1,raspberry PI imager をインストール
| 操作 | |
|---|---|
| デバイス | raspberry PI 4 |
| OS | raspberry PI os Legacy,32bit |
| ストレージ | 書き込みするSDカードを指定 |
| HostName | car1 |
| ローケーション | 全てJP |
| ユーザー名/pass | car1で一旦統一 |
| WIFI | wifiを設定できる場合はやっておく |
| SSH | SSHを有効化/パスワード認証 |
・writeを押して書き込みが終わるのを待機する。
4,作業/Pi側
・windowsでwindows key+Rを押し、ウインドウを表示させcmdと入力する。
・ssh car1@car1.localと入力し、ssh接続する。
・ssh接続時にパスワード何かを求められるがyesを入力する。
・shh接続語 以下のコード貼り付け mjpgstreamerをインストールする。
sudo apt update
sudo apt install -y cmake libv4l-dev libjpeg-dev imagemagick
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
sudo make; sudo make install
以下でshファイルを生成する。
sudo nano start_stream.sh
中身は以下をコピペする。
内容はフレームレートを30fpsで固定し、
圧縮度を20~40にする。
#!/bin/sh
PORT="8080" #ポート番号
ID="root" #ID
PW="password" #パスワード
SIZE="800x600" #画面サイズ
FRAMERATE="30" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer \
-i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y -q 20 -n" \
-o "output_http.so -w /usr/local/share/mjpg-streamer/www -p $PORT -c $ID:$PW"
を入力し、ctrl+Oで保存。 ctrl+Xで閉じる。
以下のコマンドでraspiの設定を開き、
sudo nano /boot/firmware/config.txt
最下層に以下の記述を行い レガシーカメラの有効化と行う。
camera_auto_detect=0
start_x=1
一度以下のコードでストリーミングを起動し、
sh start_stream.sh
スマホなどのブラウザから以下のアドレスにアクセスし
root と passwordを入力し、入る。
http://car1.local:8080/?action=stream
ストリーミングを終了する場合は、
ctrl+Cで終了できる。
サービス作成
sudo nano /etc/systemd/system/mjpg-streamer.service
中身は以下を入力する
[Unit]
Description=mjpg-streamer for TT-02 FPV
After=network.target
[Service]
User=car1
# 実行するスクリプトの場所
WorkingDirectory=/home/car1
ExecStart=/bin/sh /home/car1/start_stream.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
ctrl+Oで保存 ctrl+Xで閉じる。
# 権限付与
chmod +x /home/car1/start_stream.sh
# 反映
sudo systemctl daemon-reload
sudo systemctl enable mjpg-streamer.service
sudo systemctl start mjpg-streamer.service
を順番に起動し システムを起動する。
サービスが動作しているかをチェックするには
sudo systemctl status mjpg-streamer.service
を入力しenableになったら サービスが起動している証拠である。
sudo reboot
を入力しPiを再起動する。
再起動後先ほどのアドレスでアクセス出来たら成功である。
5,OSの保護 SDの読み取り専用
RC carに乗せる特性上、電源スイッチは単品にしたい。
そのためRpiの電源をぶち抜いても、OSが破損しにくい設定にする。
(起動中などは電源を切らないことだけ注意)
configから
sudo raspi-config
4 Performance options>P3 Overlay File System
の順番で入っていき しばらく待機したのち
2回yesを選択する。その後
sudo reboot
で再起動し、電源を引っこ抜いてみる。
もう一度電源を入れ、しっかり起動したらSDカードの読み取り専用モードは完了である。
6,再生について
ストリーミング再生には遅延を低減したりするため
VLC media Playerを推奨する。
VLC > メディア > ネットワークストリームを開く >
前段で設定したURL (http://car1:8080/?action=stream) >
詳細設定オプションの表示 > キャッシュ0ms
に設定する。
当環境では1回のみ"再生"を押すと、酷く遅延した。
その場合は2回 "再生"を押すと解決する。
車載側のRpiはWifi 5Ghzを推奨し(屋内の場合)、
再生側の機器はルーター(AP)とLANケーブルで接続すると遅延の減少が見込める。
カメラUnit一台につきルーター1台を付け合せると、帯域を確保できる。
ルーター設定から 空いているchにwifiを固定すると
ブロックノイズ低減が見込める。
空間の空いているchを探すにはAndroidのソフトウェアになってしまうが
WifiAnalyzerを使用した。
今回予算上の都合でwifi接続はa(WIFI4)を使用したが
Rpi4の上限であるac(WIFI5)を使用すると更なる遅延の減少が見込める。
7,RC CAR側ロジックについて
RC CAR操作のロジックは別記事で公開予定である。
ざっくり DFGT(PS3 ハンドルコントローラ)を
Arduino R3に接続し、CAR側と通信したのち、操舵する。
メリットはPCを介する必要がないため ソフトウェアのインストールが不要、
電源を入れればすぐ走行が可能な点がある。