【pythonで動くG-codeビルダー】シンプルなシリンダー形状のサンプルでG-coordinatorの使い方を学習する
※ 当ページには【広告/PR】を含む場合があります。
2023/09/26

今回から何回かに分けて、G-coordinatorの学習も兼ねてハウツーを小出しに紹介していくコーナーになります。
シリンダーサンプルを印刷してみる
まず
sample
収録してあるサンプルのうち、
default_cylinder.py
801x594

このサンプルではpythonコードを実行すると、シンプルな円筒を描くだけの形状が出力されます。
1111x835

改めてpythonコードを眺めてみましょう。
import math
import numpy as np
import print_settings
from path_generator import *
from infill_generator import *
from console import *
LAYER = 100
#👇解説ポイント①
def object_modeling():
#👇Pathオブジェクトの配列
full_object=[]
#👇解説ポイント②
for height in range(LAYER):
#👇解説ポイント③
arg = np.linspace(0, 2*np.pi, 100)
#👇解説ポイント④
x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
#👇解説ポイント⑤
z = np.full_like(arg, (height+1) * print_settings.layer_height)
#👇解説ポイント⑥
wall = Path(x, y, z)
full_object.append(wall)
print(f'layer at {height=}')
return full_object
解説ポイント①をみてみましょう。
G-coordinatorの仕様で
object_modeling
つまり、以下はテンプレート扱いです。
def object_modeling():
#👇Pathオブジェクトの配列
full_object=[]
###...full_objectに詰物(計算結果)を入れる処理をユーザーが定義
return full_object
ということで、ユーザーはどのようなPathオブジェクトの配列を生成するか、の作業に集中すればよいのです。
次に解説ポイント②に目を移します。
#...中略
LAYER = 100
#...中略
for height in range(LAYER):
#...一層ごとの処理を記述
こちらもどちらかといえばテンプレートになります。
Python標準の
range
なので、
range(100)
[0, 1, ..., 99]
配列の中身は0から始まる整数であることにも注意しましょう。
for height in range(LAYER):
height
ここからはループ処理の中身の内容です。
まず解説ポイント③では
arg = np.linspace(0, 2*np.pi, 100)
となっています。
G-coordinatorでは高度数値計算ライブラリ
numpy
np.linspace
np.linspace(0, 2*np.pi, 100)
解説ポイント④もnumpyの関数・
cos
sin
x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
この
cos
sin
前からかかっている係数の10は半径が10mmという意味です。
解説ポイント⑤は、
np.full_like
z = np.full_like(arg, (height+1) * print_settings.layer_height)
この
np.full_like
簡単な例を挙げると、
a = np.array([1, 2, 3, 4, 5])
b = np.full_like(a, 6)
print(b)
#実行結果 --> [6, 6, 6, 6, 6]
つまりは、一層のz座標の値で埋めたx,yの座標配列に対応した配列が出力できます。
また、
print_settings.layer_height
print_settings
313x507

