Steuerungssoftware (kompatibel mit allen ToyCollect Robotern)

06.02.2020

Installation TCserver

TCserver steuert Roboter, LEDs und die Kameras und nimmt Kommandos über Bluetooth oder WLAN entgegen. Für V1.21 (R2X) unterscheiden wir den MASTER Raspberry Pi mit angeschlossenem Motor Controller und den SLAVE. Für die Robotermodelle mit nur einem RPi definieren wir der Einfachheit halber diesen auch als MASTER.

Die folgenden drei Schritte müssen für den V1.21 (R2X) Roboter auf MASTER und SLAVE ausgeführt werden, sonst nur auf dem einen.

  1. Der RPi sollte bereits per SSH erreichbar sein. Bitte loggen Sie sich ein. Wir gehen bei dieser Anleitung davon aus, daß Raspbian Lite installiert wurde und WLAN konfiguriert wurde. Ein Internetzugang direkt am RPi ist für die Installation notwendig.
  2. Führen Sie den Befehl sudo raspi-config aus und ändern dort die folgenden Einträge in den Interfacing Options: P1 Kamera aktivieren; P5 I2C aktivieren; P6 Login-Shell über Seriell deaktivieren, aber serielle Port-Hardware aktivieren. Anschließend ist ein Reboot notwendig. Loggen Sie sich danach wieder ein.
  3. Um die benötigten Bibliotheken zu installieren, führen Sie die folgenden Befehle aus:
    sudo bash
    apt-get update
    apt-get install git wiringpi pigpio libncurses-dev netcat-openbsd joystick

