はじめに
Raspi にインストールした OctoPrint に WebCam の設定をしてプリント中の 3D プリンタを遠隔から監視できるようにしてみました。
なお Raspi に OctoPrint はすでにインストールされ、カメラもすでに使える状態になっているところから始めています。
環境
- Raspberry Pi 3 model B
- Raspbian GNU/Linux 9.4 (stretch)
- オフィシャル Raspi カメラ V2.1
- OctoPrint Version 1.3.9
Raspi のカメラが使えることを確認
以下のコマンドを実行。
$ raspivid -o ./test.h264
Raspi カメラで 5秒間程度動画撮影し、カレントディレクトリに動画ファイル test.h264 ができました。
このままでは Windows で再生できなのでフォーマットを変換します。
まずは必要なパッケージをインストール。
$ sudo apt install gpac
フォーマットを変換。
$ MP4Box -add ./test.h264 ./test.mp4
カレントディレクトリにできた test.mp4 を Windows に移動して再生できることを確認しました。
MJPG-Streamer コンパイル
必要なパッケージインストール
$ sudo apt install \
subversion \
libjpeg62-turbo-dev \
imagemagick \
ffmpeg \
libv4l-dev \
cmake
MJPG-Streamer をダウンロードしてコンパイル
$ cd ~
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ export LD_LIBRARY_PATH=.
$ make
試しに WebCam サーバー起動
MJPG-Streamer をコンパイルしたディレクトリに移動
$ cd ~/mjpg-streamer/mjpg-streamer-experimental
MJPG-Streamer を実行 - オフィシャル Raspi カメラでない場合はコマンドが異なるようです
$ ./mjpg_streamer \
-i './input_raspicam.so -fps 5' \
-o './output_http.so'
ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream
Ctrl + C
で MJPG-Streamer を停止
OctoPrint で WebCam サーバーを起動/停止できるようにスクリプト設置
以下のファイルを設置しました。
/home/pi/scripts/webcam
#!/bin/bash
# Start / stop streamer daemon
case "$1" in
start)
/home/pi/scripts/webcamDaemon >/dev/null 2>&1 &
echo "$0: started"
;;
stop)
pkill -x webcamDaemon
pkill -x mjpg_streamer
echo "$0: stopped"
;;
*)
echo "Usage: $0 {start|stop}" >&2
;;
esac
/home/pi/scripts/webcamDaemon
#!/bin/bash
MJPGSTREAMER_HOME=/home/pi/mjpg-streamer/mjpg-streamer-experimental
MJPGSTREAMER_INPUT_USB="input_uvc.so"
MJPGSTREAMER_INPUT_RASPICAM="input_raspicam.so"
# init configuration
camera="auto"
camera_usb_options="-r 640x480 -f 10"
camera_raspi_options="-fps 10"
if [ -e "/boot/octopi.txt" ]; then
source "/boot/octopi.txt"
fi
# runs MJPG Streamer, using the provided input plugin + configuration
function runMjpgStreamer {
input=$1
pushd $MJPGSTREAMER_HOME
echo Running ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
LD_LIBRARY_PATH=. ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
popd
}
# starts up the RasPiCam
function startRaspi {
logger "Starting Raspberry Pi camera"
runMjpgStreamer "$MJPGSTREAMER_INPUT_RASPICAM $camera_raspi_options"
}
# starts up the USB webcam
function startUsb {
logger "Starting USB webcam"
runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $camera_usb_options"
}
# we need this to prevent the later calls to vcgencmd from blocking
# I have no idea why, but that's how it is...
vcgencmd version
# echo configuration
echo camera: $camera
echo usb options: $camera_usb_options
echo raspi options: $camera_raspi_options
# keep mjpg streamer running if some camera is attached
while true; do
if [ -e "/dev/video0" ] && { [ "$camera" = "auto" ] || [ "$camera" = "usb" ] ; }; then
startUsb
elif [ "`vcgencmd get_camera`" = "supported=1 detected=1" ] && { [ "$camera" = "auto" ] || [ "$camera" = "raspi" ] ; }; then
startRaspi
fi
sleep 120
done
軽く webcamDaemon スクリプトを読んでみたところ、camera="auto"
となっているので USB カメラか Raspi カメラ かを自動判定しているようです。camera="usb"
とすると USB カメラ (接続されて使えるようになっていれば) を指定でき、camera="raspi"
とすると Raspi カメラを指定できるようです。
また、/boot/octopi.txt が存在すれば source コマンドで読み込むので、webcamDaemon スクリプトを修正しなくてもこのファイルで camera 変数の値を変更することができそうです。
作成したスクリプトに実行権限付与
$ chmod +x /home/pi/scripts/webcam
$ chmod +x /home/pi/scripts/webcamDaemon
設置したスクリプトで WebCam サーバーの起動/停止ができることを確認
まずは起動していないことを確認
$ ps -efwww | grep mjpg_streamer | grep -v grep
$
なにも表示されないので起動していないことが確認できました。
WebCam サーバー起動
$ /home/pi/scripts/webcam start
/home/pi/scripts/webcam: started
$ ps -efwww | grep mjpg_streamer | grep -v grep
pi 4759 4751 2 00:10 pts/2 00:00:00 ./mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -fps 10
mjpg_streamer プロセスが起動しているのがわかります。
また、プロセスの引数が -i input_raspicam.so
となっているのでカメラの自動認識で Raspi カメラを認識できていることがわかります。
ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream
WebCam サーバー停止
$ /home/pi/scripts/webcam stop
/home/pi/scripts/webcam: stopped
$ ps -efwww | grep mjpg_streamer | grep -v grep
$
なにも表示されないので停止したことが確認できました。
OctoPrint システムメニューで WebCam サ ーバーを起動/停止できるように設定ファイル修正
/home/pi/.octoprint/config.yaml の最後に以下追加 - 今まで一度も OctoPrint を起動していない場合はこの .octoprint/ ディレクトリは まだ作成されていないかもしれません
system:
actions:
- action: streamon
command: /home/pi/scripts/webcam start
confirm: false
name: Start video stream
- action: streamoff
command: /home/pi/scripts/webcam stop
confirm: false
name: Stop video stream
参考ページでは command: sudo /home/pi/scripts/webcam stop
というように停止時は sudo により root 権限で stop させる ようになっています。これは別ユーザーが WebCam サーバーを起動した場合でも OctoPrint から WebCam サーバーを停止できるようにするためだと思われますが、パスワード無しで sudo できることが前提です。Raspbian のデフォルトでは確かパスワード無しで sudo できたはずですが、私の Raspi は sudo 時にパスワードが必要なように設定を変更しています。このため sudo をつけると OctoPrint から WebCam サーバーを停止で きないので command: /home/pi/scripts/webcam stop
というように sudo を付けないように変更しています。別ユーザーが起動し た WebCam サーバーは OctoPrint で停止できませんが、私の使い方ではそのような状況にはならないかなと考えています。
OctoPrint で WebCam サーバー起動/停止
/home/pi/.octoprint/config.yaml を修正したので OctoPrint が起動している場合は念のため OctoPrint 再起動
ブラウザで OctoPrint にアクセスし、電源アイコン (System) のプルダウンから Start video stream
を選択して WebCam サーバー起動
ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream
電源アイコン (System) のプルダウンから stop video stream
を選択して WebCam サーバー停止
OctoPrint の画面で WebCam のストリーミングを確認できるよ うにする
WebCam サーバーが起動していない場合は起動
スパナのアイコン (Settings) をクリック
WebCam & Timelapse をクリック
Stream URL に http://<your Raspi's IP>:8080/?action=stream
を設定
参考ページには Stream URL に /webcam/?action=stream
を設定するようにと書かれていましたが、私の環境ではこれではだめ でした。
Test をクリックして WebCam のストリーム動画が表示されることを確認
Save をクリック
OctoPrint を再起動し、ブラウザのキャッシュをクリアし、OctoPrint ページをリロード
WebCam サーバーを起動
Control タブに WebCam のストリーミング画像が表示されるようになりました。
参考
- https://discourse.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian/2337
- https://www.raspberrypi.org/documentation/usage/camera/raspicam/raspivid.md
0 件のコメント:
コメントを投稿