ここでいうと、
print_settings.layer_height = 0.2
ちなみにz軸の高さの計算値は
(height+1) * print_settings.layer_height
これは印刷しはじめの第1層目(
height = 0
height+1
+1
最後に解説ポイント⑥では、各x,y,zの座標配列で初期化した
Path
wall = Path(x, y, z)
full_object.append(wall)
ということでどれほどモデルが複雑化しようと、
1. レイヤー数の設定
2. レイヤーごとのx,y座標の配列を計算
3. z座標の計算
4. Pathオブジェクトの生成とfull_object配列への追加
という工程の流れはG-coordinatorでは共通したルーチンといえます。
何も考えず印刷開始
はい、コードがある程度把握できたら、3Dプリンターのデフォルト設定のままgcodeファイルを吐き出してみます。
287x482

出力されたgcodeはそのまま3Dプリンターで出力できますので、シリンダーを何も考えずに3Dプリントしてみましょう。
488x352

痛恨の失敗...
そういえばフィラメントを換えた直後だったので、一層目がうまくベースプレートに定着できずに、モジャモジャができてしまいました。
G-coordinatorでの1つ目の注意点は、当然ながら高機能スライサーで出力したgcodeとは勝手が違い、スライサーが裏で上手くやってくれてきた、出力前の予備動作(ブリム・ラフト等)や出力中のサポート(支持)、出力終了後のノズルの位置・温度などは自動で面倒をみてもらえません。
いつものスライサー感覚で、G-coordinatorで作成したgcodeをそのまま印刷すると、最小限の印刷動作しかできないことを念頭においておきましょう。
ということで、2回目の印刷では、一層目とベッドの定着具合も安定して押し出されているのを確認してから、
279x273

きれいな円筒が印刷されました。
スパイラルモードを使ってZシームは消えるのか?
ZシームとはZ軸方向に継ぎ目のように出来てしまう筋のことで、各層の印刷地点の最初の位置に出来てしまうアレのことです。
327x266

Zシームが起こる原因は、各層の印刷が切り替わる前後で、z軸座標がワンステップ下駄を履くからです。
例えば、印刷の層方向の高さ間隔を1mmとすると、$$N$$番目のレイヤーの印刷が終わった時点で高さ$$N$$mmの位置にいるノズルは、次の$$(N+1)$$番目のレイヤーの印刷が始まる前に高さ$$(N+1)$$mmの位置に移動しないといけません。
この層をまたぐときに起こる余計な動きの痕跡が、「Zシーム」となって見えています。
つまり、Zシームを消すには、$$N$$番目のレイヤーの印刷の始まりから終わりにかけてじっくり層方向の高さ間隔分移動させるようにします。
結果、Z軸方向へノズルを螺旋状に動かすようにみえることから
では、
default_cylinder.py
object_modeling
#...
def object_modeling():
#...
for height in range(LAYER):
#...
#👇コメントアウト
#z = np.full_like(arg, (height+1) * print_settings.layer_height)
#👇以下の式に変更
z = np.linspace(height * print_settings.layer_height,
(height+1) * print_settings.layer_height,
100)
#...
これで各レイヤーの印刷の開始位置の高さから、徐々にノズル位置が上がっていって、レイヤーの最後の印刷位置が、次のレイヤーの印刷の開始位置の高さと一致します。
実際に印刷をしてみると、
357x399

結果はなんということでしょう...ほとんど効果がなさそうです。
むしろ、印刷中にノズルの動きが時折カタカタゆらぎはじてめてしまい、その時の影響で印刷物の表面が荒れてしまいました。
Zシームがほとんど消えないのに、印刷中の挙動が不安定になった原因を勝手に考察しますが、
今回テストで用いたのは、
0.04mm
ちなみにz軸方向の移動分解能を決めているのは、ステッピングモーターの回転角度分解能ですので、正確な分解能を計算したい場合はそちらのスペックをみながら考えないといけませんが、だいたい
0.04 ~ 0.05mm
ここで考えなくてはならないのは、1層分の高さ
0.2mm
4 ~ 5ステップ
理想的なスパイラルモードを実現するため、
z = np.linspace(height * print_settings.layer_height,
(height+1) * print_settings.layer_height,
100)
とはしましたが、
0.2mm
おそらくは印刷中に3Dプリンターが頑張って、"もっとも近しいz座標"に合わせるために頻繁にz軸を動かそうとしてしまうことで、そのときの印刷ヘッドのブレや振動が伝わり、安定した印刷を阻害してしまったのではないかと...。
なので、スパイラルモード自体は悪いことではありませんが、あまり小さな印刷物...つまりスパイラルモードで指定できるz軸間隔が、印刷物の1層当たりの厚みに比べほとんど変わらない場合、スパイラルモードはほとんど意味が無い、ということでしょう。
スパイラルモードを使いたい場合には、印刷物の一層当たりの厚みを大きくとるか、もしくは高分解能の精密3Dプリンターを使うか、を検討すると良いでしょう。
個人的には、
まとめ
今回は、G-coordinatorに収録してあるサンプルのうち、シンプルなシリンダー形状のものを使って、基本的な使い方を紹介してみました。
サンプルにはさらに興味をそそられる形状のものが多数用意されているようです。 今後時間があれば他のサンプル形状もチェックしてみたいと思います。