Die folgenden Schritte sind nur am MASTER notwendig.

  1. Loggen Sie sich ein und führen Sie die folgenden Kommandos aus:
    cd /home/pi
    git clone https://git.seewald.at/TCserver
    cd TCserver
  2. Die Konfiguration des konkreten Roboter erfolgt über C++ Include-Dateien. Kopieren Sie eine passende Beispiel-Include-Datei auf config.h - für V1.21 (R2X) wäre das config_PINK_RPI2X_192.168.42.90_91.h, für V1.3 (K3D) oder V1.1 wäre das config_KULA3D.h. Öffnen Sie die Datei mit einem Textmodus-Editor wie nano oder vi.
  3. Die vorgegebenen Beispieldateien sind für die Anwendung von vortrainierten Deep-Learning Modellen ausgelegt. Wenn Sie stattdessen den Roboter über andere Fernsteuerungen steuern wollen, müssen Sie die Beispieldateien wie folgt abändern:
    • bei V1.21 (R2X) #define DL_STREAM mittels // auskommentieren
    • bei V1.3 (K3D) #define RPI_3BPLUS auskommentieren und #define USE_WLAN_SOCKET sowie #define OUTPUT_3D hinzufügen.
    Dies deaktiviert jeweils auch den Override des Bluetooth-Controllers.
  4. Die Einstellungen für den Motor Controller (MC_SERIALPORT, MC_BAUDRATE, MC_BAUDRATE_AUTO) sollten so stimmen. Wenn Sie beim Motor Controller die Baudrate fix auf 38.400 Baud eingestellt haben, kommentieren Sie MC_BAUDRATE_AUTO mittels // aus.
  5. Es kann sein, das die Motoren anders angeschlossen wurden wie im ursprünglichen Roboter. Dafür sind die Einstellungen MC_M0_*, MC_M1_* da.
    Führen Sie make clean && make tests/motor_controller_test und tests/motor_controller_test aus. Mit den Tasten a,y,k,l können Sie die Motoren testen.
    M0 sollte der linke Motor in Fahrtrichtung sein (LEDs = vorne, Logo = hinten), positive Werte sollten ihn vorwärts bewegen und negative Werte rückwärts. M1 sollte der rechte Motor sein und sich ebenso verhalten.
    Wenn etwas anders ist als erwartet, korrigieren Sie die entsprechenden Werte in config.h und starten den Test neu beim ersten Kommando. Zum Beispiel wenn die Motoren links/rechts vertauscht sind, tauschen Sie M0 und M1 in den #define-Zeilen aus. Wenn ein Motor verkehrt ist, tauschen Sie die Kommandos für vorwärts und rückwärts aus.
  6. Die Kalibrierung mc_motor_calibration sollte auf { 1.0f, 1.0f, 1.0f, 1.0f } gesetzt werden. Mit dieser Einstellung kann korrigiert werden wenn die Motoren unterschiedlich schnell laufen und somit eine Geradeausfahrt systematisch nach links oder rechts abdriftet - dann kann der schnellere Motor hier gebremst werden. Da die Motoren sich teilweise bei Vorwärts- und Rückwärtsfahrt unterschiedlich verhalten, kann die Korrektur für beide Richtungen unterschiedlich sein.
  7. Wenn Sie für die direkte Kontrolle des Roboter einen Bluetooth-Controller verwenden wollen - was dann auch ohne WLAN funktioniert - kann unter BT_CONTROLLER_ID dessen Bluetooth-ID und unter BT_TYPE dessen Typ eingetragen werden. Derzeit werden StratusXL und DualShock4 Controller unterstützt. Jeder mit Linux kompatible Bluetooth Gaming-Controller müßte funktionieren. Neue Typen können in TCserver.c ergänzt werden.
    Zur Konfiguration des Bluetooth-Controllers muß dieser mit dem MASTER gekoppelt werden. Dies geschieht über die folgenden Kommandos. Zunächst den Bluetooth-Controller in einen Modus versetzen wo er neu gekoppelt werden kann!
    bluetoothctl
    (in der bluetoothctl Kommandozeile)
    agent on
    default agent
    trust [bluetooth id]
    pair [bluetooth id]
    connect [bluetooth id]
    exit
    (wieder in der normalen Kommandozeile)
    modprobe xpad
    Danach sollte /dev/input/js0 existieren und mittels jstest --event /dev/input/js0 testbar sein.
    Wenn Sie keinen Bluetooth-Controller verwenden wollen, kommentieren Sie die Zeile #define BT_CONTROLLER aus.
    ACHTUNG: Derzeit ist der Bluetooth Controller die einzige Möglichkeit, den Roboter zu übersteuern, wenn er ein vortrainiertes Deep-Learning Modell ausführt.
  8. Mit make tests/led_test && tests/led_test können Sie die angeschlossenen LEDs testen. Hier kann die Helligkeit mit + und - erhöht bzw. verringert werden. Dieser Test sollte auch am SLAVE durchgeführt werden. Das Programm led_test kann via scp tests/led_test pi@[SLAVE IP-Adresse]:. auf den SLAVE kopiert werden.
  9. Beim V1.21 (R2X) Roboter können Sie zusätzlich via make tests/sync_test die Synchronisation zwischen MASTER und SLAVE testen. Dazu muß das Programm allerdings auf beiden RPis parallel gestartet werden. Es ist nur für Troubleshooting notwendig, wenn zum Beispiel die MASTER/SLAVE Erkennung nicht stabil funktioniert. sync_test hat als ersten Parameter MASTER oder SLAVE - auf einem Rechner muß es mit MASTER, am anderen mit SLAVE gestartet werden - und als zweiten eine Zeitverzögerung in Millisekunden, die bestimmt wie oft der Wert wechselt. Sinnvolle Testwerte für den zweiten Parameter sind 10, 100 und 1000.
  10. Wenn alles eingerichtet ist, führen Sie make TCserver aus und kopieren Sie die ausführbare Datei TCserver
    • nach /usr/local/bin
    • Nur für V1.21 (R2X): auf den SLAVE, ebenfalls in /usr/local/bin via scp tests/led_test pi@[SLAVE IP-Adresse]:., dann auf dem SLAVE einloggen und sudo cp TCserver /usr/local/bin
    Anschließend fügen Sie in /etc/rc.local vor der letzten Zeile (enthält exit 0) /usr/local/bin/TCserver >>&! /home/pi/LOG.TCserver & hinzu. Bei V1.21 (R2X) muß dies auf MASTER und SLAVE passieren. Damit wird TCserver beim Booten automatisch gestartet und ein Logfile erstellt.
  11. Wenn Sie jetzt den Roboter neu starten, sollten nach 1-2min die LED(s) kurz aufleuchten. Das zeigt an das TCserver jetzt läuft und bereit ist, Kommandos entgegenzunehmen. Ab diesem Zeitpunkt kann der Roboter via Bluetooth Controller (unter Berücksichtigung des Override) oder einer anderen Fernsteuerungssoftware gesteuert werden. Dies ist auch die Voraussetzung für die Ausführung vortrainierten Deep-Learning Modelle mit TCcontrol, was als nächstes beschrieben wird.

Installation TCcontrol

TCcontrol nimmt Echtzeit-Stereobilder entweder vom lokalen Roboter oder via WLAN entgegen, und berechnet über ein vortrainiertes Tensorflow-Lite Modell die zugehörigen Steuerbefehle, die via lokalem Socket oder WLAN wieder zum Roboter zurückgeschickt werden.

