Mech-Visionインターフェース

本節では、Mech-Visionを使用するインターフェースについて説明します。次のインターフェースが含まれています。

ビジョン目標点の取得

以下に示すように、adapter.pyのfind_vision_pose()関数でMech-Visionのビジョン結果を取得します。

def find_vision_pose(self, project_name=None, timeout=default_vision_timeout):
    vision_result = self.call_vision("findPoses", project_name=project_name, timeout=timeout)
    logging.info("Find vision result: {}".format(vision_result))
    return vision_result

Mech-Visionのビジョンポイントは通常、四元数の形式で表示される対象物の位置姿勢(obj_pose)で出力されます。ツール位置姿勢を出力することもできますが、Mech-Visionプロジェクトで変換する必要があります。

サンプル

Adapterは対象物の位置姿勢をツール位置姿勢(tcp_pose)に変換する関数を構築して、ロボット側に送信します。場合によっては四元数をオイラー角、ラジアンを度などに変換する必要もあります(変換することは、ロボット側と一致するかどうかによって決定されます)。さらに、AdapterはMech-Visionによって出力された次のようなビジョンポイントを確認することもできます。

def check_vision_result(self, vision_result):
    if vision_result["noCloudInRoi"]:                      # Determine whether it is an empty bin
    logging.info("Layer has no objects")
    self.send(pack('>2B6i', CODE_NO_CLOUD, vision_num, *EMPTY_PLACEHOLDER))
    return
    poses = vision_result.get("poses", [])                 # Get pose
    if len(poses) = 0:                                  # Determine whether there is a vision point
        logging.warning("No pose from vision")
        self.send(pack('>2B6i', CODE_NO_POSE, vision_num, *EMPTY_PLACEHOLDER))
        return
    self.send(pack_pose(poses[0], vision_num))       # Send after format conversion

以下は、find_vision_pose()からvision_resultを取得するための呼び出し例です。

self.check_vision_result(json.loads(self.find_vision_pose().decode()))

vision_resultを関数に渡す際に、プロジェクトにROIが設定された場合、まず空の箱かどうかを確認し、それからビジョンポイントを取得します。ビジョンポイントが正常であれば、その結果を変換関数(pack_pose())に渡して送信します。

ステップパラメータの設定

通常、Mech-Visionステップパラメータを動的に設定する場合は、adapter.py内のset_step_property()を呼び出すだけで十分です。

def set_step_property(self, msg, project_name=None, timeout=None):
    return self.call_vision("setStepProperties", msg, project_name, timeout)

msgは特定のステップ名と設定が必要なパラメータを決定します。

サンプル

Mech-Visionのマッチングモデルをワークの種類に応じて動的に設定する必要がある場合は、次の関数を作成してmsgを設定できます。

def _step_matching_model_cell(step_name, model_type):
    msg = {"name": step_name,
            "values":
           {"modelFile": model_type["ply"],
         "pickPointFilePath": model_type["json"]}}
return msg

ここで、step_nameは設定する必要があるMech-Visionステップの名前であり、model_typeはワークの種類に対応するファイルパスです。「ply」と「json」を使用して、それぞれ「.ply」と「.json」で終わるモデルファイルのパスを取得し、Mech-Visionの対応するステップパラメータにそれぞれ入力します。

step_nameが「Local Matching」の場合、呼び出し例は以下のようになります。

msg = _step_matching_model_cell("Local Matching", model_type)
self.set_step_property(msg)

ステップパラメータの読み取り

Mech-Visionの特定のステップのパラメータを取得するには、adapter.py内のread_step_property()を呼び出すことができます。

def read_step_property(self, msg):
     result = self.call_vision("readStepProperties", msg)
     logging.info("Property result: {}".format(result))
     return result

msgは取得するステップ名とパラメータ値を決定します。関数を作成してmsgを書き換えることができます。

サンプル

カメラIPを取得する場合、呼び出し例は以下のようになります。

def read_camera_property(self):
     msg = {"type": "Camera",
            "properties": ["MechEye"]}
     property_results = json.loads(self.read_step_property(msg).decode())
     camera_ip = property_results["MechEye"]["NetCamIp"]

Mech-Visionプロジェクトにカメラが1つしかない場合、タイプ(type)のみに基づいてステップを見つけることができます。Mech-Visionプロジェクトに同じステップが複数あり、特定のステップパラメータのみを取得または設定する場合は、名前(name)でステップを見つけることができます。以下に示すように、read_step_property()を呼び出してjson形式に変換することにより、カメラのすべてのパラメータ値(json形式)を取得します。

Property result:
{
  "MechEye": {
    "NetCamIp": "127.0.0.1",
    "TimeOut": "10",
    "configGroup": "",
  }
}

本例では、特定のパラメータフィールド(「MechEye」および「NetCamIp」)に従って、カメラIP(127.0.0.1)を取得します。

パラメータレシピの切替

Mech-Visionを使用する際に、ワークフローが同じであるが、一部のパラメータが異なる場合、パラメータレシピを使用することで、異なるプロジェクトに対応するパラメータを切り替えることができます。この機能は、adapter.pyのselect_parameter_group()の呼び出しによって実現されます。

def select_parameter_group(self, project_name, group_index, timeout=None):
    msg = {"parameter_group_idx": group_index}
    result = self.call_vision("selectParameterGroup", msg, project_name, timeout)
    logging.info("selectParameterGroup result: {}".format(result))
    return result

project_nameはMech-Visionのプロジェクト名で、group_indexはレシピ番号です。

サンプル

パラメータレシピの切替が必要な場合は、次のサンプルコードを使用してselect_parameter_group()関数を呼び出し、例外を処理します。

try:
   result = self.select_parameter_group(self.vision_project_name, model_code-1)
   if result:
      result = result.decode()
      if result.startswith("CV-E0401"):
            return -1
      elif result.startswith("CV-E0403"):
            return -1
      raise RuntimeError(result)
   except Exception as e:
      logging.exception('Exception when switch model: {}'.format(e))
      return -1
   return 0

self.vision_project_nameは受信されたMech-Visionのプロジェクト名で、model_code-1は受信されたレシピ番号です。