1. [Inbetriebnahme Turtlebot 4](Dokumentation/Inbetriebnahme_Turtlebot_4.md)
2. [ROS Basics](Dokumentation/ROS2_Basics.md)
3. [Sensoren](Dokumentation/Sensoren.md)
4. [Navigation](Dokumentation/Navigation.md)

---
# Boards

### Raspberry Pi 4 (Pi)

*Der **Raspberry Pi 4** mit **4 GB RAM** dient als zentrale Recheneinheit des **TurtleBot 4** und übernimmt wesentliche Aufgaben wie die Verarbeitung von Sensordaten und die Steuerung der Roboterplattform. Ausgestattet mit einem **Quad-Core ARM Cortex-A72 Prozessor**, **Gigabit-Ethernet**, **WLAN** und **Bluetooth** bietet er eine vielseitige Grundlage für Anwendungen wie Navigation, Kartierung und Kommunikation. Die Integration von **ROS 2** ermöglicht eine einfache Entwicklung und Ausführung von Robotiksoftware, während GPIO-Pins und USB-Anschlüsse die Anbindung zusätzlicher Hardware erleichtern. Der Raspberry Pi 4 bildet damit das Kernstück für die Funktionalität und Erweiterbarkeit des TurtleBot 4.*

##### GPIOs ansteuern unter Ubuntu 22.04
###### Einrichten der Umgebung
- Python 3 und Pip (der Python Paketmananger) müsssen installiert sein:`sudo apt install python3 python3-pip`
- Das Paket *RPi.GPIO* installieren: `pip3 install RPi.GPIO`
###### Beispiel: Eine LED blinken lassen mit dem Pi [led.py](../Code/RPi4(Python)/led.py)
###### Unterscheidung Board- und BCM-Modus
- Im **BOARD-Modus** (auch "physischer Modus" genannt) werden die Pins anhand ihrer **physischen Position auf der GPIO-Leiste** des Raspberry Pi adressiert.
- Im **BCM-Modus** (Broadcom-Modus) werden die Pins anhand der **GPIO-Nummerierung des Broadcom-Chips** identifiziert.

###### GPIO Belegung:

<img src="https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png" alt="GPIO Belegung" width="500">

*[Quelle Bild](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html)*

### Raspberry Pi Pico (Pico)

*Der **Raspberry Pi Pico** ist ein Mikrocontroller-Board, das auf dem speziell entwickelten **RP2040-Chip** basiert und ideal für Elektronik-, IoT- und Robotikprojekte ist. Es verfügt über einen **Dual-Core ARM Cortex-M0+ Prozessor**, 264 KB SRAM und 2 MB Flash-Speicher. Mit 26 GPIO-Pins, die Schnittstellen wie **I2C**, **SPI**, **UART** und **PWM** unterstützen, sowie einem **ADC** für analoge Eingaben, bietet der Pico vielseitige Anwendungsmöglichkeiten. Er wird über USB oder eine externe Stromquelle betrieben und kann mit **MicroPython** oder **C/C++** programmiert werden.

Wir verwenden **Micropython** *

- Micropython auf dem PICO installieren: [Anleitung + Download](https://www.raspberrypi.com/documentation/microcontrollers/micropython.html)
- Micropython IDE für den PICO: [Thonny](https://thonny.org/)
- In Thonny unter `Werkzeuge` -> `Optionen` -> `Interpreter` 'MicroPython (Raspberry Pi)' auswählen
  <img src="/Bilder/thonny_interpreter.png" width="600">
  
  *Screenshot aus [Thonny](https://thonny.org/)*
- Damit Code automatisch ausgeführt wird muss dieser auf dem Pico als `main.py` gespeichert werden

Beispiele:
- Die interne LED des Picos blinken lassen [interne_led.py](../Code/Pico(Micropython)/interne_led.py)
- Eine externe LED blinken lassen mit dem Pico [externe_led.py](../Code/Pico(Micropython)/externe_led.py) + [Visualisierung des Aufbaus](https://wokwi.com/projects/418450844568127489)
###### GPIO Belegung:

<img src="https://www.raspberrypi.com/documentation/microcontrollers/images/pico2w-pinout.svg" alt="GPIO Belegung" width="600">


*[Quelle Bild](https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html)*

# Externe Sensoren

### HC-SR04
*Ultraschall-Distanzsensor*

<img src="https://botland.de/img/art/inne/16257_6.jpg" alt="HC_SR04" width="300">

- Messbereich von 2 bis 400 cm
- verwendet Ultraschallwellen um die Entfernung zu einem Objekt zu messen
	1. Der Sensor sendet über den **Trigger-Pin** ein Ultraschallsignal (40 kHz) aus.
	2. Das Signal trifft auf ein Objekt und wird reflektiert.
	3. Der **Echo-Pin** misst die Zeit, die das Signal benötigt, um zurückzukehren.
	4. Die Entfernung wird über die Schallgeschwindigkeit berechnet: $\text{Entfernung} = \frac{\text{Zeit} \times \text{Schallgeschwindigkeit}}{2}​$
- mit dem Raspberry Pi 4 auslesen: [hc_sr04.py](../Code/RPi4(Python)/hc_sr04.py)
- mit dem Raspberry Pi Pico auslesen: [hc_sr04.py](../Code/Pico(Micropython)/hc_sr04.py) + [Visualisierung des Aufbaus](https://wokwi.com/projects/418451470566981633)
### TCRT5000
*Infrarot-Reflexionssensor*

<img src="https://buyzero.de/cdn/shop/products/TCRT5000TrackingSensorModule.jpg?v=1611750766" alt="TCRT5000" width="250">

- sendet Infrarotlicht aus und erkennt das reflektierende Licht mit einem Fototransistor
- liefert über den OUT-Pin ein digitales Signal: LOW *(0)* bei Hindernis (also reflektiertem Licht, zB. weißer Untergrund), HIGH *(1)* bei keinem Hindernis (kein reflektiertes Licht, zB. schwarzer Untergrund)
- so kann man den Turtlebot beispielsweise einer Linie folgen lassen, daher auch Liniensensor
- mit dem Raspberry Pi 4 auslesen: [TCRT5000.py](../Code/RPi4(Python)/TCRT5000.py)
- mit dem Raspberry Pi Pico auslesen: [TCRT5000.py](../Code/Pico(Micropython)/TCRT5000.py)
### HLK-LD2450
*24-GHz-Radarsensor*

<img src="https://m.media-amazon.com/images/I/51Xo7qKEsML._AC_UF894,1000_QL80_.jpg" alt="HLK-LD2450" width="300">

- kompakter 24-GHz-Millimeterwellen-Radarsensor zur Bewegungserkennung und Zielverfolgung
- misst Entfernung, Winkel und Geschwindigkeit von bis zu drei Zielen
- UART Schnittstelle mit einer Datenrate von 256.000 Baud
- Erkennungswinkel: Azimut ±60° *(horizontal)*, Elevation ±35° *(vertikal)*
- Offizielle des Dokumentation des Herstellers auf [Google Drive](https://drive.google.com/drive/folders/1kTt0Z3hjKKrIF3OCIDGdwQ4KotDJ8SGA)

# Interne Sensoren des TurtleBot 4

### RPLIDAR A1M8
*2D-LiDAR Sensor*

<img src="https://www.mybotshop.de/media/image/product/105/lg/rplidar-a1m8-360-range-12m.jpg" alt="RPLIDAR A1M8" width="300">

- 360° Abdeckung & Reichweite von 0,15m bis 12m
- Abtastrate bis zu 8000 Samples pro Sekunde mit einer einstellbaren Drehgeschwindigkeit zwischen 5 Hz und 10 Hz
- Messdaten lassen sich auf dem Turtlebot mit RViz2 visualieren und mit SLAM in eine Karte übersetzen
### OAK-D Pro
*Stereo Tiefenkamera mit Nachtsicht*

<img src="https://www.generationrobots.com/17875-product_cover/luxonis-oak-d-pro-w-kamera.jpg" alt="oakd" width="300">

- [Seite des Herstellers](https://docs.luxonis.com/hardware/products/OAK-D%20Pro)
- speziell für neuronale Netzwerke und Echtzeitanwendungen optimiert und eignet sich so für Computer-Vision-Anwendungen
- hat einen Intel Movidius Myriad X VPU integriert, der neuronale Netze direkt auf der Kamera ausführen kann
- Der Hersteller stellt mit [Depth AI](https://github.com/luxonis/depthai-python) eine Plattform zur KI-gestützten Computer Vision für die Kamera bereit

### Create 3 Sensoren
Der Create 3 ist die Basis der Turtlebot4-Roboterplattform und beinhaltet die Antriebseinheit sowie einige Sensoren. Die Sensoren lassen sich in ROS auslesen.

<img src="https://cdn-reichelt.de/bilder/web/xxl_ws/C900%2FMBS-ROB-27-2.png?type=ProductXxl&" alt="Create 3" width="300">

#### 1. Bumper-Sensoren

- **Funktion**: Erfassen Kollisionen mit der Vorderseite des Roboters und melden potenzielle Hindernisse. Diese Sensoren ermöglichen es dem Roboter, Zusammenstöße zu erkennen und seine Bewegung entsprechend anzupassen.
- **Beispielnutzung**: `ros2 topic echo /hazard_detection`
- **Beispielausgabe:**
```
detections:
- header:
    stamp:
      sec: 1672531200
      nanosec: 500000000
    frame_id: "base_link"
  type: 1  # HAZARD_BUMP

```
- **Beschreibung der Ausgabe**: Der Roboter meldet einen Zusammenstoß mit einem Hindernis.

#### 2. Cliff-Sensoren
- **Funktion**: Erkennen Absturzkanten oder Abgründe, um zu verhindern, dass der Roboter von einer erhöhten Fläche, wie einem Tisch oder einer Treppe, herunterfällt.
- **Beispielnutzung**: `ros2 topic echo /hazard_detection`
- **Beispielausgabe:**
```
detections:
- header:
    stamp:
      sec: 1672531201
      nanosec: 200000000
    frame_id: "base_link"
  type: 2  # HAZARD_CLIFF

```
- **Beschreibung der Ausgabe**: Der Roboter meldet eine Absturzkante und kann entsprechend reagieren.

#### 3. Odometrie
- **Funktion**: Liefert Informationen über die Position und Bewegung des Roboters. Die Odometrie-Daten helfen bei der Verfolgung der gefahrenen Strecke und Orientierung, um Navigation und Lokalisierung zu ermöglichen.
- **Beispielnutzung**: `ros2 topic echo /odom`
- **Beispielausgabe**:
```
header:
  stamp:
    sec: 1672531202
    nanosec: 300000000
  frame_id: "odom"
pose:
  pose:
    position:
      x: 1.23
      y: 0.45
      z: 0.0
    orientation:
      x: 0.0
      y: 0.0
      z: 0.707
      w: 0.707

```
- **Beschreibung der Ausgabe**: Der Roboter befindet sich an Position (1.23, 0.45) mit einer Orientierung von 45 Grad.

#### 4. IMU (Inertial Measurement Unit)
- **Funktion**: Misst die Orientierung, Winkelgeschwindigkeit und lineare Beschleunigung des Roboters. Diese Daten werden genutzt, um Bewegungen und Neigungen zu analysieren sowie Stabilität und Richtung zu überwachen.
- **Beispielnutzung**: `ros2 topic echo /imu`
- **Beispielausgabe**:
```
header:
  stamp:
    sec: 1672531203
    nanosec: 400000000
  frame_id: "imu_link"
orientation:
  x: 0.0
  y: 0.0
  z: 0.707
  w: 0.707
angular_velocity:
  x: 0.0
  y: 0.0
  z: 0.1
linear_acceleration:
  x: 0.0
  y: -9.8
  z: 0.0

```
- **Beschreibung der Ausgabe**: Der Roboter ist stabil, mit einer minimalen Winkelgeschwindigkeit und normaler Gravitation.

#### 5. Wand-Sensor
- **Funktion**: Misst die Entfernung zu einer Wand oder einem Hindernis in der Nähe. Dies ermöglicht es dem Roboter, entlang von Wänden zu navigieren oder Abstände zu Hindernissen zu halten.
- **Beispielnutzung**: `ros2 topic echo /proximity`
- **Beispielausgabe**:
```
header:
  stamp:
    sec: 1672531204
    nanosec: 500000000
  frame_id: "proximity_sensor"
range: 0.25
```
- **Beschreibung der Ausgabe**: Der Roboter erkennt eine Wand oder ein Hindernis in einer Entfernung von 25 cm.

#### 6. Batteriestatus
- **Funktion**: Überwacht den aktuellen Ladezustand der Batterie sowie andere Parameter wie Spannung und Strom. Diese Informationen helfen, den Energieverbrauch zu analysieren und die Betriebszeit zu optimieren.
- **Beispielnutzung**: `ros2 topic echo /battery_state`
- **Beispielausgabe**: 
```
header:
  stamp:
    sec: 1672531205
    nanosec: 600000000
  frame_id: "battery"
voltage: 12.6
current: -1.2
percentage: 0.85
```
- **Beschreibung der Ausgabe**: Die Batterie hat eine Spannung von 12,6 V, eine negative Stromaufnahme (Entladung) von 1,2 A und ist zu 85 % geladen.

# Auslagerung externer Sensoren mit dem Pico

Um nicht die GPIO Pins des verbauten Pi belegen zu müssen bietet es sich an die externen Sensoren an einen Pico anzuschließen und diesen über USB mit dem Pi kommunizieren zu lassen.

#### Beispiel: zwei Liniensensoren auslesen und anzeigen
Mit [sensor_bridge_1.py](../Code/Pico(Micropython)/sensor_bridge_1.py) werden zwei Liniensensoren auf dem Pico ausgelesen und über die serielle USB Schnittstelle an den Pi weitergegeben. Damit dieser Code automatisch ausgeführt wird muss er allerdings als main.py auf dem Pico gespeichert werden. Mit [read_pico.py](../Code/RPi4(Python)/read_pico.py) lässt sich auf Seite des Pis das Signal dann auslesen.

Dieses Prinzip der Auslagerung der Sensoren wird im nächsten Kapitel, der Navigation, wichtig sein.