154 lines
4.1 KiB
Markdown
154 lines
4.1 KiB
Markdown
# Robot
|
|
|
|
## Cam-stream
|
|
|
|
Files:
|
|
- cam_stream.py
|
|
|
|
### Ziel
|
|
|
|
Kamera läuft und schickt Bilder via seriell an den ESP.
|
|
|
|
### Voraussetzung
|
|
|
|
- Die Kamera 🤡
|
|
- ESP am Serial-Port `/dev/ttyACM1` (115200 Baud)
|
|
|
|
### Umsetzung
|
|
|
|
In Endlosschleife wird ein 640x480-Graustufen-Frame von der Kamera gelesen und als JPEG komprimiert bis die Größe unter 1200 Bytes liegt.\
|
|
Danach wird der Frame in JSON-Format über seriell an den ESP gesendet.\
|
|
Sollte es zu einem Verbindungsabbruch zwischen Pi und ESP kommen wird automatisch so lange eine Neuverbindung versucht, bis diese Verbindung wieder steht.
|
|
|
|
### Probleme während der Bearbeitung und ihre Lösungen
|
|
|
|
Die Kamera wurde nicht konstant erkannt (beim Suchen der Kamera wurde sie manchmal gefunden und manchmal nicht, meistens nicht).\
|
|
Eine Neuinstallation von Raspbian hat das Problem gelöst, allerdings wurde diesmal die full-version installiert.
|
|
|
|
-----------------------
|
|
|
|
## Line follow
|
|
|
|
Files:
|
|
- AlphaBot2.py
|
|
- TRSensors.py
|
|
- line_follow.py
|
|
|
|
### Ziel
|
|
|
|
Roboter soll in der Lage sein einer Linie auf dem Boden zu folgen,
|
|
ohne diesen zu verlieren
|
|
|
|
### Voraussetzung
|
|
|
|
Linienbreite deckt 3 der 5 Sensoren ab (die mittleren), äußeren Sensoren müssen den boden sehen.
|
|
|
|
### Umsetzung
|
|
|
|
#### erste Idee: (Verworfen)
|
|
|
|
Von 5 Sensoren müssen die mittleren 3 immer die Linie sehen.\
|
|
Mithilfe der äußeren Sensoren werden Korrekturen durchgeführt, damit der Roboter auf der Linie bleibt.
|
|
|
|
#### zweite Idee:
|
|
|
|
Es müssen wieder die mittleren 3 Sensoren auf der Linie sein.\
|
|
Diesmal wird die Korrektur aber von Sensor 1 und Sensor 3 durchgeführt (Index beginnt bei 0).\
|
|
Mithilfe der äußeren Sensoren, soll entschieden werden, ob eine Abzweigung existiert und falls sie existiert wird eine stärkere Korrektur durchgeführt damit der Roboter sich richtig dreht.
|
|
|
|
### Probleme während der Bearbeitung und ihre Lösungen
|
|
|
|
#### erste Idee:
|
|
|
|
Der Roboter hat zu sehr gezappelt und es war schwer zu unterscheiden ob nur leicht korrigiert werden musste oder ob die Linie die Richtung gewechselt hat.
|
|
Das Problem sollte durch die zweite Idee gelöst werden.
|
|
|
|
#### zweite Idee: (Idee wurde vereinfacht auf nur starke Kurven = Roboter muss eine 90° Drehung machen um zu folgen)
|
|
|
|
Der Roboter interpretiert, je nach Untergrund, Kurven falsch.\
|
|
Obwohl keine Kurve vorhanden ist biegt er doch ab.\
|
|
Wenn eine Kurve vorhanden ist nimmt er diese nicht korrekt war und bleibt am Ende der Linie stehen.
|
|
|
|
-------------------
|
|
|
|
## remote steering
|
|
|
|
Files:
|
|
- AlphaBot2.py
|
|
- IRremote.py
|
|
|
|
### Ziel
|
|
|
|
Steuerung des kompletten Roboters über Fernbedienung.
|
|
Möglich machen:
|
|
- Roboter bewegen
|
|
- Linienfolgen starten und stoppen + Kalibrierung manuell starten
|
|
- (Kameraausrichtung ermöglichen)
|
|
|
|
### Voraussetzung
|
|
|
|
Die Fernbedienung 🤡
|
|
|
|
### Umsetzung Buttons
|
|
|
|
- play/pause = starten bzw. stoppen des line follows
|
|
- 2 = geradeaus fahren
|
|
- 4 = nach links drehen um die eigene Achse
|
|
- 6 = nach rechts drehen um die eigene Achse
|
|
- 8 = rückwärts fahren
|
|
|
|
### Probleme während der Bearbeitung und ihre Lösungen
|
|
Keine Probleme
|
|
|
|
-------------------
|
|
|
|
## Daemon
|
|
|
|
Files: Kein
|
|
|
|
### Ziel
|
|
|
|
Automatisches starten des Kamerastreams,
|
|
sowie die Steuerung über eine Fernbedienung.
|
|
|
|
### Umsetzung
|
|
|
|
1. **Service-Datei anlegen**
|
|
|
|
Erstelle unter `/etc/systemd/system/` eine Datei namens `<service_name>.service` mit folgendem Inhalt:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=<Kurzbeschreibung des Dienstes>
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=<system_user>
|
|
WorkingDirectory=<Arbeitsverzeichnis>
|
|
ExecStart=<Pfad zu Interpreter> <Pfad zum Skript>
|
|
Restart=always
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
2. **Systemd neu einlesen**
|
|
|
|
``sudo systemctl daemon-reload``
|
|
3. **Dienst aktivierten (Boot-Start)**
|
|
|
|
``sudo systemctl enable <service_name>.service``
|
|
4. **Dienst sofort starten**
|
|
|
|
``sudo systemctl start <service_name>.service``
|
|
5. **Status und Logs prüfen**
|
|
- Status anzeigen:
|
|
|
|
``sudo systemctl status <service_name>.service``
|
|
- Live-Logs:
|
|
|
|
``sudo journalctl -u <service_name>.service -f``
|
|
|
|
### Probleme während der Bearbeitung und ihre Lösungen
|