Jetracer auf JetRacer Pro AI

Der JetRacer Pro AI von Waveshare ist eine gute Platform um erste Erfahrungen mit autonomen Fahrzeugen zu sammeln.
Er basiert auf einer recht brauchbaren Platform und hat mit einem Jetson Nano auch genug Leistung um die Anforderungen locker abzudecken.

1. Installation des Waveshare Images

Zuerst holen wir uns das “originale” SD Karten Image von Waveshare und entpacken die -img Datei.
Auf die SD Karte bekommt ihr das nun z.B. mit BalenaEtcher.
Nach dem einlegen der SD Karte in den Nano und dem Hochfahren, steckt ihr ein Mikro USB Kabel an den Jetson und euren PC.
Euer Windows sollte nun eine neue Netzwerkkarte erkennen und dieser eine IP zuweisen. Über http://192.168.55.1:8888/ (Passwort jetson) könnt ihr jetzt auf den Jetson zugreifen.

1.1. WLAN Konfiguration

Öffne ein Terminal in Jupyter Lab File -> New -> Terminal.
Gebe im Terminal den folgenden Befehl ein, um die verfügbaren WLAN-Netzwerke aufzulisten und die SSID deines Netzwerks zu finden. Du kannst diesen Schritt auch überspringen, wenn du den genauen Netzwerk Namen bereits kennst.

sudo nmcli device wifi list

Stelle eine Verbindung zum ausgewählten WLAN-Netzwerk her. Bitte ersetze <ssid_name> und durch den tatsächlichen Namen und das tatsächliche Passwort.

sudo nmcli device wifi connect <ssid_name> password <password>

Nachdem du eine erfolgreiche Rückmeldung erhalten hast, überprüfe die IP-Adresse der Wlan0-Schnittstelle mit dem folgenden Befehl:

ifconfig

Du bist nun verbunden und kannst das USB Kabel wieder entfernen. Zugriff erhälst du jetzt über die IP Adresse welche dir ifconfig für die Schnittstelle wlan0 angezeigt hat (Das Display des JetRacers zeigt dir die IP ebenfalls an).

1.2. Lüftersteuerung installieren

Besser als on/off ist es wenn der Lüfter Temperaturgesteuert ist. Hierfür habe ich ein schönes Tool gefunden: jetson-fan-ctl.
Die Installation ist recht easy:

sudo apt install python3-dev
git clone https://github.com/Pyrestone/jetson-fan-ctl.git
cd jetson-fan-ctl
sudo ./install.sh

1.3. System aktualisieren und Bibliotheken installieren

Stelle den Energiemodus auf 5 Volt ein, um zu verhindern, dass der Jetson Nano versucht, mehr Strom zu verbrauchen, als der Akku liefern kann:

sudo nvpmodel -m1

Der nächste Schritt besteht darin, die Zeitzone des Systems zu ändern, indem du Folgendes ausführst:

tzselect

Installiere die Updates für das System:

sudo apt update
sudo apt upgrade
sudo reboot

Falls ihr beim Update folgenden Fehler erhaltet: nvidia-l4t-bootloader, könnt ihr folgendes versuchen:

sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/backup/
sudo mkdir /var/lib/dpkg/info/
sudo apt update
sudo apt -f install
sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/backup/
sudo rm -rf /var/lib/dpkg/info
sudo mv /var/lib/dpkg/backup/ /var/lib/dpkg/info/

Anschließend die notwendigen Bibliotheken installieren:

sudo apt install python3.8 libxslt1-dev libcurl4-openssl-dev libssl-dev libopenblas-dev python3.8-dev python3-pip nano openmpi-doc

Setzen python 3.8 als standard Version:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

Und reparieren unsere Python Installation

curl -sS https://bootstrap.pypa.io/get-pip.py | python3

2. Einrichten einer virtuellen Umgebung

Erstellen einer virtuellen Umgebung mit Zugriff auf System-Site-Pakete.

pip3 install virtualenv
python3 -m virtualenv -p python3 env --system-site-packages
echo "source ~/env/bin/activate" >> ~/.bashrc
source ~/.bashrc

2.1. Einrichten von Python-Abhängigkeiten

pip3 install -r ~/projects/donkeycar/install/nano/requirements.txt
pip3 install -U Pillow
pip3 install -U opencv-python

3. Benutzerberechtigungen für GPIO einrichten

