Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss21:roboterlabyrinth [2021/10/29 14:05] – dotz_37 | ss21:roboterlabyrinth [2022/08/02 12:16] (aktuell) – dotz_37 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ## Einleitung | + | ====== Roboterlabyrinth ====== |
+ | Ein Projekt von Zehra Anlatan, Dominic Braun, Henry Kusch & Robin Reichelt. | ||
+ | |||
+ | ====== | ||
Wie kann man bestimmte Daten, Dateien oder auch Wege innerhalb eines Systems oder einer Karte finden? Die komplexen Arbeitsweisen dieser Algorithmen wurden über Jahre ausgiebig von Mathematikern, | Wie kann man bestimmte Daten, Dateien oder auch Wege innerhalb eines Systems oder einer Karte finden? Die komplexen Arbeitsweisen dieser Algorithmen wurden über Jahre ausgiebig von Mathematikern, | ||
Zeile 17: | Zeile 20: | ||
Somit wollen wir vielerlei Möglichkeiten schaffen, diese Konzepte mit Spaß und Leichtigkeit für jedes Alter anschaulich und interaktiv darzustellen. | Somit wollen wir vielerlei Möglichkeiten schaffen, diese Konzepte mit Spaß und Leichtigkeit für jedes Alter anschaulich und interaktiv darzustellen. | ||
- | ## Theorie | + | ====== |
Viele Probleme der Graphentheorie können mithilfe von Suchalgorithmen effizient gelöst werden. Beispiele für diese Probleme sind das Problem des Handlungsreisenden, | Viele Probleme der Graphentheorie können mithilfe von Suchalgorithmen effizient gelöst werden. Beispiele für diese Probleme sind das Problem des Handlungsreisenden, | ||
Zeile 25: | Zeile 28: | ||
Zusätzlich muss das Kamerabild so verarbeitet werden, sodass die schwarze linie eindeutig identifiziert werden kann. | Zusätzlich muss das Kamerabild so verarbeitet werden, sodass die schwarze linie eindeutig identifiziert werden kann. | ||
- | ## Bauplan | + | ====== |
Da es sich hierbei um einen fertig gebauten Roboter handelt, der im Handel käuflich zu erwerben ist, können wir keinen eigenen Bauplan vorzeigen. Weitere Infos zum Roboter sind auf der eigenen Website unter https:// | Da es sich hierbei um einen fertig gebauten Roboter handelt, der im Handel käuflich zu erwerben ist, können wir keinen eigenen Bauplan vorzeigen. Weitere Infos zum Roboter sind auf der eigenen Website unter https:// | ||
Zu der SW Entwicklung haben wir uns die Dokumentation und das reichlich vorhandene Onlinematerial (Tutorials, Git-Repos etc.) angeschaut. | Zu der SW Entwicklung haben wir uns die Dokumentation und das reichlich vorhandene Onlinematerial (Tutorials, Git-Repos etc.) angeschaut. | ||
- | ## Material | + | ====== |
- Cozmo | - Cozmo | ||
Zeile 38: | Zeile 41: | ||
- Karte | - Karte | ||
- | ## Aufbau | + | ====== |
In dem Bild ist der Cozmo zu sehen, wie er exemplarisch einer Linie folgen soll. | In dem Bild ist der Cozmo zu sehen, wie er exemplarisch einer Linie folgen soll. | ||
Zeile 49: | Zeile 52: | ||
![example-card-vektor](uploads/ | ![example-card-vektor](uploads/ | ||
- | ## Start Anleitung: | + | ====== |
- Handy mit dem PC verbinden | - Handy mit dem PC verbinden | ||
Zeile 58: | Zeile 61: | ||
- | ## Zwischenstand | + | ====== |
Das aktuelle Problem besteht darin, Cozmo eine Linie folgen zu lassen. Der Ansatz ist das Nutzen eines bereits erhältlichen Scriptes (line_follower.py) und dieses mit eigenen Erweiterungen auf dem Cozmo zu implementieren. Der nächste Schritt ist dann, die Suchalgortihmen und den line_follower so zu verbinden, dass der Cozmo die Linien abfährt, dabei die Wege mappt und anschließend den schnellsten Weg berechnet. Hierbei sollen die Algorithmen eigenständig implementiert werden, aber über eine Schnittstelle mit line_follower verbunden werden können. Probleme bestehen darin, die Skripte auf den Cozmo zu übertragen und korrekt auszuführen. | Das aktuelle Problem besteht darin, Cozmo eine Linie folgen zu lassen. Der Ansatz ist das Nutzen eines bereits erhältlichen Scriptes (line_follower.py) und dieses mit eigenen Erweiterungen auf dem Cozmo zu implementieren. Der nächste Schritt ist dann, die Suchalgortihmen und den line_follower so zu verbinden, dass der Cozmo die Linien abfährt, dabei die Wege mappt und anschließend den schnellsten Weg berechnet. Hierbei sollen die Algorithmen eigenständig implementiert werden, aber über eine Schnittstelle mit line_follower verbunden werden können. Probleme bestehen darin, die Skripte auf den Cozmo zu übertragen und korrekt auszuführen. | ||
- | ## Verbesserungen für Version (nach 09.Juli.2021) | + | ====== |
+ | (nach 09.Juli.2021) | ||
- | Es besteht die möglichkeit | + | Es besteht die Möglichkeit |
- | ## Digitalisierung | + | ===== Digitalisierung |
Da eine Fertigstellung nicht mehr zu realisieren war, wurde der Ansatz verfolgt, die Algorithmen virtuell darzustellen: | Da eine Fertigstellung nicht mehr zu realisieren war, wurde der Ansatz verfolgt, die Algorithmen virtuell darzustellen: | ||
Zeile 72: | Zeile 76: | ||
main.py: | main.py: | ||
- | '' | + | '' |
- | from pygame.locals import * | + | from pygame.locals import *\\ |
- | import pygamemenu | + | import pygamemenu\\ |
- | pygame.init() | + | \\ |
+ | pygame.init()\\ | ||
+ | disp=pygame.display.set_mode\(\(640, | ||
- | disp=pygame.display.set_mode((640, | ||
+ | items = [" | ||
- | items = [" | ||
+ | nodelist = node.grow(64, | ||
+ | pixel = pygame.Surface\((10, | ||
+ | pixel.fill\((200, | ||
+ | for i in nodelist:\\ | ||
+ | disp.blit(pixel, | ||
- | nodelist | + | choice |
- | pixel = pygame.Surface((10, | + | while True:\\ |
- | pixel.fill((200, | + | pygame.time.delay(100)\\ |
- | for i in nodelist: | + | pygame.display.update()\\ |
- | disp.blit(pixel, | + | |
- | + | ||
- | choice = 0 | + | |
- | + | ||
- | while True: | + | |
- | pygame.time.delay(100) | + | |
- | pygame.display.update() | + | |
| | ||
- | for event in pygame.event.get(): | + | for event in pygame.event.get(): |
- | if event.type==QUIT: | + | if event.type==QUIT: |
- | pygame.quit() | + | pygame.quit()\\ |
- | sys.exit() | + | sys.exit()\\ |
- | '' | + | '' |
- | node.py: | + | node.py:\\ |
'' | '' | ||
- | from random import randint as rand | + | from random import randint as rand\\ |
- | class Node: | + | class Node:\\ |
- | def __init__(self, position): | + | def \_\_init\_\_(self, position):\\ |
- | self.Position = position | + | self.Position = position\\ |
- | self.Neighbours = [None, None, None, None] | + | self.Neighbours = [None, None, None, None]\\ |
- | # 0 | + | # 0 \\ |
- | #3 1 | + | #3 1 \\ |
- | # 2 | + | # 2 \\ |
- | def __eq__(self, | + | def \_\_eq\_\_(self, |
- | return self.Position == other.Position | + | return self.Position == other.Position |
- | def __repr__(self): | + | def \_\_repr\_\_(self): |
- | return str(self.Position[0])+',' | + | return str(self.Position[0])+',' |
- | def grow(x, | + | def grow(x, |
- | nodelist=[] | + | nodelist=[] |
- | Start_node = Node((0, | + | Start_node = Node\((0, |
- | nodelist.append(Start_node) | + | nodelist.append(Start_node) |
- | cur = Start_node | + | cur = Start_node |
- | is_valid = lambda a,b: (a<x and b<y and a>=0 and b>=0) | + | is_valid = lambda a,b: (a<x and b<y and a>=0 and b> |
- | i = 0 | + | i = 0 \\ |
- | while i < (x*y//2):#do things until maze if mazy enough | + | while i < (x*y//2):#creates a random |
- | cur = nodelist[rand(0, | + | cur = nodelist[rand(0, |
- | r = rand(0,3) | + | r = rand(0, |
- | nposx, | + | nposx, |
- | if r == 0: nposy += -1 | + | if r == 0: nposy += -1 \\ |
- | if r == 2: nposy += +1 | + | if r == 2: nposy += +1 \\ |
- | if r == 1: nposx += +1 | + | if r == 1: nposx += +1 \\ |
- | if r == 3: nposx += -1 | + | if r == 3: nposx += -1 \\ |
- | if not is_valid(nposx, | + | if not is_valid(nposx, |
- | continue | + | continue |
- | new = Node((nposx, | + | new = Node\((nposx, |
- | if new in nodelist: | + | if new in nodelist: |
- | continue | + | continue |
| | ||
- | ''' | + | ''' |
- | | + | |
- | this is very inneficciant and dumb but whatever | + | ''' |
- | a hashmap would be really nice | + | getnode = lambda a,b : nodelist[nodelist.index(Node\((a,b)))]\\ |
- | ''' | + | otherlist=[]\\ |
- | getnode = lambda a,b : nodelist[nodelist.index(Node((a, | + | try:\\ |
- | otherlist=[] | + | otherlist.append(getnode(nposx, |
- | try: | + | except ValueError: |
- | otherlist.append(getnode(nposx, | + | try:\\ |
- | except ValueError: | + | otherlist.append(getnode(nposx+1, |
- | try: | + | except ValueError: |
- | otherlist.append(getnode(nposx+1, | + | try:\\ |
- | except ValueError: | + | otherlist.append(getnode(nposx, |
- | try: | + | except ValueError: |
- | otherlist.append(getnode(nposx, | + | try:\\ |
- | except ValueError: | + | otherlist.append(getnode(nposx-1, |
- | try: | + | except ValueError: |
- | otherlist.append(getnode(nposx-1, | + | |
- | except ValueError: | + | if len(otherlist)!=1: |
- | | + | continue\\ |
- | if len(otherlist)!=1: | + | other=otherlist[0]\\ |
- | continue | + | |
- | other=otherlist[0] | + | if other.Position[0]-1 == nposx:\\ |
- | | + | new.Neighbours[1]=other\\ |
- | if other.Position[0]-1 == nposx: | + | other.Neighbours[3]=new\\ |
- | new.Neighbours[1]=other | + | if other.Position[0]+1 == nposx:\\ |
- | other.Neighbours[3]=new | + | new.Neighbours[3]=other\\ |
- | if other.Position[0]+1 == nposx: | + | other.Neighbours[1]=new\\ |
- | new.Neighbours[3]=other | + | if other.Position[1]-1 == nposy:\\ |
- | other.Neighbours[1]=new | + | new.Neighbours[2]=other\\ |
- | if other.Position[1]-1 == nposy: | + | other.Neighbours[0]=new\\ |
- | new.Neighbours[2]=other | + | if other.Position[1]+1 == nposy:\\ |
- | other.Neighbours[0]=new | + | new.Neighbours[0]=other\\ |
- | if other.Position[1]+1 == nposy: | + | other.Neighbours[2]=new\\ |
- | new.Neighbours[0]=other | + | |
- | other.Neighbours[2]=new | + | |
- | nodelist.append(new) | + | nodelist.append(new)\\ |
- | i+=1 | + | i+=1\\ |
- | print(i,' | + | print(i,' |
| | ||
- | return nodelist | + | return nodelist\\ |
'' | '' | ||
Zeile 200: | Zeile 201: | ||
- | ## Quellenverzeichnis | + | ===== Quellenverzeichnis |
- [libcozmo](https:// | - [libcozmo](https:// |