August 28, 2026

Very simple head up display

 There is a robot moving randomly in a graph. On top of the graphics there is a head up display showing the current situation in textual format. The Head up display and the scene with the robot are synchronized. The text in the head up display is mostly a key/value feature list for describing current facts like position, direction and previous nodes.

Sourcode in Python in 150 lines of code:

import pygame
import random
import math
import sys

# Initialize Pygame
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Robot Graph Exploration & Inner Voice HUD")
clock = pygame.time.Clock()

# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (200, 50, 50)
GRAY = (150, 150, 150)

# Define 5 Graph Nodes (fixed positions)
NODES = {
    0: {"pos": (400, 150), "name": "Alpha"},
    1: {"pos": (200, 300), "name": "Beta"},
    2: {"pos": (280, 500), "name": "Gamma"},
    3: {"pos": (520, 500), "name": "Delta"},
    4: {"pos": (600, 300), "name": "Epsilon"}
}

# Define Graph Edges (Adjacency list)
EDGES = {
    0: [1, 4],
    1: [0, 2, 3],
    2: [1, 3],
    3: [1, 2, 4],
    4: [0, 3]
}

class Robot:
    def __init__(self):
        self.current_node = 0
        self.next_node = random.choice(EDGES[self.current_node])
        self.pos = list(NODES[self.current_node]["pos"])
        self.target_pos = list(NODES[self.next_node]["pos"])
        self.speed = 3.0
        self.history = [self.current_node]
        self.inner_voice = "Scanning sector... optimizing trajectory."
        self.direction_vector = (0, 0)

    def update(self):
        # Move towards target position
        dx = self.target_pos[0] - self.pos[0]
        dy = self.target_pos[1] - self.pos[1]
        distance = math.hypot(dx, dy)

        if distance < self.speed:
            # Reached target node
            self.pos = list(self.target_pos)
            self.current_node = self.next_node
            self.history.append(self.current_node)
            if len(self.history) > 5:
                self.history.pop(0)
            
            # Pick next random neighbor
            possible_next = EDGES[self.current_node]
            # Avoid immediate backtracking if possible
            if len(possible_next) > 1 and len(self.history) >= 2:
                if self.history[-2] in possible_next:
                    possible_next = [n for n in possible_next if n != self.history[-2]]
            
            self.next_node = random.choice(possible_next)
            self.target_pos = list(NODES[self.next_node]["pos"])
            
            # Update inner voice thoughts
            thoughts = [
                f"Routing via node {NODES[self.next_node]['name']}.",
                "Analyzing structural integrity of path.",
                "Why must I wander these black vectors?",
                f"Visited nodes log updated. Current node: {NODES[self.current_node]['name']}."
            ]
            self.inner_voice = random.choice(thoughts)
        else:
            # Normalize and move
            self.direction_vector = (dx / distance, dy / distance)
            self.pos[0] += self.direction_vector[0] * self.speed
            self.pos[1] += self.direction_vector[1] * self.speed

# Setup Font
font_path = None  # Uses default system font
font = pygame.font.SysFont("Arial", 16)
font_bold = pygame.font.SysFont("Arial", 18, bold=True)

robot = Robot()

