Mehrere Kameras verwenden
Ab v2.0.0 kann eine Installation mehrere Kameras betreiben. Jede Kamera ist ein Modul mit eigener Konfigurationsdatei und eigener Adresse auf dem Data Layer, und jede angeschlossene Kamera benötigt eine eigene Lizenz. Siehe Neue Kamera-Einstellungsdateien anlegen.
Gegenüber einer Installation mit einer Kamera kommt eine gemeinsam genutzte Ressource hinzu: Alle Kameras senden ihre Bilder über eine Netzwerkverbindung an einen Port des Geräts, auf dem der Cam Driver läuft. Diese Verbindung ist die Grenze. Diese Seite beschreibt, wie Sie das Netzwerk aufbauen und wie Sie sicherstellen, dass niemals zwei Kameras gleichzeitig ein Bild übertragen.
Warum mehrere Kameras geplant werden müssen
Eine GigE-Vision-Kamera verteilt ein Bild nicht über die Zeit bis zum nächsten Bild. Sie sendet das gesamte Bild als Burst von UDP-Paketen mit der vollen Übertragungsrate der Verbindung und ist danach still. Eine 1-Gbit/s-Verbindung trägt einen solchen Burst zur Zeit.
Beginnt eine zweite Kamera ihren Burst, während der erste noch läuft, erhalten der Switch und der Netzwerk-Port des Hosts mehr Daten, als sie weiterleiten können. Die überzähligen Pakete werden verworfen. GigE Vision hat keine Wiederholung, die einen ganzen Burst retten kann, das Bild kommt also unvollständig an und der Cam Driver verwirft es:
-
control/status/codeist-10004(couldNotCaptureImage), und über den Handshake bleibtcapture/readyfalse, bis einreseterfolgreich ist. -
Das Protokoll enthält eine Zeile wie
Error: Image is incomplete with filled size 1076592 / 1259712 = 85 %.
Eine einzelne Kamera hat die Verbindung für sich allein und zeigt das selten. Deshalb kann eine Installation, die mit einer Kamera funktioniert, ausfallen, sobald eine zweite hinzukommt - ohne dass sich an Kameras, Verkabelung oder Beleuchtung etwas geändert hat.
Zwei Maßnahmen verhindern das, und beide werden benötigt:
-
Die Verbindung trägt ausschließlich Kameradaten - siehe Hardwareaufbau.
-
Die Kameras übertragen nicht gleichzeitig - siehe Triggerquelle. Wie Sie das erreichen, hängt von der Triggerquelle ab.
Hardwareaufbau
Switch und Kabel
- Jumbo Frames
-
Der Switch, jeder Kabelweg und der Netzwerk-Port des Hosts müssen Jumbo Frames unterstützen, und die MTU-Größe muss auf jedem Gerät im Pfad auf 8000 oder 9000 gesetzt sein. Ein großes Paket trägt etwa sechsmal so viele Bilddaten wie die Voreinstellung von 1500 Byte, was den Overhead pro Paket und die Zahl der Pakete verringert, die verloren gehen können. Setzen Sie
packetSizedes Cam Drivers auf die MTU-Größe, die der Pfad tatsächlich unterstützt; ein Paket, das größer ist als die kleinste MTU im Pfad, wird verworfen. Siehe Änderung der MTU-Größe. - Übertragungsrate
-
Verwenden Sie an jedem Port 1 Gbit/s oder mehr. Der Port des Hosts ist der Engpass, denn alle Kameras teilen ihn sich.
- Kabel
-
Verwenden Sie "Foil Shielded Twisted Pair"-Kabel. Im Schaltschrank zeigt sich schlechte Schirmung als gelegentlich unvollständige Bilder, die genau wie ein Bandbreitenproblem aussehen.
Keine SPS-Daten im Kameranetz
Verwenden Sie einen Switch, der ausschließlich Kameradaten trägt: die Kameras und den einen Port des Hosts, auf dem der Cam Driver die Bilder empfängt. Schließen Sie die SPS, den Feldbus und das übrige Anlagennetz an einen anderen Port des Hosts an.
Das ist in beide Richtungen wichtig:
-
Ein Bild-Burst füllt die Verbindung für die wenigen Millisekunden, die er dauert, vollständig aus. Alles andere auf dieser Verbindung wird so lange verzögert, was für ein echtzeitfähiges oder zyklisches Protokoll schädlich ist.
-
Umgekehrt ist jedes Telegramm, das das Anlagennetz auf die Kameraverbindung legt, Bandbreite, die dem Burst fehlt - unvollständige Bilder werden dadurch wahrscheinlicher.
Triggerquelle
Die Kameras dürfen nicht gleichzeitig übertragen. Wie Sie das erreichen, hängt davon ab, was sie auslöst.
| Triggerquelle | Vorgehen |
|---|---|
Software-Trigger ( |
Nehmen Sie eine Kamera nach der anderen auf und starten Sie die nächste Kamera erst, wenn das vorherige Bild angekommen ist. Siehe Software-Trigger: eine Kamera nach der anderen. |
Hardware-Trigger |
Alle Kameras belichten prinzipbedingt im selben Moment, deshalb müssen die Kameras selbst ihre
Pakete verschränken. Berechnen und setzen Sie |
Software-Trigger: eine Kamera nach der anderen
Der Cam Driver hat keinen synchronisierten Trigger für mehrere Kameras. Jedes Modul löst seine eigene Kamera aus, sobald sein eigener Request eintrifft. Der Client bestimmt also, wann welche Kamera überträgt - und der Client muss die Aufnahmen nacheinander ausführen.
| Führen Sie die Capture-Handshakes zweier Kameras niemals so aus, dass beide Kameras gleichzeitig übertragen. Eine Aufnahme muss abgeschlossen sein, bevor der nächsten Kamera das Capture aufgetragen wird. |
Eine Aufnahme startet, wenn capture/request wieder auf false fällt, und sie ist abgeschlossen,
wenn capture/ready wieder auf true steht. Zwei Kameras können daher gemeinsam vorbereitet und
nacheinander freigegeben werden:
-
Setzen Sie
camera1capture/requestauftrue. -
Warten Sie, bis
camera1capture/readyfalseist. -
Setzen Sie
camera2capture/requestauftrue. -
Warten Sie, bis
camera2capture/readyfalseist. -
Setzen Sie
camera1capture/requestauffalse. Kamera 1 belichtet und überträgt jetzt. -
Warten Sie, bis
camera1capture/readywiedertrueist. Das Bild von Kamera 1 ist angekommen und die Verbindung ist frei. -
Setzen Sie
camera2capture/requestauffalse. Kamera 2 belichtet und überträgt jetzt. -
Warten Sie, bis
camera2capture/readywiedertrueist.
%% Zwei Kameras werden nacheinander mit dem Software-Trigger aufgenommen. Mermaid rendert es im Browser; bearbeiten und Vorschau unter https://mermaid.live sequenceDiagram autonumber participant C as Client (SPS oder Programm) participant M1 as Modul camera1 participant M2 as Modul camera2 M1-->>C: capture/ready = true M2-->>C: capture/ready = true C->>M1: camera1 capture/request = true M1-->>C: camera1 capture/ready = false C->>M2: camera2 capture/request = true M2-->>C: camera2 capture/ready = false C->>M1: camera1 capture/request = false Note over M1: Kamera 1 belichtet und überträgt<br/>die Verbindung trägt nur dieses Bild M1-->>C: camera1 capture/ready = true C->>M2: camera2 capture/request = false Note over M2: Kamera 2 belichtet und überträgt<br/>die Verbindung trägt nur dieses Bild M2-->>C: camera2 capture/ready = true
Bei mehr als zwei Kameras erweitern Sie dasselbe Muster: alle vorbereiten, dann eine nach der anderen freigeben und abwarten.
Diese Abfolge setzt die Standardeinstellung von handshakeEdge voraus, FALLING_EDGE. Mit
RISING_EDGE startet eine Aufnahme, sobald capture/request true ist, sodass schon das Vorbereiten
einer Kamera sie übertragen lässt. Führen Sie dann je Kamera einen vollständigen Capture-Handshake
aus: Warten Sie, bis ihr capture/ready wieder true ist, bevor Sie capture/request der nächsten
Kamera setzen. Siehe
Wann eine Funktionalität läuft.
|
Wenn Sie statt des Handshakes die execute-Methode verwenden, gilt dieselbe Regel, und sie ist
einfacher einzuhalten: <Kameraname>/control/capture/execute kehrt erst zurück, wenn die
Aufnahme abgeschlossen ist. Rufen Sie die Methode also für eine Kamera auf, warten Sie auf ihre
Rückkehr und rufen Sie sie erst dann für die nächste Kamera auf. Rufen Sie capture/execute nicht
für mehrere Kameras parallel auf. Siehe
Eine Methode ausführen.
| Aufnahmen nacheinander kosten mehr Zeit als Aufnahmen, die sich überlappen. Reicht die Zykluszeit nicht aus, verwenden Sie einen Hardware-Trigger mit den folgenden Bandbreiteneinstellungen: Die Kameras belichten dann im selben Moment und nur die Übertragung wird auseinandergezogen. |
Hardware-Trigger: Bandbreite zwischen den Kameras aufteilen
Beim Hardware-Trigger belichten alle Kameras im selben Moment - meist ist das der Grund, ihn zu verwenden -, die Aufnahmen lassen sich also nicht nacheinander ausführen. Stattdessen werden die Übertragungen verschränkt: Jede Kamera lässt zwischen ihren eigenen Paketen eine Lücke, die für die Pakete der anderen Kameras ausreicht, und jede Kamera beginnt zu einem anderen Zeitpunkt. So wechseln sich die Pakete der Kameras auf der Verbindung ab, statt zu kollidieren.
Zwei GigE-Vision-Features leisten das. Beide sind Kamera-Features, keine Einstellungen des Cam Drivers:
| Feature | Bedeutung |
|---|---|
|
Paketverzögerung. Die Lücke, die die Kamera zwischen zwei Paketen desselben Bildes lässt. |
|
Bildübertragungsverzögerung. Wie lange die Kamera wartet, nachdem sie übertragungsbereit ist, bevor sie das erste Paket sendet. Damit werden die Kameras gegeneinander versetzt. |
Schritt 1: Zeit für ein Paket
Ermitteln Sie zuerst, wie lange ein Paket die Verbindung belegt.
Byte pro Sekunde = Übertragungsrate / 8 Zeit pro Byte = 1 s / Byte pro Sekunde Paket auf der Leitung = packetSize + Ethernet-Overhead Paketzeit = Paket auf der Leitung x Zeit pro Byte P = Paketzeit + Puffer (Puffer: 10 % bis 30 % der Paketzeit)
Der Puffer fängt den restlichen Rahmen-Overhead und die Latenz des Switches auf. Kleinere Werte lassen keine Reserve, deutlich größere verschenken Bandbreite.
Für eine 1-Gbit/s-Verbindung und packetSize 9000:
| Größe | Wert |
|---|---|
Übertragungsrate |
1 Gbit/s = 125.000.000 Byte/s |
Zeit pro Byte |
8 ns |
Paket auf der Leitung |
etwa 9014 Byte |
Paketzeit |
9014 x 8 ns = 72.112 ns |
Puffer (etwa 11 %) |
7.888 ns |
P |
80.000 ns |
Schritt 2: Werte je Kamera
Mit N Kameras und n als Nummer der Kamera (1, 2, 3 …):
GevSCPD (jede Kamera) = P x (N - 1) GevSCFTD (Kamera n) = P x (n - 1)
Jede Kamera erhält dasselbe GevSCPD: Während ein Paket dieser Kamera auf der Verbindung ist, muss
für je ein Paket der übrigen N - 1 Kameras Platz sein. GevSCFTD gibt jeder Kamera einen anderen
Vorlauf, damit nicht alle ihr erstes Paket im selben Moment auf die Verbindung legen.
| Kamera | GevSCPD |
GevSCFTD |
|---|---|---|
Kamera 1 |
80.000 ns |
0 ns |
Kamera 2 |
80.000 ns |
80.000 ns |
| Kamera | GevSCPD |
GevSCFTD |
|---|---|---|
Kamera 1 |
240.000 ns |
0 ns |
Kamera 2 |
240.000 ns |
80.000 ns |
Kamera 3 |
240.000 ns |
160.000 ns |
Kamera 4 |
240.000 ns |
240.000 ns |
Schritt 3: Verbleibende Bildrate prüfen
Die Verzögerungen bremsen jede Kamera. Prüfen Sie, ob das Ergebnis noch zu Ihrer Zykluszeit passt und ob der Trigger nicht schneller gesendet wird, als eine Kamera liefern kann.
Für ein Bild von 960 x 1280 Pixeln in Mono8 (1.228.800 Byte), packetSize 9000 und zwei Kameras:
| Größe | Wert |
|---|---|
Bildgröße |
960 x 1280 x 1 Byte = 1.228.800 Byte |
Bilddaten pro Paket |
etwa 8.992 Byte |
Pakete pro Bild |
1.228.800 / 8.992 = 137 Pakete |
Abstand zwischen zwei Paketen |
72.112 ns + 80.000 ns = 152.112 ns |
Übertragung eines Bildes |
137 x 152.112 ns = etwa 20,8 ms |
Höchste Bildrate je Kamera |
etwa 48 Bilder pro Sekunde |
Beide Kameras erreichen das gleichzeitig, es kommen also etwa alle 20,8 ms zwei Bilder an. Dieselbe Kamera allein und ohne Verzögerungen würde ein Bild in etwa 9,9 ms übertragen und etwa 101 Bilder pro Sekunde erreichen: Zwei Kameras zusammen kosten ungefähr so viel Gesamtzeit wie zwei Bilder nacheinander, aber ohne Kollisionen.
Wo die Werte gesetzt werden
Der Cam Driver setzt GevSCPSPacketSize und GevSCPD aus der Kamerakonfiguration:
| Einstellung in der Kamerakonfigurationsdatei | Knoten auf dem Data Layer | Kamera-Feature |
|---|---|---|
|
|
|
|
|
|
Beide Knoten sind schreibgeschützt, solange die Kamera verbunden ist. Setzen Sie sie daher in der Kamerakonfigurationsdatei oder auf dem Data Layer, bevor Sie die Kamera verbinden.
Für GevSCFTD gibt es keine eigene Einstellung. Setzen Sie es je Kamera über die Feature-Knoten
der Kamera unter hdvisionsystems/lumiscan-cam-driver/<Kameraname>/features oder in einer
Feature-Datei, die in cameras[].featureFiles des Moduls eingetragen ist und bei jedem Verbinden
der Kamera angewendet wird. Siehe
GenICam-Features.
Der Wert von packetDelay_us wird trotz des Namens unverändert an GevSCPD der Kamera
übergeben. GevSCPD und GevSCFTD werden in der jeweiligen Einheit der Kamera gezählt, die sich
zwischen Herstellern unterscheidet: Manche Kameras zählen in Nanosekunden, viele in Ticks des
Zeitstempelzählers. Lesen Sie GevTimestampTickFrequency aus den Feature-Knoten der Kamera und
rechnen Sie um: Ticks = Nanosekunden x GevTimestampTickFrequency / 1.000.000.000. Bei den
verbreiteten 125.000.000 Hz (8 ns pro Tick) ergeben die obigen 80.000 ns den Wert 10.000. Ziehen
Sie die Dokumentation des Kameraherstellers heran und prüfen Sie den geschriebenen Wert, indem Sie
das Feature zurücklesen.
|
Weitere Hinweise
-
Verwenden Sie eine Flanke als Trigger (
TriggerActivationaufRisingEdge,FallingEdgeoderAnyEdge). Ein Pegel (LevelHigh,LevelLow) erzeugt die hier beschriebene Verschränkung nicht. -
Halten Sie die Triggerfrequenz unter der in Schritt 3 berechneten Bildrate. Die Verzögerungen senken sie, und eine Kamera, die schneller getriggert wird, als sie übertragen kann, verwirft Bilder.
-
Die Rechnung setzt voraus, dass alle Kameras dieselbe Bildgröße, dasselbe Pixelformat und dieselbe
packetSizeverwenden. Unterscheiden sie sich, berechnen SiePaus dem größten Paket und prüfen Sie das Ergebnis mit der langsamsten Kamera. -
Sind Bilder weiterhin unvollständig, erhöhen Sie den Puffer aus Schritt 1 in Richtung 30 % oder verkleinern Sie das Bild über die ROI der Kamera.
Das Verfahren folgt der Application Note Bandwidth sharing in multi-camera systems von LUCID Vision Labs, die es für deren Kameras beschreibt.