Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Fahradar

Sicher und unfallfrei von A nach B

Embedded Systems

Markus Busch, Chris Kiriakou, Michael Koscheck, Benedikt Müssig, Leonidas Zissis

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Einführung & Projektziel

Ziel: Fahrradfahrer*innen sicher von A nach B bringen

Fahrradfahrer*in wird durch ein wahrnehmbares Signal aufmerksam auf potenzielle Gefahr gemacht. Und kann dadurch rechtzeit reagieren.

Warnmethoden

  • Visuell: Kleines bei Gegenlicht ablesbares Sharp Memory Display am Lenker.
  • Haptisch: Vibrationsmotor für diskrete Warnungen direkt am Griff.
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Systemübersicht

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Grundprinzip Radar

Radar - Radio Detection and Ranging

Ablauf:

  1. Senden: Ausstrahlen eines Signals (Chirp)
  2. Reflexion & Empfangen: Impuls/Echo wird teils zurückgestreut & empfangen
  3. Auswerten: Peaks zu Objekten mit x,y,(z) und Geschwindigkeit

Distanz: Zeit bis Empfangen des Echos
Geschwindigkeit: Versatz der Phase zwischen 2 Chirps
Azimuth: Versatz der Phase zwischen 2 Antennen

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Chirps unter der Lupe

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Aufbau eines Radars ─ Unser Radar

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Techniken aufgrund Anforderungen

  • Advanced Subframes mit Bursts
    • Beamforming: Erzeugung Beam durch konstruktiver Interferenz mehrer Antennen
    • Schmal wegen destruktiver Interferenz
      • Beamsteering: gezielte Ausrichtung des Radarbeams durch Phasenverschiebung
  • MIMO (Multiple Input Multiple Output): mehrere Sende- und Empfangsantennen für bessere Auflösung
  • CFAR (Constant False Alarm Rate): automatische Schwellenwertanpassung zur Objekterkennung
  • Tracker: Objektpersistenz und Punktwolken-Gruppierungen
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Datenverarbeitung & Aufbereitung

  • Pi Zero als Brücke zwischen Radar und Pi Pico
  • Verarbeitet Radardaten in Echtzeit
  • Kann Daten aufzeichnen und später wieder mit einstellbarer Frequenz abspielen
    • Erlaubt einfaches Testen, da Radar nicht erforderlich
    • Aufzeichnungen können über das Internet ausgetauscht werden
    • Automatisches endloses Wiederholen möglich
  • Erkennung des Radars und Picos (automatische Erkennung der drei Serialports)

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Datenverarbeitung & Aufbereitung

  • Schreiben der Radarkonfigurationsparameter
  • Synchronisieren zum Radardatenstrom
  • Einlesen, Verarbeiten und Visualisieren der TLVs
    • TUI-Anzeige im Terminal möglich
  • Filterung, Scoring und Sortierung der erkannten Objekte
    • Herausfiltern von Objekten, die sich in Gegenrichtung bewegen
    • Score aus Geschwindigkeit (m/s) und 10/Abstand (m)
    • Absteigende Sortierung (höchstes Element ist das Kritischte)
  • Paketierte Weiterleitung an Pico
    • Synchroniesierung, TLV-Format, CRC16

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Firmware ─ Raspberry Pi Pico 2 W

Zentrale Steuereinheit des Systems

  • Empfängt aufbereitete Radar-Daten über USB
  • Kein Radar-Processing \rightarrow reine Koordination
  • Verteilt Daten an Ausgabegeräte (Display & Haptik)

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Software-Architektur

Hauptschleife:

int num_objects = 0;
struct usbcom_data object_data;
while (1) {
    num_objects = usbcom_routine(&object_data); // USB-Daten empfangen
    gui_routine(object_data.objs, num_objects); // Auf Display rendern
    // Wichtigsten Punkt haptisch wiedergeben
    haptics_routine(num_objects > 0 ? &object_data.objs[0] : NULL);
}

Empfangene Objektdaten:

typedef struct {
    float y;         // Entfernung [m]
    float x[2];      // Position [m] 
    float speed;     // Geschwindigkeit
    uint32_t id;     // Eindeutige ID
} object_t;

Modulare Firmware:

  • controller.c - Koordinator
  • usbcom.c - USB-Kommunikation
  • gui.c - Display-Interface
  • haptics.c - Haptik-Interface

Performance:

  • ca. 10 Hz Update-Rate
  • Blocking USB-CDC
  • Echtzeit-Datenverteilung
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Technische Umsetzung

USB-Kommunikation:

  • Meldet sich als serielles CDC-Gerät an
  • Parst eingehende Objektlisten
  • Blockierende I/O

Datenverarbeitung:

  • Nimmt komplette Objektliste entgegen
  • Leitet alle Objekte an Display weiter
  • Wählt nächstes Objekt für Haptik aus

Modulares Design:

  • Klare Trennung der Verantwortlichkeiten
  • Einfache Erweiterung um neue Ausgabegeräte
  • Wartbarer, strukturierter Code

\rightarrow Effizienter Koordinator zwischen Radar-System und Benutzer-Interface

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Visuelle Darstellung ─ MemLCD

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Visuelle Darstellung ─ MemLCD

  • Bei der Initialisierung werden Gridlinien auf die Invertierungsebene gezeichnet
  • Check ob Aktualisierung fällig ist, und verlässt die Funktion vorzeitig, wenn nicht der Fall
  • Für jedes Obj. werden Pos., Breite und Höhe eines Rechtecks berechnet und auf dem Display dargestellt
  • Höhe und Breite der Rechtecke repräsentieren Geschwindigkeit und Breite aller erkannten Objekte
void gui_routine(object_t *objs, int num_objs) {
    uint64_t cur_time = time_us_64();
    if (gui_next_update > cur_time)
        return;

    gui_next_update = cur_time + (GUI_UPDATE_INTERVAL_US);

    memlcd_clear(MEMLCD_WHITE, false);
    for (int obj_idx = 0; obj_idx < num_objs; obj_idx++) {
        int x = (int)(objs[obj_idx].x[0]*SCALE_X)+CENTER_H;
        int w = abs((int)(objs[obj_idx].x[1]*SCALE_X)+CENTER_H - x);
        if (w < 5)
            w = 5;
        int y = (int)(objs[obj_idx].y*SCALE_Y)+15;
        int s = (int)sqrtf(objs[obj_idx].speed);
        if (s < 5)
            s = 5;

        memlcd_fill_rect(x, y, w, s, MEMLCD_BLACK);
    }
    memlcd_update();
}
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Haptik ─ DRV2605L & Titan-Haptics Carlton

  • Haptischer Feedback Treiber für LRA & ERM
  • Implementierung einer Bibliothek für Abstraktion der Low-Level-Funktionen
typedef struct {
    uint8_t addr;                    // I2C address
    i2c_inst_t *drv_i2c_instance;    // Pointer to the Pico SDK I2C instance
    enum DRV2605L_MODE mode;         // Current mode (rtp/wave sequence)
    enum CTRL_MODE ctrl;             // Control strategy (open/closed-loop)
} drv2605l_t;

bool drv2605l_init(drv2605l_t *drv);
void drv2605l_write(drv2605l_t *drv, uint8_t reg, uint8_t val);
void drv2605l_set_mode(drv2605l_t *drv, enum DRV2605L_MODE mode);
void drv2605l_stop(drv2605l_t *drv);
void drv2605l_rtp(drv2605l_t *drv, uint8_t rtp);

bool drv2605l_init(drv2605l_t *drv):

  • Kalibrierungsfunktion für Closed-Loop (Autocalibration-Routine schlägt fehl!)
  • Frequenzbereiche nicht optimal! (150Hz - 300Hz)
  • Setupfunktion für Open-Loop: fminf_{min} = 80Hz
  • LRA mit Beschleunigung von 5G bei 80Hz
  • Betriebsspannung: 3.6 bis 10 Vp-p
Modus Beschreibung
Impact Mechanischer Schlag auf eine Oberfläche
Traditional "Puls" haptisches Feedback, geräuschlos
  • Haptisches Feedback: (Rechteck >> Sinus)
  • Mechanorezeptoren reagieren auf starke Veränderungen[1]:

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Haptik ─ Wellengenerierung

void generate_waveform(float x[2], float y, float speed, waveform_t *waveform_out);

Abhängikeit der Eingabeparameter:

  • Boundingbox [m][m] x \mapsto Amplitudenfaktor jeweiliger Seite:
    • x[0]: Linke Grenze
    • x[1]: Rechte Grenze
  • Abstand [m][m] y \mapsto Amplitude, Anzahl der Sample (20 - 40)
  • Geschwindigkeit [km/h][km/h] speed \mapsto Steigung

Modifikation der Sigmoidfunktion (Logistische Funktion):

σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}} \longrightarrow σ(t;k)=11+ek(t0.5)\sigma(t;k) = \frac{1}{1 + e^{-k(t-0.5)}}

for (int i = 0; i < sample_count; i++) {
    float time = (float)i / (sample_count - 1);             // normalize time [0, 1]
    float slope = 1.0f / (1.0f + expf(-k * (time - 0.5f))); // sigmoid function
    float left = left_factor * slope;
    float right = right_factor * slope;
    ...
}
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Demo

Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Quellen

  • [1] Y. Vardar, B. Güçlü and C. Basdogan, "Effect of Waveform on Tactile Perception by Electrovibration Displayed on Touch Screens," in IEEE Transactions on Haptics, vol. 10, no. 4, pp. 488-499, 1 Oct.-Dec. 2017, doi: 10.1109/TOH.2017.2704603.
  • TI: AWR6843ISK Data Sheet, SWRU546E (2018, REV. 2022)
  • TI: AWR6843 User Guide, SWRS248E (2020, REV. 2025)
  • TI: MMWAVE SDK User Guide (3.6 LTS, 2021)
  • TI: Introduction to mmwave Sensing: FMCW Radars
  • TI: Beamforming in LRPD
  • TI: mmWave Radar Interface Control
  • TI: Long Range People Detection User Guide
  • TI: People Counting CUstomization User Guide
  • TI: Digital Baseband Architecture in AWR1xxx Devices
  • TI: Object Detection Data-path Processing Chain (DPC)
  • TI: Using a complex-baseband architecture in FMCW radar systems, SPYY007 (Karthik Ramasubramanian)
  • TI: Programming Chirp Parameters in TI Radar Devices, SWRA553A (2017, REV. 2020)
  • G. Brooker, “Understanding Millimetre Wave FMCW Radars,” 1st International Conference On Sensing Technology, November 2005, New Zealand

Tools

  • TI Demo Visualizer
  • TI Industrial Visualizer
  • TI mmWave Sensing Estimator
Fahradar | Embedded-Systems | Busch, Kiriakou, Koscheck, Müssig, Zissis

Noch offen

Noch offen

Noch offen

Noch offen

| Ziel | $S$ | $f_s$ | $N_{samples}$ | $N_{chirps}$ | $T_{ramp}$ | $T_{idle}$ | $T_{ADC Start}$ | $B$ | |------------|-----|-------|---------------|--------------|------------|------------|-----------------|-----| | $d_{max}$ | ↓ | ↑ | | | | | | | | $v_{max}$ | ↓ | ↑ | ↓ | | ↓ | ↓ | ↓ | ↓ | | $\Delta d$ | ↑ | ↓ | ↑ | | | | | | | $\Delta v$ | | | | ↑ | ↑ | ↑ | | ↑ |

TI AWR6843ISK - Michael

Raspberry Pi Zero W - Benedikt

Leo - 2.5 Min Firmware Präsentation

MemLCD - Markus

DRV2605L & Titan-Haptics TacHommer-Carlton - Chris

Benedikt

Bitte fehlende Quellen hinzufügen