OctoPrintをDockerで動かして3Dプリント中の様子をタイムラプス録画する

OctoPrint Web Camera
Raspberry Pi 4BとSSDを収納するケースを3Dプリンタで作ろうと思いました。最近は全く3Dプリンタを動かしていません。パソコンも新調してしまい昔の環境やら設定も無くなっています。ほぼゼロから環境の再構築です。
3DプリンタはパソコンとUSBケーブルでつないで動かします。プリント時間は数時間から丸一日くらいかかります。その間、パソコンのそばに3Dプリンタを置くのはうるさいし邪魔です。こんな時はRaspberry Piを3Dプリンタを動かすコンピュータにすると便利です。今回はOctoPrintというソフトウエアをDockerで動かしてみます。


3Dプリンタで3Dモデルを印刷するには3Dモデルのデータから3Dプリンタ用の命令を作るスライサというソフトウエアを使います。私はSimplify3Dという有料のスライスソフトウエアを使っています。スライサを使うにはそれなりの性能のパソコンを使った方が軽快に操作できて良いです。スライサが作った3Dモデル用の命令を3Dプリンタへ送ることで3Dプリンタは動きますが、この命令を送る作業に高性能なパソコンは必要ありません。印刷にはとても長い時間がかかるうえ、3Dプリンタの動作音は大きくうるさいです。メインのパソコンの近くでプリントするのは避けたいです。
3DプリンタによってはSDメモリーに入れた3Dプリンタ用の命令を読み出してプリントしてくれますが我が家の3DプリンタはSDメモリを読めません。

こんな時は3Dプリンタ用の命令を送る作業だけをするコンピュータを用意すると良いでしょう。これにはRaspberry Piが最適です。そしてこういった作業用のソフトウエアの一つにOctoPrintがあります。以前にも紹介しています。

久しぶりに3Dプリンタを動かすので以前にOcotoPiをインストールしたラズパイのSDメモリーは消してしまいありません。新たにインストールをしなくてはなりません。しかしそもそも空いているラズパイがありません。ブログ用APIを動かしたりおうちクラウド用にしてます。おうちクラウド用は常時動かす必要も無いのでこれを使ってみます。OctoPrint用のSDメモリーを作って入れ替えるのは避けたいです。SDメモリーって何が入っているかすぐにわからなくなってしまいますから。ならば直接インストールか?とも思いますが、今動いているOSはRaspbianではなく64bitのUbuntuです。入れられるのか?

幸いなことにOctoPrintの公式としてDockerイメージが公開されています。今回はDockerでOctoPrintを動かしてみようと思います。Dockerイメージなら必要な時だけ簡単に動かすことができます。Ubuntu上のDockerで動くのか確認にもなります。

OctoPrintをDockerで動かす

OctoPrintのDockerイメージはこちらで公開されています。
This repository contains everything you need to run OctoPrint in a docker environment.
イメージを使う方法も書かれています。イメージを自分でビルドする事もできるようです。docker-compose用のファイルも用意されています。
docker-composeを使うとして紹介します。
ファイルをGitHubからもってきます。どこのディレクトリでも良いですがここではホームディレクトリの下のdockerディレクトリに置きます。
cd
mkdir docker
cd docker
git clone https://github.com/OctoPrint/docker.git octoprint-docker
cd octoprint-docker
Raspberry Piと3DプリンタをUSBケーブルでつなぎます。3Dプリンタのシリアルポートを確認します。
ls -lrt /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Feb 27 12:24 usb-Arduino__www.arduino.cc__Arduino_Mega_2560_7543000000035190A090-if00 -> ../../ttyACM0
シリアルポートの一覧が出ます。複数ある場合は3Dプリンタがどれか選ばなくてはなりません。今回は一つだけでしたので"ttyACM0"というのが欲しい情報です。

Dockerで"/dev/ttyACM0"というデバイスを使えるようにします。docker-composeの場合はdocker-compose.ymlファイルで宣言できます。エディタで開きます。
nano docker-compose.yml
#  - /dev/ttyACM0:/dev/ttyACM0
とある行の先頭の#を消します。
保存してエディタを終了します。

これで動かす準備が終わりました。OctoPrintを動かすには
docker-compose up 
とします。最初はバックグラウンドで動かさずにエラーメッセージが出ていないか確認すると良いでしょう。
OctoPrintはWebベースで操作します。ブラウザで次のURLを開きます。
http://<ラズパイのIPアドレス>:5000
うまく動けば初期設定のウイザード画面が表示されるでしょう。

OctoPrintでUSBカメラを使う

OctoPrintではUSBカメラをつないで3Dプリンタの様子をモニタすることができます。Dockerで動かした場合はどうすれば良いのでしょうか?

