Modul 5: Navigation¶
Zur besseren Orientierung in unserer Smart City soll ein Navigationsmodul entwickelt werden.
Es nimmt zunächst ein Ziel entgegen und berechnet dann, wie man vom IMIQ Gebäude dorthin gelangt.
Schließlich werden alle Laternen entlang dieses Weges erleuchtet, um die Orientierung zu erleichtern.
Die Laternen selbst werden parallel in Modul 3 angesteuert, du kannst über den MQTT-Broker auf sie zugreifen.
Das Ziel erhälst du vom MQTT-Broker auf dem Topic city/routing/destination.
Vorbereitung¶
Zur Durchführung benötigst du einen Editor. Wir verwenden Visual Studio Code:

Der Editor glieder sich grob in zwei Bereiche: links die Dateiliste und rechts das Editorfenster.
Rechts-klicke nun links in die Dateiliste, um eine neue Datei zu erstellen.
Nenne sie.main.py und fülle sie im Editorfenster rechts mit Inhalt:
Wenn du auf kleine Dreieck oben rechts klickst, wird dein Programm gestartet.
Du siehst dann die Ausgabe Hallo unten im Terminal.
Verbinde dich nun mit dem MQTT-Broker:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Verbunden!")
client.subscribe("#")
def on_message(client, userdata, msg):
print(f"{msg.topic}: {msg.payload.decode()}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("imiq-lab.et.uni-magdeburg.de", 21883)
client.loop_forever()
Überprüfe mithilfe des MQTT Viewer, ob du Nachrichten empfangen kannst.
Info
Warte nun, bis alle Teilnehmenden sich mit dem Broker verbunden haben.
Straßen und Graphen¶
Bevor wir weitermachen, ein wenig Graphentheorie. Ein Graph ist in der Graphentheorie eine Art Netzwerk. Er besteht aus:
- Knoten (engl. Node)
- Kanten (Verbindungen zwischen den Knoten, engl. Edge)
Folgendes Beispiel zeigt einen Graphen mit 4 Knoten und 4 Kanten:

Graphen sind ein sehr hilfreiches Konstrukt. Man kann mit ihnen viele reale Sachverhalte modellieren:
Graphen können also zum Beispiel darstellen:
- 🧑🤝🧑 Freundschaften
- 🚗 Straßen zwischen Städten
- 🚇 Verbindungen in einem U-Bahn-Netz
- 💻 Verbindungen zwischen Computern
- 🌐 Links zwischen Webseiten
Den Graph von oben können wir auch programmieren:
import networkx as nx
import matplotlib.pyplot as plt
edges = [
("A", "B"),
("B", "C"),
("C", "D"),
("D", "B"),
]
G = nx.Graph()
G.add_edges_from(edges)
# Graph zeichnen
positions = nx.spring_layout(G, seed=42)
nx.draw(
G, positions,
with_labels=True,
node_size=1500,
font_size=20
)
plt.show()
Aufgabe
Passe nun den Code so an, dass der Graph das Straßennetz des Reallabors modelliert.
Du kannst dich dafür an folgender Karte orientieren:

Die Kreuzungen sollten dabei zu Knoten, die Straßen dazwischen zu Kanten werden.
Kürzeste Wege¶
Graphen helfen uns, die kürzesten Wege zwischen zwei Kreuzungen (Knoten) zu finden. Auf diesem Prinzip funktionieren auch große Kartensysteme, wie z.B. Google Maps. Wenn du das Reallabor modelliert hast, kannst du den kürzesten Pfad wie folgt finden (und zeichnen):
import networkx as nx
import matplotlib.pyplot as plt
edges = [
("A", "B"),
("B", "C"),
("C", "D"),
("D", "B"),
]
G = nx.Graph()
G.add_edges_from(edges)
# Kürzesten Weg finden
path = nx.shortest_path(G, source="A", target="D")
# Graph zeichnen
positions = nx.spring_layout(G, seed=42)
nx.draw(
G, positions,
with_labels=True,
node_size=1500,
font_size=20
)
path_edges = list(zip(path, path[1:]))
nx.draw_networkx_edges(
G, positions,
edgelist=path_edges,
width=3
)
plt.show()
Aufgabe
Probiere aus, ob du auch im Reallabor die kürzesten Wege findest.
Deine Aufgabe¶
Nun musst du diese Puzzleteile zusammensetzen:
- Warte auf MQTT-Nachrichten auf dem Topic
city/routing/destination - Berechne den kürzesten Weg vom IMIQ Büro zum gewünschten Ziel
- Erleuchte die Laternen entlang dieses Weges
Zum Erleuchten von Laternen kannst du das Topic city/lantern/1 verwenden, wobei die letzte Zahl der Laterne entspricht: