RaspbianにOctoPrintをインストールする

OctoPrintの画面
OctoPrintをRaspberry Pi 3 Bなどで動かすと3Dプリンタをブラウザから管理できます。USBカメラでプリントの状況をリアルタイムで見ることもできます。
以前に、最小構成のOSで手軽にOctoPrintを動かせるOctoPiを使いましたが、今回はOctoPiを使わずOctoPrintをソースからインストールしてみます。

以前の記事でOctoPiを動かしました。
3Dプリンタ用サーバ"OctoPrint"をRaspberry Pi 3 Model Bで動かしてみる
Raspberry Pi用のOctoPrintが動く専用イメージファイルOctoPiを使いました。
OctoPiは動作に必要な環境が出来上がっているためお手軽にOctoPrintを動かす事ができました。普通はOctoPiで動かす方が良いでしょう。

今回はOctoPrintのソースからRaspbianにインストールして動かします。
OctoPrintではmjpg-streamerによりカメラのライブ映像を見ることができます。mjpg-streamerでは音声を送ることができないのを不満に思っていました。別の手段で音声付きのライブストリーミングをしたいと思っています。
他のプログラムも使うことを考えるとOctoPiを使うより普通のRaspbianにOctoPrintをインストールした方が良さそうだからです。

OctoPrintをインストールする

OctoPrintのインストール方法はOctoPrint公式のダウンロードページに書いてあります。
https://octoprint.org/download/#installing-from-source

手順に従ってやってみます。
Raspbianのバージョンは記事公開時の最新版である
RASPBIAN STRETCH WITH DESKTOP Version:March 2018
を使いました。
レポジトリの更新をします。
sudo apt update
sudo apt upgrade

必要なライブラリのインストール

Pythonは既に入っていますのでインストールの必要はありませ。pipも入っています。
virtualenvをインストールします。
sudo pip install virtualenv

ソースからインストール

OctoPrintをダウンロードします。ダウンロードするディレクトリはユーザーディレクトリ下のDownloadsディレクトリにしています。
cd ~/Downloads
git clone https://github.com/foosel/OctoPrint.git
cd OctoPrint

Pythonの仮想環境を作ります。
virtualenv venv
OctoPrintをインストールします。
./venv/bin/python setup.py install
これでインストールは完了です。
実行するには
~/Downloads/OctoPrint/venv/bin/octoprint serve
とします。
これでOctoPrintは動きます。パソコンのブラウザで
"http://[Raspberry PiのIPアドレス]:5000"
を開きます。
初回は初期設定をいろいろ聞かれますので選択していきます。

mjpg-streamerをインストールする

OctoPiと違いmjpg-streamerは動きません。そのためカメラのライブ映像が見えません。mjpg-streamerを別途インストールします。

mjpg-streamerのインストール手順はこちらにあります。
https://github.com/foosel/OctoPrint/wiki/Setup-on-a-Raspberry-Pi-running-Raspbian#webcam
書いてある通り実行していきます。

必要なライブラリをインストールします。
cd ~
sudo apt-get install subversion libjpeg62-turbo-dev imagemagick ffmpeg libv4l-dev cmake
これはstretch用だそうです。jessieやWheezyの場合も書いてありますね。
ライブラリのインストールが終わったらmjpeg-streamerをインストールします。
cd ~/Downloads
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
export LD_LIBRARY_PATH=.
make

mjpg-streamerの動作確認

makeが完了したら動かしてみます。Raspberry PiにUSBカメラをつないでおきます。
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so"
YUVモードで動かすカメラの場合は
./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so"
と入れます。
そして、パソコンなどのブラウザで
"http://[Raspberry PiのIPアドレス]:8080/?action=stream"
を開くとカメラの映像が表示されるでしょう。

OctoPrintへカメラの設定をする

OctoPrintへカメラ映像のURLを設定します。
~/.octoprint/config.yamlファイルをテキストエディタで開きます。
ファイルの最後に次のテキストを追加します。
webcam:
  stream: http://<your Raspi's IP>:8080/?action=stream
  snapshot: http://127.0.0.1:8080/?action=snapshot
  ffmpeg: /usr/bin/ffmpeg
jessie以前の場合はffmpegではなくavconvにするそうです。
自分で最新のFFmpegをインストールしても良いですね。
関連記事:stretchなRASPBIANとTinkerOSでFFmpegをビルドする

mjpg-streamerの起動用スクリプトを作る

mjpg-streamerを起動するスクリプトを作ります。
ホームディレクトリにwebcamというテキストファイルを作ります。中身のテキストは次のようにします。
#!/bin/bash
# Start / stop streamer daemon

case "$1" in
    start)
        pkill -x webcamDaemon
        ~/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
複数回startをすると、次に作るwebcamDaemonというプロセスが何個も動きそうなのでstartにpkillを追加しています。
もう一つwebcamDaemonというテキストファイルを作ります。中身のテキストは次のようにします。
#!/bin/bash

MJPGSTREAMER_HOME=~/Downloads/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
camera_usb_optionsあるいはcamera_raspi_optionsでカメラの解像度やフレームレートを設定します。このスクリプトで露出など細かい設定もできそうです。
接続したUSBカメラの解像度とフレームレートの組み合わせを表示するには次のコマンドを入れます。
v4l2-ctl -d /dev/video0 --list-formats-ext
これで表示されない解像度やフレームレートでは映像が表示されないでしょう。
関連記事:OctoPrintの初期設定をしてUSBカメラを使えるようにする

作成したスクリプトファイルに実行許可を与えます。
chmod +x webcam
chmod +x webcamDaemon

スクリプトの使い方

作成したスクリプトを使ってmjpg-streamerを動かすには
webcam start
とします。
停止するには
webcam stop
とします。

OctoPrintとmjpg-streamerを動かし、ブラウザでOctoPrintを表示します。
Controlタブを選択するとカメラの映像が表示されているでしょう。
OctoPrintのControlタブ画面

まとめ

RaspbianにOctoPrintをインストールしてみました。
公式サイトの手順通りに行えば簡単に入れることができました。

OctoPrintとmjpg-streamerは完全に独立して動いている事がわかりました。OctoPrintとmjpg-streamerを一緒に起動するスクリプトも作ると便利でしょう。
個人的にお勧めなUSBカメラはこれです。

価格も安くレンズが広角なので狭い3Dプリンタ内を撮影するのに良いです。

mjpg-streamerでは音声が無いので他のストリーム方法を検討したいと思っていました。OctoPrintとは独立しているので他の映像ストリーム手段を動かせば実現できそうです。その時、Controlタブへ埋め込むのは難しそうですね。OctoPrintのPluginでどうにかできるのか今後の検討課題です。

コメント

最近のコメント

Threaded Recent Comments will be here.