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
连接已关闭

注意事项

  1. 请确保网络连接正常,能够访问192.168.30.200地址

  2. 拍照功能可能因相机状态返回NG,调用方需做好错误处理

  3. 拍照并识别功能需要严格按格式发送参数,参数顺序和单位需正确

  4. 必须严格遵守拍照高度要求,否则可能影响识别精度

  5. 建议使用推荐的码板规格,其他规格可能影响识别效果

  6. 姿态数据建议优先使用x、y、rz参数,其他姿态参数仅供参考

  7. Python示例代码需要socket库支持,通常为Python标准库内置

作者:李国伟  创建时间:2025-11-25 15:54
最后编辑:李国伟  更新时间:2025-11-26 16:46