# Main Loop
running = True
while running:
    screen.fill(WHITE)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    robot.update()

    # --- Draw Graph Edges ---
    for node_id, neighbors in EDGES.items():
        p1 = NODES[node_id]["pos"]
        for n in neighbors:
            p2 = NODES[n]["pos"]
            pygame.draw.line(screen, BLACK, p1, p2, 2)

    # --- Draw Graph Nodes ---
    for node_id, data in NODES.items():
        pos = data["pos"]
        pygame.draw.circle(screen, WHITE, pos, 20)
        pygame.draw.circle(screen, BLACK, pos, 20, 2)
        # Render node label
        lbl = font.render(data["name"], True, BLACK)
        screen.blit(lbl, (pos[0] - 15, pos[1] - 35))

    # --- Draw Robot ---
    pygame.draw.circle(screen, RED, (int(robot.pos[0]), int(robot.pos[1])), 10)

    # --- Draw Semi-Transparent HUD Overlay ---
    hud_width, hud_height = 400, 180
    hud_surface = pygame.Surface((hud_width, hud_height), pygame.SRCALPHA)
    hud_surface.fill((20, 20, 20, 180))  # Semi-transparent dark background (RGBA)

    # Border for HUD
    pygame.draw.rect(hud_surface, (100, 200, 255, 200), (0, 0, hud_width, hud_height), 2)

    # HUD Content formatting
    history_str = " -> ".join([NODES[n]["name"] for n in robot.history])
    hud_texts = [
        ("=== ROBOT HUD / INNER VOICE ===", (100, 220, 255)),
        (f"Position: ({int(robot.pos[0])}, {int(robot.pos[1])})", WHITE),
        (f"Direction Vector: ({robot.direction_vector[0]:.2f}, {robot.direction_vector[1]:.2f})", WHITE),
        (f"Next Node: {NODES[robot.next_node]['name']}", WHITE),
        (f"History: [{history_str}]", WHITE),
        (f"Voice: \"{robot.inner_voice}\"", (255, 200, 100))
    ]

    y_offset = 12
    for text, color in hud_texts:
        rendered_text = font.render(text, True, color)
        hud_surface.blit(rendered_text, (12, y_offset))
        y_offset += 26

    # Blit HUD onto main screen at top-left corner
    screen.blit(hud_surface, (5, 5))

    pygame.display.flip()
    clock.tick(30)

pygame.quit()
sys.exit()
 

Die lange Reise zur Künstlichen Intelligenz

 Von der Computertechnik ist bekannt dass sie sich sehr schnell weiterentwickelt. Innovationen wie die 3.5 Zoll Floppy disk waren einerseits Meilensteine des Fortschritts, wurden zugleich aber nach wenigen Jahren durch bessere Techniken wie USB Flash drives ersetzt. Die Computertechnisch schreitet ständig voran.

Ganz anders verlief die Entwicklung der Künstlichen Intelligenz sehr langsam. Die Ursprünge lassen sich auf das Jahr 1912 zurückführen als Torres Quevedo einen Schachautomaten für das Endspiel konstruierte [1] Seite 1. In den 1980er wurden Schachprogramme in Software realisiert und erst 1997 gelang es der Firma IBM unter hohem Technischen Aufwand den menschlichen Weltmeister zu schlagen.[1] seite 2. 

Einfacher formuliert hat es 85 Jahre gedauert bis der Schachautomat von Torres Quevedo soweit verbessert wurde, dass er tatsächlich einsatzfähig war.

Die Langsamkeit der Entwicklung deutet darauf hin, dass die Realisierung Künstlicher Intelligenz anspruchsvoll ist. Trotz hohem Aufwand durch Forscher an den Universitäten und in der Industrie gelang es über Jahrzehnte nicht nennenswerte Fortscrhitte zu erzielen. Gleichzeitig sei erwähnt dass Computerschach ohne praktische Bedeutung ist, will man KI in Form von Robotik einsetzen benötigt man weitere Forschungsprojekte.

Es gibt eine mögliche Erklärung warum die Geschichte der Künstlichen Intelligenz so langatmig ist. Weil ähnlich wie bei dem Versuch ein Perpetuum mobile zu konstruieren die meisten prototypen nicht funktionieren. Von frühen Neuronalen Netzen aus den 1990er Jahren ist bekannt dass sie keinerlei Ergebnis erzielten, es blieb unklar ob das neuranale Netz mittels OCR auf einem Bild eine handschriftliche Zahl erkannte oder nicht. Bei Robotik-Projekte sieht es noch pessimistischer aus. Das Stanford Cart was in den 1970er Jahren von Hans Moravec und anderen entwickelt wurde, war langsam blieb häufig stehen und funktionierte nicht.

Es verwundert wenig das kritischer Beobachter der KI Forschung zu dem Schluss kamen, dass der Ansatz an sich, also einer Maschine das Denken beizubringen, nicht funktioniert.

Quellen:

[1] Bruderer, Herbert. "Die künstliche Intelligenz begann 1912 mit dem Schachautomaten von Torres Quevedo." (2020).


Deutschland ist KI Land

 Häufig wird behauptet, Deutschland wäre rückständig was Künstliche Intelligenz angeht. Die Zahlen sprechen jedoch eine andere Sprache. Die Technology adoption rate misst den Prozentsatz der Bevölkerung, die eine neue Technologie aktiv nutzen. Für "Large language modelle" beträgt sie:

