No description
  • Python 64.8%
  • JavaScript 23.1%
  • CSS 6.7%
  • HTML 5.4%
Find a file
Dennis 518aa73d97 (c) require intsys_car_v1>=0.0.10 (heartbeat, newest reply)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 10:46:51 +00:00
.vscode (c) web_server/, beispiele/, main.py from Blockly starter, VS Code + mise setup 2026-11-05 02:15:31 +00:00
beispiele (+) manuelles_fahren bsp 2026-11-05 08:19:50 +01:00
tests (f) reply only to received frames (no backlog), heartbeat, reply before display; JPEG pass-through, recorder thread with measured fps, bandwidth display 2026-11-06 10:22:18 +00:00
web_server (f) reply only to received frames (no backlog), heartbeat, reply before display; JPEG pass-through, recorder thread with measured fps, bandwidth display 2026-11-06 10:22:18 +00:00
.gitignore (c) web_server/, beispiele/, main.py from Blockly starter, VS Code + mise setup 2026-11-05 02:15:31 +00:00
LICENSE (c) GPL v3 license like intsys_car_v1 2026-11-05 02:29:22 +00:00
main.py (c) web_server/, beispiele/, main.py from Blockly starter, VS Code + mise setup 2026-11-05 02:15:31 +00:00
mise.toml (c) web_server/, beispiele/, main.py from Blockly starter, VS Code + mise setup 2026-11-05 02:15:31 +00:00
overrides.txt (c) use intsys_car_v1 comm_lib, remove legacy code 2026-11-04 14:50:40 +00:00
pytest.ini (c) web_server/, beispiele/, main.py from Blockly starter, VS Code + mise setup 2026-11-05 02:15:31 +00:00
README.md (c) require intsys_car_v1>=0.0.10 (heartbeat, newest reply) 2026-11-06 10:46:51 +00:00
requirements.txt (c) require intsys_car_v1>=0.0.10 (heartbeat, newest reply) 2026-11-06 10:46:51 +00:00
ruff.toml (c) use intsys_car_v1 comm_lib, remove legacy code 2026-11-04 14:50:40 +00:00

PMHS Car Server

Aufbau

Pfad Inhalt
main.py Grundprogramm, identisch mit dem Startprogramm in Blockly (Server): mit WASD/Xbox fahren. Als erste Aufgabe fehlt die Notbremse (TODO). mise run main
beispiele/ Beispiele: notstop.py, kamera.py, xbox_controller.py sowie die Blockly-Beispiele kreis.py, acht.py, linienverfolgung.py
web_server/ Dashboard (web_server.py, assets/), mise run web bzw. mise run web:mock

Visual Studio Code

Beim Öffnen des Ordners startet die Aufgabe „Umgebung einrichten (mise)“ (VS Code fragt einmal, ob automatische Aufgaben laufen dürfen). Sie installiert Python über mise, legt .venv an und installiert requirements.txt. Ist alles aktuell, überspringt mise die Installation. VS Code nimmt .venv als Interpreter. Die Erweiterung hverlin.mise-vscode ist so eingestellt, dass sie den Interpreter nicht auf den Python von mise ohne venv umstellt. Startkonfigurationen (F5) gibt es für main.py, die aktuelle Datei und das Dashboard.

Abhängigkeiten

SerializingContext (Bild + JSON über ZeroMQ) kommt aus der Bibliothek intsys_car_v1 (ab 0.0.10: Heartbeat, neueste Antwort), also aus derselben Bibliothek wie auf dem Fahrzeug. mise run install installiert mit uv requirements.txt. overrides.txt schließt dabei das von der Bibliothek mitgebrachte opencv-python-headless aus, sonst fehlen die Kamerafenster (cv2.imshow). Eine ältere .venv, in der die Headless-Variante schon liegt, neu anlegen.

Fahrzeugkalibrierung im Dashboard

Beim Verbinden meldet das Fahrzeug seine aktuellen Kalibrierungswerte. Zu Beginn einer Ausleihe sind das die per Ansible ausgelieferten Werte aus car.toml. Das Dashboard lädt diese auch dann, wenn die Seite bereits vor dem Fahrzeugstart geöffnet wurde. Bis alle fünf Werte vorliegen, bleiben die Kalibrierungsslider gesperrt.