USBカメラの映像はOctoPrintで取得しているのではありません。MJPG-Streamerという別のソフトウエアで動かしています。OctoPrintのDockerイメージにMJPG-Streamerを組み込まなくてはいけないのでしょうか?すでに入っているのでは?
MJPG-Streamerはとても汎用的なソフトウエアなので特定のDockerイメージに組み込むのは悪い方法です。Dockerなのですから独立してMJPG-Streamerを動かせば良いのです。ただしMJPG-Streamerには公式のDockerイメージがありません。出所不明のイメージを使わなくてはなりません。
OctoPrintのDokcerページでは
このイメージへ誘導されます。しかし64bit Ubuntuでこのイメージは動きませんでした。こんなエラーが出ます。
mjpg-streamer_1  | standard_init_linux.go:211: exec user process caused "exec format error"
octoprint-docker_mjpg-streamer_1 exited with code 1
ARM64のイメージがあるように書かれていますが、ベースとなるOSイメージが64bitに対応していないとか問題があるようです。
今回はイメージをビルドするスクリプトが公開されているこちらのイメージを使ってみます。
By sixsq • Updated 10 months ago
Stream USB camera and/or RPi camera as mjpeg stream over HTTP with mjpg-streamer 
イメージをビルドするスクリプトはここにあります。
このイメージを使うdocker-compose.ymlファイルは次のようにしました。
version: '3.7'

services:
  octoprint:
    image: octoprint/octoprint
    ports:
      - 5000:5000
    devices:
      - /dev/ttyACM0:/dev/ttyACM0
    volumes:
     - ./octoprint:/home/octoprint
    restart: unless-stopped

  mjpg-streamer:
    image: sixsq/mjpg-streamer
    devices:
      - /dev/video0
    ports:
      - 8080:80
    command: ["-i", "input_uvc.so -n -r 1280x720-f 30", "-o", "output_http.so -p 80 -w /usr/local/share/mjpg-streamer/www"]
    restart: unless-stopped
OctoPrintのデフォルトでは設定をVolumeに保存するようになっていました。設定ファイルを直接見れるように"./octoprint"ディレクトリへリンクしています。
USBカメラの解像度を1280x720にするためMJPG-Streamerへのコマンドを追加しました。

MJPG-Streamerが動いたかどうかはブラウザで次のURLを開く事ができるかでわかります。
http://<ラズパイのIPアドレス>:8080
何も表示できなかったらMJPG-Streamer動いていません。動いていれば次のような画面が出ます。
MJPG-Streamer
OctoPrintにMJPG-StreamerのURLを設定します。
"Stream URL"には”http://<ラズパイのIPアドレス>:8080/?action=stream”
”Snapshot URL”には"http://<ラズパイのIPアドレス>:8080/?action=snapshot"
を設定します。
タイムラプス録画をするにはffmpegが必要です。OctoPrintのイメージにはffmpegが含まれています。
"Path to FFMPEG"には”/opt/ffmpeg/ffmpeg”
を設定します。
コントロール画面にUSBカメラの映像が映れば成功です。
OctoPrint Web Camera

タイムラプス録画を試す

3Dプリンタのプリント中の様子をタイムラプス録画してみます。
Raspberry Pi 4B用のケースを作るためにRaspberry Pi 4B自体のモデルを作りました。公式のDXFデータを立体化しました。主要パーツの位置出し用に作ったのでプリントするつもりはなかったのですが、プリントの条件出しを兼ねてプリントしてみます。
モデルはこんなのです。
Raspberry Pi 4B 3Dモデル

OctoPrintとUSBカメラでプリント中の様子をタイムラプス録画をするとこのようになります。

まとめ

3Dプリンタを制御するソフトウエアOctoPrintをRaspberry Pi 4Bの64bit Ubuntu上のDockerで動かしました。MJPG-StreamerのDockerコンテナを一緒に動かしUSBカメラの映像をタイムラプス録画することができます。
Dockerで動くのでより簡単にOctoPrintを使うことができるようになりました。

3Dプリンタを久しぶりに動かしました。3Dプリンタのあちこちのネジが緩んでいました。フィラメントのプリント条件など忘れていて一からやり直しです。プリントしても思った寸法で出来上がりません。ラズパイのケースを作るつもりでしたがプリントの条件出しに半月以上かかってしまいそうです。
スライサのSimplify3Dには印刷条件の保存が正しく行われないというバグが相変わらず存在しています。今ならもっと良いスライサがあるのでしょうか?

コメント

  1. > - ./octoprint:/home/octoprint
    - ./octoprint:/octoprintではないでしょうか。
    2022/09/27はコンテナ側のパスは/octoprintでした。

    返信削除
    返信
    1. コメントありがとうございます。パスは時々変わりそうですね。記事も2年前のもので環境再現ができません。確認及び修正はせず今後大きな環境変更が有った時に新しい記事を書く予定です。

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.