Technische Dokumentation zur Festo Didactic AR‑App

Die Festo Didactic AR App ist NICHT zur Steuerung oder Überwachung von industriellen Anlagen gedacht oder geeignet und sollte nur für didaktische Zwecke in ungefährlichen Umgebungen eingesetzt werden!


AR-Szenen bereitstellen

AR-Szenen werden über einen Webserver bereitgestellt, bitte beachten Sie, dass https-Zertifikate nicht geprüft werden. In der App greifen Sie über die URL darauf zu.

Szene

Eine Szene enthält alle anzuzeigenden Elemente und besteht aus einer Beschreibung in Form einer XML-Datei. Der Inhalt dieser Datei kann statisch als Datei auf dem Webserver liegen oder dynamisch erzeugt werden.

Verzeichnis

Ein Verzeichnis ist eine Sammlung von Verweisen auf Szenen oder weitern Verzeichnissen. So können thematisch zusammenhängende Szenen für den Anwender einfach aufgerufen werden.

Beispiel:

<DIRECTORY name="Verzeichnis" desc="Verschiedene Szenen">
  <ENTRY url="http://srv.lan/index.xml" name="Test" desc="Eine Testszene."/>
  <ENTRY url="http://srv.lan/ofen.xml" name="Tunnelofen"/>
  <ENTRY url="http://example.net/ar/index.xml" name="Tunnelofen (internet)"/>
</DIRECTORY>

Jedes LINK-Element stellt einen Eintrag dar. Im Attribut “name” lässt sich eine Beschriftung und unter “desc” ein Beschreibungstext hinterlegen. Siehe auch: Element METADATA.

Zusammenstellung

Mehrere Szenen können in einer Szenenkombination gleichzeitig geladen werden. Sie werden sich dabei so verhalten, als wären sie eine einzige Szene.

<COMPILATION>
  <ENTRY url="./std.xml"/>
  <ENTRY url="./modules.xml"/>
  <ENTRY url="http://srv.lan/ar/index.xml"/>
</COMPILATION>

Szenen im V4 Format

Alte Szenen können weiterhin geladen werden. Folgende Unterschiede sollten beachtet werden:


Auf AR-Szenen zugreifen

Um auf AR-Szenen zuzugreifen, geben Sie in der Festo Didactic AR App die URL einer Szene, Szenenkombination oder eines Szenenverzeichnisses an. Sie können auch über den Webbrowser direkt auf Inhalte verlinken: “fdar://srv.lan/ar.xml” wird versuchen “http://srv.lan/ar.xml” zu laden.


Beispiel einer AR-Szene

Die Szenenbeschreibung enthallt die Struktur der Szene als Baum. Änderungen an Position und Skalierung einer NODE wirken sich auf alle Elemente darunter aus.

<AUGMENTATION viewlist="normal,extended">
  <VALUESERVER>
    <WEBSOCKET url="ws://nodered.local:1880/ws/data"/>
  </VALUESERVER>
  <IMGTARGET file="Marker_10.jpg">
    <NODE tx="0.14" ty="0.2">
      <COUNTER value="@anim:itemCount:1.5" intdigits="3" fractdigits="0"/>
    </NODE>
    <NODE tx="-0.1" ty="0.2" view="extended">
      <VIEWER picture="http://srv.lan/cam/now.jpg" w="0.2" h="0.3"/>
      <NODE ty="0.13" sxyz="0.1" view="extended">
        <TEXT label="@anim:time" rgba="00ff" backrgba="8088"/>
      </NODE>
    </NODE>
  </IMGTARGET>
  <IMGTARGET file="Marker_20.jpg">
    <NODE>
      <MODEL file="obj/model.obj"/>
      <NODE tx="0.15" ty="0.08" tz="0.02">
        <LINK w="0.04" h="0.02" d="0.05" refer="http://srv.lan/info.htm">
          <METADATA>
            <refer>
              <de>http://srv.lan/info-de.htm</de>
            </refer>
          </METADATA>
        </LINK>
      </NODE>
    </NODE>
  </IMGTARGET>
</AUGMENTATION>

Referenz aller Elemente einer AR-Szene

Hinweise:

AUGMENTATION

Wurzelelement

<AUGMENTATION name="Name der Szene" desc="Beschreibung der Szene" preview="preview.jpg" viewlist="normal,extended" viewswitch="false" viewdisplay="true">
</AUGMENTATION>

Attribute:

name
Der Name der Szene.
desc
Eine kurze Beschreibung der Szene.
preview
Ein Bild, das in der Vorschau angezeigt werden kann.
version
Gibt an, für welche Version die Szene gebaut wurde. Eine dreistellige Zahl. Z.B.: 550 für Version 5.5.0.
viewlist
Definiert die möglichen Ansichten innerhalb der Szene. Der Wert des Attributs ist eine Auflistung von kommagetrennten Zeichenketten. Damit können Elemente der Szene ein- und ausgeblendet werden, wenn zwischen den Ansichten gewechselt wird. (nicht animierbar)
viewswitch
Anwender können zwischen den Ansichten wechseln. (nicht animierbar)
viewdisplay
Der Name der aktuellen Ansicht wird angezeigt. (nicht animierbar)

METADATA