Als nächstes konfigurieren wir den Jetson Nano so dass er auf den Motor und Servo des Autos für DonkeyCar zugreifen kann. Dazu verwenden wir einige hilfreiche Skripte, die von JetsonHacksNano geschrieben wurden. Wenn du die letzte Zeile ./installServoKit.sh ausführst, bekommst du sie Ausgabe das die Datei 99-gpio.rules nicht gefunden werden konnte. Keine Sorge, das erledigen wir in einem späteren Schritt.

mkdir ~/projects
cd ~/projects
git clone https://github.com/JetsonHacksNano/ServoKit.git
cd ServoKit
sudo ./scripts/setPermissions.sh $USER
pip3 install adafruit-circuitpython-servokit

Als Nächstes fügen wir den Benutzer einer Gruppe mit der Berechtigung zum Zugriff auf den GPIO des Jetson Nano hinzu:

sudo groupadd -f -r gpio
sudo usermod -a -G gpio jetson

Als nächstes müssen brauchen wir die Datei 99-gpio.rules:

sudo wget https://blog.denniseisold.de/blog/2023/10/30/99-gpio.rules -P /etc/udev/rules.d/

Um die von Änderungen zu aktivieren, kannst du entweder den folgenden Befehl ausführen oder das System einfach neu starten.

sudo udevadm control --reload-rules && sudo udevadm trigger

4. DonkeyCar einrichten

cd ~/projects
git clone https://github.com/autorope/donkeycar.git
cd donkeycar
git checkout main
pip3 install -e .[nano]
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v512 tensorflow==2.12.0+nv23.06

Um schließlich den rosa Farbton der Kamera zu korrigieren, können wir den folgenden Code verwenden:

mkdir ~/projects/camera-fix
cd ~/projects/camera-fix
wget https://blog.denniseisold.de/blog/2023/10/30/camera_overrides.isp
sudo cp camera_overrides.isp /var/nvidia/nvcam/settings/
sudo chmod 664 /var/nvidia/nvcam/settings/camera_overrides.isp
sudo chown root:root /var/nvidia/nvcam/settings/camera_overrides.isp

5. Fahrzeug erstellen

donkey createcar --path ~/mycar
cd ~/mycar

Es müssen noch ein paar Variablen in der Konfig eingestellt werden bevor Donkey das Auto steuern kann.

nano myconfig.py
CAMERA_TYPE = "CSIC"                        # (PICAM|WEBCAM|CVCAM|CSIC|V4L|D435|MOCK|IMAGE_LIST)
IMAGE_W = 224
IMAGE_H = 224

PCA9685_I2C_ADDR = 0x40                     # I2C address, use i2cdetect to validate this number
PCA9685_I2C_BUSNUM = 1                      # None will auto detect, which is fine on the pi. But other platforms should specify the bus num.

DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE"
PWM_STEERING_THROTTLE = {
    "PWM_STEERING_PIN": "PCA9685.1:40.0",   # PWM output pin for steering servo
    "PWM_STEERING_SCALE": 1.0,              # used to compensate for PWM frequency differents from 60hz; NOT for adjusting steering range
    "PWM_STEERING_INVERTED": False,         # True if hardware requires an inverted PWM pulse
    "PWM_THROTTLE_PIN": "PCA9685.1:40.1",   # PWM output pin for ESC
    "PWM_THROTTLE_SCALE": 1.0,              # used to compensate for PWM frequence differences from 60hz; NOT for increasing/limiting speed
    "PWM_THROTTLE_INVERTED": False,         # True if hardware requires an inverted PWM pulse
    "STEERING_LEFT_PWM": 470,               # pwm value for full left steering
    "STEERING_RIGHT_PWM": 320,              # pwm value for full right steering
    "THROTTLE_FORWARD_PWM": 500,            # pwm value for max forward throttle
    "THROTTLE_STOPPED_PWM": 350,            # pwm value for no movement
    "THROTTLE_REVERSE_PWM": 220,            # pwm value for max reverse throttle
}

Hier solltest du die Werte eingeben welche du im nächsten Schritt erhälst.

6. Fahrzeug kalibrieren

Um das Auto zu kalibrieren, kannst du den hier gezeigten Schritte folgen. Was folgt, sind die Befehle, die du zum Kalibrieren der Lenkung und des Gashebels deines Autos benötigst.

6.1. Kalibrierung der Lenkung

donkey calibrate --pwm-pin PCA9685.1:40.0

6.2. Kalibrierung Gashebel

donkey calibrate --pwm-pin PCA9685.1:40.1