Sincronización de cámaras GigE Vision mediante PTP

Sincronizar relojes

En aplicaciones que consisten en procesar material gráfico de varias cámaras el momento o la secuencia temporal correcta de la captura de las imágenes resultan a menudo decisivos para el tratamiento posterior. Si se transmite una marca temporal, se puede crear una referencia temporal con el resto de datos de imagen. Sin embargo, es esencial que las cámaras tengan exactamente la misma base temporal. Con el "Precision Time Protocol" (PTP) las cámaras GigE Vision de IDS a partir del firmware 2.2. se pueden sincronizar fácilmente.

Sincronización de cámaras GigE Vision mediante PTP

Precision Time Protocol (PTP) es un estándar de sincronización (IEEE1588) con el que se pueden sincronizar temporalmente dispositivos conectados en red. Las cámaras que soportan este estándar intercambian mensajes de sincronización con un reloj máster en ciclos definidos. Con la información que ofrece la marca temporal sobre cada momento de envío y recepción los contadores internos de las cámaras pueden calibrarse de forma muy exacta y mantenerse sincronizadas.

Con la versión de firmware 2.2, todas las cámaras GigE Vision de IDS serán compatibles con PTP.

PTP no ha sido definido para conexiones USB, por lo que esta nota de aplicación se refiere solo a las cámaras GigE Vision de IDS.

La marca de tiempo definida en IEEE1588 establece como fecha de inicio (epoch) las 00:00 horas del 1 de enero de 1970 y ofrece una precisión de 1 ns (1 GHz). La exactitud de la sincronización temporal entre los dispositivos en red se encuentra en el rango de los microsegundos debido a las inexactitudes en las latencias y los tiempos de ejecución de las señales.

Ejemplos de aplicación del PTP

El PTP es una tecnología de base para diversas aplicaciones con referencia temporal de las imágenes. Se puede crear de formas distintas dependiendo de las necesidades de la aplicación y de la complejidad de la infraestructura de la red:

1. Sincronización con marca de tiempo relativa

En este caso todas las cámaras se encuentran conectadas en una red. Una cámara ejerce de master y el resto de slave. Las marcas temporales de todas las cámaras slave se sincronizan con la cámara master. Las cámaras no muestran una marca de tiempo absoluta (tiempo real) ni pueden dispararse sincrónicamente sin un esfuerzo adicional.

Ventajas:

  • Las marcas de tiempo relativas crean una asignación temporal de las capturas de imagen de todas las cámaras de la aplicación. Definen qué imagen ha sido la primera y cuál es la diferencia temporal entre las imágenes de las distintas cámaras.
  • Las marcas de tiempo relativas se pueden generar sin coste ni esfuerzo adicionales para infraestructuras de redes específicas.

2. Sincronización con marca de tiempo con tiempo real

En este caso las cámaras en red se sincronizan con un master externo. Este master PTP puede ser una tarjeta de red que soporta la denominada "hardware-timestamping". Sin el soporte del hardware la exactitud de la sincronización se ve gravemente afectada. Además del hardware, también se necesita un software que soporte el PTP (atención: no forma parte de IDS peak).

Ventajas:

  • El contenido de las imágenes con marcas de tiempo globales (reales) puede asociarse con cualquier otra información con referencia en tiempo real más allá de los límites de la aplicación.
  • Las imágenes pueden volver a utilizarse para otras aplicaciones o análisis con referencia en tiempo real o global.

Uso del PTP: "Sincronización relativa"

A continuación se describe un procedimiento tipo para crear una "sincronización relativa" de marcas de tiempo entre dos cámaras en red compatibles con PTP.

Configuración del hardware

Dos cámaras IDS GigE Vision distintas (GV-526xFA-C, GV-504xCP-M) con firmware 2.2 ("compatible con PTP") se conectan en red en el mismo switch. Se utiliza un PC host adicional exclusivamente para controlar y configurar las cámaras, no interviene en la sincronización PTP de las cámaras.

Configuración del software

Todas las funciones para la configuración PTP se encuentran en el "feature-nodemap" de las cámaras bajo la categoría "PtpControl". Estas funciones están disponibles a partir de la versión 2.2 del firmware. Para configurar la sincronización PTP utilizamos el Vision Cockpit del IDS peak instalado en el PC host.