Die Slider zeigen und bearbeiten Gesamtwerte. Meldet die Lenkung beispielsweise −12°, steht der Slider auf −12°; eine Änderung auf −10° setzt die Kompensation auf −10°. Es wird kein weiterer Offset addiert. Motorwerte von 0 % werden ebenfalls übernommen.

Neue Fahrzeug-Agenten melden zusätzlich calibration_session. Bei einem Wechsel der Ausleihe lädt der Server die Fahrzeugwerte erneut und verwirft noch ausstehende Änderungen der alten Belegung. Ältere Clients ohne Kennung werden nach einer Verbindungspause erneut synchronisiert.

/sensors liefert dafür calibration, calibration_ready und calibration_session. Die bisherigen Kalibrierungs-Endpunkte behalten ihre Bedeutung als Gesamtwerte.

Tests: mise run test für den Server und node tests/dashboard.test.cjs für die UI-Synchronisierung ohne Browser-Abhängigkeiten.

Datenfluss im Dashboard

  • Wechselspiel mit dem Fahrzeug: Bild empfangen, Telemetrie übernehmen, genau eine Antwort senden; erst danach Anzeige und Aufnahme. Ohne Bild sendet der Server keine Antwort, sonst stauen sie sich beim Fahrzeug. Ein ZeroMQ-Heartbeat (1 s, Zeitlimit 3 s) gibt den Port frei, wenn ein Fahrzeug ohne Abmeldung verschwindet.
  • Live-Werte (/events, Server-Sent Events): bei jedem Bild vom Fahrzeug, höchstens 30/s, ohne neue Daten 1/s. /sensors (alle 500 ms) bleibt für Kalibrierung und Status.
  • Kamerabild (/stream.mjpg): das JPEG unverändert so, wie es vom Fahrzeug kommt, sofort bei jedem neuen Bild.
  • Anzeige unter dem Kamerabild: Bildgröße, WLAN-Last (Mbit/s) und Bildrate. Unter dem Abstandsbalken: Verzögerung (Mittel über 1 s) aus dem timing-Feld des Fahrzeugs. Der Netzanteil braucht per NTP synchrone Uhren, sonst steht dort „?“.
  • Aufnahmen laufen in einem eigenen Thread mit der gemessenen Bildrate (Standard 30 FPS). Kommt er nicht hinterher, lässt er Bilder aus, statt das Fahrzeug zu bremsen.

Steuerung im Dashboard

Slider, WASD (W/S vor/zurück mit 100, A/D lenken 30°, loslassen = 0) und ein Xbox-Controller am Server-Rechner. Ist ein Controller angeschlossen, zeigt der Kopf des Dashboards ein Controller-Symbol (Name als Tooltip); An- und Abstecken wird im laufenden Betrieb erkannt. Der Controller steuert nur, wenn er bewegt wird, und überschreibt Slider und WASD im Ruhezustand nicht; Loslassen setzt einmal auf 0. Belegung wie im intsys-car-v1-Standard: rt vor, lt zurück, linker Stick lenkt, rechter Stick bewegt die Kamera. Die Slider folgen dabei dem Controller. Auslesen und Umrechnen übernimmt intsys_car_v1 (XboxController, parse_reply), wie bei CarServer. /sensors meldet controller (connected, name) und controls.

XBox 360 Controller (pygame 2.x)

Der Xbox 360-Controller hat 6 Achsen, 11 Tasten und 1 Hut. Der Controller wird als "Xbox 360 Controller" erkannt.

Sticks und Trigger

Funktion Richtung Achse Werte
Linker Stick Links -> Rechts Achse 0 -1 (links) bis 1 (rechts)
Linker Stick Oben -> Unten Achse 1 -1 (oben) bis 1 (unten)
Rechter Stick Links -> Rechts Achse 3 -1 (links) bis 1 (rechts)
Rechter Stick Oben -> Unten Achse 4 -1 (oben) bis 1 (unten)
Linker Trigger Draußen -> Drinnen Achse 2 -1 bis 1
Rechter Trigger Draußen -> Drinnen Achse 5 -1 bis 1

Tasten

Taste Button
A-Taste Button 0
B-Taste Button 1
X-Taste Button 2
Y-Taste Button 3
Linker Bumper Button 4
Rechter Bumper Button 5
Zurück-Taste Button 6
Start-Taste Button 7
Linker Stick Eindrücken Button 8
Rechter Stick Eindrücken Button 9
Guide-Taste Button 10

Hut/D-Pad

Richtung Achse
Unten -> Oben Y-Achse
Links -> Rechts X-Achse