Dienstag, 1. Januar 2019

Erste Schritte am Odroid XU4Q

Im Rahmen meines Roboter-Projekts habe ich mir einen Odroid xu4q (mit passiver Kühlrippe) gekauft. In diesem Blogpost beschreibe ich die Inbetriebnahme des Odroids sowie das Einrichten eines RTMP-Servers zum Videostreaming einer Webcam im lokalem Netzwerk.

Zunächst wurde dieser ohne jegliches Netzteil, SD-Karte und Wifi geliefert.
Daher habe ich mir noch folgende Komponenten gekauft:
  • Netzteil 5V/DC, 3.5 Ampére von Voltcraft
  • Wifi USB-Dongle TPLink WN821N v6
  • SD-Card 64GB SanDisk Ultra
Das Netzteil ist etwas knapp dimensioniert, da laut Hersteller 5V DC 4Amp benötigt wird. Mangels Verfügbarkeit beim lokalen Elektronikhandel musste es aber das 3,5 Amp Netzteil sein. Ich habe den Odroid nun seit einigen Tagen in Betrieb und stelle keine Probleme mit dem Netzteil fest.

Bevor man irgendetwas mit dem Odroid anfangen kann, muss man sich noch ein Image eines Betriebssystems auf die SD-Karte schreiben. Ich habe mich für Ubuntu Mate 18.04 entschieden. Die "Installation" des Betriebssystems auf der SD-Karte mittels Windows-PC ist tatsächlich gar nicht so schwierig. Ich habe mich da an einen sehr alten Blog-Eintrag gehalten: https://com.odroid.com/sigong/blog/blog_list.php?bid=130. Man benötigt einen SD-Kartenleser, dort wird mittels des Tools Win32DiskImager das Ubuntu-Image geschrieben. Das Image kann man sich hier laden. Anschließend wird die SD-Karte in den Odroid gesteckt und der kleine weiße Schalter nahe dem HDMI-Anschluss auf µSD gestellt (andernfalls versucht der Odroid vom eMMC oder gar nicht zu booten). An den HDMI-Anschluss noch einen Monitor anschließen sowie Tastatur und/oder Maus an die USB-Anschlüsse. Wenn man dem Odroid nun Strom gibt, so fängt ein blaues Licht an zu leuchten und der Odroid bootet. Sehr schnell kommt man zum Startbildschirm (Benutzer: odroid, passwort: ohne Passwort). Das root/sudo passwort ist zunächst odroid.
Hinweis: Ich musste den Odroid anfangs 2 oder 3 mal booten, bis ich mich erfolgreich einloggen konnte.


Aufgrund der geringen Anzahl der USB-Ports am Odroid, benutze ich keine Maus, nur eine Tastatur. Daher hier eine Liste von hilfreichen Linux-Befehlen:
  • ctrl+alt+t öffnet ein neues Terminal
  • alt+F10 Fenster in Vollbild 
  • alt+F4 Fenster schließen
  • alt+tab Zwischen Fenstern wechseln 
  • Windows-Taste öffnet das Menü
  • shutdown Herunterfahren des Odroid
  • reboot  Neustarten des Odroid
  • ifconfig  zeigt u.a. die IP des Odroid (unter wlan0)
  • ps -e zeigt alle laufenden Prozesse; ps -e | grep xy zeigt alle Prozesse mit xy im Namen 
  • kill 12345  beendet den Prozess mit der id 12345 (diese id kann man vorher mit ps -e ermitteln)
  • pkill xyz beendet den Prozess mit dem Namen xyz 
  • ~/Desktop ist der Pfad zum Desktop
  • nano ~/Desktop/test.txt öffnet die Textdatei test.txt in der Konsole. Mit ctrl+x kann man nano beenden und wird vorher gefragt ob man speichern möchte


Mit dem Wlan-Dongle hatte ich Schwierigkeiten. Zwar konnte ich mich direkt in mein WLan einloggen, leider war die Signalqualität und Übertragungsgeschwindigkeit extrem gering. Standardmäßig ist der rtl8xxxu-Treiber geladen. Dieser Treiber ist suboptimal. Dieser Post: https://github.com/Mange/rtl8192eu-linux-driver/issues/46 löste mein Problem. Man muss rtl8xxxu nur blacklisten und den Treiber rtl8192eu herunterladen, installieren und den Odroid neustarten.
Blacklisten:
sudo nano /etc/modprobe.d/blacklist-rtl8xxxu.conf
und dann in diese Datei blacklist rtl8xxxu schreiben und speichern
 Neuen Treiber herunterladen, bauen und installieren
sudo apt-get install linux-headers-generic git build-essential
git clone https://github.com/Mange/rtl8192eu-linux-driver.git
cd rtl8192eu-linux-driver
make
sudo make install 
Neustart
reboot
Letzendlich habe ich noch ein Datei-Sharing zwischen dem Odroid und meinem Windows-PC eingerichtet, via Samba. Diese Anleitung https://websiteforstudents.com/share-files-on-ubuntu-16-04-lts-with-windows-10-systems/ hat mir da sehr geholfen.


