Andreas Grätz
Andreas Grätz

Automatische Webcam

Vorgeschichte: Alle zwei Jahre findet in Altenbeken ein großes Spur Z Treffen statt. So sollte es auch dieses Jahr(2020) im April sein. Bedingt durch Corona wurde die Veranstaltung abgesagt. Pech für alle, die dort ihre neuen Anlagen präsentieren wollten. 
Im Vorfeld hatte ich noch überlegt, das Treffen komplett live im Netz zu übertragen für diejenigen, die wegen Corona nicht kommen wollten - was sich dann eben mit der Absage auch erledigt hatte.
Aber ich habe dann weitergedacht und überlegt, wie man Anlagen im Netz am einfachsten präsentieren kann.
Eine fest installierte Kamera ist da nur suboptimal. Ich habe ja auf meinem Youtube-Kanal auf diese Art einige Videos gedreht, wo dann mal eben auch eine zeitlang nichts passiert. Auch aus der Hand filmen ist auf Dauer kein Vergnügen, weil man gleichzeitig auf das Bild und darauf achten muss, wo denn nun die Züge fahren. Bei sehr großen Anlagen wird es dann noch schwieriger.
Also auf jeden Fall müsste man das Video noch nachträglich bearbeiten, damit es nicht zu langweilig wird.


Daraus enstand dann die Idee, Traincontroller mit einer Webcam so zu verbinden, dass sie nicht nur einen Blickwinkel zeigt, sondern sich automatisch dorthin wendet, wo auch grade etwas auf der Anlage los ist. Traincontroller weiss ja, wo demnächst die Züge fahren. 

Und da kommt eine PTZ-Kamera ins Spiel.

PTZ steht für "Pan-Tilt-Zoom", also eine Kamera, die (ferngesteuert) sich drehen, neigen und zoomen kann.

 

Solchen Kameras ist gemein, dass sie über HTTP-Aufrufe angesteuert werden können. Einige Kameras speichern auch dauerhaft "Presets", also feste Positionen, die man mit einem Kommando dann wieder abrufen kann.

Und da kommen wir dann zur Schnittstelle zu Traincontroller: TC kann ja Windows-Programme starten. Ich starte dann "einfach" ein Curl-Kommando. Curl erlaubt auf Kommandozeilenebene HTTP-Aufrufe.
Ich habe also ein Stellwerk generiert, das nur Knöpfe enthält, die ein "Programm" aufrufen. Das "Programm" ist dann eine Batch-Datei, die wiederum ein Curl-Kommando aufruft.
Eine Gruppe von "Go"-Knöpfen ruft dann Presets auf, die die Kamera an von mir zuvor definierte Positionen fährt.

Der nächste Schritt ist dann, über Aktionsmarkierungen oder andere Trigger diese "Go"-Knöpfe zu drücken.

Was genau aufgerufen wird, hängt immer von der Kamera ab, da jeder Hersteller da seine eigenen Parameter definiert. Die Funktionalitäten sind zwar immer gleich, aber die "Sprache" ist es nicht. Deswegen habe ich beim Kauf darauf geachtet, dass die "API" der Kamera dokumentiert und frei verfügbar ist.

Ich habe eine "HiLook Mini PTZ Camera" und die Dokumentation dafür kann man hier einsehen:

http://descargas.hommaxsistemas.com//3.%20CCTV%20y%20SISTEMAS%20IP/02.INTEGRACION%20SDK-CGI-ONVIF-RTSP/HIKVISION/CGI/HIKVISION%20CGI%20IPMD%20V1.5.9.pdf

 

Andere Hersteller dokumentieren ihre Kameras nicht. Bei einigen - z.B. D-Link - kann man sich die Kommandos aus dem Internet zusammensuchen. Ich habe zuerst alte D-Link Kameras benutzt, die ich noch von einem anderen Projekt übrig hatte. Die lösten aber nicht hoch genug auf und hatten keinen optischen Zoom. Eine neue HD-Kamera von D-Link hatte die gleiche API, aber D-Link hat deren Benutzung deutlich erschwert.
 

Prinzipiell lässt sich aber jedes IoT-Gerät steuern, das über eine (REST-)API verfügt. Das könnten z.B. auch Philips Hue Lampen sein. Tag/Nacht-Wechsel mit "Abendrot" usw. würde also auch gehen durch reine Programmierung.

Ein Einstieg dazu findet sich hier:
https://developers.meethue.com/develop/get-started-2/

 

Das wird mein nächstes IoT-Projekt. Ich habe in TC eine Programmerung, die Probleme beim Zugverkehr erkennt. Die Anlage wird dann gestoppt. Die Beleuchtung der Schattenbahnhöfe soll dann automatisch angeschaltet werden.

 

Wie man dann wann die Kamera positioniert, bleibt jedem dann selbst überlassen. Das kann eine Operation zu Beginn einer Zugfahrt sein oder eben eine Aktionsmarkierung. Ich habe dazu dann Makros definiert, die von der Aktion ausgelöst werden und letztendlich den Preset-Taster drückt. Makro deswegen, weil ich noch etwas Zusatzintelligenz drin habe:

Zuerst habe ich noch zwei Schalter definiert: 1. Steuerung generell an und aus. 2. Kamera ist grade in Benutzung.

Jedes Makro testet zuerst beide Schalter, schaltet dann den "Benutzungsschalter" - womit alle anderen Makros gesperrt werden, drückt dann den Preset und gibt nach ein paar Sekunden die Kamera wieder frei. Damit gibt man der Kamera genug Zeit, den Zug durchs Bild fahren zu lassen ohne dass eine andere Aktion die Kamera übernimmt, also im Mehrzugbetrieb die Kamera wild hin- und herschwenkt.

Prinzipiell gibt es drei verschiedene Kommandos: Kamera bewegen, Preset setzen, Preset aufrufen.

 

Am einfachsten sind die Kommandos für das Aufrufen eines Presets. Hier ein Beispiel meiner Kamera zum Aufruf des Presets Nummer 3 (für alle Beispiele gilt, dass man die IP-Adresse der Kamera sowie Username und Passwort ersetzen muss):

 

curl  -H "application/xml" -X PUT -u "username:passwort" "http://192.168.0.117/PTZCtrl/channels/1/presets/3/goto"

Hinter "/preset/" schreibt man also einfach nur die Nummer des Presets.

Die Kamera hat ein eigenes Web-Interface, mit dem man die Kamera positionieren und die Presets speichern kann. Dann würden die "Go"-Knöpfe ausreichen.

Ich habe aber auch diese Funktionen in TC übernommen.

 

Beispiel für das Kommando hinter einem Speicher-Knopf für Preset 3:

 

curl  -H "application/xml" -X PUT -u "username:passwort" "http://192.168.0.117/PTZCtrl/channels/1/presets/3" -d "@C:\Users\a_gra\Documents\xmlset3.txt"


Hier müssen zusätzliche Parameter im XML-Format mitgeschickt werden. Diese stehen in einer Datei mit dem Namen "xmlset3.txt":

<PTZPreset> <enabled>true</enabled>
<id>3</id>
<presetName>MyPreset3</presetName> </PTZPreset>

 

Gespeichert wird die Position, die die Kamera in dem Moment hat. Man muss sie also vorher forthin bewegen.

 

Beispiel für das Bewegen der Kamera:

 

curl  -H "application/xml" -X PUT -u "username:passwort" "http://192.168.0.117/PTZCtrl/channels/1/momentary" -d "@C:\Users\a_gra\Documents\xmlleft500.txt"

 

Die Datei "xmlleft500.txt" enhält dann die Parameter für das Bewegen der Kamera für die Bewegung nach links:

 

<?xml version="1.0" encoding="UTF-8"?>
<PTZData>
<pan>-1</pan>
<tilt>0</tilt>
<zoom>0</zoom>

<Momentary>
<duration>500</duration>
</Momentary>
</PTZData>

 

Die Parameter pan, tilt und zoom definieren also die Richtung (-1 = links/unten/näher ran, 0 = keine Bewegung, 1 = rechts/oben/weiter weg)
Duration ist die Bewegungszeit in Millisekunden.

Für alle Bewegungen habe ich dann entsprechend Batch- und XML-Dateien erstellt. Die Knöpfe rufen dann die entsprechende Batch-Dateien auf.

 

Wir brauchen ja auch ein Bild.

 

Der Videostream der Kamera lässt sich so anzeigen:

 

rtsp://username:passwort@192.168.0.117/Streaming/Channels/101

Das ist das Bild in hoher Qualität und klappt z.B. mit VLC.
 

In einem Webbrowser bekommt man auch ein einfaches Bild angezeigt:

 

http://192.168.0.117/Streaming/Channels/102/httppreview

 

Das hochauflösende Bild kann man z.B. mit der freien Software OBS aufzeichnen oder Streamen. Z.B. nach Youtube. So kann ich live von der Anlage auf Youtube senden.

Man braucht auf jeden Fall auch das Webinterface der Kamera, um die Bildqualität, die Kompression usw. zu definieren. Das hängt natürlich auf davon ab, ob man streamen will und wie schnell die eigene Upload-Leitung ist. Auch Farbeinstellungen und andere Bildparameter lassen sich dort einstellen. Da hilft viel ausprobieren, bis es einem zusagt.

 

 

Zum Schluss ein Video, wo ich die Presets mal durchdrücke und ein Video, dass ich mit der Steuerung aufgezeichte habe. In meinem Kanal sind noch mehr davon:

Noch etwas zum Ton: Die Kamera hat kein eigenes Mikrofon. Aber zwei Drähte, wo man ein externes Mikrofon anschliessen kann. Dazu reicht ein Mikrofon z.B. für KFZ-Freisprechanlagen. Die haben den Vorteil, dass die gleich mit einem Klebepad geliefert werden. Sieht man bei mir auf die Kamera aufgeklebt. Daneben ist noch eine Wasserwaage aufgeklebt, um die Kamera waagerecht auszurichten.

Druckversion Druckversion | Sitemap
© Andreas Grätz