2020, 1%
2021, 3%
2022, 9%
2023, 28%
2024, 42%
2025, 51%
2026, 58%
2030, 82% (Prognose)

Seit 2025 nutzen nach dieser Tabelle die Mehrheit der Deutschen Large language modelle. Die zeitliche Entwicklung seit 2020 verlief ähnlich wie in anderen Ländern auch. Innerhalb weniger Monate explodierte die Zahl der Benutzer. Andres als in 2020 sind large language modelle nicht länger eine Spezialanwendung für Wissenschaftler sondern sie werden von fast allen Menschen genutzt. Die Zahl der Personen die noch nie chatgpt um Rat gefragt haben ist inzwischen eine Minderheit. So ähnlich wie der Anteil jener Personen die noch nie im Internet gesurft haben, oder noch nie das Fernsehen eingeschaltet haben.

Lediglich was den Umgang mit fortschrittlicher Robotik angeht sind die Deutschen konservativ bis ablehnenden eingestellt. Der Prozentsatz an Personen die schonmal mit einem sprachgesteuerten Roboter interagiert haben, dürfte bei unter 1% liegen. Gleichzeitig ist dieser Technologiezweig vermutlich zukünftig sehr entscheidend. Es ist also nicht so, dass die Deutschen aktiv unerprobte Technik ausprobieren und gierig wären auf neues, sondern lieber wartet man ab, bis etwas in den Mainstream einsickert und für die Masse verfügbar ist. Das ist bei sprachgesteuerten Robotern derzeit nicht der Fall.

Deutschland ist KI Land, Teil 2

Die Anzahl täglich versendeter Prompts an Large language modelle zu schätzen ist schwierig aber machbar. Wenn man annimmt dass rund 50% der Bevölkerung diese neuartige Technologie nutzen (selten bis mittelmäßig oft) kann man von rund 80 Mio versendete Prompts täglich ausgehen. Monatlich sind das stolze 2.4 Milliarden Prompts nur aus Deutschland. Das ist eine Menge an KI erzeugter Interaktion, die stattfindet.

Der Wert ist eher zu gering geschätzt und dürfte künftig weiter steigen. Selbst wenn die Deutschen von sich behaupten, KI nicht zu mögen, nutzen sie diese Technologie erstaunlich oft. 

August 27, 2026

Weiteres Beispiel zur Datenkompression mit grounded language

 Im vorherigen Blogpost wurde bereits ein Lagerroboter als Beispiel erwähnt. In diesem Post soll die Thematik Datenkompression vertieft werden.

Ausgangspunkt ist das Problem in der klassischen KI Forschung bis ca. 2010, dass ein Roboter in einem sehr großen Zustandsraum agiert der sich nicht effizient mittels vorhandener Hardware durchsuchen lässt. Diese Problemklasse wird als np hard problem bezeichnet und betrifft motion planning, senor perception und STeuerung von Robotern ganz allgemein.

Obwohl die Informatik über hunderte von Algorithmen, Programmiersprachen, und schnellen CPU ist verfügt ist keine Technologie mächtig genug Probleme mit einem sehr großen Zusttandsraum zu lösen. Damit ist Künstliche Intelligenz unlösbar.

Die einzige Ausnahme besteht darin, das Ausgangsproblem in ein niedrig-dimensionales Prolbem zu überführen, natürliche Sprache dient dazu als kompressionstechnik. Für den erwähnten warehouse roboter bietet sich eine Minivokablur an, was Zielorte und Ereignisse beinhaltet:

Zielorter: regalA, regalB, Korridor
Ereignisse: Kollison, Batterie_leer, ziel_erreicht

Die Vokabelliste definiert einen neuen Zustandsraum auf einem symbolischen Level. Er besteht aus 6 möglichen Worten und abstrahiert vom ursprünglichen Zustandsraum. Die Frage ist nicht länger wie man die Kamerabilder des Roboters speichert, oder wieviele Anzahl möglicher Trajektorien es gibt, sondern die Frage ist welche der 6 Wörter gerade aktiv ist.

