JZTAruco视觉端使用手册
服务基本信息
服务类型: TCP服务端
IP地址: 192.168.30.200
端口号: 9527
功能说明
1. 拍照功能
请求指令:
capture成功响应: 返回图片ID(数字)
失败响应:
NG(因相机原因无法拍摄时返回)图片查看地址:
http://192.168.30.200:8080/imageFile/{图片ID}.jpg
2. 拍照并识别功能
请求格式: 发送相机姿态和相机手眼参数,每个数字用空格分割 - 请求参数单位: - 距离: mm - 角度: 度 - 示例请求:
0.5 0.5 0.5 180 180 0 0 0 0.1 0 0 -90成功响应: 返回mark板的位置和姿态 - 响应参数单位: - 距离: m - 角度: 弧度 - 示例响应:
0 0.5 0.5 0 0 0 0失败响应:
NG相机手眼指的时相机坐标系和机械臂法兰坐标系的位置关系。单机场景可以使用结构理论值进行填入
技术实现细节
1. 拍照参数要求
推荐拍照高度: 300mm ± 20mm
高度稳定性: 对于同一个工位,拍照高度必须保持固定
2. 识别目标规格
识别类型: Aruco码板
码板规格: - 单个标记边长: 30mm - 内间距: 100mm
精度保证: 使用指定规格的码板可保证最佳识别效果和精度
3. 姿态数据使用建议
推荐使用参数: x, y坐标和rz旋转角度
参数说明: - x, y: 码板在水平面的位置坐标 - rz: 码板绕Z轴的旋转角度
使用限制: 视觉系统主要提供平面位置和朝向信息,其他姿态参数精度有限
Python通讯示例
import socket
import time
class VisionClient:
def __init__(self, host='192.168.30.200', port=9527):
self.host = host
self.port = port
self.timeout = 10 # 10秒超时
def connect(self):
"""连接视觉服务端"""
try:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.settimeout(self.timeout)
self.client_socket.connect((self.host, self.port))
print(f"成功连接到视觉服务端 {self.host}:{self.port}")
return True
except Exception as e:
print(f"连接视觉服务端失败: {e}")
return False
def capture_image(self):
"""拍照功能"""
try:
# 发送拍照指令
command = "capture"
self.client_socket.send(command.encode('utf-8'))
# 接收响应
response = self.client_socket.recv(1024).decode('utf-8').strip()
if response == "NG":
print("拍照失败: 相机无法拍摄")
return None
else:
try:
image_id = int(response)
image_url = f"http://{self.host}:8080/imageFile/{image_id}.jpg"
print(f"拍照成功! 图片ID: {image_id}")
print(f"图片查看地址: {image_url}")
return image_id
except ValueError:
print(f"无效的响应: {response}")
return None
except Exception as e:
print(f"拍照过程中发生错误: {e}")
return None
def capture_and_recognize(self, camera_pose, hand_eye):
"""
拍照并识别功能
参数:
camera_pose: 相机姿态 [x, y, z, rx, ry, rz] (单位: mm, 度)
hand_eye: 相机手眼参数 [x, y, z, rx, ry, rz] (单位: mm, 度)
"""
try:
# 组合请求参数
params = list(camera_pose) + list(hand_eye)
request_str = " ".join(str(x) for x in params)
# 发送请求
self.client_socket.send(request_str.encode('utf-8'))
# 接收响应
response = self.client_socket.recv(1024).decode('utf-8').strip()
if response == "NG":
print("拍照识别失败")
return None
else:
try:
# 解析返回的姿态数据
pose_data = [float(x) for x in response.split()]
print(f"识别成功! Mark板姿态: {pose_data}")
# 提取推荐的x, y, rz参数
if len(pose_data) >= 6:
x, y, z, rx, ry, rz = pose_data
print(f"推荐使用参数 - X: {x:.3f}m, Y: {y:.3f}m, Rz: {rz:.3f}rad")
return pose_data
except ValueError as e:
print(f"解析响应数据失败: {e}, 原始响应: {response}")
return None
except Exception as e:
print(f"拍照识别过程中发生错误: {e}")
return None
def close(self):
"""关闭连接"""
if hasattr(self, 'client_socket'):
self.client_socket.close()
print("连接已关闭")
# 使用示例
if __name__ == "__main__":
# 创建视觉客户端实例
vision_client = VisionClient()
try:
# 连接服务端
if vision_client.connect():
# 示例1: 简单拍照
print("\n=== 示例1: 简单拍照 ===")
image_id = vision_client.capture_image()
# 示例2: 拍照并识别
print("\n=== 示例2: 拍照并识别 ===")
# 相机姿态: [x, y, z, rx, ry, rz] (mm, 度)
camera_pose = [0.5, 0.5, 0.3, 180, 0, 0] # 注意高度设置为300mm
# 手眼参数: [x, y, z, rx, ry, rz] (mm, 度)
hand_eye = [0, 0, 0.1, 0, 0, -90]
result = vision_client.capture_and_recognize(camera_pose, hand_eye)
except Exception as e:
print(f"示例运行出错: {e}")
finally:
vision_client.close()
通讯示例输出
成功连接到视觉服务端 192.168.30.200:9527
=== 示例1: 简单拍照 ===
拍照成功! 图片ID: 123
图片查看地址: http://192.168.30.200:8080/imageFile/123.jpg
=== 示例2: 拍照并识别 ===
识别成功! Mark板姿态: [0.0, 0.5, 0.5, 0.0, 0.0, 0.0]
推荐使用参数 - X: 0.000m, Y: 0.500m, Rz: 0.000rad
连接已关闭
注意事项
请确保网络连接正常,能够访问192.168.30.200地址
拍照功能可能因相机状态返回NG,调用方需做好错误处理
拍照并识别功能需要严格按格式发送参数,参数顺序和单位需正确
必须严格遵守拍照高度要求,否则可能影响识别精度
建议使用推荐的码板规格,其他规格可能影响识别效果
姿态数据建议优先使用x、y、rz参数,其他姿态参数仅供参考
Python示例代码需要socket库支持,通常为Python标准库内置
最后编辑:李国伟 更新时间:2025-11-26 16:46