Die vortrainierten Deep-Learning Modell erfordern aus Effizienzgründen die Videoausgabe in unkomprimiertem Format und niedriger Auflösung, viele andere Fernsteuerungen erfordern allerdings aus Qualitätsgründen die Videoausgabe in komprimiertem Format (H2.64) und hoher Auflösung. Deshalb kann derzeit die Anwendung von vortrainierten Deep-Learning Modellen nur mit der Bluetooth-Controller Fernsteuerung kombiniert werden.

  • Wenn Sie einen V1.3 (K3D) Roboter zusammenbauen, führen Sie die folgenden Schritte direkt auf dem RPi 3B+ am Roboter durch.
  • Wenn Sie einen V1.21 (R2X) Roboter zusammenbauen, benötigen Sie einen weiteren RPi als Server (mindestens 3B+, besser 4). Wir empfehlen, diesen direkt an den WLAN-Router per Ethernet-Kabel anzuschließen damit die verfügbare WLAN-Brandbreite vollständig für die Übertragung der Robotervideos zur Verfügung gestellt werden kann.
  1. Der RPi sollte bereits per SSH erreichbar sein. Bitte loggen Sie sich ein. Wir gehen bei dieser Anleitung davon aus, daß Raspbian Lite installiert und WLAN konfiguriert wurde. Ein Internetzugang direkt am RPi ist für die Installation notwendig.
  2. Zunächst installieren wir Tensorflow Lite. Da die Installation relativ aufwendig ist und viel Zeit und Speicherplatz erfordert, verwenden wir hier eine bereits kompilierte Version.
    sudo bash
    cd /usr/local/src
    wget https://seewald.at/files/tf1.7_rpi_lite.tar.gz
    tar -xvzf tf1.7_rpi_lite.tar.gz
    rm -f tf1.7_rpi_lite.tar.gz

    Wenn Sie eine andere Tensorflow-Light Version als 1.7 verwenden, bitte prüfen Sie ob float *probs in tc_eval.cc Zeile #156 geändert werden muß. Unser Einschätzung nach handelt es sich hier um einen Bug von Tensorflow Lite 1.7, der möglicherweise auch bei neuen Versionen besteht.

  3. Um die benötigten Bibliotheken zu installieren, führen Sie die folgenden Befehle aus:
    sudo bash
    apt-get update
    apt-get install git wiringpi pigpio libncurses-dev netcat-openbsd
    apt-get install libopencv-core-dev libopencv-highgui-dev libopencv-imgcodecs-dev libopencv-imgproc-dev
    exit
    cd /home/pi
    git clone https://git.seewald.at/TCcontrol
    cd TCcontrol

    In /home/pi/TCcontrol befinden sich jetzt die notwendigen Programme für die Ausführung der Deep-Learning Modelle sowie die Modelle selbst.

  4. Zur Konfiguration müssen je nach Roboter die #define Einträge im Quelltext unterschiedlich gesetzt werden.
    • Für V1.21 (R2X): Öffnen Sie merge.cc und tragen Sie auf Zeile #48 und #49 die entsprechenden statischen IP-Adressen TC_SERVER_IP_LEFT, TC_SERVER_IP_RIGHT des linken und rechten RPi Zero Ws ein. Links und rechts sind hierbei in Fahrtrichtung des Roboter zu verstehen. TEST_LOCAL darf nicht definiert sein, falls doch bitte auskommentieren. Speichern Sie die Änderungen und öffnen Sie anschließend tc_test.cc. Dort setzen Sie in Zeile #92 TC_SERVER_IP auf die IP-Adresse des MASTER (d.h. dort wo der Motor Controller angeschlossen ist). TC_TEST_LOCAL darf nicht definiert sein, falls doch bitte auskommentieren. Wiederum die Änderungen speichern.
    • Für V1.3 (K3D): Öffnen Sie tc_test.cc. TC_TEST_LOCAL und TC_TEST_LOCAL__KULA3D müssen definiert sein. TC_TEST_LOCAL__CM3 darf nicht definiert sein. Bitte entsprechend abändern. Die Änderungen speichern.
  5. Anschließend wird TCcontrol fertig kompiliert:

    cd /home/pi/TCcontrol
    make

  6. Die Installation unterscheidet sich zwischen den zwei Robotertypen.
    • V1.3 (K3D): Automatischer Start kurz nach TCserver. Bitte die folgenden Zeilen in /etc/rc.local (vor exit 0 und nach /usr/local/bin/TCserver ...) ergänzen:
      sleep 5
      cd /home/pi/TCcontrol
      ./runTcTest.sh K3D.tflite &
    • V1.21 (R2X): Manuelles Starten am Server, nach dem Aufblinken beider LEDs am Roboter:
      cd /home/pi/TCcontrol
      ./runTcTest.sh R2X.tflite &

      Der Roboter sollte sich dann in ca. 30-60s bewegen und parallel die Statusmeldungen angezeigt werden. Alternativ kann am Server auch wie oben ./runTcTest.sh R2X.tflite & in /etc/rc.local vor exit 0 ergänzt werden. Diese Methode ist allerdings nicht ausreichend getestet.

    Zur Steuerung via Bluetooth Controller: Per Default steuert das Deep-Learning Modell den Roboter. Nur wenn eine der Override-Tasten (definiert in TCserver.c mittels BT_BUTTON_LED_MINUS oder BT_BUTTON_LED_PLUS - bei den beiden unterstützten Controllern jeweils die L1 und R1 Tasten vorne am Controller) gedrückt gehalten wird, werden Kommandos übertragen. wenn keine Deep-Learning Modelle verwendet werden, ist diese Override-Funktion deaktiviert und Kommandos werden immer übertragen (wird in TCserver hier eingestellt). Der linke Joystick ist für die Geschwindigkeit, der rechte für die Richtung. Mittels der Tasten X bzw. und B bzw. kann der Roboter am Stand nach links bzw. rechts drehen.

    Viel Spaß! Wenn etwas nicht so funktioniert wie es sollte, kontaktieren Sie uns.