Unterelement von AUGMENTATION, DIRECTORY, ENTRY, COMPILATION, WEBSOCKET, TARGET, IMGTARGET, CAMERA, NODE, MODEL, TEXT, LINK, EFFECT, STREAMER, VIEWER, COUNTER, VUMETER, SIGNAL, TRANSMIT, ANIMATION und KEYFRAME.

Ermöglicht es Attribute eines Elements sprachabhängig zu setzen. Die Unterelemente des Knotens mit dem Attributnamen werden nach zweistelligen ISO-Kennungen für die jeweilige Sprache benannt. Es werden auch CDATA-Inhalte unterstützt. Die Inhalte überschreiben (falls für die aktuelle Sprache vorhanden) die Attribute des übergeordneten Elements und werden wiederum von Animationen überschrieben.
Die Inhalte müssen über die verschiedenen Sprachen nicht konsistent sein. Ein Attribut kann auch nur in einer Sprache verfügbar sein.

<TEXT>
  <METADATA fallback="en">
    <label>
	  <en><!CDATA[content]]></en>
	  <de><!CDATA[Inhalt]]></de>
	  <fr><!CDATA[contenu]]></fr>
	  <es><!CDATA[contenido]]></es>
	</label>
	<rgba>
	  <fr>0f0f</fr>
	</rgba>
  </METADATA>
</TEXT>



Attribute:

fallback
Wenn die Sprache des Geräts nicht in den verfügbaren Sprachen auftaucht, wird stattdessen die angegebene Sprache verwendet. Wenn fallback nicht angegeben ist und keine passende Sprache gefunden wird werden keine Inhalte übernommen.

VALUESERVER

Unterelement von AUGMENTATION

Enthält die Verbindungen, von denen Kenndaten bezogen werden können.

<VALUESERVER predefined="{&quot;var&quot;: 123}">
</VALUESERVER>

Attribute:

predefined
JSON-Objekt mit vordefinierten Variablen. Muss ordnungsgemäß maskiert werden. Z. B. müssen Anführungszeichen durch &quot; ersetzt werden.

WEBSOCKET

Unterelement von VALUESERVER

Zu einem Websocket eine Verbindung aufbauen, um Kenndaten empfangen zu können.

<WEBSOCKET url="ws://srv.lan:1880/ws/data"/>

Attribute:

url
Die Adresse des Web Sockets. Es ist wichtig, das richtige Protokoll anzugeben.
prefix
Alle empfangenen Variablennamen bekommen dieses Präfix vorangestellt.
transmitter
ID für das Senden von Daten. Siehe “TRANSMIT”-Element.

RESTJSON

Unterelement von VALUESERVER

Eine über HTTP erreichbare REST API nach Kenndaten abfragen. Die Antwort muss aus einem JSON Objekt mit Eigenschaften bestehen. Unterstützt nicht das Senden von Daten.

<RESTJSON url="http://srv.lan:1880/rest/data"/>

Attribute:

url
Diese URL wird alle zwei Sekunden aufgerufen.
prefix
Alle empfangenen Variablennamen bekommen dieses Präfix vorangestellt.

MQTT

Unterelement von VALUESERVER

Eine Verbindung zu einem Mqtt Broker aufbauen, um Kenndaten empfangen zu können.

<MQTT url="mqtt://srv.lan" topic="sample/topic"/>

Attribute:

url
Die Adresse des Brokers. Es ist wichtig, das richtige Protokoll anzugeben.
topic
Das zu abonnierende Thema.
prefix
Alle empfangenen Variablennamen bekommen dieses Präfix vorangestellt.
transmitter
ID für das Senden von Daten. Siehe “TRANSMIT”-Element.

IMGTARGET

Unterelement von AUGMENTATION

Ein Referenzpunkt (“Ziel”) für einen Marker.

<IMGTARGET file="marker.jpg" width="0.1" extended="true">
  ...
</IMGTARGET>
<IMGTARGET file="http://example.net/marker.jpg" width="0.08" extended="true">
  ...
</IMGTARGET>

Attribute:

file
Lädt das angegebene Bild und erzeugt dafür einen Referenzpunkt in der Szene.
width
Die Breite des Markers. Die Höhe ergibt sich aus der Bildgröße.
extended
Wenn “true” bleiben die Objekte unter dem Referenzpunkt sichtbar, auch wenn der Marker nicht mehr im Bild sichtbar ist. Die Lage der Unterobjekte kann dadurch aber instabil werden.

Hinweise:

TARGETBASE

Unterelement von AUGMENTATION

Wird die angegebene Datenbank mit Zielen laden.

<TARGETBASE file="basefile">
</TARGETBASE>

Attribute:

file
Sucht nach einer .xml und einer .dat Datei mit entsprechendem Namen um sie als Zieldatenbank zu laden.

TARGET

Unterelement von TARGETBASE

Ein Referenzpunkt für einen Marker.

<TARGET marker="Marker_10" extended="true">
  ...
</TARGET>

Attribute:

marker
Erzeugt einen Referenzpunkt für einen bestimmten Marker in der Szene. In diesem Beispiel muss der Marker “Marker_10” in der Datenbank enthalten sein.
extended
Wenn “true” bleiben die Objekte unter dem Referenzpunkt sichtbar, auch wenn der Marker nicht mehr im Bild sichtbar ist. Die Lage der Unterobjekte kann dadurch aber instabil werden.