Der neue sprachliche Zustandsraum kann viel leichter auf einem Roboter gespeichert werden. Man speichert die Vokabelliste in einer Tabelle und kann darauf referenzieren. Damit wird die ursprüngliche Problembeschreibung modifiziert. Es geht nicht länger darum einen Lagerroboter zu steuern der über eine hochauflösende Kameras und mehrere Servo-M;otoren verfügt sondern das neue problem ist, die ist situation des Roboter mittels Natürlicher Sprache zu beschreiben.

Eine Analogie aus der Nicht informatik ist eine Landkarte. Karten werden dazu verwendet größere Gebiete übersichtlich darzustellen. Ein Gebiet wie z.B. ein Wald sind auf einer Karte mit einem einfachen Symbol markiert. Obwohl der Wald über hunderte von Bäumen enthält sind diese nicht eingezeichnet sondern es gibt nur ein grünes Rechteck mit dem Symbol "Wald". Erst der Rezipient der Landkarte dekodiert die Information und schließt aus dem Symbol auf die ursprüngliche Realität. Dadurch reduzieren Landkartieren die Komplexität der Wirklichkeit.

Technisch gesehen lässt sich grounded language für Roboter erstuanlich einfach implementieren. Man extrahiert aus einer Szene zuerst Features und konvertiert diese dann in einen Text. Der Programmieraufwand in lines of code ist überschaubar und die benötigte CPU Leistung ist gering. Dennoch waren solche Systeme vor 2010 selten bis gar nicht vorhanden. Weniger aus technischen Gründen als vielmehr aus einem mangelnden Verständnis für das Symbol grounding problem. Bis 2010 war zwar bekannt, dass KI Probleme np hard sind und der state space zu groß ist um diesen zu durchsuchen, es war allerdings unklar, dass natürliche Sprache darauf die Antwort ist. Was stattdessen untersucht wurde, waren heuristiken, Reward Funktionen und sampling basierte Algorithmen wie RRT.

Mit diesen Verfahren konnte man Fortschritte bei motion planning realisieren, allerdings waren das unbedeutende Detailverbesserungen. Der Durchbruch erfolgte erst, durch Verwendung natürlicher Sprache als Abstraktionsmechanismus. 

Datenkompression mit grounded language an einem Beispiel

 Das Hauptproblem in der KI Forschung bis 1990 war das state space problem, also die Hohe Anzahl möglicher Zustände eines Systems. Das state space problem verhinderte das KI Probleme wie Motion planning von einem Computer in echtzeit gelöst werden konnten. Die vorhandenne Algorithmen waren nicht effizient genug und die vorhandene Hardware war zu langsam.

Die Antwort besteht in der Datenkompression mit Hilfe von grounded lanugage. Sprachw wird verwendet als Karte die über die Domäne gelegt wird. Dazu ein Beispiel: Angenommen die lagerhaus wird in einer 800x600=480000 pixel großen Übersicht gespeichert. In diesem Beispiel gibt es eindeutig ein state space problem weil die Anzahl von rund 0.5 Mio unterschiedliche Pixel die aus verschiedenen Farben bestehen eine sehr große Last erzeugt. Um diesen Rohdaten Objekte oder Wege zu erkennen bräuchte man Supercomputer. Mittels semantischer Datenkompression lässt sich die Aufgabe vereinfachen. Zuerst definiert man eine Vokabelliste (RegalA, RegalB, Korridor), dann definiert man Bereiche in der Karte auf die diese Vokabeln zutreffen. Man erhält dadurch eine annotierte 2d Karte.

In dieser neuen Realität ist das state space problem gelöst. Der Roboter kennt lediglich drei Begriffe "RegelA, RegalB, Korridor" und kann ermitteln wo er sich befindet. Durch eine Karte wurde also die hochkomplexe Wirklichkeit stark komprimiert und lässt sich leichter maschinenlesbar speichern.

Man kann also sagen, dass natürliche Sprache zur Datenkompression verwendet wird. Durch cid Vergabe von Begriffen werden 2d-Bereiche oder Events in der Ausgangsdomäne gelabelt. Diese Label dienen als Platzhalter wodurch Komplexität gesenkt wird. Der Boboter benötigt nicht länger die Information über die 800x600 Pixelkarte selber sondern er referenziert mit hilfe der Vokabelliste viel effizineter auf die wirklichkeit.

August 26, 2026

KI durch Kompression

Bereits 1973 hat James Lighthill erkannt, dass Künstliche Intelligence an der kombinatorischen Explosion scheitert. Gemeint ist, dass dass z.B. ein Lagerroboter einen sehr großen Zustandsraum besitzt mit Millionen von unterschiedlichen Aktionsmöglichkeiten. Diesen Zustandsraum mittels Computer zu durchsuchen ist mathematisch unmöglich, in der Informatik wird das als NP harte Problemklasse bezeichnet. Das Grundproblem, womit sich Generationen von KI Forschern konfrontiert sahen, war also die Suche in einem riesigen Zustandsraum. 

Die Antwort auf die Fragestellung besteht darin, natürliche Sprache als Kompression zu nutzen. Damit lässt sich der Zustandsraum eines Roboters verkleinern. Dieses Konzept ist als Symbol grounding problem bekannt und meint, dass der originale Zustandsraum bestehend aus Sensorwerten und Servomotoren-Signalen mittels natürlicher Sprache kartiert wird und dann von Computern verarbeitet wird.

Ein Lagerroboter hat nicht länger Millionen möglicher Trajektorien, die es durchzuprobieren gilt, sondern die Welt des Lagerroboters besteht aus einer Vokabelliste von weniger als 50 Worten womit er die Umgebung analysiert und Handlungen ausführt. Dieser diskerete Symbolvorrat reduziert den Zustandsraum und eine maschinelle Speicherung inkl. dem Planen von Handlungen wird möglich.

August 25, 2026

Playing a videogame with features

 The pictures shows a neural network which determines the next action for a character in a videogame. The network needs 20 input features which are player_pos, energy, last jump height, distance to enemy and some other features. The hidden layer of the network determines the current situation its a feature-to-information layer. The output layer provides the action itself submitted to the game pad.

The intelligence of the neural network doesn't depend on the training algorithm because its a simple backpropagation algorithm with nu tuning, but the intelligence depends on the input features. These features were chosen manual by a human to mirror the current game state in a meaningful way. The goal is to provide the smallest amount of features and ensure that the data are updated in realtime. 

August 24, 2026

Szene to text parser mittels feature set

 Als Semantik Gap wird die Lücke bezeichnet zwischen natürlicher Sprache einerseits und Rohdaten welche durch sensoren erhoben wird andererseits. Solange es einen semantic gap gibt, scheitert eine mensch maschine kommunikation. Ein Roboter versteht nicth einen Befehl wie "fahre zum Regal A und entnehme die rote box".

Der Gap wird mittels grounded language geschlossen, was in zwei richtungen verläuft. 

a) Natürliche Sprache -> Sensordaten
b) Sensordaten -> natürliche Sprache

Natürliche Sprache lässt sich mittels feature engineering erzeugen. Ein feature set bezeichnet im Maschinen learning eine Liste von Werten. Für das Beispiel "Überwaschung einer Straßenverkehrskreuzung" sind geeignete features:

- Quelle und Ziel des Autos
- Farbe des Autos
- Größe des Autos
- Geschwindigkeit

Aus diesem Feature set lässt sich eine Sprachausgabe erzeugen wie:

- "Ein blauer Kleinwagen aus nörderlicher Richtung fährt nach Süden. Er fährt sehr langsam".
- "Ein weißer LKW aus Westlicher Richtung fährt nach Süden. Er fährt mittelschnell".

Features im Maschinen learning sind das selbe wie statistische Merkmale in beschreibenden Statistik. Es sind eine Reihe von Werte in einem Statistikbogen die gemessen werden. der Unterschied ist dass im maschine learning diese Daten computerlesbar vorliegen und häufig automatisiert gemessen werden z.B. über Kmaeras und induktionsschleifen im Boden. Das feature set stellt eine zwischenschicht da zwischen sensordaten und natürlicher sprache.

Auf den ersten blick sieht ein feature set nicht besonders anspruchsvoll aus. Es ist eine Liste mit Werte die man als histogram darstellen kann, vergleichbar mit einem Farbhistogram für ein photo. Der entscheidene Vorteil besteht darin dass features eine Zwischenposition einnehmen zwischen sensorrohdaten einerseits und natürlicher Sprache andererseits.