March 15, 2026

Line following roboter

 

Ü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