Der Odroid stellt das Herzstück meines Roboterprojektes dar. Er soll Bilder einer 3D-Kamera verarbeiten, Steuerbefehle verarbeiten und einen Arduino ansteuern, welcher wiederum die Elektromotoren steuert. Um die Kamerabilder auch von anderen PCs im gleichen Netzwerk sehen zu können, habe ich einen rtmp-Server auf dem Odroid installiert. Zu diesem Server streamt zur Zeit ffmpeg die Bilder einer Logitech Webcam.
Als Server verwende ich nginx mit rtmp-Modul. Zum Einrichten habe ich mich an folgende Anleitung gehalten: http://usefulramblings.org/?page_id=10660. Laut dieser Anleitung muss man nginx selber bauen. Dies führte bei mir zu zwei Fehlern, daher kommt hier nocheinmal die Anleitung mit Modifikationen (fett) für den Odroid bzw. das Ubuntu Mate Image 18.04 für den Odroid.

  1. sudo apt-get update
  2. sudo apt-get install unzip
  3. sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev 
    sudo apt-get install --reinstall zlibc zlib1g zlib1g-dev

    sudo apt-get install libsssl1.0-dev
  4. wget http://nginx.org/download/nginx-1.8.0.tar.gz
  5. tar -zxvf nginx-1.9.9.tar.gz
  6. wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
  7. unzip master.zip
  8. cd nginx-1.9.9
  9. ./configure –add-module=../nginx-rtmp-module-master --with-c-opt="Wno-error"
  10. make
  11. sudo make install
  12. start nginx:  sudo /usr/local/nginx/sbin/nginx
  13. stop nginx:  sudo /usr/local/nginx/sbin/nginx -s stop
  14. Configure Nginx with RTMP by editing the file /usr/local/nginx/conf/nginx.conf and placing the following code into it at the end of the file: 

    rtmp
    server {
      listen 1935;
      chunk_size 4096;
      application live {
       live on;
       record off;
       }
     }
    }

Mit folgendem FFMPEG-Befehl wird die Webcam, welche am USB-Port des Odroid angeschlossen ist, zu nginx gestreamt:
ffmpeg -f v4l2 -s 640x480 -r 15 -i /dev/video0 -vcodec libx264 -crf 35 -g 15 -tune zerolatency -f flv rtmp://localhost/live/stream
-s legt die Kameraauflösung fest und muss von der Webcam unterstützt werden.
-r legt die Framerate in fps fest
-i ist der input-path (die erste Kamera liegt unter Linux immer unter /dev/video0)
-vcodec legt fest, wie die einzelnen Frames codiert werden sollen. libx264 und libx265 sind für besonders kleine Datenmengen bekannt.
-crf legt die Güte des codierten Videos fest. Je höher, desto besser die Bildqualität, aber auch Videogröße. libx264 und libx265 sind rechenintensive Codecs. Je höher der -crf Wert, desto weniger muss zum Codieren gerechnet werden. D.h. man muss hier einen guten Mittelwert zwischen Rechenzeit zur Codierung und Videogröße zum flüssigen Streamen finden.
-g legt fest nach wie vielen Frames ein Key Frame gesetzt wird. Das Video wird zum Streaming in Pakete anhand der Key Frames zerschnitten. D.h. je größer der Wert, desto größer die Frameanzahl in einem Paket welche vom Server verteilt werden. Wenn man eine geringe Latenz beim Streaming erhalten möchte, möchte man Pakete mit wenigen Frames verschicken, d.h. die GOP size (-g) darf nicht zu groß sein. In diesem Fall entspricht die Latenz etwa eine Sekunde, da -r 15.Wenn man -g dagegen zu klein wählt, dann steigt die Paketgröße stark an, da das Coding mittels libx264 oder libx265 nicht mehr so effizient ist. Dies führt zu einer stark erhöhten Bitrate und führt dann wieder zu hohen Latenzen.
-tune zerolatency lässt ffmpeg bestimmte (mir unbekannte Parameter) so zu setzen, dass die Latenz reduziert wird.
-f flv legt das Containerformat des Videostreams als flv fest. Möglich auch z.B. asf oder mpeg. Mit flv konnte ich aber die geringsten Latenzen von etwa 1000ms erreichen.

Den Stream kann man dann im Netzwerk unter der Adresse rtmp://<ip vom Odroid>/live/stream abgreifen. Z.B. mit dem VLC-Player oder ffplay. Der VLC-Player führte bei mir zu sehr hohen Latenzen. FFPlay (Teil von ffmpeg) sowohl für Windows wie auch Linux vorhanden führte zu besseren Ergebnissen. Ich verwende folgenden Befehl

ffplay -fflags -nobuffer -probesize 32 -i rtmp://ubuntu1804/live/stream

ubuntu1804 ist der Host-Name von meinem Odroid.




 

Keine Kommentare: