Zum Inhalt springen

Linux auf dem Raspberry Pi 5 ​

Der Raspberry Pi 5 ist das „Gehirn“ von Strido: ein kleiner Linux-Computer, der ROS 2 in Docker ausführt und über USB mit dem Servocontroller kommuniziert. Diese Seite behandelt die Wahl des Betriebssystems, das Flashen, die Anmeldung ohne Bildschirm und die wenigen Linux-Kenntnisse, die Sie brauchen, um den Roboter am Laufen zu halten.

In Strido

  • Hardware: Raspberry Pi 5 (4 GB) mit dem Raspberry Pi Active Cooler und einer 64-GB-A2-microSD-Karte (SanDisk Extreme), alle in hardware/bom.yaml. Er wird mit 5 V über die GPIO-Stiftleiste versorgt, nicht über USB-C.
  • Betriebssystem: Ubuntu Server 24.04 (arm64) oder Raspberry Pi OS Bookworm 64-Bit, dazu Docker Engine (Software).
  • Robotersoftware: läuft im Container strido-ros:jazzy, gebaut aus docker/ros2/Dockerfile; das Host-Betriebssystem braucht daher nur Docker, udev-Regeln und einige Firmware-Einstellungen.
  • Geräte: Der XIAO ESP32-S3 (USB CDC) und der RPLIDAR C1 (CP210x-USB-Adapter) erscheinen über ros2/strido_bringup/config/99-strido.rules als /dev/strido_mcu und /dev/rplidar.

Was der Pi macht und was nicht ​

Der Pi führt alles oberhalb der Servoschleife aus: den Gait- oder Policy-Node, die mcu_bridge, den LiDAR-Treiber und (optional) die Kamera. Er steuert keine Servos und liest die IMU nicht selbst. Das übernimmt der ESP32-S3, dem der I²C-Bus gehört (PCA9685, LSM6DSOX, INA260) und der eine harte 200-Hz-Schleife ausführt. Die Aufteilung existiert, weil Linux kein Echtzeitbetriebssystem ist: Ein ausgelasteter Pi kann einen Prozess für Dutzende Millisekunden anhalten, was für die Planung harmlos ist, Servos aber zucken ließe. Siehe Firmware.

Der Pi braucht also nur USB-Seriell-Zugriff, weder I²C noch SPI. Das hält die Linux-Einrichtung kurz.

Wahl des Betriebssystems ​

Ubuntu Server 24.04 (arm64)Raspberry Pi OS Bookworm 64-Bit
BasisUbuntu „Noble“Debian 12
ROS 2 Jazzy nativJa: Ubuntu 24.04 ist Jazzys Tier-1-Plattform (apt-Pakete)Keine offiziellen Binärpakete; Docker verwenden
Pi-5-Kamera (libcamera-Fork)Muss selbst gebaut werdenEnthalten (rpicam-apps)
Werkzeuge wie raspi-config, vcgencmdTeilweiseJa

Beides funktioniert, weil das Repo ROS 2 in einen Container packt (FROM ros:jazzy-ros-base, selbst auf Ubuntu 24.04 aufgebaut). Der Container bringt sein eigenes Ubuntu-Userland mit; der Host stellt nur Kernel, USB-Geräte und Netzwerk bereit. Wählen Sie Raspberry Pi OS, wenn Sie die Kamera nutzen wollen (der Kamera-Stack des Pi 5 braucht den libcamera-Fork von Raspberry Pi, den das Docker-Image nicht enthält); wählen Sie Ubuntu Server, wenn Sie ROS 2 später nativ installieren möchten.

Verwenden Sie immer das 64-Bit-Image. Das ROS-Image, die NumPy-Wheels und Dockers arm64-Builds setzen alle aarch64 voraus.

Karte mit Raspberry Pi Imager flashen ​

  1. Installieren Sie Raspberry Pi Imager auf Ihrem Laptop und stecken Sie die microSD-Karte ein.
  2. Wählen Sie das Gerät Raspberry Pi 5, dann das Betriebssystem (unter „Other general-purpose OS → Ubuntu“ für Ubuntu Server 24.04 oder „Raspberry Pi OS (64-bit)“; die Lite-Variante hat keinen Desktop und genügt für einen Roboter ohne Bildschirm).
  3. Öffnen Sie auf Nachfrage die OS-Anpassung (Edit settings) und legen Sie fest:
    • Hostname, zum Beispiel strido;
    • einen Benutzernamen und ein Passwort (keinen Standardbenutzer beibehalten);
    • WLAN-SSID, Passwort und Land;
    • im Reiter Services: SSH aktivieren, idealerweise mit „public-key authentication only“ und eingefügtem öffentlichem Schlüssel.
  4. Schreiben, auswerfen, Karte in den Pi stecken.

Warum im Imager anpassen

