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

その中で、vision_resultはfind_vision_pose()から取得され、呼び出しステートメントは次のとおりです。

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

vision_resultを関数に渡した後、プロジェクトにROIが設定された場合、まずは空の箱かどうかを判定してから視覚位置姿勢を取得します。視覚位置姿勢が正常であれば、視覚位置姿勢を変換関数(pack_pose())に渡して送信します。

ステップパラメータを設定する

通常はadapter.pyでset_step_property()を呼び出して、Mech-Visionでステップパラメータを動的に設定します。

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)

効果を下図に示します。

../../../../../_images/vision_interface_01.png

ステップパラメータを読み取る

adapter.pyでread_step_property()を呼び出して、Mech-Visionのステップパラメータを取得します。

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は受信されたレシピ番号です。