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で編集する必要があります。その後、Adapterがロジックに従ってインデックスを変更します。使用方法は、 定点移動パレタイジング ステップと同じです。

外部移動

制御を計画するために複数の外部目標位置姿勢を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では、外部移動ステップのパラメータを下図に示します。

../../../../../_images/viz_interface_01.png

注意

外部移動ステップの前に、把持することを示すステップが必要です。そうしないと、「- 対象物が把持されてない場合、対象物の位置姿勢は無効です。」というエラーが報告されます。

パレタイジング

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は分岐ステップに実行すると、外部信号が出口を設定するのを待ちます。分岐ステップの場合、分岐制御を行うために次の関数を定義できます。

def set_branch(self, name, area):
    time.sleep(1) # The delay of 1s here is to wait for the Mech-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プロジェクトに「ビジョン処理による移動」ステップの右の分岐がステップにつなぐ場合は正常に戻ります)

Command Stop

Mech-Vizで停止ボタンを押すか、stop_viz()関数を呼び出します

No targets

視覚位置姿勢はありません(Mech-Visionからの視覚結果は空であることを意味します)

No proper vision poses

視覚位置姿勢に到達できません(ロボット自体が現在認識された対象物に到達できない、またはそれと衝突したことを意味します)

PlanFail

Mech-Vizの動作計画に失敗しました

SceneCollision

衝突が発生しました

Mech-Vizの返された値に応じて、Adapter基本クラスは対応するインターフェース関数を提供します。