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())并发送。
设置步骤参数
在为 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工程只有一个相机,则仅根据类型(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是传入的配方编号。