Hinweise:

CAMERA

Unterelement von AUGMENTATION

Referenzpunkt der Kamera. Hier eingefügte Elemente sind immer sichtbar und nicht an einen Marker gebunden. Sie stehen fest vor der Kamera.

<CAMERA x="1" y="0.5" distance="0.2">
  <NODE>
    ...
  </NODE>
</CAMERA>

Attribute:

x, y
Abstände vom linken und unteren Bildschirmrand (0..1) für den Nullpunkt. Im Beispiel ist der Nullpunkt auf der rechten Bildschirmseite in der Mitte.
distance
Abstand zur Kamera. Dargestellte Objekte sollten nicht in die Kamera hineinragen, da sie sonst abgeschnitten werden.
scaleto
Die Unterelemente werden so skaliert, dass eine Bildschirmseite der Länge 1 entspricht. Bei width ist es die Breite des Bildschirms, bei height die Höhe. Bei min ist es der kleiner Wert von beiden, entsprechend bei max der Größere.

NODE

Unterelement von TARGET, IMGTARGET, CAMERA, NODE, TOUCH

Definiert einen Knoten, der wiederum Knoten oder darstellbare Elemente enthalten kann.

<NODE ry="-90.0" sxyz="3" sz="-1" view="normal" show="false" collapse="false">
</NODE>

Attribute:

tx, ty, tz
Verschiebungen in Richtung der X-, Y- oder Z-Achse
rx, ry, rz
Drehungen um die X-, Y- oder Z-Achse. Hier kann auch “CAMERA” oder ein Pfad in der Art “targetBase/target” angegeben werden, damit sich die Node in der entsprechenden Achse immer in Richtung des Ziels dreht.
sx, sy, sz
Skalierung entlang der X-, Y- oder Z-Achse
sxyz
Gleichzeitige Skalierung entlang aller Achsen.
view
Enthält eine kommagetrennte Liste aller Ansichten, in denen die im Knoten direkt enthaltenen Elemente sichtbar sind. (Untergeordnete Knoten sind davon unberührt.)
show
Versteckt den Knoten, wenn der Wert “false” ist. Voreinstellung: “true”. (Ein leerer Wert führt zur Voreinstellung.)
collapse
Versteckt den Knoten und alle Unterknoten, wenn der Wert “true” ist. Voreinstellung: “false”.

Hinweise:

TOUCH

Unterelement von TARGET, IMGTARGET, CAMERA, NODE, TOUCH

Definiert einen von Hand dreh-, skalier- und bewegbaren Knoten, der wiederum Knoten oder darstellbare Elemente enthalten kann.

<TOUCH w="0.2" d="0.2" h="0.2" rotate="true">
</TOUCH>
<TOUCH w="0.1" h="0.1" d="0.1" rotate="true" scale="true">
</TOUCH>

Attribute:

rotate
Wenn “true”, kann der Knoten mit einem Finger gedreht werden.
scale
Wenn “true”, kann der Knoten mit zwei Fingern skaliert werden.
translate
Wenn “true”, kann der Knoten mit einem Finger bewegt werden.
tx, ty, tz
Verschiebungen in Richtung der X-, Y- oder Z-Achse. Falls translate aktiv ist, werden diese Werte durch die Benutzereingabe verändert. Die Werten dürfen dann nicht animiert werden.
rx, ry, rz
Drehungen um die X-, Y- oder Z-Achse. Hier kann auch “CAMERA” oder ein Pfad in der Art “targetBase/target” angegeben werden, damit sich die Node in der entsprechenden Achse immer in Richtung des Ziels dreht. Wenn rotate aktiv ist, werden diese Werte durch die Benutzereingabe geändert. Die automatische Drehung oder Animationen dürfen dann nicht genutzt werden.
sx, sy, sz
Skalierung entlang der X-, Y- oder Z-Achse.
sxyz
Gleichzeitige Skalierung entlang aller Achsen. Wenn scale aktiv ist, wird dieser Wert durch die Benutzereingabe geändert. Der Wert darf dann nicht animiert werden.
view
Enthält eine kommagetrennte Liste aller Ansichten, in denen der Knoten und seine Unterelemente sichtbar sind.
show
Versteckt den Knoten, wenn der Wert “false” ist. Voreinstellung: “true”. (Ein leerer Wert führt zur Voreinstellung.)
collapse
Versteckt den Knoten und alle Unterknoten, wenn der Wert “true” ist. Voreinstellung: “false”.
rgb
Farbe des Interaktionsbereichs (halbtransparent).
rgba
Farbe des Interaktionsbereichs mit Transparenzangabe.
alpha
Transparenzwert des Interaktionsbereichs. (0..1, Standard: 0,1)
pulse
Intensität der Änderung des Transparenzwerts. (0..1, Standard : 0,2)
w, h, d
Breite, Höhe und Tiefe des Interaktionsbereichs.

Hinweise:

MODEL

Unterelement von NODE, TOUCH

Zeigt ein dreidimensionales Modell an.

<MODEL file="car.obj" texture="red.png"/>

Attribute:

file
3D-Modelldatei im Wavefront OBJ- (ohne Animationsunterstützung) oder GLTF/GLB-Format (mit Animationsunterstützung). (nicht animierbar)
texture
Optional: Eine Bilddatei, die als Textur für das 3D-Modell geladen wird. Ist texture nicht angegeben, wird versucht die Material-Bibliothek der OBJ-Datei zu laden und anzuwenden, die auch unterschiedliche Texturen enthalten kann. (nur für OBJ-Dateien gültig) (nicht animierbar)
filetype
Falls der Dateityp durch die Dateiendung nicht eindeutig ist, kann er hier explizit angegeben werden. Gültige Werte sind “obj”, “glb” und “gltf”.
tint
Die Farbwerte der mit “texture” angegebene Textur werden mit dieser Farbe multipliziert. Dadurch können Texturen eingefärbt werden.
clip
Wenn gesetzt wird versucht eine Animation mit dem angegebenen Namen zu finden und zu laden.
play
Wenn auf “true” gesetzt, wird versucht die ausgewählte Animation zu starten.
playmode
Der Abspielmodus für die Animation. Kann auf “once” (Standard), “loop” und “pingpong” gesetzt werden.
position
Durch Setzen kann innerhalb der Animation gespult werden. 0 entspricht dem Anfang, 1 dem Ende. Durch ständiges Setzen kann auch eine eigene Abspielgeschwindigkeit realisiert werden.

TEXT

Unterelement von NODE, TOUCH

Zeigt einen Text an.

<TEXT label="Textfeld" rgba="00ff0088" backrgba="ffffff88" border="2" width="100" />

Attribute:

rgba
Textfarbe
backrgba
Hintergrundfarbe
border
Randgröße des Hintergrunds
width
Breite des Textfeldes, bei dessen überschreiten der Text umgebrochen wird. Eine Breite von 0 (Standard) deaktiviert den Umbruch.

Hinweise:

LINK

Unterelement von NODE, TOUCH

Zeigt einen anklickbaren Bereich an, der den Standard-Webbrowser öffnet und eine angegebene URL ansteuert oder zu einer anderen Ansicht in der AR-Szene wechselt. Der Bereich ist blau transparent und pulsiert schwach.

<LINK w="0.12" h="0.06" d="0.04" refer="http://www.festo-didactic.de/" rgb="00dd00"/>

Attribute:

w, h, d
Breite, Höhe und Tiefe des Bereichs
refer
URL oder Ansicht (view:<Name der Ansicht>) ###. - rgb@ := Farbe des Interaktionsbereichs (halbtransparent).
###. – rgba := Farbe des Interaktionsbereichs mit Transparenzangabe.
###. – alpha := Transparenzwert des Interaktionsbereichs. (0..1, Standard: 0,1)
###. – pulse := Intensität der Änderung des Transparenzwerts. (0..1, Standard : 0,2)

Besonderheit:

EFFECT

Unterelement von NODE, TOUCH

Zeigt einen visuellen Effekt an.

<EFFECT type="fire" enabled="true"/>

Attribute:

type
Art des Effekts. Gültige Werte sind: “fire”. (nicht animierbar)
enabled
Aktiviert und deaktiviert den Effekt. Der Standardwert ist “true”.

STREAMER

Unterelement von NODE, TOUCH

Zeigt ein Video an. Das Video wird dabei NICHT auf dem Gerät zwischengespeichert.

<STREAMER url="video.mp4" loop="true" status="play" position="0" showpos="true" w="0.4" h="0.225"/>

Attribute:

url
Die URL des Videostreams.
status
Das Element kann nach dem Laden den Status “play” oder “pause” annehmen. “play” wird das Video bei Sichtbarkeit laufen lassen, “pause” hält es dauerhaft an.
loop
Ob das Video beim Erreichen des letzten Bildes von vorne abspielt. Falls nicht, wird das Video in den Status “pause” wechseln und die Position auf 0 setzen. Ansonsten wird das Video erneut abgespielt.
position
Die aktuelle Abspielposition im Video in Sekunden. Beim Setzen wird versucht an diese Stelle zu spulen.
showpos
Die Abspielposition im Video wird als Fortschrittsbalken im unteren Bildrand gezeigt.
w
Die Darstellungsbreite.
h
Die Darstellungshöhe.

VIEWER

Unterelement von NODE, TOUCH

Zeigt Bilder an und aktualisiert diese Regelmäßig neu. Die Bilder werden nicht zwischengespeichert. Benötigt das Herunterladen des Bildes mehr Zeit, als in einem Intervall zur Verfügung steht, werden alle nächsten Intervalle übersprungen, bis das Bild heruntergeladen wurde oder die Übertragung fehlschlug.

<VIEWER w="0.09" h="0.13" refresh="5" picture="http://srv.lan/pic.jpg" showtimer="true"/>

Attribute:

picture
Die URL zum Bild, das angezeigt werden soll.
refresh
Das Zeitintervall in Sekunden, bis das Bild erneut geladen wird. Muss größer 0 sein, sonst ist das Intervall deaktiviert. Sehr niedrige Werte verursachen eine große Menge Datenverkehr im Netzwerk und sollten unbedingt gemieden werden. (Standard: 10)
w
Die Darstellungsbreite.
h
Die Darstellungshöhe.
showtimer
Ein Fortschrittsbalken im unteren Bildrand zeigt an, wann der nächste Versuch unternommen wird ein Bild zu beziehen.

