3Dプリンタの印刷風景のタイムラプス撮影がやってみたい!ということで、今回は撮影できる機材と環境を整えてみます。(映像のかっこよさは後で考えましょう。)
まずは結論を
小難しいことをせずにタイムラプス撮影したかったら、Raspberry Piとカメラモジュールを買ってOctoPi入れましょう。
先人たちとOctoPiがめちゃ簡単な手順を用意してくれています。
OctoPiなら、SDカード上の設定ファイル(テキストファイル)をちょっと書き換えるだけで完成するようです。
私はケチってOctoPrintが動く高性能なRaspberry Piを買わなかったので、なかなか面倒な作業をすることになりました。
今回のめもは、Raspberry Piを購入するのをケチったがためにこんな苦労をすることになろうとは…という失敗ログです。(撮影はできる)
私のOctoPrintは通常のLinuxサーバに導入されているため、Webカメラをつないではいおしまい!とはいきませんでした。
手順とできあがりについて
今回はOctoPrintコミュニティの情報をもとに作業量を減らして構築しました。
実は、微妙に手順を省略しているので以下作業を完了してもOctoPrintのプレビュー画面でカメラ映像が見えません。
タイムラプス撮影はできるし、Slackに画像つきの通知も飛ばせるのでヨシ!としました。
ソフトウェアのインストール
以下ソフトウェアが必要です。
- OctoPrint
- FFmpeg
- mjpeg-streamer
OctoPrintのインストール
過去エントリを参考にしてください。
Raspberry Pi 4 を買えばこんなことしなくてもいいのに・・・
FFmpegのインストール
FFmpegがepelにも用意されていなかったのでsnap使って入れてみました。
https://snapcraft.io/install/ffmpeg/centos#install
# dnf install epel-release # dnf install snapd # systemctl enable --now snapd.socket # ln -s /var/lib/snapd/snap /snap
公式には書いてないけど、再起動しないとsnap動きませんでしたね。
再起動の前に、ついでにOctoPrintを実行するユーザーをvideoグループ(Webカメラにアクセスできるグループ)に追加しておきます。
# usermod -a -G video YOUR_OCTOPRINT_USER
再起動。
# shutdown -r now # snap install ffmpeg
mjpeg-streamerのインストール
mjpeg-streamerをビルド、Webカメラの映像を常に配信しつづけるようにします。
ビルドに必要なライブラリをインストールします。
# LANG=C dnf groupinstall 'Development Tools' # dnf install libjpeg-turbo{,-devel}
mjpg-streamerをビルドします。
# git clone https://github.com/jacksonliam/mjpg-streamer.git # cd mjpg-streamer # make
ファイアウォールもあけておきましょう。今回はTCP 10080番を開けました。
# firewall-cmd --zone=public --permanent --add-port 10080/tcp # firewall-cmd --reload
ということで、動作確認をします。
※解像度やポート番号は適宜変更してください。
# mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 1024x768" -o "output_http.so -p 10080"
配信されているか、VLCなどで再生して確認します。
http://YOUR_SERVER_IP:10080/?action=stream
カメラの映像が配信されていることが確認できたら、systemdでサービス化します。
webcam.sh
#!/bin/bash # see also: https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian-or-raspberry-pi-os/2337 MJPGSTREAMER_HOME=/path/to/mjpg-streamer/mjpg-streamer-experimental MJPGSTREAMER_INPUT_USB="input_uvc.so" # init configuration camera="auto" camera_usb_options="-r 1024x768 -f 10 -d /dev/video0" # runs MJPG Streamer, using the provided input plugin + configuration function runMjpgStreamer { input=$1 pushd $MJPGSTREAMER_HOME echo Running mjpg_streamer -o "output_http.so -p 10080" -i "$input" LD_LIBRARY_PATH=. mjpg_streamer -o "output_http.so -p 10080" -i "$input" popd } # starts up the USB webcam function startUsb { logger "Starting USB webcam" runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $camera_usb_options" } # echo configuration echo camera: $camera echo usb options: $camera_usb_options # keep mjpg streamer running if some camera is attached while true; do if [ -e "/dev/video0" ] && { [ "$camera" = "auto" ] || [ "$camera" = "usb" ] ; }; then startUsb fi sleep 120 done
webcamd.service
[Unit] Description=Camera streamer for OctoPrint After=network-online.target octoprint.service Wants=network-online.target [Service] Type=simple User=YOUR_OCTOPRINT_USER ExecStart=/path/to/octoprint/webcam.sh [Install] WantedBy=multi-user.target
作成した webcamd.service を登録します。
# cp webcamd.service /etc/systemd/system/ # systemctl enable --now webcamd.service
VLCなどでさきほどと同じようにカメラ映像が配信されていることを確認できたらOK!
OctoPrintの設定
OctoPrintの設定 > Webcam & Timelapse
を開いて、準備したカメラ映像のURLを割り当てます。
- Timelapse Recordings
- Path to FFMPEG
/var/lib/snapd/snap/bin/ffmpeg
あとは印刷する際毎回タイムラプス撮影するよう設定すれば完成です。
タイムラプス撮影できたー。
— あおせ (@i_aose) 2021年12月8日
サーバ:CentOS上で動いてるOctoPrint
カメラ:RaspberryPi Zero WにAliExpressで279円で買ったカメラモジュールをつけてWebcam化したやつ pic.twitter.com/j0SeDdTWav