Ein laufender Roboter hat weder Tastatur noch Monitor. Durch Vorbelegen von Benutzer, WLAN und SSH tritt der Pi beim ersten Start Ihrem Netzwerk bei, sodass Sie ihn vom Laptop erreichen: Das ist eine Headless-Einrichtung.

Erster Start und SSH ​

Versorgen Sie den Pi mit Strom (nur Logikversorgung, Loop-Key der Servoschleife gezogen). Nach einer Minute sollte er im Netzwerk sein:

bash
ssh <user>@strido.local          # mDNS name; if it does not resolve, use the IP from your router

Verwenden Sie schlüsselbasierte Anmeldung statt Passwörtern:

bash
ssh-keygen -t ed25519             # on the laptop, once
ssh-copy-id <user>@strido.local  # installs the public key on the Pi

Bringen Sie dann das System auf den neuesten Stand, bevor Sie etwas installieren:

bash
sudo apt update && sudo apt full-upgrade -y
sudo reboot

Halten Sie unter Raspberry Pi OS auch das Bootloader-EEPROM aktuell (sudo rpi-eeprom-update); es enthält Stromeinstellungen, die Sie unten ändern.

Pi-spezifische Konfiguration für diesen Roboter ​

Zwei Einstellungen aus Elektronik sind wichtig, weil Strido den Pi über die GPIO-5-V-Pins versorgt. Dieser Weg umgeht die USB-C-Power-Delivery-Aushandlung, sodass der Pi sonst eine schwache Versorgung annehmen und den USB-Strom begrenzen würde:

bash
sudo rpi-eeprom-config --edit        # add:  PSU_MAX_CURRENT=5000
echo "usb_max_current_enable=1" | sudo tee -a /boot/firmware/config.txt

PSU_MAX_CURRENT=5000 teilt dem Bootloader mit, dass die Versorgung 5 A liefert; usb_max_current_enable=1 erlaubt den USB-Ports ihren vollen Strom (LiDAR und ESP32 werden über USB versorgt). config.txt liegt sowohl unter Bookworm als auch unter Ubuntu 24.04 in /boot/firmware/.

WARNING

Das optionale Overlay zur Selbstabschaltung (dtoverlay=gpio-poweroff,gpiopin=26) ist im Repo als [UNVERIFIED on Pi 5] markiert. Testen Sie es mit entschärften Servos, bevor Sie sich darauf verlassen.

Benutzer, Gruppen und Geräteberechtigungen ​

Linux steuert den Hardwarezugriff über Dateien in /dev und deren Eigentümergruppe:

GerätTypischer NameStandardgruppeVon Strido verwendet?
USB-CDC-Seriell (XIAO ESP32-S3)/dev/ttyACM0dialoutJa: mcu_bridge, strido-cli
USB-UART-Brücke (CP210x, LiDAR)/dev/ttyUSB0dialoutJa: sllidar_ros2
I²C an der GPIO-Stiftleiste/dev/i2c-1i2cNein: I²C liegt am ESP32
GPIO/dev/gpiochip*gpioNur das optionale Abschalt-Overlay
Docker-Daemon-Socket/var/run/docker.sockdockerJa

Zwei Dinge machen das hier einfach:

  • udev-Regeln. 99-strido.rules erkennt die Geräte anhand der USB-Hersteller-/Produkt-ID (Espressif 303a:1001, Silicon Labs 10c4:ea60), legt stabile Symlinks an und setzt MODE="0666". Ohne sie könnten ESP32 und LiDAR über Neustarts hinweg die Namen ttyACM0/ttyUSB0 tauschen, und nur Mitglieder von dialout könnten sie öffnen.

    bash
    sudo cp ros2/strido_bringup/config/99-strido.rules /etc/udev/rules.d/
    sudo udevadm control --reload && sudo udevadm trigger
    ls -l /dev/strido_mcu /dev/rplidar
  • docker-Gruppe. Wenn Sie sich hinzufügen, können Sie docker ohne sudo ausführen:

    bash
    sudo usermod -aG docker $USER      # log out and back in afterwards

    WARNING

    Mitgliedschaft in docker ist gleichbedeutend mit root: Jedes Mitglied kann einen privilegierten Container starten. Fügen Sie nur vertrauenswürdige Benutzer hinzu.

Wenn Sie strido-cli oder ROS 2 nativ (außerhalb von Docker) ohne die udev-Regel ausführen, fügen Sie sich stattdessen zu dialout hinzu: sudo usermod -aG dialout $USER.

Docker installieren und das Roboter-Image bauen ​

Installieren Sie Docker Engine aus Dockers eigenem Repository (die Debian- oder Ubuntu-Anleitung unter Weiterführende Literatur) und führen Sie dann in einem Klon des Repositorys aus:

bash
docker compose -f docker/compose.yaml build ros     # ROS 2 Jazzy, Gazebo libs, sllidar_ros2, this repo's packages
docker compose -f docker/compose.yaml run --rm robot

