Mech-Vizインターフェース
以下では、Mech-Vizを使用するインターフェースについて説明します。次のインターフェースが含まれています。
Mech-Vizプロジェクトの起動
Mech-Vizを起動する関数は、adapter.pyファイルのAdapterクラスで定義されているため、コード内でstart_viz()を直接呼び出すことができます。また、プロジェクトの要件に応じてself.before_start_viz()とself.after_start_viz()を書き換えることで、Mech-Viz起動前後のカスタマイズの動作を実現できます。
関数定義
def start_viz(self, in_new_thread=True, timeout=None):
if not self.is_viz_registered():
logging.error("{} has not registered in {}.".format(jk.mech_viz, jk.mech_center))
self.code_signal.emit(ERROR, VIZ_NOT_REGISTERED)
self.viz_finished_signal.emit(True)
self.viz_not_registerd()
return False
if self.is_viz_in_running():
logging.info("{} is already running.".format(jk.mech_viz))
self.code_signal.emit(WARNING, VIZ_IS_RUNNING)
self.viz_finished_signal.emit(False)
self.viz_is_running()
return False
self._read_viz_settings()
if not self.viz_project_dir:
self.msg_signal.emit(ERROR, _translate("messages", "The project of {0} is not registered. Please make sure Autoload Project is selected in {0}.").format(jk.mech_viz))
self.viz_finished_signal.emit(True)
return False
msg = {"simulate": self.is_simulate, "project_dir": self.viz_project_dir}
if self.is_keep_viz_state:
msg["keep_exec_state"] = self.is_keep_viz_state
if self.is_save_executor_data:
msg["save_executor_data"] = self.is_save_executor_data
self.before_start_viz()
self.viz_finished_signal.emit(False)
if in_new_thread:
threading.Thread(target=self.wait_viz_result, args=(msg, timeout)).start()
else:
self.wait_viz_result(msg, timeout)
self.after_start_viz()
return True
start_viz()は、デフォルトで新しいスレッドでMech-Vizが実行を終了するのを待ちます。この目的は、Mech-Vizの起動以外の他の操作に影響を与えないようにすることです。
次にステップパラメータを動的に設定することを例として、self.before_start_viz()を書き換える方法を示します。
def before_start_viz(self):
self.set_move_offset(x, y, z)
Mech-Vizを起動する前に、読み取んだデータに従って、ある移動点のx、y、z方向のオフセットを設定します。
Mech-Vizプロジェクトの停止
Mech-Vizを停止する関数は、adapter.pyファイルのAdapterクラスで定義されているため、コード内でstop_viz()を直接呼び出すことができます。
関数定義
def stop_viz(self, timeout=None):
if not self.is_viz_registered():
self.code_signal.emit(WARNING, VIZ_NOT_REGISTERED)
return False
self.call_viz("stop", timeout=timeout)
self.code_signal.emit(INFO, VIZ_STOP_OK)
return True
Mech-Vizの一時停止と再開
Mech-Vizを一時停止・再開する関数は、adapter.pyファイルのAdapterクラスで定義されています。Mech-Vizソフトウェアの停止ボタンと同じように機能し、シミュレーションのみに使用できます。
関数定義
def pause_viz(self, msg, timeout=None):
if not self.is_viz_registered():
self.code_signal.emit(WARNING, ADAPTER_CANCEL_PAUSE)
return
self.call_viz("switchPauseContinue", msg, timeout)
self.code_signal.emit(INFO, ADAPTER_PAUSE_VIZ if msg.get(
"to_pause") else ADAPTER_CONTINUE_VIZ)
ステップパラメータの設定
通常、Adapterクラスのset_task_property()を呼び出して、Mech-Vizでステップパラメータを動的に設定します。
関数定義
def set_task_property(self, msg, timeout=None):
return self.call_viz("setTaskProperties", msg, timeout)
msgは様々なステップに対して様々なパラメータを設定することを決定します。
移動
Mech-Vizの実行中に、移動ステップでX、Y、Zのオフセットを微調整する必要がある場合があります。Mech-Vizを制御するメインプログラムには、次の関数を記述できます。
サンプル
def set_move_offset(self, name, x_offset, y_offset, z_offset):
msg = {"name": name,
"values": {"xOffset": x_offset / UNIT_PER_METER,
"yOffset": y_offset / UNIT_PER_METER,
"zOffset": z_offset / UNIT_PER_METER}}
self.set_task_property(msg)
nameは移動ステップの名前を表します。UNIT_PER_METER=1000。通常、x_offset、y_offsetおよびz_offsetのデータ単位はmmで、Mech-Vizでのデータ単位はmであるため、単位変換にはUNIT_PER_METERを使用します。
以下の方法でset_move_offset()関数を呼び出すと、Mech-Vizの対応する「移動_1」ステップのX、Y、Zオフセットがそれに応じて変更されます。
self.set_move_offset("move_1", 100, 200, 300)
外部移動
制御を計画するために複数の外部目標位置姿勢をMech-Vizに送信する必要がある場合、それらは外部移動ステップによって実現できます。外部移動ステップは、JPs、TCP、対象物の位置姿勢の設定に対応しています。使用方法は次の通りです。
サンプル
class CustomOuterMoveService(OuterMoveService):
def gather_targets(self, di, jps, flange_pose):
self.add_target(self.move_target_type, [0.189430,-0.455540,0.529460,-0.079367,0.294292,-0.952178,0.021236])
Mech-Vizは外部移動ステップに実行すると、getMoveTargets()が呼び出されます。様々な外部移動ステップは、サービス名によって区別されます。
def _register_service(self):
self.outer_move_service = CustomOuterMoveService()
self._outer_move_server, port = register_service(outer_move_service, port)
外部移動ステップの前に、把持することを示すステップが必要です。そうしないと、「- 対象物が把持されてない場合、対象物の位置姿勢は無効です。」というエラーが報告されます。 |
パレタイジング
Mech-Vizの実行中に、様々なパレタイジングステップに応じて様々なパラメータを設定する必要がある場合があります。変更が必要なステップは、パレタイジングステップの名前で見つけることができます。Mech-Vizのプロジェクト編集エリアでステップを選択すると、パラメータバーに表示されるすべてのパラメータを変更できます。
サンプル
例えば、カスタマイズのパレットパターンの場合、一般的に変更が必要なパラメータは 開始インデックス および ファイル名 ( 動的に読み込む にチェックを入れる場合のみに表示)です。したがって、メインプログラムで次の関数を定義できます。
def set_stack_pallet(self, name, startIndex, fileName):
msg = {
"name": name,
"values": {
"startIndex": startIndex,
"fileName": fileName,
}
}
self.set_task_property(msg)
その中で、「startIndex」は 開始インデックス を示し、「fileName」は ファイル名 に示します。「curIndex」および「filename」のパラメータ名は、Mech-Vizで定義されています。
以下の方法を使用してset_stack_pallet()関数を呼び出します。
self.set_stack_pallet("common_pallet_1", 2, "re.json")
事前計画パレットパターンの場合、通常、変更が必要なパラメータは 開始インデックス 、 パレットパターン 、 箱の長さ 、 箱の幅 、 箱の高さ 、 行の数 、 列の数 および 段数 です。したがって、メインプログラムで次の関数を定義できます。
def set_stack_pallet(self, name, startIndex, stack_type):
pallet_info = self.box_data_info[stack_type]
"""
pallet_info: Length(mm),Width(mm),Height(mm),pallet type,rows,columns,layers
"""
msg = {
"function": "setTaskProperties",
"name": name,
"values": {
"startIndex": startIndex,
"palletType": pallet_info[3],
"cartonLength": pallet_info[0] / UNIT_PER_METER,
"cartonWidth": pallet_info[1] / UNIT_PER_METER,
"cartonHeight": pallet_info[2] / UNIT_PER_METER,
"cylinderRows": pallet_info[4],
"cylinderCols": pallet_info[5],
"layerNum": pallet_info[6]
}
}
self.set_task_property(msg)
設定するパラメータが多いため、通常はパラメータをexcelファイルに書き込み、excelァイルのデータを読み取って、self.box_data_infoに記録します。これは、後でstack_typeの値によってインデックス化できます。「startIndex」、「palletType」および「cartonLength」などの名パラメータはMech-Vizで固定されています。
カスタマイズのパレットパターン クラスと 事前計画パレットパターン クラスのmsg値を比較すると、違いが「values」の値にあることがわかります。ステップパラメータを設定するには、対応するパラメータ名と値を 、「values」でに追加する必要があります。他のパレットパターンのステップパラメータ設定については、上記の例をご参照ください。
メッセージによって異なる分岐を実行
Mech-Vizは分岐ステップに実行すると、外部信号(Adapter)が出口を指定するのを待ちます。分岐ステップの場合、分岐制御を行うために次の関数を定義できます。
サンプル
def set_branch(self, name, area):
time.sleep(1) # The delay of 1s here is to wait for the {product-viz} executor to fully start
try:
info = {"out_port": area, "other_info": []}
msg = {"name": name,
"values": {"info": json.dumps(info)}}
self.set_task_property(msg)
except Exception as e:
logging.exception(e)
その中で、nameは分岐ステップの名前を示し、areaは出口を示します。出口には、左から右に0、1、2、…の番号が付けられています。このステップが左端の出口から実行する場合、area=0になります。Mech-Vizを起動せずに分岐ステップを直接呼び出すと、Mech-Vizは「エグゼキュータはありません」というエラーが報告されます。
カウンター
カウンターステップを使用する場合、通常、計数の合計数と現在の計数を設定する必要があります。このステップを定義して設定するコードは次の通りです。
サンプル
def set_counter_property(self, name, count, curCount):
msg = {"name": name,
"values": {"count": count, "currentCount": curCount}}
self.set_task_property(msg)
この関数の呼び出し例を以下に示します。
self.set_counter_property("counter_1", 5, self.success_stack_num)
self.success_stack_numは正常にパレタイジングされた対象物の数を示します。パレタイジング中に箱が下した場合、人間の介入により、Mech-Vizは停止します。この時点で、Mech-Vizの「カウンター_1」というカウンターステップは、「currentCount」の値を保存しません。Mech-Vizを再起動した後、カウンターステップの現在の計数は、self.success_stack_numによってリセットできます。
ステップパラメータの読み取り
Mech-Vizの実行中に、ステップパラメータを読み取る必要がある場合は、メインプログラムで次の関数を定義できます。
サンプル
def read_move_pallet(self, name):
msg = {"name": name,
"properties": ["xOffset","yOffset","zOffset", ]}
return read_task_property(msg)
「name」によって読み取るステップ名を見つけることができます。「properties」の後のリストの値は、必要に応じてパラメータを追加または削除できます。本例では、「xOffset」、「yOffset」、および「zOffset」の値が読み取られるので、3つの値を「properties」に追加します。呼び出す方法を以下に示します。
self.read_move_pallet("move_3")
呼び出した後、次の結果が得られます。
{'zOffset': -0.23, 'xOffset': -0.12, 'yOffset': -0.15}
また、Mech-Vizのステップから得られるパラメータ値は、計画進行時の値であり、実際の実行時の値ではないことにご注意ください。計画は、実行前に実行します(つまり、Mech-Vizは以後の動作を実際実行より前に計画します)。ここで、パレタイジングステップの開始インデックスを例として説明します。メインプログラムで以下のような関数を定義できます。
def read_pallet_current_index(self, name):
msg = {"name": name,
"properties": ["curIndex"]}
return read_task_property(msg)
開始インデックスの値を呼び出す方法は以下の通りです。
self.read_pallet_current_index("common_pallet_1")
呼び出すと以下の結果が得られます。
{'curIndex': 5}
ここで表示される「5」は、5回の計画が実行されたことを意味します。例えば、箱配置のプロジェクトでは、5は計画実行中に5つの箱が配置されましたが、実際にロボットは5箱より少ない箱しか配置しない可能性があります。したがって、このパラメータは実際実行時の値ではなく、計画された値を示します。
TCPの設定
TCPの設定は、Mech-Vizのロボットハンドリストで対応するインデックスを指定するだけです。Mech-Vizのロボットハンドのインデックスは、上から下まで0、1、2、3、...です。範囲を超えないように注意してください。TCP関数の設定は次の通りです。
サンプル
def set_tcp(self, index):
msg = {"function": "setTcp", "index": index}
self.call("executor", msg)
実行中のグローバル速度を設定
Mech-Vizの実行中に、ロボットの実行速度を動的に調整する必要がある場合は、メインプログラムに次の関数を定義できます。
サンプル
def set_vel(self, vel_scale):
msg = {"function": "setConfig",
"velScale": vel_scale / 100, "accScale": vel_scale / 100}
self.call("executor", msg)
速度が80%に設定されている場合、関数は次のように呼び出すことができます。
self.set_vel(80)
この関数は、Mech-Vizの起動後に呼び出す必要があります。そうしないと、エラーが報告されます。つまり、このモジュールの呼び出し条件は分岐ステップと一致しています。したがって、分岐ステップでset_vel()を呼び出し、新しいスレッドでset_vel()を呼び出さないようにします。例を以下に示します。 |
def set_branch(self, name, area):
time.sleep(1)
if self.box_data_info[int(self.pallet_info)][7] <= 10:
self.set_vel(100)
else:
self.set_vel(80)
try:
info = {"out_port": area, "other_info": []}
msg = {"function": "setTaskProperties",
"name": name,
"values": {"info": json.dumps(info)}}
self.set_task("executor", msg)
except Exception as e:
logging.exception(e)
点群衝突検出のパラメータを設定
点群衝突パラメータを設定します。Mech-Vizに対応するインターフェースはsetConfig()であり、これは実行時にグローバル速度を設定するインターフェースと同じですが、設定する情報が異なります。例を以下に示します。
サンプル
msg = {}
msg["function"] = "setConfig"
msg["check_pcl_collision"] = True
msg["collided_point_thre"] = 5000
msg["collide_area_thre"] = 20
msg["pcl_resolution_mm"] = 2
self.call("executor", msg)
Mech-Vizの返された値
Mech-Vizの返された値を次の表に示します。
返された値 | 意味 |
---|---|
Finished |
正常に実行しました(Mech-Vizプロジェクトに「ビジョン処理による移動」ステップの右の分岐がステップにつなぐ場合、Mech-Vizは正常に戻ります) |
Command Stop |
停止ボタンを押すか、stop_viz()関数を呼び出します |
No targets |
ビジョンポイントはありません(Mech-Visionからのビジョン結果は空であることを意味します) |
No proper vision poses |
ビジョンポイントに到達できません(ロボット自体が現在認識された対象物に到達できない、またはそれと衝突したことを意味します) |
PlanFail |
Mech-Vizの動作計画に失敗しました |
SceneCollision |
衝突が発生しました |
Mech-Vizの返された値に応じて、Adapter基本クラスは対応するインターフェース関数を提供します。