COUNTER

Unterelement von NODE, TOUCH

Ein mechanisches Zählwerk mit optionalen Nachkommastellen.

<COUNTER value="10.42" intdigits="3" fractdigits="1" intrgb="fff" wheelintrgb="00f" fractrgb="fff" wheelfractrgb="f00" casergb="111" commargb="00de10"/>

Attribute:

value
Wert, der angezeigt werden soll. Ist der Wert genauer als er dargestellt werden kann, wird die letzte Walze entsprechend teilweise weitergedreht.
intdigits
Die Anzahl der Stellen mit ganzzahligem Wert. Bereich: 1..8 (nicht animierbar)
fractdigits
Die Anzahl der Nachkommastellen. Bereich: 0..8 (nicht animierbar)
intrgb, fractrgb
Die Farbe der Ziffern auf den Walzen vor und nach dem Komma.
wheelintrgb, wheelfractrgb
Die Farbe der Walzen vor und nach dem Komma.
commargb
Die Farbe des Kommas auf dem Gehäuse, falls es Nachkommastellen gibt.
casergb
Die Farbe des Gehäuses.

Hinweise:

VUMETER

Unterelement von NODE, TOUCH

Simuliert ein mechanisches Zeigerinstrument. Die Nadel hat einen geringen Nachlauf und eine rote Lampe signalisiert Übersteuerung und Untersteuerung.

<VUMETER value="0.5" label="Zeigerausschlag" labelmin="gering" labelmax="hoch"/>	

Attribute:

value
Eine Fließkommazahl zwischen 0 und 1, deren Wert den Zeigerausschlag von links nach rechts angibt.
label
Eine Beschriftung auf dem Gehäuse.
labelmin, labelmax
Beschriftungen auf der linken und rechten Seite des Gehäuses.

SIGNAL

Unterelement von NODE, TOUCH

Zeigt eine Signalleuchte der angegebenen Farbe an.

<SIGNAL rgb="f00" status="true"/>

Attribute:

rgb
Die Farbe des Signals in angeschaltetem Zustand.
status
Die Lampe anschalten. (“true” / “false” (Standard))

SWITCH

Unterelement von NODE, TOUCH

Zeigt einen anklickbaren Bereich wie LINK an, hält aber Zustände bereit, die mit TRANSMIT ausgelesen werden können.

<SWITCH w="0.03" h="0.03" d="0.02" rgb="0ff" on="true"/>

Attribute:

w, h, d
Breite, Höhe und Tiefe des Interaktionsbereichs.
rgb
Farbe des Interaktionsbereichs (halbtransparent).
rgba
Farbe des Interaktionsbereichs mit Transparenzangabe.
alpha
Transparenzwert des Interaktionsbereichs. (0..1, Standard: 0,1)
pulse
Intensität der Änderung des Transparenzwerts. (0..1, Standard : 0,2)
pressed
Das Element wird gedrückt (Taster).
on
Nach dem Drücken wird der innere Zustand umgeschaltet (Schalter). Durch Setzen kann ein anderer Zustand erzwungen werden.
pressedvalue
Der Wert für “pressed” wenn das Element gedrückt wird. (Standard: true)
unpressedvalue
Der Wert für “pressed” wenn das Element nicht gedrückt wird. (Standard: false)
onvalue
Der Wert für “on” im eingeschalteten Zustand. (Standard: true)
offvalue
Der Wert für “on” im ausgeschalteten Zustand. (Standard: false)

TRANSMIT

Unterelement von NODE, TOUCH, MODEL, TEXT, LINK, EFFECT, STREAMER, VIEWER, COUNTER, VUMETER, SIGNAL, SWITCH, TRANSMIT, ANIMATION, KEYFRAME

Schreibt den Inhalt eines Attributs des Übergeordneten Elements in eine Variable und sendet diese über den angegebenen Transmitter.

<SWITCH>
  <TRANSMIT attribute="pressed" variable="btnPressed" transmitter="send" />
</SWITCH>

Attribute:

attribute
Das Attribut, das ausgelesen werden soll.
variable
Name der Variable in die geschrieben werden soll.
transmitter
Der Name des Transmitters, über den die Variable gesendet werden soll. Wird kein Transmitter angegeben bleibt die Variable lokal.
threshold
Differenzschwelle ab der die nächste Übertragung stattfindet. Ist der ausgelesene Wert keine Zahl, ist jede Angabe außer 0 ungültig.

ANIMATION

Unterelement von CAMERA, NODE, TOUCH, MODEL, TEXT, LINK, EFFECT, STREAMER, VIEWER, COUNTER, VUMETER, SIGNAL, SWITCH, TRANSMIT, ANIMATION, KEYFRAME

Ändert das Attribut des übergeordneten Elements im Verlauf der Zeit. Siehe “Animationen”. Der Wert des zu ändernden Attributs wird den Schlüsselbildern entnommen.

pre(code).

Attribute:

attribute
Der Name des Attributes, das animiert werden soll.
increment
Maximal mögliche Veränderung pro Sekunde. Damit können Änderungen geglättet werden, da der aktuelle Wert sich dann höchstens mit der angegebenen Größe pro Sekunde an den neuen annähert. 0 deaktiviert das Verhalten. Standard: 0
double
Ist-Soll-Differenzschwelle, ab der increment verdoppelt wird.
triple
Ist-Soll-Differenzschwelle, ab der increment verdreifacht wird.
jump
Ist-Soll-Differenzschwelle, ab der increment ausgesetzt wird.

