ExoMax ist eine Adaption von ExoMy (https://github.com/esa-prl/ExoMy ) mit einem alternativen Software-Stack sowie einer Pan-and-Tilt-Kamera anstelle der festen Kamera des Originals.

Es verwendet motion zur Erzeugung des Videostreams, eine in Kotlin/JVM geschriebene Rover-Software, die auf einem Raspberry Pi läuft, und eine universelle Swift-App, die auf AppleTV, iPad und Mac ausgeführt werden kann.
Die Kommunikation wird über mosquitto realisiert. Das Video wird direkt von der lokalen motion-Instanz als MJPEG bezogen und on-the-fly in der Größe angepasst. Anschließend wird jedes Bild über MQTT veröffentlicht. Das ist zwar nicht besonders effizient, macht das gesamte Setup aber extrem flexibel in Bezug darauf, wo die einzelnen Komponenten platziert werden.

Hier befindet sich der mosquitto-Broker direkt auf dem Rover, er kann aber auch an einer anderen Stelle platziert werden. Dadurch kann eine vollständige Fernsteuerung über das Internet erreicht werden.

Rover Software
Die Rover-Software ist ein IntelliJ IDEA Projekt. Du kannst es direkt öffnen. Vor dem Build sind jedoch einige Schritte erforderlich.
Grundlegendes Raspberry Pi Setup
Installiere ein Raspberry Pi OS headless und aktiviere SSH. Verbinde dich per Ethernet mit dem Raspi und richte das WLAN über sudo raspi-config ein. Benenne deinen Raspberry außerdem in Exomax um. Dies ist der Hostname, der im gesamten Projekt verwendet wird.
Folgende Software-Pakete müssen installiert werden:
| Paket | Grund |
|---|---|
| OpenJDK8 | Unsere Rover-Software läuft darauf |
| Motion | Wird für das Video-Streaming verwendet |
| Wiringpi | Zur Ansteuerung von I2C mittels Pi4J |
| mosquitto | Der MQTT-Broker |
sudo apt-get install openjdk-8-jre-headless motion wiringpi mosquitto
sudo systemctl enable mosquitto.service
sudo systemctl enable motion
sudo systemctl start motion
Motion konfigurieren
Editiere /etc/motion/motion.conf und passe die folgenden Zeilen an:
# Start im Daemon-Modus (Hintergrund) (Standard: off)
daemon on
# Log-Level [1..9] (Standard: 6 / NTC)
log_level 1
# Bildbreite (Pixel). Standard: 320
width 800
# Bildhöhe (Pixel). Standard: 240
height 600
# Maximale Bilder pro Sekunde. Standard: 100
framerate 15
# Nur Bilder mit Bewegung ausgeben (Standard: off)
output_debug_pictures off
# ffmpeg zur Video-Kodierung nutzen (Standard: off)
ffmpeg_output_movies off
# Automatischer Snapshot alle N Sekunden (0 = deaktiviert)
snapshot_interval 0
# Stream-Framerate bei fehlender Bewegung reduzieren (Standard: off)
stream_motion off
# Port des Mini-HTTP-Servers (0 = deaktiviert)
stream_port 8081
# Maximale Framerate des Streams (Standard: 1)
stream_maxrate 15
# Stream-Zugriff nur von localhost (Standard: on)
stream_localhost off
Starte den Motion-Service neu, um die Änderungen zu übernehmen.
sudo systemctl restart motion
Test im Webbrowser über http://exomax:8081.
Prüfe den Ordner /var/lib/motion, ob keine Bilder oder Videos gespeichert werden. Dies kann deine SD-Karte zerstören. Falls dort andere Dateien als das Logfile liegen, muss die Konfiguration angepasst werden.
Pi4J installieren
Ich habe Pi4J auf dem Pi auf dem empfohlenen Weg installiert: curl -sSL https://pi4j.com/install | sudo bash. Es ist jedoch ratsam, vorher die Anleitung unter https://pi4j.com/1.2/install.html
zu prüfen.
Rover-Software bauen
Öffne den Ordner Rover in IntelliJ IDEA. Danach ist alles vorbereitet und du kannst das Projekt bauen.
Erstelle das Artefakt und nutze copyToRover.sh, um ungenutzte Zertifikate zu entfernen und die JAR-Datei auf den Raspberry zu kopieren.
Es ist möglich, IDEA direkt auf dem Pi laufen zu lassen, aber dieses Projekt ist darauf ausgelegt, die gesamte Software auf einem Mac zu bauen (besonders den Controller) und dann auf den Pi zu übertragen.
Servo-Konfiguration
Aktuell gibt es keinen automatisierten Prozess zur Konfiguration der Servos, aber es ist recht einfach. Man muss nur wissen, welcher Servo an welchem Pin angeschlossen ist. In ServoController.kt sind die Servos als Konstanten konfiguriert. Sie sind nach ihrer Position auf dem Rover benannt. frd steht für Front Right Drive, mls für Middle Left Steering usw. Es gibt immer einen Fahr-Servo (drive) und einen Lenk-Servo (steering).
Falls keine Kamera am Rover montiert ist, können die Kamera-Servos ignoriert werden.
Autostart einrichten
Erstelle eine neue Datei unter /etc/systemd/system/exomax.service:
[Unit]
Description=Exomax Rover Software
Wants=network.target
After=network.target
[Service]
Type=simple
Restart=always
ExecStart=/bin/bash -c "java -jar /home/pi/Rover.jar"
Restart=always
[Install]
WantedBy=multi-user.target
Aktiviere den Autostart über sudo systemctl enable exomax.service.
Nun sollte der Rover bereit sein. Neustart durchführen.
Falls die Software direkt auf dem Pi gebaut wurde, verschiebe die resultierende jar in das Home-Verzeichnis oder passe die Service-Datei entsprechend an.
Controller Software

Öffne die Controller-Software in Xcode und starte sie auf einem beliebigen Gerät.
Es gibt eine Version für iOS (optimiert für Querformat auf iPhone und iPad), eine für macOS (läuft auf allen Macs inklusive M1) und eine für AppleTV. ExoMax wird in allen Fällen mit einem Game-Controller gesteuert. Es können bis zu 4 Controller gleichzeitig verbunden werden, die alle dieselbe Funktionalität haben. Auf Touch-Geräten sind zudem die Buttons zum Umschalten der Fahrmodi aktiv. Die MQTT-Verbindung wird hergestellt, sobald die App in den Vordergrund tritt, und beim Beenden getrennt. Die Controller-Belegung ist wie folgt:

| Button | ExoMax Verhalten | Tastatur |
|---|---|---|
| Steuerkreuz | Feste Kamerapositionen | QEVB |
| A | Ackermann Fahrmodus | R |
| B | Spot Turn Fahrmodus | F |
| X | Crabbing Fahrmodus | T |
| Y | Kamera zentrieren | C |
| L-Schulter | Geschwindigkeit +10 & Sperre | W |
| L-Trigger | Stop & Geschwindigkeits-Freigabe | Leertaste |
| R-Schulter | Geschwindigkeit -10 & Sperre | S |
| R-Trigger | Stop & Geschwindigkeits-Freigabe | Leertaste |
| L-Stick | Fahrsteuerung | AD |
| R-Stick | Freie Kamerasteuerung | Pfeiltasten |
