OctoPrintとArc Welderプラグインをインストールして遊んでみたら簡単かつ面倒だったので備忘録を書いておきます。
OctoPrintは一般的には3Dプリントサーバを作るためにRaspberry Piにインストールするソフトウエアです。
Raspberry Piと3Dプリンタとの間はUSBで接続します。 ユーザーはWebインターフェイスから操作します。
できることはもともと非常に多いんですが、さらにプラグインで拡張できるので、3Dプリンタにまつわるオールインワンパッケージみたいになってます。gcodeだけでなくstlファイルをアップロードしてスライスするとか、プリントの様子を監視するカメラを付けるとか、それでタイムラプス動画を撮る、みたいなことまでできます。プリントが終わったら自動で電源を落とす、なんてのもお手の物です。
とはいえオレは「3DプリンタはgcodeをSDカードに入れてその場でプリントすればいいだけ。オールインワンのものを入れたりすると逆にプロセスが分離しにくくなる」と思っているので、OctoPrintも存在は知ってはいるものの使う気のないものでしかありませんでした。
それが今回インストールしてみようと思いたったのは、Arc Welder Pluginの存在を知ったからです。
このプラグインはgcodeを構成する直線移動のG0/G1命令を曲線移動のG2/G3命令に変換することでgcodeを圧縮し、造形品質を改善し、プリント時間を短くて予想可能にするというものです。
スライサが吐くgcodeは曲線を細かい直線として表現します。こうした多数の直線ブリント命令を少数の曲線プリント命令に変換してやれば、最小限の命令数でプリントできるため、コントローラの負担が減り、スムーズにプリントできるわけです。*1
くわしくは、はるかぜポポさんによる紹介記事や:
公式ドキュメントを参照してください:
OctoPrintにArc Welderプラグインをインストールすると、OctoPrintにアップロードしたgcodeファイルが自動変換されて、新たにG2/G3コードで構成されたファイルが生成されるようになります。たとえばsample.gcodeというファイルをアップロードするとsample.aw.gcodeというファイルが勝手に出来上がります。このファイルはOctoPrintのサーバからダウンロード可能です。
ここで思ったのですが、テキストファイルであるgcodeを受け取って返すだけなんだから、普通のUnixコマンドと同じようなものが裏にあるはずです。これがあればサーバをわざわざ入れるなんて無駄なことはしなくて済むはず。
ところがオレはOctoPrintのプラグインの構造をわかってませんから、どこで横入りすればファイルを食わせたり取り出したりできるかがわかりません。また作者のGithubリポジトリにはArcWelderPluginの他にArcWelderLibというのもあり、まさにこれ! と思ったんですが、こちらは関連コードをとりあえず集めてあるだけでMakefileもサブディレクトリごとにあったりなかったりという状態のレポジトリでした。クローンしてみたものの、とてもmakeが通るようなものではありません。さらに言えば、Arc WelderプラグインがOctoPrintの持ってる情報を使ってる可能性もありました。
というわけで、FreeBSDのファイルサーバにOctoPrintをインストールし、3Dプリンタは繋がずにプラグインだけを使う、という方法で試してみることにしました。やってみると非常に簡単で、いろいろ探し回ったのがアホみたいでした。
そんなわけでインストールの様子を書きますが、オレの踏んだ手順はごちゃごちゃしてるので、ここではちょっと整理して:
- OctoPrintのインストール
- Arc Welderプラグインのインストール
- OctoPrintを恒久的に使う場合の設定
を載せることにします。
OctoPrintのインストール
FreeBSDへのOctoPrintのインストール手順はOctoPrintのダウンロードセクションの「Installing manually」にあるように
- Pythonの仮想環境を生成 virtualenv OctoPrint
- 仮想環境内のpipでOctoPrintをインストール OctoPrint/bin/pip install OctoPrint
でインストールできます。ちょう簡単。(ただし多用途のサーバに恒久的にインストールする場合はこの記事のずっと下の方の「OctoPrintを恒久的に使う場合の設定」を読んでください。この場合は専用のユーザー("octoprint")を作り、ここにインストールする方が何かと良いです。)
Python3.6以上とpip、virtualenvが必要です。インストールされていない場合はpkg add py37-virtualenvなどとすると簡単だと思います。
インストールが済んだら:
./OctoPrint/bin/octoprint serve
で起動します。これでデフォルトの http://localhost:5000 にOctoPrintのインターフェイスが立ち上がるので初期設定をします。
(最初右下のNextボタンに気づかず、左のメニューをクリックして「動かねえ〜」ってやってました。)
初期設定の解説は3Dプリントする犬さんの
3Dプリンタを遠隔操作しよう(2/2)|3Dプリントする犬|note
という記事の「STEP 6: 最後の仕上げ、OctoPrintの設定」を参照してください。
Arc Welderプラグインのインストール
OctoPrintのプラグインのインストールはOctoPrintのウエブインターフェイスからおこないます。設定ボタンがわかりにくいんですが、ここにあります。
このスパナアイコンを押すと設定画面が開きます。
設定画面からプラグインマネージャを開きます…これも初見だとたいへん見つけにくいですがここにあります。
出てきたプラグインマネージャ画面がこれです。
それでArc Welderを検索してインストールするんですが、上の検索窓に普通に入力しても出てきません。これはインストール済みのプラグインを検索する場所みたいです。
オンラインレポジトリにあるプラグインを検索するには、一番下のGet More...を押して、「... from the Plugin Repopsitory」に入力する必要があります。
これは入力に合わせて勝手に検索されるので、arcくらい入れたところで、もうArc Welderが出てきます。
「Install」ボタンを押すと小さい画面が開いてダウンロード〜ビルドの様子が見られます。ここらへんはちょうよく出来てます。
インストールが終了したら、いったんOctoPrintを再起動します。
上記のように./OctoPrint/bin/octoprint serveで起動していた場合は、そちらのターミナルでCtrl-Cを入力することで正しく終了してくれます。再度./OctoPrint/bin/octoprint serveと入力して再起動しましょう。
再起動後にArc Welderがインストールされているか確認しようとしたところ、Plugin Managerに出てきませんでした。途方に暮れかけたんですが、下の方にPLUGINSというメニューがあって、こちらにちゃんとArc-Welderと出ています。これをクリックすることで設定にアクセスできます。
Arc Welderの使い方自体は上にも書いたように非常に簡単で、OctoPrintの画面にgcodeファイルをドラッグ&ドロップするだけで、自動的に一瞬で変換されます。変換中は右上に進行状況が出ます。
元のファイルと変換済みのファイルは、左のペーンのFiles内に出てきます。
変換の詳細は画面選択タブの一番右のプルダウンメニューからArc-Welderを選択すると表示されます。
このボールベアリングのgcodeは2.3MBから797kBと、かなり小さくなっていることがわかりますね。
OctoPrintを恒久的に使う場合の設定
FreeBSDのファイルサーバ等でOctoPrintを恒久的に使う場合に考えるべきことは2つあります。
- 自動起動
- セキュリティ
自動起動についてはrcスクリプトを書き、セキュリティについてはネットワーク制限を施します。
FreeBSDでOctoPrintを自動起動する
自動起動についてはserviceコマンドから制御できるようにoctoprintというファイル名でスクリプトを置きます。
#!/bin/sh
# PROVIDE: octoprint
# REQUIRE: NETWORKING
# KEYWORD: shutdown
# *******DESCRIPTION: FreeBSD 12.1 - rc.d script for the 3D Printer Software OctoPrint. This script takes advantage of FreeBSD's rc.subr framework to start OctoPrint automatically at startup and to allow it to be controlled as a FreeBSD service (eg. service octoprint start). This script assumes you are running OctoPrint as a virtual python environment (py27-virtualenv), but it can easily be changed if you want.
# *******HELP:
# 1. To increase security we want to avoid running it as root so create a user named "octoprint" (or any name you want but then change the script to reflect the change) and add the user to the "dialer" group so it can access the USB serial port that connects to the 3D Printer.
# 2. Add the line "octoprint_enable=yes" to the end of "etc/rc.conf" this will enable and start OctoPrint at boot time.
# 3. Place this rc.d script file in "usr/local/etc/rc.d/" (make sure this file is executable, if not run: "chmod +x /usr/local/etc/rc.d/octoprint")
# 4. Make sure the variables below such as, "command", "octoprint_basedir", "command_interpreter", etc..., reflect the correct paths to your octoprint executable, base directory, and virtual python executable (if you are using a virtual python environment like this script does).
# 5. After startup the service can be controlled like any other service "service octoprint {start,status,reset,stop,start}"
. /etc/rc.subr
name=octoprint
rcvar="octoprint_enable"
: ${octoprint_enable:=no}
octoprint_user=octoprint
octoprint_group=${octoprint_user}
octoprint_user_path="/home/${octoprint_user}"
octoprint_basedir="${octoprint_user_path}/.octoprint"
command_interpreter="${octoprint_user_path}/OctoPrint/bin/python3.7"
command="${octoprint_user_path}/OctoPrint/bin/${name}"
command_args="serve --basedir ${octoprint_basedir} > /dev/null 2>&1 &"
load_rc_config $name
run_rc_command "$1"
このファイルの内容は基本的にこの投稿のままですが、上に書いたインストール方法に合わせてパスとPythonのバージョンを書き換えてあります:
このファイルを/usr/local/etc/rc.dに置き、実行可能にした上で、/etc/rc.confにoctoprint_enable="YES"の行を追加するとマシンの起動時に自動でoctoprintが起動されます。また service octoprint start/stop/restart で起動/停止/再起動できるようになります。
FreeBSDサーバにOctoPrintをインストールしたときのアクセス制限方法
セキュリティについてはOctoPrintのページでもうるさく言われていますが、高い温度が出せる3Dプリンタに直接接続して完全に制御できるというアプリケーションですから、悪意のある者がアクセスできれば危険です。ウチの場合はルータを兼ねたファイルサーバにインストールしているので、デフォルトの設定だと世界中から制御できてしまってたいへんオモシロい感じになります。プリンタを接続する予定はありませんが、晒しておくのもよくないでしょう。
また、3Dプリンタを接続する場合、一般ユーザーではUSBシリアルデバイスにはアクセスできませんが、rootで動かすというのは良くない選択です。
というわけで以下の設定をします:
- OctoPrintに接続するインターフェイスの制限
- 非root権限でUSBシリアルにアクセスできるユーザーによるサーバー起動
1.については、OctoPrintにはlistenするインターフェイスを制限する機能があるので、これを使います。
設定は~/.octoprint/config.yamlでおこないます。ドキュメントは以下にあります。
インターフェイスの制限はこの部分です。
server:
# Use this option to define the host to which to bind the server, defaults to "0.0.0.0" (= all
# interfaces)
host: 0.0.0.0
これをローカルネットワーク側のインターフェイス(ここでは192.168.1.1)のみにします。
server:
# Use this option to define the host to which to bind the server, defaults to "0.0.0.0" (= all
# interfaces)
host: 192.168.1.1
localNetworksという設定があるので接続クライアントのネットワークを制限できるのかと思いましたが、これは自動ログインを許可する場合のログイン可能なネットワークの設定でした。
非root権限でUSBシリアルにアクセスできるユーザーはdialerグループに入れることで作れます。adduserでユーザーoctoprintを作り、dialerグループに入れる(作ったときに入れなかったときは/etc/groupを編集)すると良いでしょう。
上の起動スクリプトのパスをこのユーザーにしておくことで、octoprintはFreeBSD上で安全に起動/使用できるようになります。