AEP Gruppe B5 - SoSe18: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(83 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:


== Einleitung ==
== Einleitung ==
Das Ziel des Praktikums besteht darin einen LEGO - Roboter zu konstruieren und zu programmieren, der selbstständig eine Parklücke erkennt und schnellstmöglich in diese einparkt.
Das Ziel des Praktikums besteht darin einen LEGO-Roboter zu konstruieren und zu programmieren, der selbstständig eine Parklücke erkennt und schnellstmöglich in diese einparkt.
[[Datei:Auto-Modell_Werbefoto.png|600px|mini|LEGO-Modell <ref> Selbsterstellter Screenshot </ref>]]


=== Teammitglieder ===
=== Teammitglieder ===
Zeile 8: Zeile 9:
   
   
# [[Benutzer:Alexander Thumann|Alexander Thumann]]
# [[Benutzer:Alexander Thumann|Alexander Thumann]]
#* Bau des Roboters
#* Bau des Roboters (Version 1.0)
#* Entwicklung eines Konzepts/einer Spielstrategie
#* Überarbeitung des Roboters
#* Implementierung der Spielstrategie in Matlab (bzw Simulink)
#* Entwicklung einer Strategie
#* Pflege des SVN
#* Implementierung der Strategie in Matlab und Simulink
#* Erstellung des YouTube Videos
# [[Benutzer:Darius Wude|Darius Wude]]
# [[Benutzer:Darius Wude|Darius Wude]]
#* Bau des Roboters
#* Bau des Roboters (Version 1.0)
#* Entwicklung einer Spielstrategie
#* Entwicklung einer Strategie
#* Implementierung der Spielstrategie in Matlab
#* Implementierung der Strategie in Matlab
#* Erstellung des HSHL - Wiki - Artikels
#* Erstellung des HSHL-Wiki-Artikels
# [[Benutzer:Leon Broelemann|Leon Brölemann]]
# [[Benutzer:Leon Broelemann|Leon Brölemann]]
#* Bau des Roboters
#* Bau des Roboters (Version 1.0)
#* Entwicklung eines Konzepts/einer Spielstrategie
#* Überarbeitung des Roboters
#* Implementierung der Spielstrategie in Matlab (bzw Simulink)
#* Entwicklung eines Konzepts/einer Strategie
#* Nachbau des Roboters als LEGO - Modell mit dem LEGO - Designer
#* Implementierung der Strategie in Matlab und Simulink
#* Nachbau des Roboters als LEGO-Modell mit dem LEGO-Digital-Designer
#* Erstellung des YouTube Videos


== Die Parksituation ==
== Die Parksituation ==
Zeile 28: Zeile 32:


== Regelwerk ==
== Regelwerk ==
Wie auch im echten Leben soll hier auf die STVO Rücksicht genommen werden. Das vollständige Regelwerk dazu ist [http://193.175.248.52/wiki/index.php/Regelwerk_RoboSoccer hier <ref> Regelwerk - http://193.175.248.52/wiki/index.php/Regelwerk_RoboSoccer </ref>] zu finden.
Wie auch im echten Leben soll hier auf die STVO Rücksicht genommen werden. Das vollständige Regelwerk und andere Informationen bezüglich des Praktikums finden Sie [http://193.175.248.52/wiki/index.php/Autonomes_Fahren_SoSe18 hier <ref> Informationen - http://193.175.248.52/wiki/index.php/Autonomes_Fahren_SoSe18 </ref>].


== Hardware ==
== Hardware ==
Zeile 35: Zeile 39:
<br>Der Ultraschallsensor wird zum erkennen der Parklücke verwendet. Zudem wird mit Hilfe der Anzahl der Umdrehungen des Motors und dem Ultraschallsensor die größe der Parklücke ausgerechnet.
<br>Der Ultraschallsensor wird zum erkennen der Parklücke verwendet. Zudem wird mit Hilfe der Anzahl der Umdrehungen des Motors und dem Ultraschallsensor die größe der Parklücke ausgerechnet.


Damit der Roboter nun bei der Suche der Parklücke auch wirklich geradeaus fährt, benötigt es einen zusätzlichen Sensor, der in dem [https://de.wikipedia.org/wiki/Lego_Mindstorms_NXT LEGO – Mindstorms – Set] nicht enthalten ist. Das wäre der [https://de.wikipedia.org/wiki/Drehratensensor/# Gyrosensor].
Damit der Roboter nun bei der Suche der Parklücke auch wirklich geradeaus fährt, benötigt es einen zusätzlichen Sensor, der in dem [https://de.wikipedia.org/wiki/Lego_Mindstorms_NXT LEGO – Mindstorms – Set] nicht enthalten ist. Das wäre der [https://de.wikipedia.org/wiki/Drehratensensor/# Gyrosensor <ref> Infos zum Gyrosensor - https://de.wikipedia.org/wiki/Drehratensensor/ </ref>].
Dieser Sensor wird von der Firma [http://www.hitechnic.com/# HiTechnic <ref> Homepage HiTechnic - http://www.hitechnic.com/# HiTechnic </ref>] hergestellt.  
Dieser Sensor wird von der Firma [http://www.hitechnic.com/# HiTechnic <ref> Homepage HiTechnic - http://www.hitechnic.com/# HiTechnic </ref>] hergestellt.  
Die Servomotoren sowie der Tastsensor werden im Folgenden noch kurz vorgestellt.
Die Servomotoren sowie der Ultraschallsensor werden im Folgenden noch kurz vorgestellt.


=== Servomotoren ===
=== Servomotoren ===
Der NXT benutzt Servomotoren, die je nach Belieben nach Zeit, Geschwindigkeit, Strecke und Winkel angesteuert werden können. Mit den eingebauten Rotationssensoren lassen sich die Umdrehungszahlen in Grad speichern und über verschiedene Befehle rotieren, vor und zurück fahren oder bremsen. Der NXT-Brick bietet 3 Möglichkeiten, um die Servomotoren anzuschließen.
Der NXT benutzt Servomotoren, die je nach Belieben nach Zeit, Geschwindigkeit, Strecke und Winkel angesteuert werden können. Mit den eingebauten Rotationssensoren lassen sich die Umdrehungszahlen in Grad speichern und über verschiedene Befehle rotieren, vor und zurück fahren oder bremsen. Der NXT-Brick bietet 3 Möglichkeiten, um die Servomotoren anzuschließen.


=== Tastsensor ===
=== Ultraschallsensor===
Der Tastsensor funktioniert im Grunde wie ein normaler Lichtschalter und besitzt entweder die Position 1 (gedrückt) oder 0 (nicht gedrückt). <br>Durch das Drücken des Tasters gegen einen leichten mechanischen Federwiderstand wird der Sensorstromkreis geschlossen und somit der elektrische Impuls mit einer ungefähren Stromstärke von 2,2 mA abgesetzt. Wird der Taster losgelassen, so wird der Stromkreis wieder durch die meachanische Feder unterbrochen.
Der Ultraschallsensor funktioniert, wie der Name schon sagt mit Hilfe von Ultraschallwellen um Abstände zu bestimmen. Hier für muss der Sensor sowohl Ultraschallwellen aussenden können, als auch diese empfangen können. <br>
Der Ultraschallsensor kann dann mit Hilfe der verstrichenen Zeit die Entfernung in 'cm' ausrechnen. <br>
Allerdings nur bis zu 255 cm.
 
===Roboterabmessungen===
 
{| class="wikitable"
|-
! style="width:60%"| Parameter      !!  style="width:30%"|Maße
|-
| Länge in mm                                                    ||style="text-align:center"| 280
|-
| Breite in mm                                                  ||style="text-align:center"| 151
|-
| Höhe in mm                                                    ||style="text-align:center"| 130
|-
| Spurweite in mm                                                ||style="text-align:center"| 120
|-
| Max. Lenkeinschlag rechts in °                                  ||style="text-align:center"| 40
|-
| Max. Lenkeinschlag links in °                                  ||style="text-align:center"| 40
|}


=== Bilder des Roboters ===
=== Bilder des Roboters ===


[[Datei:IR_COMP_TOUCH_beschriftet.jpg|none|mini|Vorderansicht <ref> Eigenes Foto </ref>]]
<gallery widths="500">
[[Datei:Frontalansicht.jpg|none|mini|Frontalansicht <ref> Eigenes Foto </ref>]]
Datei:VorderansichtB5.jpeg|Vorderansicht<ref> Eigenes Foto </ref>
[[Datei:NXT_FANG_beschriftet.png|none|mini|Rückansicht <ref> Eigenes Foto </ref>]]
Datei:Gyrosensor_Neu.jpg|Seitenansicht  <ref> Eigenes Foto </ref>
 
Datei:Rückansicht Neu.jpg|Rückansicht<ref> Eigenes Foto </ref>
[[Datei:Roboninho.png|none|mini|LEGO-Modell <ref> Selbsterstellter Screenshot </ref>]]
</gallery>


Mit dem [http://ldd.lego.com/de-de LEGO Digital Designer <ref> LEGO Digital Designer - http://ldd.lego.com/de-de </ref>] haben wir den Roboter in einem 3D-Modell nachgebaut. Eine Bauanleitung, um den Roboter nachzubauen befindet sich hier: [[Datei:Bauanleitung_Roboninho.pdf]]
Mit dem [http://ldd.lego.com/de-de LEGO Digital Designer <ref> LEGO Digital Designer - http://ldd.lego.com/de-de </ref>] haben wir den Roboter in einem 3D-Modell nachgebaut. Eine Bauanleitung, um den Roboter nachzubauen befindet sich in unserem SVN-Ordner.


== Spielstrategie ==
== Strategie ==
Zur Entwicklung einer Spielstrategie für das Spielprogramm wird zunächst ein Programmablaufplan mit dem Programm [http://friedrich-folkmann.de/papdesigner/Hauptseite.html „PaP-Designer“ <ref> Pap-Designer http://friedrich-folkmann.de/papdesigner/Hauptseite.html </ref>] erstellt.
Zur Entwicklung einer Strategie für das Programm wird zunächst ein Programmablaufplan mit dem Programm [http://friedrich-folkmann.de/papdesigner/Hauptseite.html „PaP-Designer“ <ref> Pap-Designer http://friedrich-folkmann.de/papdesigner/Hauptseite.html </ref>] erstellt.
Bei unserer Spielstrategie benutzen wir drei Unterfunktionen: Die ''Ballsuche und den Ballfang'', das ''Ausrichten zum Tor'' und den ''Ballschuss''. Diese drei Unterfunktionen werden dann in einem Multitaskingprogramm als Dauerschleife im ''Hauptprogramm'' zusammengeführt.
Bei unserer Srategie benutzen wir drei Unterfunktionen:''Parklücke Suchen'', ''Parklücke Messen'' und ''Einparken''. Diese drei Unterfunktionen werden dann in einem Multitaskingprogramm in einer Zustandsmaschine im ''Hauptprogramm'' zusammengeführt.


=== Hauptprogramm ===
=== Hauptprogramm ===


[[Datei:Autonom Einparken.png|400px|thump|Hauptprogramm]]
[[Datei:Autonom Einparken.png|600px|thump|Hauptprogramm]] <br>
Beim Start des Hauptprogramms werden zunächst alle Sensoren auf ihre jeweiligen Ports initialisiert. Danach wird der aktuelle Zustand abgefragt.
Beim Start des Hauptprogramms werden zunächst alle Sensoren auf ihre jeweiligen Ports initialisiert. Danach wird der aktuelle Zustand abgefragt.
Solange man nun nicht richtig eingeparkt ist werden dann die einzelnen Unterprogramme (je nach aktuellen Zustand) aufgerufen.
Solange man nicht richtig eingeparkt hat werden dann die einzelnen Unterprogramme (je nach aktuellem Zustand) aufgerufen.


=== Parklücke Suchen ===
=== Parklücke Suchen ===
[[Datei:Parklücke suchen.png|250px|none|Parklücke Suchen]]
[[Datei:Parklücke suchen.png|250px|none|Parklücke Suchen]]
Solange der Tastsensor nicht gedrückt ist, soll der Ball gesucht werden und sich die Fangmotorik drehen.  
Solange der Abstand zur Wand zu  gering ist soll der Nxt geregelt geradeaus fahren.
Zur Ballsuche werden die Werte des Infrarotsensors eingelesen. Mit 5 if-Verzweigungen werden die 5 Richtungen unterschieden und die Motoren dann jeweils angesteuert.
Falls die Parklücke breit genug ist, ist die nächste Phase des Einparkens erreicht.


=== Parklücke Messen ===
=== Parklücke Messen ===
[[Datei:Parklücke messen.png|none|350px|Parklücke Messen]]
[[Datei:Parklücke_Messen_Neu.png|none|800px|Parklücke Messen]]
Wenn der Tastsensor gedrückt wurde/ist, wird die aktuelle Richtung des Kompassensors eingelesen und die Differenz zur Richtung des Tors berechnet. Danach werden die "Fahrmotoren" so angesteuert, dass sich der Roboter zum Tor bewegt.
Der Roboter fährt parallel zur Parklücke bis der Abstand zur Wand wieder schrumpft. <br>
Sobald die Differenz, mit einer kleinen Abweichung, der Richtung des Tors entspricht, werden die "Fahrmotoren" gestoppt.
Mit Hilfe der Umdrehungen des Motors seit Parklückenbeginn und dem Durchmesser der Reifen kann die Länge der Lücke errechnet werden. <br>
Falls die Parklücke lang genug ist wird der Zustand auf 3 gesetzt (eine passende Parklücke wurde gefunden) sonst wieder auf 1 (eine neue Parklücke muss gesucht werden).


=== Einparken ===
=== Einparken ===
[[Datei:Ballschuss.png|none|300px|Einparken]]
[[Datei:EinparkenB5.png|none|200px|Einparken]]
Der Schussmotor soll den Ball mit voller Leistung ins Tor schießen.
Wenn eine Parklücke gefunden wurde, in die der Roboter passt, beginnt der Nxt mit dem Einparken.


== Umsetzung der Spielstrategie ==
== Umsetzung der Strategie ==
Zur Realisierung der Spielstrategie und Implementierung der Unterprogramme und des Hauptprogramms wurde das [http://bricxcc.sourceforge.net/ Bricx Command Center <ref> Bricx Command Center - http://bricxcc.sourceforge.net/ </ref>] (kurz: BricxCC) verwendet. Dieses benutzt die Programmiersprache [https://de.wikipedia.org/wiki/Not_eXactly_C NXC <ref> NXC - https://de.wikipedia.org/wiki/Not_eXactly_C </ref>] (Not eXactly C).  
Zur Realisierung der Strategie und Implementierung der Unterprogramme und des Hauptprogramms wurde [https://de.wikipedia.org/wiki/Matlab Matlab<ref> Matlab - https://de.wikipedia.org/wiki/Matlab </ref>] und später das Unterprogramm [https://de.wikipedia.org/wiki/Simulink Simulink <ref> Simulink - https://de.wikipedia.org/wiki/Simulink </ref>] verwendet.
<br>Da an dieser Stelle eine vollständige Präsentation des Spielprogramms nicht vorgesehen ist, werden „nur“ die Befehle zur Ansteuerung der Motoren sowie Sensoren vorgestellt:
<br>Da an dieser Stelle eine vollständige Präsentation des Programms nicht vorgesehen ist, werden „nur“ die Befehle zur Ansteuerung der Motoren sowie Sensoren vorgestellt:


<br><code>handle = COM_OpenNXT();</code>
<br> Mit diesem Befehl wird eine Verbindung zum NXT aufgbaut.
<br><code>COM_CloseNXT(handle);</code>
<br> Mit diesem Befehl wird die Verbindung zum NXT getrennt.


'''Motoren'''
'''Motoren'''
<br><code>OnFwd(OUT_AC, 75);</code>
<br><code>Antrieb = NXTMotor('A', 'Power', 80);</code>
<br>Dieser Befehl lässt den Roboter geradeaus fahren. Als Parameter werden dafür die Motoren an den Ausgängen A und C und die Geschwindigkeit (75) übergeben.  
<br>Dieser Befehl initialisiert einen Motor als Antrieb. Als Parameter werden dafür der Port des Motors (A) und die Geschwindigkeit (80) übergeben.  


<br><code>OnRev(OUT_AC, 75);</code>
<br><code>Antrieb.SendToNXT();</code>
<br>Diese Anweisung funktioniert genauso wie OnFwd(), lässt die Motoren diesmal nur rückwärts drehen, sodass der Roboter rückwärts fährt.
<br>Dieser Befehl schickt dem NXT den im Antrieb gespeicherten Befehl, sodass der NXT weiß was zutun ist.


<br><code>Off(OUT_AC);</code>
<br><code>Antrieb.Stop('break');</code>
<br>Mit diesem Befehl werden die Motoren an den Ausgängen A und C gestoppt.
<br>Mit diesem Befehl werden die Motoren an den Ausgängen A und C gestoppt.


<br><code>Float(OUT_AC);</code>
<br><code>Antrieb.Stop('Off');</code>
<br>Dieser Befehl bremst wie der Befehl Off(), jedoch wird hier einfach die Stromzufuhr zu den Motoren abgeschnitten, was ein Ausrollen der Motoren zu Folge hat.
<br>Dieser Befehl bremst wie der Befehl Antrieb.Stop('break'), jedoch wird hier einfach die Stromzufuhr zu den Motoren abgeschnitten, was ein Ausrollen der Motoren zu Folge hat.
 
<br><code>OnFwdSync(OUT_AC, 75, 50);</code>
<br>Mit dieser Anweisung lassen sich Bögen mit dem Roboter fahren. Der letzte Parameter gibt dabei den Radius des Bogens an. <br>Bei 0 würde der Roboter ganz normal vorwärts fahren. Bei immer größer werdenden Werten, fährt der Roboter immer Stärker zur Seite. Der Wert 50 dreht nur einen der beiden Motoren, sodass der Roboter praktisch in einem Winkel von 90° fährt. Ein Wert von 127 lässt die beiden Motoren entgegengesetzt drehen, der Roboter dreht sich also auf der Stelle.
 
<br><code>OnFwdReg(OUT_AC, 75, mode);</code>
<br>Dieser Befehl reguliert die Motoransteuerung. Die ersten beiden Parameter dieser Anweisung stehen wieder für die Ausgänge der Motoren und die Geschwindigkeit. Für den letzten Parameter gibt es jedoch drei verschiedene Modi.
*'''OUT_REGMODE_IDLE''' Bei diesem Modus findet keine Synchronisation der Motoren statt.
*'''OUT_REGMODE_SPEED''' Synchronisation durch Anpassung der Geschwindigkeit. Unterschiede werden dabei durch Schneller- bzw. Langsamer- Drehen der Motoren ausgeglichen.
*'''OUT_REMODE_SYNC''' Synchronisierung der Rotationen. Unterschiede werden bei diesem Modus durch Pausieren eines Motors ausgeglichen.
 


'''Sensoren'''
'''Sensoren'''
*Tastsensor
*Ultraschallsensor
<code>SetSensorTouch(IN_1);</code>
<code>OpenUltrasonic(SENSOR_4); </code>
<br>Der Befehl initialisiert den Tastsensor an Port 1.
<br>Der Befehl initialisiert den Ultraschallsensor an Port 4.
 
<br><code>x = SENSOR_1;</code>
<br>Gibt den Zustand des Tastsensors zurück und schreibt ihn in die Variable x.


<code>usstart=GetUltrasonic(SENSOR_4); </code>
<br>Ultraschallsensor wird in eine Variable geschrieben.


*Infrarotsensor
<code>CloseSensor(SENSOR_4); </code>
<code>SetSensorLowspeed(IN_3);</code>
<br>Verbindung zum Ultraschallsensor wird unterbrochen.
<br>Initialisert den Infrarotsensor an Port 3.


<br><code>ReadSensorHTIRSeeker2AC(IN_3, richtung, s1, s3, s5, s7, s9);</code>
*Gyrosensor
<br>Gibt in richtung zurück, in welchem Bereich des Infrarotsensors sich eine Infrarotquelle befindet. In s1 bis s9 wird die Stärke der Quelle in den einzelnen Bereichen zur Positionsbestimmung gespeichert.
<code>OpenGyro(SENSOR_1); </code>
<br>Der Befehl initialisiert den Gyrosensors an Port 1.


<code>a() = GetGyro(SENSOR_1); </code>
<br>Speichert die Wert des Gyrosensors in einem Array.


*Kompasssensor
<code>CloseSensor(SENSOR_1); </code>
<code>SetSensorLowspeed(IN_4);</code>
<br>Verbindung zum Gyrosensor wird unterbrochen.
<br>Initialisiert den Kompasssensor an Port 4.


<br><code>x = SensorHTCompass(IN_4);</code>
<br>Gibt den Wert des Kompass an Port 4 aus und speichert ihn in der Variablen x.


 
'''Finales Simulink Programm'''
Weitere nützliche Befehle, Beispiele und Erläuterungen lassen sich [https://gym-leibnitz.lima-city.de/robotik/wp-content/uploads/2016/01/NXC_Tutorial_DE.pdf hier <ref> NXC-Befehle - https://gym-leibnitz.lima-city.de/robotik/wp-content/uploads/2016/01/NXC_Tutorial_DE.pdf </ref>] und
in dem Buch [https://www.daniel-braun.com/buch/roboter-programmieren-mit-nxc/ „Roboter programmieren mit NXC für LEGO Mindstorms NXT“ <ref> Buch "Roboter programmieren mit NXC für LEGO Mindstorms NXT" - https://www.daniel-braun.com/buch/roboter-programmieren-mit-nxc/ </ref>] von Daniel Braun finden, welches auch von uns genutzt wurde.


== Werbeplakat ==
Als kleinen Ausblick in unser fertiges Simulink Programm haben wir noch einen Screenshot aufgenommen welcher im folgenden zu sehen ist.  
Damit jeder auf den ersten Blick sehen kann, wie unser Roboter aussieht und was seine Hauptmerkmale sind, haben wir ein Werbeplakat erstellt und den Roboter auf den Namen "Roboninho" getauft.
[[Datei: Hauptprogramm Simulink.png|none|200px|Hauptprogramm Simulink <ref> Selbsterstellter Screenshot Simulink </ref>]]
[[Datei:Roboninho_Werbeplakat.png|none|mini|Werbeplakat]]
Bei dem Screenshot handelt es sich nur um das Hauptprogramm welches die Struktur beinhaltet und nicht die Unterprogramme um unsere Implementierung nicht zu veröffentlichen.


== YouTube - Video ==
== YouTube-Video ==
Zur bildlichen Veranschaulichung wurde ein YouTube - Video erstellt, welches [https://www.youtube.com/watch?v=VQPF9ObOaXU hier <ref> YouTube-Video - https://www.youtube.com/watch?v=VQPF9ObOaXU </ref>] zu finden ist.
Zur bildlichen Veranschaulichung wurde ein YouTube-Video erstellt, welches [https://youtu.be/YxRnCf_y0uo hier <ref> YouTube-Video - https://youtu.be/YxRnCf_y0uo</ref>] zu finden ist.


== Lernerfolg ==
== Lernerfolg ==
Bei diesem Projekt können sowohl erste Erfahrungen in der C-Programmierung, als auch in der Konstruktionstechnik, beim Bauen des Roboters, gesammelt werden. Dabei lernt man verschieden Sensoren und deren Funktionsweise und Programmierung kennen. Außerdem lernt man, zunächst ein Konzept zu entwickeln, welches man anschließend mit einer angemessenen Dokumentation in die Tat umsetzt. Es gilt dabei Probleme im Team zu lösen und sich untereinander abzusprechen.
Bei diesem Projekt können sowohl erste Erfahrungen mit Matlab, als auch in der Konstruktionstechnik, beim Bauen des Roboters, gesammelt werden. Dabei lernt man verschieden Sensoren und deren Funktionsweise und Programmierung kennen. Außerdem lernt man, zunächst ein Konzept zu entwickeln, welches man anschließend mit einer angemessenen Dokumentation in die Tat umsetzt. Es gilt dabei Probleme im Team zu lösen und sich untereinander abzusprechen.


== Projektunterlagen ==
== Projektunterlagen ==
Alle Projektunterlagen lassen sich [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Gruppen/Gruppen_WS1718/C2/Projektunterlagen/ hier(nur mit Zugangsberechtigung) <ref> Projektunterlagen - https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Gruppen/Gruppen_WS1718/C2/Projektunterlagen/ </ref>] finden.
Alle Projektunterlagen lassen sich [https://svn.hshl.de/svn/Informatikpraktikum_2/trunk/Gruppen/SoSe2018/MTR_Inf2P_B5/ hier(nur mit Zugangsberechtigung) <ref> Projektunterlagen - https://svn.hshl.de/svn/Informatikpraktikum_2/trunk/Gruppen/SoSe2018/MTR_Inf2P_B5/</ref>] finden.


== Literaturverzeichnis ==
== Literaturverzeichnis ==
Zeile 152: Zeile 168:




→ zurück zum Hauptartikel: [[RoboSoccer_WS_17/18|Informatikpraktikum WS 17/18]]
----
→ zurück zum Hauptartikel: [[Autonomes_Fahren_SoSe18|Informatikpraktikum 2 SoSe18]]

Aktuelle Version vom 8. August 2018, 14:34 Uhr

Autor: Darius Wude

Einleitung

Das Ziel des Praktikums besteht darin einen LEGO-Roboter zu konstruieren und zu programmieren, der selbstständig eine Parklücke erkennt und schnellstmöglich in diese einparkt.

LEGO-Modell [1]

Teammitglieder

In diesem Abschnitt werden kurz die Teammitglieder, die an diesem Projekt beteiligt waren, und ihre Tätigkeiten vorgestellt.

  1. Alexander Thumann
    • Bau des Roboters (Version 1.0)
    • Überarbeitung des Roboters
    • Entwicklung einer Strategie
    • Implementierung der Strategie in Matlab und Simulink
    • Erstellung des YouTube Videos
  2. Darius Wude
    • Bau des Roboters (Version 1.0)
    • Entwicklung einer Strategie
    • Implementierung der Strategie in Matlab
    • Erstellung des HSHL-Wiki-Artikels
  3. Leon Brölemann
    • Bau des Roboters (Version 1.0)
    • Überarbeitung des Roboters
    • Entwicklung eines Konzepts/einer Strategie
    • Implementierung der Strategie in Matlab und Simulink
    • Nachbau des Roboters als LEGO-Modell mit dem LEGO-Digital-Designer
    • Erstellung des YouTube Videos

Die Parksituation

Zunächst fährt der Roboter an den möglichen Parkplätzen vorbei, bis er eine Parklücke findet, die groß genug zum erfolgreichem Einparken ist.
Dann soll er so schnell wie möglich in dieser freien Parklücke einparken.

Regelwerk

Wie auch im echten Leben soll hier auf die STVO Rücksicht genommen werden. Das vollständige Regelwerk und andere Informationen bezüglich des Praktikums finden Sie hier [2].

Hardware

Als Hardware wurde ein LEGO – Mindstorms - Set [3] benutzt. In diesem Set sind ein NXT-Brick [4], welcher unter anderem einen Microcontroller beinhaltet, der sich programmieren lässt, 3 Servomotoren, ein Ultraschallsensor, zwei Tastsensoren, ein Lichtsensor und ein Geräuschesensor enthalten.
Der Lichtsensor und der Geräuschesensor, sowie die Tastsensoren werden in unserem Projekt nicht verwendet, da es für diese Sensoren keinerlei sinnvolle Anwendung für ein erfolgreiches Einparken gibt.
Der Ultraschallsensor wird zum erkennen der Parklücke verwendet. Zudem wird mit Hilfe der Anzahl der Umdrehungen des Motors und dem Ultraschallsensor die größe der Parklücke ausgerechnet.

Damit der Roboter nun bei der Suche der Parklücke auch wirklich geradeaus fährt, benötigt es einen zusätzlichen Sensor, der in dem LEGO – Mindstorms – Set nicht enthalten ist. Das wäre der Gyrosensor [5]. Dieser Sensor wird von der Firma HiTechnic [6] hergestellt. Die Servomotoren sowie der Ultraschallsensor werden im Folgenden noch kurz vorgestellt.

Servomotoren

Der NXT benutzt Servomotoren, die je nach Belieben nach Zeit, Geschwindigkeit, Strecke und Winkel angesteuert werden können. Mit den eingebauten Rotationssensoren lassen sich die Umdrehungszahlen in Grad speichern und über verschiedene Befehle rotieren, vor und zurück fahren oder bremsen. Der NXT-Brick bietet 3 Möglichkeiten, um die Servomotoren anzuschließen.

Ultraschallsensor

Der Ultraschallsensor funktioniert, wie der Name schon sagt mit Hilfe von Ultraschallwellen um Abstände zu bestimmen. Hier für muss der Sensor sowohl Ultraschallwellen aussenden können, als auch diese empfangen können.
Der Ultraschallsensor kann dann mit Hilfe der verstrichenen Zeit die Entfernung in 'cm' ausrechnen.
Allerdings nur bis zu 255 cm.

Roboterabmessungen

Parameter Maße
Länge in mm 280
Breite in mm 151
Höhe in mm 130
Spurweite in mm 120
Max. Lenkeinschlag rechts in ° 40
Max. Lenkeinschlag links in ° 40

Bilder des Roboters

Mit dem LEGO Digital Designer [10] haben wir den Roboter in einem 3D-Modell nachgebaut. Eine Bauanleitung, um den Roboter nachzubauen befindet sich in unserem SVN-Ordner.

Strategie

Zur Entwicklung einer Strategie für das Programm wird zunächst ein Programmablaufplan mit dem Programm „PaP-Designer“ [11] erstellt. Bei unserer Srategie benutzen wir drei Unterfunktionen:Parklücke Suchen, Parklücke Messen und Einparken. Diese drei Unterfunktionen werden dann in einem Multitaskingprogramm in einer Zustandsmaschine im Hauptprogramm zusammengeführt.

Hauptprogramm

Hauptprogramm
Beim Start des Hauptprogramms werden zunächst alle Sensoren auf ihre jeweiligen Ports initialisiert. Danach wird der aktuelle Zustand abgefragt. Solange man nicht richtig eingeparkt hat werden dann die einzelnen Unterprogramme (je nach aktuellem Zustand) aufgerufen.

Parklücke Suchen

Parklücke Suchen
Parklücke Suchen

Solange der Abstand zur Wand zu gering ist soll der Nxt geregelt geradeaus fahren. Falls die Parklücke breit genug ist, ist die nächste Phase des Einparkens erreicht.

Parklücke Messen

Parklücke Messen
Parklücke Messen

Der Roboter fährt parallel zur Parklücke bis der Abstand zur Wand wieder schrumpft.
Mit Hilfe der Umdrehungen des Motors seit Parklückenbeginn und dem Durchmesser der Reifen kann die Länge der Lücke errechnet werden.
Falls die Parklücke lang genug ist wird der Zustand auf 3 gesetzt (eine passende Parklücke wurde gefunden) sonst wieder auf 1 (eine neue Parklücke muss gesucht werden).

Einparken

Einparken
Einparken

Wenn eine Parklücke gefunden wurde, in die der Roboter passt, beginnt der Nxt mit dem Einparken.

Umsetzung der Strategie

Zur Realisierung der Strategie und Implementierung der Unterprogramme und des Hauptprogramms wurde Matlab[12] und später das Unterprogramm Simulink [13] verwendet.
Da an dieser Stelle eine vollständige Präsentation des Programms nicht vorgesehen ist, werden „nur“ die Befehle zur Ansteuerung der Motoren sowie Sensoren vorgestellt:


handle = COM_OpenNXT();
Mit diesem Befehl wird eine Verbindung zum NXT aufgbaut.
COM_CloseNXT(handle);
Mit diesem Befehl wird die Verbindung zum NXT getrennt.

Motoren
Antrieb = NXTMotor('A', 'Power', 80);
Dieser Befehl initialisiert einen Motor als Antrieb. Als Parameter werden dafür der Port des Motors (A) und die Geschwindigkeit (80) übergeben.


Antrieb.SendToNXT();
Dieser Befehl schickt dem NXT den im Antrieb gespeicherten Befehl, sodass der NXT weiß was zutun ist.


Antrieb.Stop('break');
Mit diesem Befehl werden die Motoren an den Ausgängen A und C gestoppt.


Antrieb.Stop('Off');
Dieser Befehl bremst wie der Befehl Antrieb.Stop('break'), jedoch wird hier einfach die Stromzufuhr zu den Motoren abgeschnitten, was ein Ausrollen der Motoren zu Folge hat.

Sensoren

  • Ultraschallsensor

OpenUltrasonic(SENSOR_4);
Der Befehl initialisiert den Ultraschallsensor an Port 4.

usstart=GetUltrasonic(SENSOR_4);
Ultraschallsensor wird in eine Variable geschrieben.

CloseSensor(SENSOR_4);
Verbindung zum Ultraschallsensor wird unterbrochen.

  • Gyrosensor

OpenGyro(SENSOR_1);
Der Befehl initialisiert den Gyrosensors an Port 1.

a() = GetGyro(SENSOR_1);
Speichert die Wert des Gyrosensors in einem Array.

CloseSensor(SENSOR_1);
Verbindung zum Gyrosensor wird unterbrochen.


Finales Simulink Programm

Als kleinen Ausblick in unser fertiges Simulink Programm haben wir noch einen Screenshot aufgenommen welcher im folgenden zu sehen ist.

Hauptprogramm Simulink [14]
Hauptprogramm Simulink [14]

Bei dem Screenshot handelt es sich nur um das Hauptprogramm welches die Struktur beinhaltet und nicht die Unterprogramme um unsere Implementierung nicht zu veröffentlichen.

YouTube-Video

Zur bildlichen Veranschaulichung wurde ein YouTube-Video erstellt, welches hier [15] zu finden ist.

Lernerfolg

Bei diesem Projekt können sowohl erste Erfahrungen mit Matlab, als auch in der Konstruktionstechnik, beim Bauen des Roboters, gesammelt werden. Dabei lernt man verschieden Sensoren und deren Funktionsweise und Programmierung kennen. Außerdem lernt man, zunächst ein Konzept zu entwickeln, welches man anschließend mit einer angemessenen Dokumentation in die Tat umsetzt. Es gilt dabei Probleme im Team zu lösen und sich untereinander abzusprechen.

Projektunterlagen

Alle Projektunterlagen lassen sich hier(nur mit Zugangsberechtigung) [16] finden.

Literaturverzeichnis



→ zurück zum Hauptartikel: Informatikpraktikum 2 SoSe18