工作機械(3軸または5軸のCNC)のように産業用ロボットを使用する事ができます。産業用ロボットでCNC機械と同じ様な結果を得るには、機械プログラムをロボットプログラムに変換するRoboDKなどの高度なオフラインプログラミングソフトウェアが必要になります。そこでRoboDKは、APT、G-code、ACL、TAP、NCIなどの機械プログラムをロボットシミュレーションやロボットプログラムに変換する事ができます。
ロボットによる加工では、通常自動工作機械(CNC)が行う、フライス加工、穴あけ加工、面取り、バリ取りなどの、さまざまな材料除去を行います。
部品の寸法は、コンピューター支援設計(CAD)ソフトウェアを使用して定義されます。そして、コンピューター支援製造(CAM)ソフトウェアによって製造プログラム(G-codeなど)に変換されます。その製造プログラムは、RoboDKのオフラインプログラミングツールを使用してロボットプログラムに変換できます。
作業スペースを拡張する為、ターンテーブルやリニアレールなどの追加の軸は、作成そしてロボットと同期できます。
この項目では、ロボット加工を含むいくつかの実例を紹介します。CAMツールパスの生成方法を示す為、ほとんどの例でプラグインを使用します。しかし、APT、NC、G-codeファイルなどの通常の5軸ツールパスをRoboDKに読み込めます。
次のようなロボット加工プロジェクトの実例が他にもドキュメンテーションのCAMアドイン項目にあります。マスターキャム、MecSoft/RhinoCAM、インベンター、FeatureCAM、Fusion360などの実例を参照に。
ロボット加工用のこの例は、KUKAロボットと追加された3つの外部軸の使用方法を示します。セルには、6軸ロボットアーム、1軸のレール、2軸のターンテーブルが含まれています。
詳細は、RhinoCAMサンプル項目にあります。RhinoCAMとRoboDKの統合は、自動的にAPTファイルをRhinoCAMからRoboDKに読み込みます。
この例では、レーザー切断用に安川/Motomanのロボットを使用する方法を示します。ロボット切削ツールパスは、Autodesk Fusion用のRoboDKアドインを使用して定義されます。
この例は、安川/Motomanロボットをロボット加工用とRoboDKのMastercamアドインの使用方法を示しています。RoboDKは、Mastercamに生成されたNCIまたはNCファイルの自動読み込みをサポートしています。
詳細については、Mastercam実例項目へ。
この例は、バリ取り用にABBロボットの使用方法を示します。ついでに、ピックアンドプレース操作が例に含まれます。
この項目では、ロボット加工用に単純なRoboDKプロジェクトをオフラインで準備する方法を示します。ロボット加工セルには、少なくとも1つのロボット、1つのツール(EOAT)、および1つの参照系(基準系または基準座標系とも呼ばれます)が必要です。RoboDKでの新しいプロジェクトの作成に関する詳細は、スタートアップガイドの項目を参照にしてください。
次の手順は、KUKA KR210ロボットとTeknomotorのミーリング主軸を使用してロボット加工のセットアップを準備する方法を示しています(この例は、Sample-New-Project.rdkとしてライブラリにあります)。
1-ロボットを選択:
a.ファイル➔オンラインライブラリを開くを選択。
b.フィルターを使用して、ロボットをブランド、ペイロード、…などで検索できます
例えば、KUKA KR210 R2700(ペイロード210 Kg、リーチ2.7 m)を選択します。
c.ダウンロードを選択すると、ロボットが自動的にメイン画面に表示されます。
2-ツールを選択:
a.同じオンラインライブラリのフィルターをリセットしてから、タイプを➔ツールでフィルターしてください。
b.ダウンロードを選択して、Teknomotor ATC71-C-LNなどのスピンドルツールを読み込みます。
c.スピンドルは自動的にロボットに取り付けられます。
d.オンラインライブラリウィンドウを閉じてください。
3-参照系を追加:
a.ロボットの土台を表す座標系(名前はKUKA KR210 R2700 Base)を選択します。
b.プログラム➔参照系を追加を選択。新しい参照系がロボットの土台に追加されます。
c.参照をダブルクリックして、座標を入力します:
XYZABC = [1500,1000,500,0,0,0](mm-deg)
d.新しい名前を入力するか、F2を押して、参照系の名前をフライス加工の参照に変更します。
4-ロボット加工に使用するオブジェクトを追加(任意):
a.ファイル➔開くを選択
b.RoboDKライブラリからObject Chess Rook.sldという名のオブジェクトを選択します:
C:/RoboDK/Library
c.オブジェクトが(プロジェクトツリー内で)自動的にフライス加工の参照に配置されていない場合は、オブジェクトをドラッグアンドドロップしてください。
5-ロボットをダブルクリックして、ロボットパネルを表示します(任意)。ロボットパネルは、有効なツールと参照系を表示します。ツールと参照系を選択して更新することによって、ロボットコントローラーに同じ座標が表示されるはずです。デフォルトで、TeknomotorスピンドルのTCPはツールホルダーのルートにあります。ツール(TCP)には一定の長さがあります。この例では、ツールカッターの長さを表すようにTCPを更新します。
a.ツール(TCP)のX座標を375 mmに更新。TCPが軸に沿って移動するのがわかります。
b.(任意)2つ目のツールを作成して、Z軸に沿って移動させれば、最初のツールに相対するTCPを定義することもできます。
c.ロボットパネルウィンドウを閉じてください。
CAMソフトウェアを使用して生成されたNCファイル(G-codeやAPTなど)を指定して、RoboDKで新しいロボット加工プロジェクトを設定するには、次の手順を辿ってください:
1.ユーティリティ➔ロボット加工プロジェクト(Ctrl+M)を選択。
画像のように、新しいウィンドウがポップアップします。
2.パス入力の部分でNCファイルを選択を選択します
3.次のAPT加工ファイルなどのNCファイルを提供してください:
C:/RoboDK/Library/Example-02.e-Robot Machining Chess Rook.nc
4.ツリー内の新しいアイテムを右クリックし、名前の変更(F2)でロボット加工プロジェクトの名前を加工設定に変更します。
次の画像で示すように、メニューの左上にあるロボット、参照系、およびツールを選択してください。ツールパスは、正しい座標系に対して緑色で表示されます。
加工のツールパスは緑色で表示され、経路の法線は白いベクトルで表示されます。ツールパスを非表示にするには、可視ツールパスのチェックを外してください。
更新を選択して、デフォルトの設定でロボット加工プログラムを作成できるかどうか確認できます。プログラムが正常に生成されると、緑色のチェックマークが表示されます。次に、シミュレートを選択するか、生成されたプログラムをダブルクリックして、シミュレーションが開始されます。
警告メッセージと共に赤い十字が表示された場合は、ロボット加工プログラムが現在の設定では利用できないことを意味します。ツールの向き、最適化パラメーター、開始点、パーツの位置などの一部の設定を変更する必要があります。
次の項目では、ロボットの加工設定をカスタマイズする方法について詳しく説明します。
パス入力は、さまざまなツールパスを提供する方法が選択できます。
●NCファイルを選択:この項目で説明するように、一つのNCファイルとして(CAMソフトウェアから取得)。
●曲線を選択:一つ以上の曲線として、曲線を辿るプロジェクトの項目で示す用に。
座標の一覧としてRoboDKに曲線をインポートする事が可能です。
●点を選択:一つ以上の点として、点を辿るプロジェクトの項目で示す用に。
座標の一覧としてRoboDKに点をインポートする事が可能です。
●3Dプリントオブジェクト:3Dプリント用のオブジェクトとして。形状をツールパスに変換する為にスライサーが使用されます
パス入力部分からプログラムイベントを選択すると、ロボットプログラムの生成時に考慮する特別なイベントを表示します。これには、ツール変換を引き起こしたり、RPMでの主軸速度を設定したり、またはプログラム開始時か終了時に特定のプログラムを引き起こすイベントが含まれます。G-codeを使用している場合、デフォルトでM_RunCodeを使用して、M codesを関数として引き起こす事もできます。
詳細については、マウスカーソルを同様のフィールドに移動して、各イベントをカスタマイズしてください。
例えば、ツールを変更する場合、CAMソフトウェアに提供されたツールIDを表す%1値を使用する事ができます。引数を渡す代わりに静的関数を引き起こしたい場合は、SetTool(%1)をSetTool%1に換えることができます。ツール2を使用すると、SetTool(2)ではなくSetTool2が生成されます。
ロボット加工メニューの右上から、接近と後退動作をカスタマイズする事ができます。デフォルトでRoboDKは、法線に沿って100 mmの接近と後退の移動を追加します。
後退移動を追加する為に、追加を選択してください。緑色の経路はそれに応じて更新されます。特定の軸に沿って移動したり、座標を提供したり、円弧の接近をしたり、その他から選択する事ができます。追加ボタンを選択する事で、複数の動きを組み合わせる事もできます。
削除を選択して、特定の接近または後退移動を取り消します。
パスからツールへのオフセットで、ツールパスに沿ったツールの望ましい方向が変更できます。この設定は主に、TCPのZ軸を中心にツールを回転させる為に使用されます。これにより、ツールの軸周りに6番目の自由度が処理できます。場面や要件によって、様々な設定が利用可能です。例えば、ツールの向きを最小化したり、経路に沿ってツールの向きを辿ったりする事が選べます。
3軸または5軸のCNC製造プログラムを実行する為に6軸ロボットを使用している為、定義する必要がある追加の自由度があります。通常は、この自由度がTCPのZ軸を中心とした回転になります。
デフォルトで、パスからツールへのオフセットはrotz(0)の変換を表示します。つまり、ツールのZ軸を中心に回転が追加できます。この値を変更させて、ツールの好ましい方向を成立させる事ができます。TCPのZ軸を中心にまたは他の軸と組み合わせて、方向を変更できます。好ましい方向は、ロボットがツールパスをたどっている間、ロボットが維持しようとする方向です。
デフォルトでRoboDKは、ツール方向の変更を最小化アルゴリズムを使用します。これは、ツールの向きがツールパスに沿って可能な限り一定に保たれることを意味します。一般的に、この設定はロボットの関節の動きを最小限に抑えるため、フライス加工に適しています。また別で、他のアルゴリズム/方法も利用できます。例えば、ツールの向きがツールパスを辿る(刃がパスに沿って接線である必要がある、切削用途に有効です)、または辿るツールパスがロボットツールに取り付けられている場合オブジェクトを持つロボット(例えば、ディスペンスまたは研磨をする時)を選択します。
好ましいツールの向きを指定する事により、ロボットはツールのZ軸を中心に回転する自由度が得られます。これにより、ロボットは全ての到達地点にたどり着けるまま、特異点や軸の制限を避けながらプログラムが実行できます。デフォルトでRoboDKは、20度ずつの増加でTCP軸を中心にツールを+/-180度回転できます。
場合によっては、この回転を制限することをお勧めします。例えば、許容される回転範囲を半減する為に+/-90度を入力する事ができます。さらに、このパラメーター下げることでプログラムを入手する為の処理時間も減ります。
もしも経路の一部の点に到達できない場合は、参照系を回転させるか、Z軸で許容する回転範囲を広げることをお勧めします。参照系を移動するには、Altキーを押しながら座標系をドラッグして、パーツがロボットの作業スペースに入るように配置します。
RoboDKは、好む開始の関節構成(開始地点に望む関節)に最も近い開始構成を自動的に選択します。その時点から、ロボットは直線移動を行う為、ロボットの構成は変更されません。
ドロップダウンメニューから、プログラムを開始する為に考えられるすべての解決策が表示されます。必要に応じて、望むロボットの関節構成を選択し、プログラムを再計算する為に更新を選択してください。
指定された設定でロボットプログラムを生成するには、更新を選択してください。プログラムがの作成に成功すると、緑色のチェックマークが表示されます。すると、プロジェクト内に加工(Machining)という新しいプログラムが追加されます。
生成されたプログラムをダブルクリックするか、シミュレートを選択してロボット加工シミュレーションを開始します。
プログラムを右クリックして、ロボットプログラムを生成(F6)を選択してロボットプログラムを生成します。プログラム生成の詳細については、プログラム項目へ。
経路に沿ってツールの向きを一定に保つようにアルゴリズムを設定できます。この行動は、切削や溶接などのアプリケーションに役立ちます。
アルゴリズムを選択のドロップダウンでツールの向きがパスを辿るを選択して、好むツールパスを再計算します。他の設定は、一定のツール方向で加工プロジェクトを持つのと同じです。
ロボットが製造作業を行っている間に、ツールを使用してオブジェクト/ツールパスを持っているロボットをプログラミングすることができます。これは、接着剤の塗布や研磨などの用途に役立ちます。このタイプのロボットプログラミングは、リモートTCPとも呼ばれます。
アルゴリズムを選択のドロップダウンでロボットがオブジェクトを持つを選択して、しっかりとツールパスをTCPの参照に配置します。他の設定は、一定のツール方向で加工プロジェクトを持つのと同じです。
詳細情報は、RoboDKのオートデスクFusionのアドイン項目にあります。
RoboDKを使用して、三次元空間でロボットに曲線を辿らせることができます。RoboDKの曲線は、オブジェクトの端またはCSVファイルとして点の一覧をインポートする事ができます。この設定は、ロボット溶接などのアプリケーションに役立ちます。
ユーティリティ➔曲線を辿るプロジェクトを選択して、曲線を辿る設定を開きます。これらの設定は、ロボット加工プロジェクトと同じです。唯一の違いは、既にパス入力が曲線を選択に設定されていることです。
画面上の曲線を選択するには、曲線を選択ボタンを選択してください。
マウスの左クリックで曲線を選択します。同じ曲線を2回選択する事で、移動方向が切り替わります。また、選択済みの曲線を右クリックすると、方向転換したり、選択を解除したりできます。
画面を右クリックして完了を選択するか、Escキーを押して設定メニューに戻ります。緑色の経路は、オブジェクトに対してロボットの動きを示します。
ツールの速度や、接近/後退移動を各曲線に適用するかどうかなどの、追加の設定が設定ウィンドウの右上にあります。次の画像でデフォルトの設定が示されています:
ユーティリティ➔曲線をインポートを選択して、CSVファイルまたはテキストファイルから曲線をRoboDKにインポートできます。プロジェクトに新しいアイテムが表示され、オブジェクトとして曲線が追加されます。
ファイルは、各点の三次元座標を含むテキストファイルである事もできます。任意ですが、ツールのZ軸の方向をi,j,kベクトルとして指定できます。
必要に応じて、オブジェクトに既存する曲線をCSVファイルとしてエクスポートし(曲線を右クリックして、曲線をエクスポートを選択)、編集してからRoboDKに再インポートできます。
CSVまたはTXTファイルを曲線または点としてのインポートをカスタマイズする方法については、RoboDK APIの実例項目にあります。
RoboDKを使用すると、ロボットに点を追跡させるシミュレーションが簡単にできます。RoboDKの点は、オブジェクトそれか曲線から抽出でき、または点の一覧としてCSVファイルがインポートできます。この設定は、スポット溶接や穴あけ加工などに役立ちます。次のビデオは、スポット溶接の用途を設定する例を示しています:ビデオを見る。
ユーティリティ➔点を辿るプロジェクトを選択して、点を辿るための設定が開きます。これらの設定は、ロボット加工プロジェクトと同じです。唯一の違いは、既にパス入力が点を選択に設定されていることです。
画面上の点を選択するには、点を選択ボタンを選択してください。
マウスの左クリックで点を選択します。同じ点を2回選択すると、接近方向が替わります。また、点を右クリックして、次を選択を選択すると後続の点を選択します。
画面を右クリックして完了を選択するか、Escキーを押して設定メニューに戻ります。緑色の経路は、オブジェクトに対してロボットの動きを示します。
ツールの速度や、接近距離などの、追加の設定が設定ウィンドウの右上にあります。次の画像でデフォルトの設定が示されています:
点の一覧は、ユーティリティ➔点をインポートを選択して、テキストファイルまたはCSVファイルからインポートできます。プロジェクトに新しいアイテムが表示され、点がオブジェクトとして表示されます。
ファイルは、曲線の各点の三次元座標を含むテキストファイルであることができます。必要に応じて、ツールのZ軸の方向をi,j,kベクトルとして指定できます。
さらに、オブジェクトの既存の曲線は、曲線を右クリックして曲線の点を抽出を選択することで点に変換できます。
積層造形(または3Dプリンティング)は、デジタルファイルから三次元の立体オブジェクトを作成する作業です。産業用ロボットアームは、RoboDKを使用して3軸または5軸3Dプリンターとして機能できます。次のビデオは、RoboDKオフラインで3Dプリントをセットアップする方法を示します:ビデオを見る。
3Dプリントは、ロボットを使用して次のいずれかの方法で可能です:
●G-codeプログラム(NCファイル)をRoboDKを使用して、ロボット加工プロジェクトで示す用に、ロボットプログラムに変換。マテリアルフローの速度(押出機指令E)は、各移動の為に計算され、生成されたプログラムにプログラムイベントとして統合できます。G-codeは、RoboDKでサポートされているNCファイルの一種であり、多くの3Dプリンターでサポートされている形式でもあります。ほとんどのスライサーソフトウェアは、STLファイルを指定してG-codeが生成できます。
●ユーティリティ➔3Dプリントプロジェクトを選択して、3Dプリンティング設定を開きます。
RoboDKはデフォルトで、EディレクティブをExtruderと呼ばれるプログラムのプログラムコールとして変換し、E値をパラメーターとして渡します。この動作を変更するには、プログラムイベントを選択して下さい。
押出機の値(E)は、各移動の前に押し出す必要がある材料の量を表します。この値は、ロボットの速度と点と点の間の距離を考慮して、ロボットから押出機フィードを駆動する為に使用できます。
または、ポストプロセッサーを使用して押出機フィード用に計算し、それに応じて適切なコードを生成することもできます。次の項目で実例を示します。
この項目では、3Dプリント用の移動指示を実行する前に、ロボットのポストプロセッサーが押出機の速度を計算する為の変更を示します。あるいは、これらの操作は、押し出しプログラムコール(押し出しを駆動するデフォルトのコマンド)を使用して、ロボットコントローラーで行うこともできます。
ロボットポストプロセッサーをカスタマイズすることにより、プログラムをロボットに送信する前に、3Dプリント用の押出機の統合を容易にすることができます。このようなタスクを可能にするには、ロボットポストプロセッサーでプログラムが生成される時に、いくつかの計算を行い、カスタマイズされたコードを出す必要があります。
最初は、Extruderコールをインターセプトし、ポストプロセッサーのRunCode部分内の新しいExtruder値(E値)を読み取ることです。次のセクションは、プログラムから生成されたすべてのプログラムコールを処理します:
def RunCode(self, code, is_function_call = False):
if is_function_call:
if code.startswith("Extruder("):
# Intercept the extruder command.
# if the program call is Extruder(123.56)
# we extract the number as a string
# and convert it to a number
self.PRINT_E_NEW = float(code[9:-1])
# Skip the program call generation
return
else:
self.addline(code + "()")
else:
# Output program code
self.addline(code)
押出機の値(length/E)は、ロボットポストプロセッサでPRINT_E_NEW変数として保存されます。
新しい直線移動の指示ごとに、new_moveと言う関数呼び出しを実行する必要があります。MoveLコマンドの最初にこの呼び出しが追加できます:
def MoveL(self, pose, joints, conf_RLF=None):
"""Add a linear movement"""
# Handle 3D printing Extruder integration
self.new_move(pose)
...
押出機の増分を計算する為に、ポストプロセッサーのヘッダーに次の変数を追加する必要があります:
# 3D Printing Extruder Setup Parameters:
PRINT_E_AO =5# Analog Output ID to command the extruder flow
PRINT_SPEED_2_SIGNAL =0.10# Ratio to convert the speed/flow to an analog output signal
PRINT_FLOW_MAX_SIGNAL =24# Maximum signal to provide to the Extruder
PRINT_ACCEL_MMSS =-1# Acceleration, -1 assumes constant speed if we use rounding/blending
# Internal 3D Printing Parameters
PRINT_POSE_LAST =None# Last pose printed
PRINT_E_LAST =0# Last Extruder length
PRINT_E_NEW =None# New Extruder Length
PRINT_LAST_SIGNAL =None# Last extruder signal
最後に、移動距離、ロボットの速度、ロボットの加速度に応じて適切な押出機フィードのコマンドを生成する新しい手順を定義する必要があります。これは、押出機フィードが特定のアナログ出力またはカスタマイズされたプログラムコールによって駆動されることを前提としています。
def MoveLプログラム定義の前に次のコードを追加する必要があります。
def calculate_time(self, distance, Vmax, Amax=-1):
"""Calculate the time to move a distance with Amax acceleration and Vmax speed"""
if Amax < 0:
# Assume constant speed (appropriate smoothing/rounding parameter must be set)
Ttot = distance/Vmax
else:
# Assume we accelerate and decelerate
tacc = Vmax/Amax;
Xacc = 0.5*Amax*tacc*tacc;
if distance <= 2*Xacc:
# Vmax is not reached
tacc = sqrt(distance/Amax)
Ttot = tacc*2
else:
# Vmax is reached
Xvmax = distance - 2*Xacc
Tvmax = Xvmax/Vmax
Ttot = 2*tacc + Tvmax
return Ttot
def new_move(self, new_pose):
"""Implement the action on the extruder for 3D printing, if applicable"""
if self.PRINT_E_NEW isNone or new_pose is None:
return
# Skip the first move and remember the pose
if self.PRINT_POSE_LAST isNone:
self.PRINT_POSE_LAST = new_pose
return
# Calculate the increase of material for the next movement
add_material = self.PRINT_E_NEW - self.PRINT_E_LAST
self.PRINT_E_LAST = self.PRINT_E_NEW
# Calculate the robot speed and Extruder signal
extruder_signal = 0
if add_material > 0:
distance_mm = norm(subs3(self.PRINT_POSE_LAST.Pos(), new_pose.Pos()))
# Calculate movement time in seconds
time_s = self.calculate_time(distance_mm, self.SPEED_MMS, self.PRINT_ACCEL_MMSS)
# Avoid division by 0
if time_s > 0:
# This may look redundant but it allows you to account for accelerations and we can apply small speed adjustments
speed_mms = distance_mm / time_s
# Calculate the extruder speed in RPM*Ratio (PRINT_SPEED_2_SIGNAL)
extruder_signal = speed_mms * self.PRINT_SPEED_2_SIGNAL
# Make sure the signal is within the accepted values
extruder_signal = max(0,min(self.PRINT_FLOW_MAX_SIGNAL, extruder_signal))
# Update the extruder speed when required
if self.PRINT_LAST_SIGNAL isNone or abs(extruder_signal - self.PRINT_LAST_SIGNAL) > 1e-6:
self.PRINT_LAST_SIGNAL = extruder_signal
# Use the built-in setDO function to set an analog output
self.setDO(self.PRINT_E_AO, "%.3f"% extruder_signal)
# Alternatively, provoke a program call and handle the integration with the robot controller
#self.addline('ExtruderSpeed(%.3f)' % extruder_signal)
# Remember the last pose
self.PRINT_POSE_LAST = new_pose