Arc Welder on OctoPrint on FreeBSD

f:id:kamosawa:20201124122616p:plain

OctoPrintとArc Welderプラグインをインストールして遊んでみたら簡単かつ面倒だったので備忘録を書いておきます。

OctoPrintは一般的には3Dプリントサーバを作るためにRaspberry Piにインストールするソフトウエアです。

octoprint.org

Raspberry Pi3Dプリンタとの間はUSBで接続します。 ユーザーはWebインターフェイスから操作します。

できることはもともと非常に多いんですが、さらにプラグインで拡張できるので、3Dプリンタにまつわるオールインワンパッケージみたいになってます。gcodeだけでなくstlファイルをアップロードしてスライスするとか、プリントの様子を監視するカメラを付けるとか、それでタイムラプス動画を撮る、みたいなことまでできます。プリントが終わったら自動で電源を落とす、なんてのもお手の物です。

とはいえオレは「3DプリンタはgcodeをSDカードに入れてその場でプリントすればいいだけ。オールインワンのものを入れたりすると逆にプロセスが分離しにくくなる」と思っているので、OctoPrintも存在は知ってはいるものの使う気のないものでしかありませんでした。

それが今回インストールしてみようと思いたったのは、Arc Welder Pluginの存在を知ったからです。

このプラグインはgcodeを構成する直線移動のG0/G1命令を曲線移動のG2/G3命令に変換することでgcodeを圧縮し、造形品質を改善し、プリント時間を短くて予想可能にするというものです。

スライサが吐くgcodeは曲線を細かい直線として表現します。こうした多数の直線ブリント命令を少数の曲線プリント命令に変換してやれば、最小限の命令数でプリントできるため、コントローラの負担が減り、スムーズにプリントできるわけです。*1

くわしくは、はるかぜポポさんによる紹介記事や: 

note.com

公式ドキュメントを参照してください:

plugins.octoprint.org

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プリンタは繋がずにプラグインだけを使う、という方法で試してみることにしました。やってみると非常に簡単で、いろいろ探し回ったのがアホみたいでした。

そんなわけでインストールの様子を書きますが、オレの踏んだ手順はごちゃごちゃしてるので、ここではちょっと整理して:

  1. OctoPrintのインストール
  2. Arc Welderプラグインのインストール
  3. OctoPrintを恒久的に使う場合の設定

を載せることにします。

OctoPrintのインストール

FreeBSDへのOctoPrintのインストール手順はOctoPrintのダウンロードセクションの「Installing manually」にあるように

  1. Pythonの仮想環境を生成 virtualenv OctoPrint
  2. 仮想環境内の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のインターフェイスが立ち上がるので初期設定をします。

OctoPrintの初期設定画面

OctoPrintの初期設定画面

(最初右下のNextボタンに気づかず、左のメニューをクリックして「動かねえ〜」ってやってました。)

初期設定の解説は3Dプリントする犬さんの

3Dプリンタを遠隔操作しよう(2/2)|3Dプリントする犬|note

という記事の「STEP 6: 最後の仕上げ、OctoPrintの設定」を参照してください。

Arc Welderプラグインのインストール

OctoPrintのプラグインのインストールはOctoPrintのウエブインターフェイスからおこないます。設定ボタンがわかりにくいんですが、ここにあります。

OctoPrintの設定ボタン

OctoPrintの設定ボタン

このスパナアイコンを押すと設定画面が開きます。

設定画面からプラグインマネージャを開きます…これも初見だとたいへん見つけにくいですがここにあります。

OctoPrintのプラグインマネージャ

OctoPrintのプラグインマネージャ

出てきたプラグインマネージャ画面がこれです。

Plugin Manager画面

それでArc Welderを検索してインストールするんですが、上の検索窓に普通に入力しても出てきません。これはインストール済みのプラグインを検索する場所みたいです。

オンラインレポジトリにあるプラグインを検索するには、一番下のGet More...を押して、「... from the Plugin Repopsitory」に入力する必要があります。