KEYFRAME

Unterelement von ANIMATION

Beschreibt ein Schlüsselbild in einer Animation, welches den Wert zu einer bestimmten Zeit definiert.

<KEYFRAME time="4" value="2" lerp="linear"/>

Attribute:

time
Die Position des Schlüsselbilds auf der Zeitleiste. Die Schlüsselbilder werden nach dem einlesen sortiert, müssen in der XML-Datei also nicht in der richtigen Reihenfolge vorliegen. Liegen jedoch mehrere Schlüsselbilder auf der gleichen Position, ist das Verhalten undefiniert.
value
Der Wert, den das Attribut annehmen soll.
lerp
Auf welche Weise zwischen den Schlüsselbildern interpoliert werden soll. direct: (Standard) Keine Interpolation. linear: (Nur gültig für Zahlen) Lineare Interpolation

PACK

Wurzelelement

Definiert ein herunterladbares Paket mit einer oder mehrerer Szenen.

<PACK name="pack" desc="..." preview="preview.jpg">

Attribute:

name
Der Name des Pakets.
desc
Eine kurze Beschreibung des Pakets.
preview
Ein Bild, das in der Vorschau angezeigt werden kann.

CONTENT

Unterelement von PACK

Ein Verweis auf ein ZIP-Archiv mit Inhalten.

<CONTENT file="content.zip"/>

Attribute:

file
Relative oder absoulte URL auf eine ZIP-Datei.

Kenndatenübertragung

Die App kann sich auf einen Websocket verbinden und von dort Werte erhalten und an diesen senden. Diese Werte sind an einen Bezeichner gekoppelt (Variablenname und Variablenwert). Ebenso werden JSON-Objekte etwa von einer REST API als Datenquelle unterstützt.

<VALUESERVER>
  <WEBSOCKET url="ws://nodered.local:1880/ws/data"/>
</VALUESERVER>

Es können mehrere Websockets angegeben werden, jedoch wird nicht unterschieden von welchem Websocket die Variable kommt. Senden also zwei Websockets einen Wert für die Variable “position” gilt der zuletzt empfangene Wert. Dieses Problem können Sie jedoch vermeiden, wenn Sie den Websockets eindeutige Präfixe geben. Eine Variable ist auch nicht bekannt, bis sie das erste Mal empfangen wurde. Der Versuch ihren Wert abzufragen wird nichts zurückgeben (für Zahlenattribute entspricht das einer 0). Im Zweifel müssen wichtige Variablen sofort beim Verbinden durch den Server übertragen werden oder im Element VALUESERVER vordefiniert werden. Die App kann sie nicht explizit anfordern.

Node-Red Beispiel Ein Beispiel, wie mit Node-Red ein Websocket erstellt werden kann, der einen Wert überträgt:

Beispielquelltext für eine Function-Node:

context.set("value", msg.payload || (context.get("value") || 0.0));
msg.payload = { variableName: context.get("value") }; // variableName anpassen
return msg;

Es können beliebig viele Werte gleichzeitig übertragen werden:

msg.payload = { var1: value1, var2: value2, var3: value3 }; 

Die Websocket-Node muss so eingestellt sein, dass Sie auf eingehende Anfragen reagiert (listen on) und nur die Nutzdaten überträgt (payload only).

Wichtiger Hinweis:

Attribute von Elementen aus der App senden

Sie können Attribute von Elementen senden, wenn diese sich verändern (zum Beispiel das “on”-Attribut von SWITCH-Elementen). Fügen Sie dazu das TRANSMIT-Element unterhalb des Elements ein, dessen Attribute Sie senden wollen.

<SWITCH w="2" h="3" d="2" rgb="0ff">
  <TRANSMIT attribute="pressed" variable="btnPressed" transmitter="send" />
</SWITCH>

Bei einer Änderung des Attributs wird an alle Transmitter mit dem Namen “send” der Wert des Attributs mit dem Zugewiesenen Variablennamen gesendet.

{ "btnPressed": "true" }

Vordefinierte Variablennamen

Diese Bezeichner sind fest definiert und können nicht für eigene Zwecke genutzt werden:

fdarcurrentview
Beim übertragen dieser Variable wird die App versuchen in die angegebene Ansicht zu wechseln, sofern diese in der Szene enthalten ist.

Animationen

Die Elemente CAMERA, NODE, TOUCH, MODEL, TEXT, LINK, EFFECT, STREAMER, VIEWER, COUNTER, VUMETER, SIGNAL, SWITCH, TRANSMIT, ANIMATION und KEYFRAME sind animierbar. Das heißt, diese unterstützen ein Unterelement ANIMATION, welches den Wert eines Attributes zur Laufzeit ändern kann. Nicht alle Attribute sind änderbar (siehe Referenz der Elemente).

Eine Animation enthält mindestens eine Angabe über das zu ändernde Attribut und ein Schlüsselbild.

<TEXT>
  <ANIMATION attribute="label">
    <KEYFRAME value="sensorData"/>
  </ANIMATION>
