Streams (experimentell)
| Streams sind experimentell: im Cam Driver ab v2.3.0, in AI Object Matching ab v2.2.0 und in Calibration ab v2.1.0. Ihre Knoten können sich noch ändern. Prüfen Sie einen Stream mit Ihrer Kamera und Ihrem Netz, bevor Sie sich darauf verlassen. |
Ein Stream verarbeitet jedes Element, das eine Quelle erzeugt, sobald es eintrifft: Kamerabilder in AI Object Matching, einem Finder oder einem Code Reader; Detektionen oder Punkte in Calibration. Es gibt keinen Request pro Element. Der Produzent sendet jedes Element, ein Konsument verarbeitet es und sendet sein Ergebnis. Produzent und Konsument arbeiten gleichzeitig; deshalb ist ein Stream schneller als ein Execute-Aufruf pro Element.
Produzenten und Konsumenten
| App | Rolle |
|---|---|
Cam Driver |
erzeugt Bilder auf |
AI Object Matching |
konsumiert Bilder, erzeugt Detektionen auf |
Template Finder, Object Finder, Area Detector, Text Reader |
konsumieren Bilder, erzeugen ihre Ergebnisse auf |
DMC, QR, Aztec und Barcode Reader |
konsumieren Bilder, erzeugen Codes auf |
Calibration |
konsumiert Punkte oder das Ergebnis einer anderen App, erzeugt 3D-Punkte auf
|
Ein Konsument hat eine Quelle. Um zwei Kameras zu verarbeiten, verwenden Sie zwei Module.
Der Produzent: der Cam Driver
Alle Adressen beginnen mit hdvisionsystems/lumiscan-cam-driver/<camera>/.
| Adresse | Typ | Bedeutung |
|---|---|---|
|
Methode |
wendet die folgenden Eingaben gemeinsam an |
|
bool |
veröffentlicht, solange |
|
bool |
schreibt jedes Bild zusätzlich in die normale Ausgabe |
|
string |
das Tag auf seinen Bildern; wird in der Moduldatei gespeichert |
|
FlatBuffers |
jedes Bild, gesendet |
|
bool |
der Stream läuft |
|
uint64 |
Zähler |
Der Cam Driver triggert die Kamera nie von selbst. Ein Bild kommt, wenn die Kamera per Hardware oder per
control/trigger/execute getriggert wird oder wenn ihr Trigger-Modus aus ist und sie frei läuft. Der Stream
benötigt eine verbundene Kamera; connect-camera, disconnect-camera und reset stoppen einen laufenden Stream.
Siehe das Handbuch des Cam Driver.
Ein Konsument
Dieselben Knoten in jedem Konsumenten, unter <module>/ (bei einem Code Reader: unter <app>/):
| Adresse | Typ | Bedeutung |
|---|---|---|
|
Methode |
prüft, speichert und wendet die folgenden Eingaben an |
|
bool |
Stream-Modus |
|
string |
die eine Quelle: der Stream-Ordner des Produzenten |
|
string |
das Tag auf der Ausgabe dieses Moduls; leer: die Modul-ID |
|
uint32 |
wie viele Elemente warten dürfen |
|
bool |
schreibt jedes Ergebnis zusätzlich in die normale Ausgabe |
|
Methode |
entfernt die Quelle, die angegeben ist durch … |
|
string |
… diese Adresse; eine andere Adresse wird abgelehnt |
|
schreibgeschützt |
was angewendet und gespeichert ist: |
|
bool |
der Stream läuft |
|
FlatBuffers |
jedes Ergebnis, gesendet |
|
uint64 |
Zähler, alle 250 ms veröffentlicht, bei jedem Start zurückgesetzt |
Die Finder und Code Reader haben außerdem control/subscribe/output/stream/last-failure: warum das letzte
Element fehlgeschlagen ist.
Was die Quelle eines Konsumenten enthalten muss, steht als JSON Schema auf
hdvisionsystems/<app>/system/meta/subscription-schema.
Stream starten und stoppen
Die Eingaben wirken erst bei execute. enable allein zu schreiben startet nichts.
-
Starten Sie den Produzenten: Schreiben Sie an der Kamera
control/publish/input/enable=trueund rufen Sie danncontrol/publish/executeauf. Warten Sie, biscontrol/publish/output/stream/activetrueist. -
Schreiben Sie am Konsumenten
control/subscribe/input/address, zum Beispielhdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream. -
Schreiben Sie optional
tag,queue-sizeundkeep-latest-output. -
Schreiben Sie
control/subscribe/input/enable=trueund rufen Sie danncontrol/subscribe/executeauf. -
Warten Sie, bis
control/subscribe/output/stream/activetrueist. Ab dann treffen Ergebnisse ein. -
Zum Stoppen schreiben Sie
enable=falseund rufen erneutexecuteauf.
Gut zu wissen:
-
Der Stream-Modus ist ein Pegel, kein Befehl: Der Stream läuft, solange das angewendete
enabletrueist. -
Die Eingaben sind mit den angewendeten Werten vorbelegt; ändern Sie also nur, was Sie brauchen, und rufen Sie
executeauf. -
Ein Konsument kann vor seinem Produzenten gestartet werden. Ergebnisse treffen ein, sobald Elemente eintreffen. Ein fehlgeschlagenes Abonnement wird alle 5 s erneut versucht, solange der Stream läuft.
-
Eine andere Adresse ersetzt die Quelle.
-
enable=trueohne Adresse wird abgelehnt (Rejected, ctrlXDL_INVALID_VALUE), und nichts ändert sich.
Calibration als Konsument
Auch Calibration erhält einen Stream-Ordner, und ihre Moduldatei gibt an, welchen Knoten darin sie lesen und wie
sie ihn in Punkte umwandeln soll: einen onEntry-Schritt im Abschnitt stream. Um die Objekte zu lesen, die AI
Object Matching findet, nennt der Schritt den Knoten result, die Liste darin und die Felder, die den Punkt
bilden. Ohne einen solchen Schritt liest Calibration ihre Quelle als einfaches Zahlen-Array, wie eine
SPS-Variable sie liefert. Siehe das Handbuch von Calibration.
Neuestes Ergebnis behalten
Mit eingeschaltetem keep-latest-output wird jedes Element - bzw. jedes Ergebnis - zusätzlich in die normale
Ausgabe des Moduls geschrieben, so wie ein Aufruf auf Anfrage es schreiben würde, und output/package-identifier
wird gezählt. Eine SPS, die die normale Ausgabe liest, sieht dann das neueste Stream-Ergebnis. Ist es
ausgeschaltet, veröffentlicht der Stream nur unter …/stream/…, und die normale Ausgabe behält das Ergebnis
des letzten Aufrufs.
Stream-Ergebnisse sind FlatBuffers-Datensätze. Für eine SPS schalten Sie keep-latest-output in dem Modul ein,
dessen Ergebnis Sie benötigen, und lesen dessen einfache Ausgabeknoten. Calibration veröffentlicht außerdem
plain-points: alle Punkte eines Ergebnisses in einem float32-Array x0, y0, z0, x1, …, ohne Lineage.
Was bei einem Neustart erhalten bleibt
| Was | Erhalten | Wie |
|---|---|---|
Der Stream eines Konsumenten ( |
ja |
|
Der Stream des Cam Driver |
nein |
nur sein |
Die Kameraverbindung |
nein |
führen Sie nach jedem Start den Handshake |
Lässt sich eine Datei nicht schreiben, antwortet execute mit CreationFailed (ctrlX DL_CREATION_FAILED),
und nichts ändert sich.
Der Abschnitt stream der Einstellungsdatei eines Konsumenten:
"stream": {
"enable": false,
"address": "hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream",
"tag": "",
"queueSize": 1,
"keepLatestOutput": false,
"onEntry": []
}
Warteschlangengröße
| App | Bereich | Standard | Wenn die Warteschlange voll ist |
|---|---|---|---|
AI Object Matching, die Finder, die Code Reader |
1 bis 64 |
1 |
ein neues Element verdrängt das älteste |
Calibration |
1 bis 4096 |
64 |
ein neues Element verdrängt das älteste wartende |
Ein Element, das aus einer vollen Warteschlange verdrängt wird, zählt als übersprungen.
Streams und einzelne Operationen
Während ein Stream läuft, werden Operationen abgelehnt, mit denen er kollidieren würde:
-
Cam Driver:
capture/readyistfalse;capture/executeantwortet mitInvalidOperationMode(ctrlXDL_INVALID_OPERATION_MODE). Wiederholen Sie nicht in einer Schleife. Um während des Streamings einzelne Bilder aufzunehmen, lesen Sie…/stream/frameder Kamera, oder schalten Siekeep-latest-outputein und lesen Sieoutput/image, wenn sichoutput/package-identifierändert. -
AI Object Matching:
inference/readyistfalse; ein Handshake-Request endet mit Status100002. -
Finder: Eine Methode, die aufgerufen wird, während ein Bild verarbeitet wird, wird als belegt abgelehnt.
-
Code Reader:
executeund der Stream behindern sich nicht; jedes Bild wird von einem eigenen Detektor gelesen.
Wird der Stream des Cam Driver gestoppt, verbindet er die Kamera neu, damit capture wieder funktioniert; das
dauert etwa zwei Sekunden. Warten Sie, bis capture/ready true ist. Wechseln Sie so selten wie möglich zwischen
Stream und Capture.
Die Kette verfolgen
Jede App zählt unter …/stream/statistics/, was sie empfängt. Der erste Zähler, der nicht steigt, zeigt, wo eine
Kette stehen bleibt:
| App | Zähler |
|---|---|
Cam Driver |
|
AI Object Matching |
|
Finder, Code Reader |
|
Calibration |
|
lost- zählt Elemente, die nie eingetroffen sind, ermittelt aus Lücken in den Sequenznummern; skipped-
Elemente, die aus einer vollen Warteschlange verdrängt wurden; failed-* Elemente, die nicht verarbeitet werden
konnten.
Das Ergebnis: ein Envelope mit seiner Lineage
Jedes Stream-Ergebnis ist ein Envelope: zuerst die Lineage (Herkunftskette) des Elements, dann die Nutzdaten - dasselbe Ergebnis wie die Nicht-Stream-Ausgabe der App, mit einigen Unterschieden, die im Handbuch der jeweiligen App beschrieben sind.
Die Lineage listet jedes Modul auf, das das Element durchlaufen hat. Jeder Schritt hat:
| Feld | Bedeutung |
|---|---|
|
die Data-Layer-Adresse des Moduls, zum Beispiel |
|
das Tag des Moduls, oder seine Modul-ID, wenn das Tag leer ist |
|
wann der Stream des Produzenten gestartet wurde (µs seit der Epoche); ein neuer Lauf zählt wieder ab 1 |
|
die Nummer des Elements im Lauf: 1, 2, … ohne Lücken, eine Lücke ist also ein verlorenes Element |
|
wann der Schritt ausgeführt wurde |
|
der Hash der Einstellungen, mit denen der Schritt ausgeführt wurde, wie auf |
|
wie lange der Schritt gedauert hat |
|
die eigene Nummer des Produzenten für das Element, zum Beispiel die Block-ID der Kamera |
Die Lineage enthält höchstens 16 Schritte: den Ursprung und die neuesten. Ein geänderter settings_hash bedeutet,
dass sich eine Einstellung geändert hat. Jeder Hash wird einmalig in settings-history/ im Einstellungsordner der
App gespeichert, sodass sich die Einstellungen hinter einem Ergebnis nachschlagen lassen.
Um auf einem PC ein Bild durch die Kette zu verfolgen, verwenden Sie LumiScan Keryx Utilities, siehe Werkzeuge.