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.
- 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.
- 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.
- 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.
- Loggen Sie sich ein und führen Sie die folgenden Kommandos aus:
cd /home/pi
git clone https://git.seewald.at/TCserver
cd TCserver
- 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
.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
Anschließend wird TCcontrol fertig kompiliert:
cd /home/pi/TCcontrol
make
- 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.