OctoPrintをDockerで動かして3Dプリント中の様子をタイムラプス録画する
Raspberry Pi 4BとSSDを収納するケースを3Dプリンタで作ろうと思いました。最近は全く3Dプリンタを動かしていません。パソコンも新調してしまい昔の環境やら設定も無くなっています。ほぼゼロから環境の再構築です。
3Dプリンタで3Dモデルを印刷するには3Dモデルのデータから3Dプリンタ用の命令を作るスライサというソフトウエアを使います。私はSimplify3Dという有料のスライスソフトウエアを使っています。スライサを使うにはそれなりの性能のパソコンを使った方が軽快に操作できて良いです。スライサが作った3Dモデル用の命令を3Dプリンタへ送ることで3Dプリンタは動きますが、この命令を送る作業に高性能なパソコンは必要ありません。印刷にはとても長い時間がかかるうえ、3Dプリンタの動作音は大きくうるさいです。メインのパソコンの近くでプリントするのは避けたいです。
3DプリンタはパソコンとUSBケーブルでつないで動かします。プリント時間は数時間から丸一日くらいかかります。その間、パソコンのそばに3Dプリンタを置くのはうるさいし邪魔です。こんな時はRaspberry Piを3Dプリンタを動かすコンピュータにすると便利です。今回はOctoPrintというソフトウエアをDockerで動かしてみます。
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-dockerRaspberry 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 agoStream 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動いていません。動いていれば次のような画面が出ます。
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カメラの映像が映れば成功です。
タイムラプス録画を試す
3Dプリンタのプリント中の様子をタイムラプス録画してみます。
Raspberry Pi 4B用のケースを作るためにRaspberry Pi 4B自体のモデルを作りました。公式のDXFデータを立体化しました。主要パーツの位置出し用に作ったのでプリントするつもりはなかったのですが、プリントの条件出しを兼ねてプリントしてみます。
モデルはこんなのです。
OctoPrintとUSBカメラでプリント中の様子をタイムラプス録画をするとこのようになります。
まとめ
3Dプリンタを制御するソフトウエアOctoPrintをRaspberry Pi 4Bの64bit Ubuntu上のDockerで動かしました。MJPG-StreamerのDockerコンテナを一緒に動かしUSBカメラの映像をタイムラプス録画することができます。
Dockerで動くのでより簡単にOctoPrintを使うことができるようになりました。
Dockerで動くのでより簡単にOctoPrintを使うことができるようになりました。
3Dプリンタを久しぶりに動かしました。3Dプリンタのあちこちのネジが緩んでいました。フィラメントのプリント条件など忘れていて一からやり直しです。プリントしても思った寸法で出来上がりません。ラズパイのケースを作るつもりでしたがプリントの条件出しに半月以上かかってしまいそうです。
スライサのSimplify3Dには印刷条件の保存が正しく行われないというバグが相変わらず存在しています。今ならもっと良いスライサがあるのでしょうか?
> - ./octoprint:/home/octoprint
返信削除- ./octoprint:/octoprintではないでしょうか。
2022/09/27はコンテナ側のパスは/octoprintでした。
コメントありがとうございます。パスは時々変わりそうですね。記事も2年前のもので環境再現ができません。確認及び修正はせず今後大きな環境変更が有った時に新しい記事を書く予定です。
削除