これは入力に合わせて勝手に検索されるので、arcくらい入れたところで、もうArc Welderが出てきます。

Get More...画面

Get More...画面

「Install」ボタンを押すと小さい画面が開いてダウンロード〜ビルドの様子が見られます。ここらへんはちょうよく出来てます。

 

インストール開始

インストール開始

インストール終了

インストール終了

インストールが終了したら、いったんOctoPrintを再起動します。

上記のように./OctoPrint/bin/octoprint serveで起動していた場合は、そちらのターミナルでCtrl-Cを入力することで正しく終了してくれます。再度./OctoPrint/bin/octoprint serveと入力して再起動しましょう。

再起動後にArc Welderがインストールされているか確認しようとしたところ、Plugin Managerに出てきませんでした。途方に暮れかけたんですが、下の方にPLUGINSというメニューがあって、こちらにちゃんとArc-Welderと出ています。これをクリックすることで設定にアクセスできます。

Where the plugin configuration is?

Where the plugin configuration is?

Arc Welderの使い方自体は上にも書いたように非常に簡単で、OctoPrintの画面にgcodeファイルをドラッグ&ドロップするだけで、自動的に一瞬で変換されます。変換中は右上に進行状況が出ます。

変換中

変換中

元のファイルと変換済みのファイルは、左のペーンのFiles内に出てきます。

変換の詳細は画面選択タブの一番右のプルダウンメニューからArc-Welderを選択すると表示されます。

このボールベアリングのgcodeは2.3MBから797kBと、かなり小さくなっていることがわかりますね。

詳細情報

詳細情報

 

OctoPrintを恒久的に使う場合の設定

FreeBSDのファイルサーバ等でOctoPrintを恒久的に使う場合に考えるべきことは2つあります。

  1. 自動起動
  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のバージョンを書き換えてあります:

community.octoprint.org

 

このファイルを/usr/local/etc/rc.dに置き、実行可能にした上で、/etc/rc.confにoctoprint_enable="YES"の行を追加するとマシンの起動時に自動でoctoprintが起動されます。また service octoprint start/stop/restart で起動/停止/再起動できるようになります。

FreeBSDサーバにOctoPrintをインストールしたときのアクセス制限方法

セキュリティについてはOctoPrintのページでもうるさく言われていますが、高い温度が出せる3Dプリンタに直接接続して完全に制御できるというアプリケーションですから、悪意のある者がアクセスできれば危険です。ウチの場合はルータを兼ねたファイルサーバにインストールしているので、デフォルトの設定だと世界中から制御できてしまってたいへんオモシロい感じになります。プリンタを接続する予定はありませんが、晒しておくのもよくないでしょう。

また、3Dプリンタを接続する場合、一般ユーザーではUSBシリアルデバイスにはアクセスできませんが、rootで動かすというのは良くない選択です。

というわけで以下の設定をします:

  1. OctoPrintに接続するインターフェイスの制限
  2. 非root権限でUSBシリアルにアクセスできるユーザーによるサーバー起動

1.については、OctoPrintにはlistenするインターフェイスを制限する機能があるので、これを使います。

設定は~/.octoprint/config.yamlでおこないます。ドキュメントは以下にあります。

docs.octoprint.org

インターフェイスの制限はこの部分です。

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上で安全に起動/使用できるようになります。

*1:とはいえ細かい直線の連続を曲線に直すことは、たとえば「曲線だったデータの再現度を上げる」といったことを意味するわけではありません。そもそも、われわれが普通3Dオブジェクトを保存しているSTLというファイル形式自体、三角形のポリゴンを組み合わせたメッシュによってオブジェクトを構成しています。つまり普通の3Dデータは直線の集まりで表現するほうが再現度が高くなります。Arc Welderがやっていることは、「もともと細かい直線で描かれている曲線的な表現を実際の曲線で近似している」と考えるのが正しいです。