3. Teledyne视觉软件平台与开发环境搭建

Teledyne DALSA 的机器视觉开发体系并不是单一软件,而是由相机固件、传输标准、SDK 与上层应用框架共同组成的分层结构。理解这套分层关系,是后续做机器人视觉定位与引导的前提。本节围绕 Sapera LT、Teledyne DALSA SDK、GigE Vision/GenICam 接口配置以及机器人通信环境准备展开,目标是搭建一个“相机能被枚举、图像能被采集、参数能被读写、机器人能收到坐标”的最小可用开发环境。

一、软件平台的分层关系

从下往上,第一层是相机与镜头等物理设备;第二层是传输与协议层,GigE Vision 定义了图像、控制命令和事件如何通过千兆以太网传输,GenICam 则定义了相机功能如何以统一的方式被描述和访问;第三层是 Sapera LT,它是 Teledyne DALSA 提供的底层采集与设备管理框架,负责设备发现、采集控制、缓冲区管理和显示;第四层是 Teledyne DALSA SDK,提供 C/C++、.NET 等语言的 API 与示例,供开发者编写自己的采集与处理程序;最上层才是机器人视觉引导应用,包括标定、位姿计算和通信。

Teledyne 视觉开发环境分层结构 应用层 机器人视觉引导程序:标定、位姿计算、坐标变换、TCP/UDP 通信 SDK 层 Teledyne DALSA SDK:C/C++、.NET API、示例工程、图像处理库 采集框架层 Sapera LT:设备发现、采集控制、缓冲区管理、显示、参数读写 协议层 GigE Vision(传输/控制/事件) + GenICam(功能描述与统一访问) 设备层 GigE 工业相机、镜头、光源、网卡、交换机、机器人控制器

二、Sapera LT 与 SDK 的安装要点

Sapera LT 是采集与设备管理的基础,安装时需要注意版本与操作系统、相机固件的匹配。安装完成后,系统会注册 Sapera 设备驱动和 GigE Vision 过滤器驱动,这是相机能被枚举的关键。Teledyne DALSA SDK 通常与 Sapera LT 配套安装,安装后可在安装目录下找到示例工程,例如采集、显示、参数读写等示例,建议先编译运行官方示例,确认相机能被识别并出图,再开始编写自己的程序。

安装后需要重点确认三件事:一是设备管理器中能看到相机对应的网络适配器与 GigE Vision 设备;二是 Sapera 自带的相机配置工具能枚举到相机并显示其 IP;三是示例程序能正常采集到图像。如果相机无法枚举,优先检查网卡驱动、防火墙和 IP 网段,而不是直接怀疑相机故障。

三、GigE Vision 与 GenICam 接口配置

GigE Vision 相机通过千兆以太网与主机通信,配置的核心是 IP 地址规划。相机的 IP 必须与主机网卡处于同一网段,例如主机网卡设为 192.168.1.10,掩码 255.255.255.0,相机设为 192.168.1.20。若相机出厂为 DHCP 或 LLA(链路本地地址),需要先用 Sapera 工具或厂商工具将其改为固定 IP,避免每次上电后地址变化导致程序连接失败。

GenICam 的作用是把相机的功能抽象成统一的“特征”(Feature),例如曝光时间、增益、触发模式、像素格式等。开发者不需要针对每个型号写不同的寄存器操作,而是通过 GenICam 特征名访问。常见的特征包括:ExposureTime、Gain、TriggerMode、TriggerSource、PixelFormat、Width、Height、AcquisitionFrameRate。在 Sapera LT 中,这些特征可以通过相机对象读写,也可以通过 GenICam 浏览器查看当前值和取值范围。

// 以 Sapera LT 风格示意:设置曝光与触发
camera.SetFeatureValue("ExposureTime", 8000);   // 单位微秒
camera.SetFeatureValue("Gain", 6);              // 单位 dB
camera.SetFeatureValue("TriggerMode", "On");
camera.SetFeatureValue("TriggerSource", "Software");
camera.SetFeatureValue("PixelFormat", "Mono8");

配置时要注意参数之间的约束关系。例如提高帧率会缩短最大曝光时间,增大分辨率会降低可达到的帧率,触发模式下自由运行帧率设置可能被忽略。建议先用 GenICam 浏览器逐项确认取值范围,再写入程序,避免运行时因参数越界而报错。

四、机器人通信环境准备

视觉系统最终要把定位结果发送给机器人。通信方式常见有三种:TCP Socket、UDP 以及现场总线(如 EtherNet/IP、PROFINET)。对于开发阶段,建议先用 TCP 或 UDP 打通链路,验证坐标能被机器人接收,再考虑接入现场总线。

通信环境准备包括:确认机器人与视觉主机的 IP 在同一网段;约定数据格式,例如以字符串发送 X,Y,Angle\n,或使用固定长度的二进制结构;约定坐标系与单位,例如毫米和度,并明确正方向定义;约定握手方式,例如视觉发送后机器人回 OK,或机器人主动请求。下面是一个简单的 TCP 服务端示例,用于向机器人发送定位结果:

# Python 示例:视觉侧 TCP 服务端发送坐标
import socket

HOST, PORT = "192.168.1.10", 6000
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind((HOST, PORT))
srv.listen(1)
print("等待机器人连接...")
conn, addr = srv.accept()
print("机器人已连接:", addr)

x, y, angle = 123.45, -67.89, 12.3   # 示例数据,单位 mm / 度
msg = f"{x:.2f},{y:.2f},{angle:.2f}\n"
conn.sendall(msg.encode("utf-8"))
print("已发送:", msg.strip())
conn.close()

机器人侧需要编写对应的客户端或通信程序,解析收到的字符串并转换为机器人坐标。调试时建议先用网络调试助手模拟机器人,确认视觉侧能稳定发送,再接入真实机器人。若通信失败,按“物理链路—IP 连通性—端口监听—数据格式”的顺序排查,而不是直接修改程序逻辑。

五、最小可用环境验收

完成上述配置后,可以用一个最小闭环来验收:相机被 Sapera 枚举并显示 IP;示例程序能连续采集图像;通过 GenICam 特征能修改曝光并观察到图像亮度变化;视觉程序能计算一个简单目标的位置;通过 TCP 把坐标发送到网络调试助手并看到正确格式。这个闭环打通后,后续的标定、手眼关系和引导逻辑才有稳定的运行基础。

建议在开发机上固定相机 IP、关闭无关防火墙规则、单独使用一块千兆网卡连接相机,避免与办公网络混用导致丢包或枚举不稳定。
修改相机 IP 或触发模式后,务必重新枚举设备并确认参数已生效;部分参数在采集过程中不可修改,需要先停止采集再设置。