Üblicherweise ist die Programmierung eines Line following roboters auf den Sourcecode fokussiert der in Java, Python oder C++ erstellt wird. Im folgende wird der Fokus auf die Mensch Maschine Kommunikation gelegt. Es wird ein semantischer Tagging space verwendet um die Linie auf dem Boden zu klassifizieren. Der Software für diesen Liniengenerator findet sich weiter unten und wurde in der Sprache python erstellt.
Die Hauptaufgabe der Software besteht darin, die dargestellte visuelle Szene innerhalb der 200x200 Pixel Karte in eine semantische Tagging beschreibung zu überführen. Diese Tagging beschreibung dient der Mensch Maschine interaktion. Der Roboter meldet die Tags zurück an den Menschen und dieser entscheidet was in der jeweiligen Situation zu tun ist.
import pygame
import random
# --- Konfiguration ---
WIDTH, HEIGHT = 800, 600
BOX_SIZE = 200
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (200, 0, 0) # Hindernis
GRAY = (200, 200, 200) # Box-Rahmen
# --- Moegliche Parameter ---
paths = ["vorwärts", "links", "rechts", "sackgasse", "Kreuzung"]
thicknesses = {"normal": 10, "dick": 20}
breaks = [False, True]
obstacles = [False, True]
# --- Pygame Setup ---
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Roboter Linien-Generator (Space für neue Karte)")
font_small = pygame.font.Font(None, 24)
font_large = pygame.font.Font(None, 36)
def generate_random_config():
return {
"path": random.choice(paths),
"thickness_name": random.choice(list(thicknesses.keys())),
"break": random.choice(breaks),
"obstacle": random.choice(obstacles)
}
def draw_text(screen, text, font, color, x, y, align_center=False):
text_obj = font.render(text, True, color)
text_rect = text_obj.get_rect()
if align_center:
text_rect.center = (x, y)
else:
text_rect.topleft = (x, y)
screen.blit(text_obj, text_rect)
def draw_card(config):
screen.fill(WHITE)
# 1. Box berechnen (Zentrum des Bildschirms)
box_rect = pygame.Rect((WIDTH//2 - BOX_SIZE//2, HEIGHT//2 - BOX_SIZE//2), (BOX_SIZE, BOX_SIZE))
pygame.draw.rect(screen, GRAY, box_rect, 1) # Rahmen der Box
center_x, center_y = box_rect.center
half = BOX_SIZE // 2
# Parameter
path = config["path"]
thickness_val = thicknesses[config["thickness_name"]]
has_break = config["break"]
has_obstacle = config["obstacle"]
# 2. Pfade definieren (Relativ zur Box)
# Startpunkt ist immer unten in der Mitte der Box
start_p = (center_x, center_y + half)
mid_p = (center_x, center_y)
lines = [] # Liste von (Start, Ende) Paaren
if path == "vorwärts":
lines.append((start_p, (center_x, center_y - half)))
elif path == "links":
lines.append((start_p, mid_p))
lines.append((mid_p, (center_x - half, center_y)))
elif path == "rechts":
lines.append((start_p, mid_p))
lines.append((mid_p, (center_x + half, center_y)))
elif path == "sackgasse":
lines.append((start_p, (center_x, center_y + 10))) # Kurzes Stück
elif path == "Kreuzung":
lines.append((start_p, (center_x, center_y - half)))
lines.append(((center_x - half, center_y), (center_x + half, center_y)))
# 3. Zeichnen mit optionaler Unterbrechung
for s, e in lines:
if has_break:
# Zeichne nur das erste und letzte Drittel der Teil-Linie
m1 = (s[0] + (e[0]-s[0])//3, s[1] + (e[1]-s[1])//3)
m2 = (s[0] + 2*(e[0]-s[0])//3, s[1] + 2*(e[1]-s[1])//3)
pygame.draw.line(screen, BLACK, s, m1, thickness_val)
pygame.draw.line(screen, BLACK, m2, e, thickness_val)
else:
pygame.draw.line(screen, BLACK, s, e, thickness_val)
# 4. Hindernis (Falls ja, immer am Mittelpunkt der Box)
if has_obstacle:
pygame.draw.rect(screen, RED, (center_x - 15, center_y - 15, 30, 30))
# 5. Semantische Beschreibung
desc_str = f"Linienweg: {path} | Liniendicke: {config['thickness_name']}"
extra_str = f"Unterbrechung: {'ja' if has_break else 'nein'} | Hindernis: {'ja' if has_obstacle else 'nein'}"
draw_text(screen, desc_str, font_small, BLACK, WIDTH//2, HEIGHT//2 + half + 40, True)
draw_text(screen, extra_str, font_small, BLACK, WIDTH//2, HEIGHT//2 + half + 65, True)
draw_text(screen, "Drücke LEERTASTE für neue Karte", font_large, BLACK, WIDTH//2, 50, True)
# --- Hauptschleife ---
current_config = generate_random_config()
draw_card(current_config)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
current_config = generate_random_config()
draw_card(current_config)
pygame.display.flip()
pygame.quit()

No comments:
Post a Comment