337 lines
11 KiB
Markdown
337 lines
11 KiB
Markdown
# CUNO – Admin-Dokumentation
|
||
|
||
Stand: 2026-05-21
|
||
|
||
---
|
||
|
||
## 1. Hardware & Betriebssystem
|
||
|
||
| Eigenschaft | Wert |
|
||
|---|---|
|
||
| Hardware | Raspberry Pi 4 Model B Rev 1.4 |
|
||
| Betriebssystem | Debian GNU/Linux 13 (Trixie) |
|
||
| Kernel | 6.12.75+rpt-rpi-v8 (64-bit ARM) |
|
||
| Python | 3.13.5 |
|
||
| Docker | 26.1.5 |
|
||
|
||
---
|
||
|
||
## 2. Raspberry Pi – Zugangsdaten
|
||
|
||
| Eigenschaft | Wert |
|
||
|---|---|
|
||
| Hostname | `ExoMyCuno` |
|
||
| Benutzer | `pi` |
|
||
| Passwort | `Sonneberg` |
|
||
| LAN-IP | `192.168.1.83` |
|
||
| WLAN-IP | `192.168.1.9` |
|
||
|
||
**SSH-Zugang:**
|
||
```
|
||
ssh pi@192.168.1.9
|
||
```
|
||
|
||
---
|
||
|
||
## 3. WLAN-Logik
|
||
|
||
Der Rover wählt automatisch das beste verfügbare Netzwerk. Ein Hintergrunddienst (`exomy-wifi-fallback`) prüft alle 20 Sekunden die Verbindung und schaltet bei Bedarf um.
|
||
|
||
### Prioritätenreihenfolge
|
||
|
||
| Priorität | SSID | Typ | Wann aktiv |
|
||
|---|---|---|---|
|
||
| 1 (höchste) | `eskimue.de` | Heimnetz | wenn im Heimnetz |
|
||
| 2 | `4pi` | Mobiler Hotspot | wenn unterwegs mit Handy |
|
||
| 3 (Fallback) | `CUNO` | Eigener AP des Rovers | wenn kein bekanntes WLAN erreichbar |
|
||
|
||
### Netzwerk-Passwörter
|
||
|
||
| SSID | Passwort |
|
||
|---|---|
|
||
| `4pi` | `st89Saf6H86n` |
|
||
| `CUNO` (Rover-AP) | `astr0cun042` |
|
||
|
||
### Verhalten im Detail
|
||
|
||
- Ist `eskimue.de` erreichbar → Verbindung wird hergestellt und gehalten.
|
||
- Ist `eskimue.de` nicht erreichbar, aber `4pi` sichtbar → Verbindung mit `4pi`.
|
||
- Ist keines der beiden Netze erreichbar → Rover öffnet den eigenen WLAN-Hotspot **CUNO**.
|
||
- Sobald ein besser priorisiertes Netz wieder verfügbar wird, schaltet der Dienst automatisch zurück.
|
||
|
||
### Eigener Access Point (CUNO)
|
||
|
||
Wenn der Rover als AP läuft, ist er unter einer festen IP erreichbar:
|
||
|
||
| Eigenschaft | Wert |
|
||
|---|---|
|
||
| SSID | `CUNO` |
|
||
| Passwort | `astr0cun042` |
|
||
| IP des Rovers | `192.168.50.1` |
|
||
| Sicherheit | WPA2-PSK |
|
||
|
||
Browser-Adresse im AP-Modus: `http://192.168.50.1:8000/`
|
||
|
||
---
|
||
|
||
## 4. Offene Ports und Dienste
|
||
|
||
Alle Dienste laufen auf dem **Host** (Raspberry Pi), nicht im Docker-Container.
|
||
|
||
| Port | Dienst | Beschreibung |
|
||
|---|---|---|
|
||
| `8000` | Web-GUI | Haupt-Steuerseite und Admin-Seite (Python HTTP-Server im Container) |
|
||
| `8081` | Kamerastream (Quelle) | Rohstream direkt von der Kamera, kein Delay. Nur intern genutzt. |
|
||
| `8082` | Admin-API | REST-API für Systemsteuerung (Neustart, Status, Delay). Kein Browser-Frontend. |
|
||
| `8083` | Video-Delay-Proxy | Kamerastream **mit** eingestellter Verzögerung. Wird von der Web-GUI gezeigt. |
|
||
| `9090` | ROSBridge WebSocket | Verbindung zwischen Browser und ROS im Container. |
|
||
|
||
### Kamera-Signalkette
|
||
|
||
```
|
||
Kamera (Hardware)
|
||
↓
|
||
libcamera_mjpeg_server → Port 8081 (Rohstream, kein Delay)
|
||
↓
|
||
video_delay_proxy → Port 8083 (mit Delay, 0–10 s einstellbar)
|
||
↓
|
||
Web-GUI (Browser)
|
||
```
|
||
|
||
Bei Delay = 0 s wird das Bild sofort weitergegeben (kein echtes Buffern).
|
||
|
||
---
|
||
|
||
## 5. Webseiten
|
||
|
||
### 4.1 Steuerung – `http://<IP>:8000/`
|
||
|
||
Die Haupt-Steuerseite des Rovers.
|
||
|
||
**Inhalt:**
|
||
- Kamerabild (live, mit Delay wenn eingestellt)
|
||
- Virtueller Joystick (Maussteuerung)
|
||
- Modus-Anzeige (Ackermann / Punkt-Drehen / Crabbing)
|
||
- Systemstatus-Panel (rechts): Verbindung, CPU, RAM, Temp, WLAN, Uptime, Speicher
|
||
|
||
**Besonderheiten:**
|
||
- Physischer Controller und Web-Joystick können gleichzeitig betrieben werden.
|
||
- Wenn die Web-GUI aktiv gesteuert hat, wird der physische Controller für 2 Sekunden ignoriert (Prioritätslogik).
|
||
- Moduswechsel vom physischen Controller werden in der Web-GUI sofort angezeigt.
|
||
- Die Joystick-Spiegelanzeige zeigt, welche Eingaben der physische Controller gerade sendet.
|
||
|
||
---
|
||
|
||
### 4.2 Admin-Seite – `http://<IP>:8000/admin.html`
|
||
|
||
Systemverwaltung des Rovers. Die Seite ist passwortgeschützt — bei jedem Aufruf wird das Passwort abgefragt.
|
||
|
||
| Eigenschaft | Wert |
|
||
|---|---|
|
||
| Passwort | `cuno` |
|
||
|
||
**Bereiche:**
|
||
|
||
#### Aktionen
|
||
| Schaltfläche | Funktion |
|
||
|---|---|
|
||
| Kameradienst neu starten | Startet `exomy-camera-stream.service` neu |
|
||
| ExoMy-Container neu starten | Startet Docker-Container `exomy_autostart` neu (ROS, Motoren, Joystick) |
|
||
| Raspberry Pi neu starten | Fährt den Pi neu hoch |
|
||
| Raspberry Pi herunterfahren | Fährt den Pi aus |
|
||
|
||
#### Dienststatus
|
||
Zeigt den Live-Status von Kamera, Admin-API und ExoMy-Container.
|
||
|
||
#### Motorentest
|
||
Link zur separaten Motortest-Seite (siehe 4.3).
|
||
|
||
#### Latenz-Simulation
|
||
Dropdown 0–10 Sekunden. Verzögert **gleichzeitig**:
|
||
- Steuerbefehle (sowohl Web-GUI als auch physischer Controller)
|
||
- Kamerabild
|
||
|
||
So lässt sich realitätsnahe Steuerung mit erhöhter Signallaufzeit simulieren (z. B. Mond-Delay ≈ 1 s hin + 1 s zurück → 2 s einstellen).
|
||
|
||
#### Systemstatus
|
||
| Anzeige | Quelle |
|
||
|---|---|
|
||
| WLAN-Status | nmcli |
|
||
| IP-Adressen | wlan0 |
|
||
| CPU-Temperatur | `/sys/class/thermal/thermal_zone0/temp` |
|
||
| Unterspannung | `vcgencmd get_throttled` |
|
||
| Uptime | `/proc/uptime` |
|
||
| Freier Speicherplatz | Root-Partition |
|
||
|
||
---
|
||
|
||
### 4.3 Motortest – `http://<IP>:8000/admin-motor-test.html`
|
||
|
||
Separate Testseite zum Kalibrieren und Prüfen einzelner Räder.
|
||
|
||
**Wichtig:** Der ExoMy-Container muss für den Motortest **gestoppt** sein (Schaltfläche auf der Seite). Nach dem Test kann er wieder gestartet werden.
|
||
|
||
**Funktionen:**
|
||
- Lenkung links / rechts je Rad testen
|
||
- Vorwärts / Rückwärts je Rad testen
|
||
- Servo-Mittenwerte (Lenkung) einstellen und speichern
|
||
- Antriebsneutralwert einstellen und speichern
|
||
|
||
---
|
||
|
||
## 7. Controller-Belegung (Logitech F710)
|
||
|
||
Der Controller muss im **D-Modus** (Schalter auf der Rückseite) betrieben werden.
|
||
|
||
| Taste / Achse | Funktion |
|
||
|---|---|
|
||
| **Linker Stick** | Fahren und Lenken |
|
||
| **A** | Ackermann-Modus (normales Kurvenfahren) |
|
||
| **X** | Punkt-Drehen (Rover dreht auf der Stelle) |
|
||
| **Y** | Crabbing (seitliche Fahrt, alle Räder gleich eingeschlagen) |
|
||
| **B** | (nicht belegt) |
|
||
| **START** | Motoren ein- / ausschalten (Toggle) |
|
||
| **SELECT** | (nicht belegt) |
|
||
|
||
### Fahrmodi im Detail
|
||
|
||
**Ackermann** (Standard):
|
||
Normales Kurvenfahren wie ein Auto. Die Vorder- und Hinterräder lenken gegenläufig für einen engen Wendekreis.
|
||
|
||
**Punkt-Drehen:**
|
||
Der Rover dreht sich auf der Stelle. Alle Räder stehen schräg, der Antrieb dreht links und rechts gegeneinander.
|
||
|
||
**Crabbing:**
|
||
Alle Räder werden auf den gleichen Winkel eingeschlagen. Der Rover fährt seitlich (wie eine Krabbe). Lenkrichtung folgt dem X-Achsen-Ausschlag des Sticks.
|
||
|
||
---
|
||
|
||
## 6. Docker-Container
|
||
|
||
### Container `exomy_autostart`
|
||
|
||
| Eigenschaft | Wert |
|
||
|---|---|
|
||
| Image | `exomy:latest` (lokal gebaut, basiert auf `ros:melodic`) |
|
||
| ROS-Version | ROS 1 Melodic (Ubuntu 18.04-Basis im Container) |
|
||
| Startet automatisch | ja (`--restart=always`) |
|
||
| Ports (Host → Container) | `8000→8000` (Web-GUI), `8080→8080` (alt, nicht aktiv genutzt), `9090→9090` (ROSBridge) |
|
||
|
||
### ROS-Knoten im Container
|
||
|
||
| Knoten | Funktion |
|
||
|---|---|
|
||
| `/delay_node` | Puffert `/joy` → `/joy_delayed` mit einstellbarer Verzögerung (0–10 s) |
|
||
| `/f710_joy_node` | Liest den Logitech F710 Controller und publiziert auf `/joy` |
|
||
| `/joystick_parser_node` | Übersetzt Joystick-Eingaben in Rover-Befehle (`/rover_command`) |
|
||
| `/robot_node` | Berechnet Rad-Winkel und -Geschwindigkeiten aus dem Rover-Befehl |
|
||
| `/motors` | Schreibt PWM-Werte auf den Servo-Controller (I²C) |
|
||
| `/rosbridge_websocket` | WebSocket-Brücke zwischen Browser und ROS (Port 9090) |
|
||
| `/rosapi_node` | Erlaubt dem Browser, ROS-Parameter zu lesen/schreiben |
|
||
|
||
### ROS-Signalfluss
|
||
|
||
```
|
||
Controller (USB)
|
||
↓
|
||
/f710_joy_node → /joy
|
||
↓
|
||
/delay_node → /joy_delayed
|
||
↓
|
||
Web-GUI (Browser) → /joy /joystick_parser_node
|
||
(frame_id="webgui") ↓
|
||
/rover_command
|
||
↓
|
||
/robot_node
|
||
↓
|
||
/motor_commands
|
||
↓
|
||
/motors (PWM → Servos)
|
||
```
|
||
|
||
### Nützliche Container-Befehle
|
||
|
||
```bash
|
||
# Container neu starten
|
||
docker restart exomy_autostart
|
||
|
||
# Shell im Container öffnen
|
||
docker exec -it exomy_autostart bash
|
||
|
||
# ROS-Knoten anzeigen
|
||
docker exec exomy_autostart bash -c 'source /opt/ros/melodic/setup.bash && rosnode list'
|
||
|
||
# Alle ROS-Topics anzeigen
|
||
docker exec exomy_autostart bash -c 'source /opt/ros/melodic/setup.bash && rostopic list'
|
||
|
||
# Delay-Parameter im ROS lesen/setzen
|
||
docker exec exomy_autostart bash -c 'source /opt/ros/melodic/setup.bash && rosparam get /delay_seconds'
|
||
docker exec exomy_autostart bash -c 'source /opt/ros/melodic/setup.bash && rosparam set /delay_seconds 2.0'
|
||
|
||
# Alten Image-Schrott aufräumen (dangling images)
|
||
docker image prune -f
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Systemdienste (Übersicht)
|
||
|
||
Alle laufen auf dem Raspberry Pi als systemd-Dienste:
|
||
|
||
| Dienst | Beschreibung | Startet automatisch |
|
||
|---|---|---|
|
||
| `exomy-camera-stream` | MJPEG-Kamerastream auf Port 8081 | ja |
|
||
| `exomy-video-delay` | Delay-Proxy auf Port 8083 | ja |
|
||
| `exomy-admin-api` | REST-API auf Port 8082 | ja |
|
||
| `exomy-wifi-fallback` | WLAN-Priorisierung und AP-Fallback | ja |
|
||
|
||
Der **Docker-Container** `exomy_autostart` enthält ROS und startet ebenfalls automatisch (via `docker run --restart=always` oder manuell).
|
||
|
||
### Nützliche SSH-Befehle
|
||
|
||
```bash
|
||
# Dienststatus prüfen
|
||
systemctl status exomy-camera-stream
|
||
systemctl status exomy-video-delay
|
||
systemctl status exomy-admin-api
|
||
|
||
# Dienst neu starten
|
||
sudo systemctl restart exomy-camera-stream
|
||
|
||
# Container-Status
|
||
docker ps
|
||
|
||
# Container-Logs
|
||
docker logs exomy_autostart
|
||
|
||
# ROS-Topic live anzeigen (im Container)
|
||
docker exec exomy_autostart bash -c \
|
||
'source /opt/ros/melodic/setup.bash && rostopic echo /rover_command'
|
||
|
||
# Aktuellen Delay prüfen
|
||
cat /tmp/exomy_delay.txt
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Latenz-Simulation – technischer Hintergrund
|
||
|
||
Die Verzögerung wirkt auf zwei Ebenen gleichzeitig:
|
||
|
||
1. **Steuerbefehle** (ROS-Ebene):
|
||
Der `delay_node` puffert alle Joystick-Nachrichten vom Topic `/joy` und gibt sie verzögert auf `/joy_delayed` aus. Der Joystick-Parser liest nur `/joy_delayed`.
|
||
|
||
2. **Kamerabild** (Host-Ebene):
|
||
Der `video_delay_proxy` puffert JPEG-Frames aus Port 8081 mit Timestamps. Beim Abruf wird der Frame geliefert, der zum Zeitpunkt `jetzt − Delay` aufgezeichnet wurde.
|
||
|
||
Der eingestellte Wert wird in `/tmp/exomy_delay.txt` gespeichert und von beiden Komponenten gleichzeitig gelesen. Änderungen über die Admin-Seite wirken sofort.
|
||
|
||
---
|
||
|
||
## 10. Bekannte Eigenheiten
|
||
|
||
- **Crabbing**: Funktioniert softwareseitig, mechanische Einstellung der Einzelräder ist noch nicht abgeschlossen.
|
||
- **Containerstart**: Niemals `sudo docker run ...` nutzen – das falsche Home-Verzeichnis wird gemountet.
|
||
- **Browser-Cache**: Nach GUI-Updates ggf. Shift+F5 (Hard Reload) im Browser nötig.
|
||
- **Port 8081 direkt**: Erreichbar für Debug-Zwecke, zeigt immer das Live-Bild ohne Delay.
|