- Python 64.8%
- JavaScript 23.1%
- CSS 6.7%
- HTML 5.4%
|
|
||
|---|---|---|
| .vscode | ||
| beispiele | ||
| tests | ||
| web_server | ||
| .gitignore | ||
| LICENSE | ||
| main.py | ||
| mise.toml | ||
| overrides.txt | ||
| pytest.ini | ||
| README.md | ||
| requirements.txt | ||
| ruff.toml | ||
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 |