Zum Inhalt

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:

print("Hallo")

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:

  1. Warte auf MQTT-Nachrichten auf dem Topic city/routing/destination
  2. Berechne den kürzesten Weg vom IMIQ Büro zum gewünschten Ziel
  3. 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:

client.publish("city/lantern/1", "1")
Stimme dich hierfür am besten mit dem Teilnehmenden von Modul 3 ab.