Der zweite Befehl startet ros2 launch strido_bringup robot.launch.py. Halten Sie die Startreihenfolge aus Elektronik ein: Roboter liegt in der Ruhepose, Loop-Key eingesteckt, dann starten. Details stehen in Docker und ROS 2.

systemd: Dienste, die beim Booten starten ​

systemd ist der Prozess, der auf beiden Betriebssystemen Dienste startet und überwacht. Docker selbst ist ein systemd-Dienst:

bash
systemctl status docker          # running? enabled at boot?
sudo systemctl enable --now docker
journalctl -u docker -f          # follow its log
journalctl -b -p warning         # warnings and errors since this boot

Das Repo liefert bewusst keine systemd-Unit für den Roboter: Der Gait-Node kommandiert die Ruhepose und steht innerhalb von 3 s nach dem Start auf, und die Sicherheitsregeln verlangen, dass Sie den Loop-Key vor dem Start einstecken. Ein automatischer Start beim Booten würde Servos ohne anwesende Person bewegen. Wenn Sie später eine eigene Unit hinzufügen (ein Type=simple-Dienst, der docker compose -f docker/compose.yaml run --rm robot ausführt, After=docker.service), behalten Sie den Loop-Key als Arming-Schritt bei und lassen Sie ihn nie unbeaufsichtigt eingesteckt.

Nützliche Befehle ​

BefehlZeigt Ihnen
hostname -I, ip aIP-Adressen
lsusbUSB-Geräte: nach 303a:1001 (XIAO) und 10c4:ea60 (CP210x) suchen
ls -l /dev/strido_mcu /dev/rplidarudev-Symlinks existieren und zeigen auf ein tty
udevadm info -a -n /dev/ttyACM0Attribute für eine udev-Regel
dmesg -wKernel-Meldungen live (Gerät einstecken und beobachten)
vcgencmd get_throttled0x0 ist gut; Bit 0 (0x1) = Unterspannung jetzt, Bit 16 (0x10000) = Unterspannung seit dem Booten aufgetreten
vcgencmd measure_tempSoC-Temperatur (der Active Cooler hält sie unter ROS-Last im Rahmen)
htop, free -h, df -hCPU, Arbeitsspeicher, Datenträger
docker ps, docker logs <id>laufende Container und ihre Ausgabe

vcgencmd ist Teil von Raspberry Pi OS; unter Ubuntu muss es eventuell installiert werden (libraspberrypi-bin) oder ist nicht verfügbar.

Wartbar halten ​

  • Aktualisieren Sie den Host regelmäßig (apt full-upgrade); ROS 2 lebt im Image, ein Host-Update kann ROS also nicht beschädigen.
  • Bauen Sie das Image nach dem Pullen von Repo-Änderungen neu: Das Dockerfile kopiert packages/strido-core und die drei ROS-Pakete zur Build-Zeit.
  • Fahren Sie sauber herunter (sudo poweroff), bevor Sie den Strom trennen: Eine SD-Karte, auf die während eines Stromausfalls geschrieben wird, kann das Dateisystem beschädigen.

Selbsttest ​

  1. Warum braucht der Pi in Strido kein aktiviertes I²C?
  2. Was beheben PSU_MAX_CURRENT=5000 und usb_max_current_enable=1, und warum braucht dieser Roboter sie?
  3. Welche Datei gibt dem ESP32-S3 einen stabilen Gerätenamen, und wie lautet dieser Name?
  4. Warum ist Raspberry Pi OS die bessere Wahl, wenn Sie die Kamera nutzen wollen?
  5. Warum startet das Repo den Roboter nicht automatisch beim Booten?
Antworten
  1. Alle I²C-Geräte (PCA9685, LSM6DSOX, INA260) hängen am ESP32-S3; der Pi kommuniziert mit dem ESP32 nur über USB-Seriell.
  2. Die Versorgung über die GPIO-5-V-Pins überspringt die USB-C-PD-Aushandlung, sodass der Pi eine schwache Versorgung annehmen und den USB-Strom begrenzen würde. Die Einstellungen deklarieren eine 5-A-Versorgung und erlauben vollen USB-Strom für LiDAR und ESP32.
  3. ros2/strido_bringup/config/99-strido.rules, kopiert nach /etc/udev/rules.d/; sie legt /dev/strido_mcu an.
  4. Der Kamera-Stack des Pi 5 braucht den libcamera-Fork von Raspberry Pi, den Raspberry Pi OS mitliefert und das Docker-Image nicht enthält.
  5. Der Start lässt den Roboter innerhalb von 3 s aufstehen; die Startreihenfolge verlangt, dass eine Person die Servos unmittelbar vor dem Start mit dem Loop-Key scharf schaltet.

Weiterführende Literatur ​

MIT-Lizenz. Mechanik abgeleitet von Yertle (Jerome Graves). CAD, Simulation und native Tests sind kein Hardware-Nachweis – siehe Verifikation.