3Dプリントをタイムラプス撮影したい!OctoPrint設定めも

3Dプリンタの印刷風景のタイムラプス撮影がやってみたい!ということで、今回は撮影できる機材と環境を整えてみます。(映像のかっこよさは後で考えましょう。)

まずは結論を

小難しいことをせずにタイムラプス撮影したかったら、Raspberry Piとカメラモジュールを買ってOctoPi入れましょう。

先人たちとOctoPiがめちゃ簡単な手順を用意してくれています。

OctoPiなら、SDカード上の設定ファイル(テキストファイル)をちょっと書き換えるだけで完成するようです。

私はケチってOctoPrintが動く高性能なRaspberry Piを買わなかったので、なかなか面倒な作業をすることになりました。

今回のめもは、Raspberry Piを購入するのをケチったがためにこんな苦労をすることになろうとは…という失敗ログです。(撮影はできる)

私のOctoPrintは通常のLinuxサーバに導入されているため、Webカメラをつないではいおしまい!とはいきませんでした。

手順とできあがりについて

今回はOctoPrintコミュニティの情報をもとに作業量を減らして構築しました。

https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian-or-raspberry-pi-os/2337

実は、微妙に手順を省略しているので以下作業を完了してもOctoPrintのプレビュー画面でカメラ映像が見えません。

タイムラプス撮影はできるし、Slackに画像つきの通知も飛ばせるのでヨシ!としました。

ソフトウェアのインストール

以下ソフトウェアが必要です。

  • OctoPrint
  • FFmpeg
  • mjpeg-streamer

OctoPrintのインストール

過去エントリを参考にしてください。

aose.hatenablog.jp

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を割り当てます。

あとは印刷する際毎回タイムラプス撮影するよう設定すれば完成です。