Configure una cámara como PTP master

La cámara GV-526xFA-C se debe configurar como dispositivo PTP master. Para ello debe abrir la cámara en el Vision Cockpit y activar PTP poniendo " PtpEnable " en " True ". La cámara obtiene el permiso para asumir el rol de master poniendo " PtpSlaveOnly " en " False ".

# Configure master camera
PtpEnable = True
PtpSlaveOnly = False

Configure la otra cámara como PTP slave

La GV-504xCP-M debe configurarse como dispositivo PTP slave. También aquí se activa el PTP poniendo "PtpEnable" en "True". Pero esta vez la cámara solo se limita a trabajar como dispositivo slave. Para ese fin "PtpSlaveOnly" sigue ajustado en "True".

# Configure slave camera
PtpEnable = True
PtpSlaveOnly = True

Generación de la jerarquía master-slave

La jerarquía master-slave se crea automáticamente en cuanto se han configurado un master y un slave. Para la cámara master, esto se puede definir pasando "PtpStatus" de " Listening " a "Master". En la cámara slave lo reconocerá porque "PtpStatus" pasa primero de "Listening" a "Uncalibrated" y, una vez finalizada la sincronización con la cámara master, a "Slave".

Tras crear la jerarquía master-slave de las cámaras mediante sus nuevas habilidades PTP, la "sincronización relativa" habrá finalizado.

Activar marca de tiempo

Si desea utilizar las marcas de tiempo de las cámaras ahora sincronizadas con los datos de imagen en su aplicación, tiene que activar la transmisión de las marcas de tiempo como metadatos (con los datos de los chunks).
Para ello active primero la transmisión de los datos de los chunks con la memoria gráfica poniendo "ChunkModeActive" en "True". A continuación seleccione mediante el "ChunkSelector " la información "Timestamp" y actívela mediante el selector "ChunkEnable".

# activate chunk data creation
ChunkModeActive = True
 
# enable "ChunkTimestamp"
ChunkSelector = Timestamp
ChunkEnable = True

A partir de ahora la cámara genera una marca de tiempo con cada captura y la transmite con la memoria gráfica (en los datos de los chunks) al PC host. Puede consultar los datos de los chunks y con ello la marca de tiempo con cualquier software con estándar Vision.

# image acquisition configuration for both cameras
LineSelector = Line2
LineMode = Output
LineSource = PPS
TriggerSelector = ExposureStart
TriggerMode = On
TriggerSource = Line2
 
# Limit bandwidth on both cameras
DeviceLinkThroughputLimit = 60000000
 
# Start acquisition on both cameras
Execute AcquisitionStart
Mediante las señales de disparo PPS sincronizadas las cámaras realizan la captura en el mismo momento.
Mediante las señales de disparo PPS sincronizadas las cámaras realizan la captura en el mismo momento.

Lectura de la marca de tiempo

Para procesar la marca de tiempo en su aplicación junto con el contenido de las imágenes debe leer los datos de los chunks de cada memoria gráfica. Como los datos de los chunks son una memoria payload específica del fabricante con un layout de la memoria mayormente desconocido, los distintos metadatos se leen a través del mapa de nodos. Para ello todos los metadatos existentes se transfieren de GenTL al mapa de nodos con sus nombres de nodo estandarizados, de modo que están accesibles mediante el estándar API.

Con la próxima actualización 1.1 de IDS peak que aparecerá a principios de abril podrá consultar y procesar marcas de tiempo y el resto de datos de los chunks de forma muy cómoda a través de IDS peak API. El siguiente extracto de código fuente le muestra cómo puede extraer marcas de tiempo de una memoria gráfica. Un ejemplo de código fuente completo que muestra el manejo con datos de los chunks también puede encontrarlo en el paquete de instalación de su IDS peak SDK (a partir de la versión 1.1).

// Get buffer from device's datastream
const auto buffer = m_dataStream->WaitForFinishedBuffer(5000);
 
// check buffer for chunks
if (buffer->HasChunks())
{
    // update nodemap with current chunk data
    m_nodemapRemoteDevice->UpdateChunkNodes(buffer);
 
    // Get the value of the timestamp chunk
    const auto chunktimestamp = m_nodemapRemoteDevice->FindNode<peak::core::nodes::FloatNode>("ChunkTimestamp")->Value();
}