</TEXT>

Zuerst wird versucht eine Variable zu finden, deren Name der im Schlüsselbild angegebenen Zeichenkette entspricht und den entsprechenden Wert zu übernehmen. Wird keine Variable gefunden bleibt der Inhalt bestehen. Ist für die Animation eine Berechnung erforderlich, wird der Wert umgewandelt und verrechnet. Wenn das fehlschlägt oder nicht erforderlich ist wird der Wert einfach so übernommen und dem Elementattribut übergeben. Es wird entsprechend damit umgehen und entweder reagieren oder bei einem ungültigen Wert nichts tun.
In diesem Beispiel wird der Wert der Variable sensorData über einen Text ausgegeben.
Da dieser Fall häufig vorkommt, kann man ihn auch wie folgt abkürzen:

<TEXT label="@anim:sensorData"/>

Wenn Sie eine Position für ein Element übertragen möchten, kann eine Glättung der Werte zwischen den Übertragungen wünschenswert sein, um den Effekt einer flüssigen Bewegung zu erzeugen. Dazu wird das Attribut “increment” benutzt. Es legt die maximal mögliche Veränderung eines Werts über die Dauer einer Sekunde fest. Mit Zeichenketten ist das natürlich nicht möglich.

<NODE>
  <ANIMATION attribute="tx" increment="20">
    <KEYFRAME value="position"/>
  </ANIMATION>
  <MODEL ... />
</NODE>

Lässt sich abkürzen als:

<NODE tx="@anim:position:20">
  <MODEL ... />
</NODE

Wenn die App einen Wert für die Variable “position” erhält wird dieser mit dem aktuellen von “tx” verglichen und “tx” mit maximal 20/s angeglichen.

Weiteres Beispiel:

<COUNTER value="@anim:pieces:1.5"/>

Ein Zähler soll eine Zahl anzeigen, von der bekannt ist, dass sie sich etwa einmal pro Sekunde um 1 erhöht. Da “increment” auf 1,5 gesetzt wird, ist sichergestellt, dass die Anzeige genügend Zeit hat nachzuziehen und erhalten gleichzeitig die für den Effekt des mechanischen Zählwerks notwendigen Zwischenschritte.

Manchmal ist aber nicht bekannt wie stark sich Variablen ändern können oder sie ändern sich stark schwankend. Die Attribute “double”, “triple” und “jump” können in diesem Fall einen Ausgleich bewirken.

“double” und “triple” geben eine Schwelle an, ab welcher die Geschwindigkeit mit der sich dem Zielwert angepasst wird verdoppelt oder verdreifacht wird. “jump” bei welcher sofort der Zielwert gesetzt wird.
Beispiel:

<NODE>
  <ANIMATION attribute="tx" increment="20" double="25" triple="40" jump="100">
    <KEYFRAME value="position"/>
  </ANIMATION>
  <MODEL ... />
</NODE>

Wenn der aktuelle Wert von “tx” also 0 ist und sich nun auf 15 ändern soll, wird er dies mit den angegebenen 20/s tun. Soll sich der Wert von 0 auf 35 ändern, übersteigt die Differenz die in “double” festgelegte Schwelle und die Bewegung findet nun mit 40/s statt, bis die Differenz zum Zielwert auf unter 20 fällt. Bei einer Änderung von 0 auf 70 findet die Bewegung anfangs mit 60/s statt, später mit der Differenz entsprechenden Geschwindigkeiten. Sollen gar 140 von der Startposition aus angefahren werden, übersteigt die Differenz die in “jump” angegebene Schwelle und die neue Position wird sofort eingenommen. Käme danach ein neuer Wert von 150 würde die Interpolationsgeschwindigkeit wieder 20/s betragen.

Weiteres Beispiel:

<COUNTER>
  <ANIMATION attribute="value" increment="2" jump="10">
    <KEYFRAME value="pieces"/>
  </ANIMATION>
</COUNTER>

Ist nur ein Schlüsselbild notwendig und sollen mehr Felder genutzt werden als die schon vorgestellte Abkürzung zulässt, kann auch diese Abkürzungsform genutzt werden:

<COUNTER>
  <ANIMATION attribute="value" targetvalue="pieces" increment="2" jump="10">
</COUNTER>

“targetvalue” verkürzt dabei nur die Schreibweise für ein Schlüsselbild und ist damit kein animierbares Attribut (kann aber eine abgekürzte Schreibweise für eine Animation aufnehmen). Soll der Zielwert selbst verändert werden, etwa um andere Variablennamen eintragen zu können, kann das so gelöst werden:

<COUNTER>
  <ANIMATION attribute="value" targetvalue="@anim:whichPieces" increment="2" jump="10"/>
</COUNTER>

Und entspräche dieser langen Schreibweise:

<COUNTER>
  <ANIMATION attribute="value" increment="2" jump="10">
    <KEYFRAME>
      <ANIMATION attribute="value">
        <KEYFRAME value="whichPieces"/>
      </ANIMATION>
    </KEYFRAME>
  </ANIMATION>
</COUNTER>

Der Wert der Variable “whichPieces” wird dem Attribut “value” des Schlüsselbilds der Animation von Counter zugewiesen. Wird die Animation von Counter berechnet, wird das Attribut “value” interpretiert und wenn es sich um eine gültige Variable handelt wird deren Wert ausgelesen und für die Animation verwendet.
Wichtig: Die Reihenfolge der Abarbeitung ist für verschachtelte Animationen nicht vorherzusehen. Möglicherweise kann eine Änderung erst ein Einzelbild später sichtbar sein.

Die unten stehende Schreibweise wäre jedoch ungültig und würde nichts bewirken, da ANIMATION den Wert nicht annehmen wird:

<COUNTER>
  <ANIMATION attribute="value" increment="2" jump="10">
    <ANIMATION attribute="targetvalue" value="whichPieces" <!-- UNGÜLTIG! --> />
  </ANIMATION>
</COUNTER>

Schlüsselbilder

Bei komplexeren Animationen können Schlüsselbilder genutzt werden:

<NODE>
  <ANIMATION attribute="sxyz">
    <KEYFRAME time="0" value="0"/>
    <KEYFRAME time="4" value="2"/>
    <KEYFRAME time="5" value="1.5"/>
    <KEYFRAME time="7" value="3"/>
    <KEYFRAME time="10" value="0"/>
  </ANIMATION>
  <MODEL ... />
</NODE>

“time” gibt die Position des Schlüsselbilds im Zeitverlauf an. Der Zeitpunkt 0 ist der Moment, in dem die App gestartet wurde. Die Animation wird endlos wiederholt.
Die Veränderung des sxyz Attributs wird wie folgt verlaufen:

Um die harten Sprünge zu vermeiden und eine weiche Interpolation zu erhalten, benutzen Sie das Attribut “lerp”. Im letzten Schlüsselbild ist das lerp-Attribut obsolet, da es nur für den Übergang zum nächsten Schlüsselbild genutzt wird. Soll die Animation also nicht an den Anfang zurück “springen”, muss das letzte Schlüsselbild den gleichen Wert wie das erste haben, wie in diesem Beispiel.

<NODE>
  <ANIMATION attribute="sxyz">
    <KEYFRAME time="0" value="0" lerp="linear"/>
    <KEYFRAME time="4" value="2" lerp="linear"/>
    <KEYFRAME time="5" value="1.5" lerp="linear"/>
    <KEYFRAME time="7" value="3" lerp="linear"/>
    <KEYFRAME time="10" value="0"/>
  </ANIMATION>
  <MODEL ... />
</NODE>

Daraus ergibt sich dieser Verlauf:

Für das value-Attribut können auch Zeichenketten genutzt werden. Dann kann lerp aber nicht genutzt werden.

<SIGNAL>
  <ANIMATION attribute="on">
    <KEYFRAME time="0" value="true"/>
    <!-- lerp hat keine Auswirkung. -->
    <KEYFRAME time="1" value="false" lerp="linear"/>
    <KEYFRAME time="2" value="true"/>
  </ANIMATION>
</SIGNAL>

Wird eine Lampe im Sekundentakt blinken lassen.

Wichtige Hinweise:


Downloadpakete

Um Szenen dauerhaft auf einem Gerät zu speichern können diese in Pakete gebündelt werden. Ein Paket kann beliebig viele Inhalte enthalten.

Um ein Paket zu erstellen platzieren Sie zunächst alle erforderlichen Dateien in einem Verzeichnis. Es darf auch Unterverzeichnisse enthalten, aber keine Referenzen zu übergeordneten Verzeichnissen. Bitte entfernen Sie vor dem Packen alle nicht benötigten Dateien, da diese sonst unnötig Platz auf dem Gerät belegen.
Eine “index.xml” Datei ist zwingend erforderlich, denn auf diese wird immer zuerst zugegriffen. Das kann eine Szene, eine Szenensammlung oder ein Verzeichnis sein, von dem aus auf weitere im Paket enthaltene Szenen zugegriffen wird.
Prinzipiell können Downloadpakete auch Referenzen auf externe Inhalte haben.
Den Inhalt des Verzeichnisses komprimieren Sie dann in ein ZIP Archiv.

Beispiel für ein Archiv:

CONTENT.ZIP
- img/
    texture.png
    button.png
  index.xml
  scene.xml
  target.jpg
  model.obj

Bitte beachten Sie, dass die index.xml in keinem Unterverzeichnis liegen darf. Sie darf allerdings durchaus auf Unterverzeichnisse verweisen.

Um die Inhalte auf das Gerät laden zu können benötigen Sie außerdem eine Beschreibung des Downloadpakets. Das ist eine XML-Datei, welche einen Verweis auf das Archiv und optional eine Beschreibung und ein Vorschaubild enthällt.

Beispiel:

<PACK name="AR-Szenenpaket" desc="verschiedene Szenen" preview="preview.jpg">
  <CONTENT file="content.zip"/>
</PACK>

Wenn Sie die beiden Dateien hochladen können Sie mit der AR App auf die XML-Datei zugreifen und darüber das Paket herunterladen.

Sie finden heruntergeladenen Pakete in den Lesezeichen.


Achsenausrichtung

Planare Marker:


Version 5.5 (2023-09-15)

Festo Didactic SE
Rechbergstraße 3
73770 Denkendorf
Germany

+49 711 3467-0
🖷+49 711 34754-88500
🌐www.festo-didactic.com
did@de.festo.com

Hack Font