Entdecken Sie unsere
Ressourcen
Benötigtes Material :
- Mindestens 1 Roboter oder Simulation in der Software
- 1 Computer/Roboter
- Rennarena
Software-Konfiguration :
- Beispielkonfiguration: hängt von der Code-Situation ab
Dauer :
1 bis 2 Stunden
Alter :
+ 15 Jahre
Die + dieser Aktivität :
- Kann mit dem Simulator durchgeführt werden
Python-Programmierung: Umgang mit Ultraschall und Kamera, um autonome Bewegungen des Roboters zu programmieren und anschließend ein Roboterrennen zu organisieren.
[Videoinhalt folgt]
Einführung
Ziel dieses TP ist es, AlphAI so zu programmieren, dass es sich selbstständig bewegt und nicht wie im TP "AlphAI ferngesteuert" vom Schüler/von der Schülerin "ferngesteuert" wird. Dazu müssen wir seine Sensoren nutzen, damit er auf seine Umgebung reagieren kann, insbesondere um Hindernisse zu erkennen.
Wir werden uns ein schnelles Beispiel mit Ultraschall ansehen und dann zur Kamera übergehen, um Rennen mit autonomen Robotern auf einer Rennstrecke zu veranstalten.
Navigation mit Ultraschall
Entdeckung des Ultraschallsensors
Die Funktion get_distance() (Details in der API auf der letzten Seite) gibt die vom Ultraschall des Roboters gemessene Entfernung (in Zentimetern) zurück. Achten Sie darauf, den Sensor mit der Funktion set_distance(True) zu aktivieren, sonst gibt sie nicht die Distanz, sondern den Wert None zurück.
Testen Sie diese Funktion mit dem echten Roboter mit folgendem Code:
set_distance(True) # aktiviert den Ultraschallsensor
while True:
d = get_distance() # ruft den Ultraschallwert des Roboters ab
print("distance:", d)
Wenn Sie den Roboter von Hand bewegen, prüfen Sie, ob sich die gemessene Entfernung verringert, wenn der Roboter vor einem Hindernis steht. Sie können auch feststellen, dass leider diese Wand nicht erfasst wird, wenn der Roboter vor einer Wand steht, und zwar nicht genau vor ihr, sondern diagonal (die gemessene Entfernung ist viel größer, weil der Ultraschall von der diagonalen Wand reflektiert wird, ohne direkt zum Roboter zurückzukehren).
Selbstständige Fortbewegung mit Ultraschall
Definieren und testen Sie mithilfe der Funktion get_distance() eine Funktion ultrasound_race(), die den Roboter vorwärts bewegt, solange er mit seinem Ultraschall kein Hindernis wahrnimmt, und sich nach rechts dreht, wenn er ein Hindernis erkennt.
Versuchen Sie nicht, ein perfektes Verhalten zu haben (das wäre schwierig). Sobald Sie ein Verhalten haben, bei dem der Roboter weiß, dass er abbiegen kann, wenn er vor einer Wand steht, und geradeaus fahren kann, wenn es keine Wand gibt, gehen Sie weiter.
Navigation mit der Kamera
Die Kamera liefert viel reichhaltigere Informationen als der Ultraschall-Distanzsensor und wird anspruchsvollere Entscheidungen ermöglichen.
Entdeckung des Kamerabildes
Beginnen wir damit, das Kamerabild des Roboters in der Software anzuzeigen. Öffnen Sie den Einstellungsreiter "Sensoren" auf der linken Seite und wählen Sie den Kameramodus "64x48-Bild".

: Das Bild dessen, was der Roboter sieht, erscheint.
Ein Bild ist ein Raster aus Pixeln; in einem Farbbild wie hier enthält jedes Pixel drei Werte: die Intensität von Rot, Grün und Blau in diesem Pixel. Um dies genauer zu sehen, wählen Sie nun den Kameramodus mit der niedrigen Auflösung "8x6-Bild".

Klicken Sie auf die Registerkarte "Visualisierung" und markieren Sie "Kamera: Verringerte Auflösung".

: Es erscheint ein sehr grobes Bild und die Rot-/Grün-/Blauwerte der einzelnen Pixel werden angezeigt (Werte zwischen 0 und 255).

Um die Bildauflösung im Python-Code statt in der Software einzustellen, muss man zunächst die Kamera initialisieren, z. B. set_camera("8x6"). Dann ruft man das Bild mit get_camera() ab. Diese Funktion gibt ein Array der Dimension 3 in Form eines "List"-Objekts zurück. Das Einzige, was man für diese TP über dieses Objekt wissen muss, ist, wie man auf die Pixelwerte zugreift: Wenn wir dieses zurückgegebene Objekt als Bild bezeichnen, greifen wir mit image[i][ j ][k] auf den Wert des Pixels in Zeile i, Spalte j und im Kanal k(k=0 für rot, 1 für grün, 2 für blau) zu.
Kopieren Sie den folgenden Code, führen Sie ihn aus und überprüfen Sie, ob die drei angezeigten Werte mit den drei Werten rot/grün/blau in der Pixelsoftware in der fünften Zeile von oben (Index 4, wenn man bei Null anfängt zu zählen) und in der vierten Spalte von links (Index 3) übereinstimmen.
from alphai import *
from time import sleep
set_camera("8x6") # aktiviert die Kamera in der richtigen Auflösung
sleep(1) # wartet 1s, bis die Software die Kamera aktiviert
while True:
image = get_camera() # ruft das Bild der Kamera ab
line = Bild[4]
pixel = line[3]
print('rot', pixel[0], 'grün', pixel[1], 'blau', pixel[2])
Erste autonome Bewegung mit der Kamera
Wir möchten, dass der Roboter selbstständig Runden auf der Rennstrecke dreht. Wenn Sie eine Arena verwenden, die mit AlphAI-Robotern geliefert wird, ist der Boden weiß, die äußere Umrandung rot und die Mittelinsel schwarz. Wir gehen davon aus, dass dies der Fall ist und Sie den Roboter im Uhrzeigersinn umlaufen lassen wollen.
Schreiben Sie zunächst eine Funktion camera_race(), die Entscheidungen wiederholt auf folgende Weise trifft (die sich nur auf die Farbe eines einzelnen Pixels im unteren Teil des Bildes stützt):

Si image[4][3][0] < 100 (canal rouge sombre 🡪 le pixel est noir), pivoter à gauche à vitesse 25 pendant 0.5 seconde.

Sinon, si image[4][3][1] < 100 (canal rouge lumineux et canal vert sombre 🡪 le pixel est rouge), pivoter à droite à vitesse 25 pendant 0.5 seconde.

Andernfalls (heller roter und grüner Kanal 🡪 Pixel ist weiß), gehe mit Geschwindigkeit 40 0,5 Sekunden lang geradeaus.
Testen Sie dieses Programm auf der Strecke.
Zur Erinnerung: Die Struktur wenn, sonst wenn, sonst hat in Python die folgende Form :
if condition_1:
action_1()
elif condition_2:
action_2()
else:
action_3()
Zählen von Pixeln verschiedener Farben
Sie haben wahrscheinlich schon festgestellt, dass es nicht immer das Beste ist, Entscheidungen auf der Grundlage eines einzigen Pixels zu treffen. Zum Beispiel kann es vorkommen, dass der Pixel in der fünften Zeile / vierten Spalte weiß ist, sodass der Roboter sich für die Vorwärtsbewegung entscheidet, während sich an der Seite eine Wand befindet und er sich stattdessen drehen sollte.
Um das Programm zu verbessern, werden wir alle Pixel des Kamerabildes betrachten. Zunächst zählen wir, wie viele Pixel schwarz, rot und weiß sind. Dann wird die Entscheidung so getroffen: Wenn die Mehrheit der Pixel rot ist, gehe nach rechts; wenn die Mehrheit der Pixel dunkel ist, gehe nach links; und wenn nicht, gehe geradeaus.
Um die Anzahl der Pixel mit einer bestimmten Farbe zu zählen, führen Sie eine Reihe von for-Schleifen für jede Komponente des Bildes durch: Zeilen und Spalten. Zählen Sie dann für jedes Pixel, welche Farbe es hat, indem Sie die Werte für Rot, Grün und Blau verwenden, aus denen es sich zusammensetzt. Sie können sich an den zuvor gefundenen Schwellenwerten orientieren, um die Farbe des Pixels zu bestimmen. Sie können mit dem folgenden Code beginnen oder Ihren eigenen Weg finden - es gibt viele!
def count_pixel_colors(bild: liste):
# create dict here
anzahl_pxl_schwarz = 0
anzahl_pxl_rot = 0
nombre_pxl_blanc = 0
for i in range(len(image)):
Zeile = Bild[i]
for j in range(len(linie)):
pixel = Zeile[j]
roter_Kanal = Pixel[0]
canal_vert = pixel[1]
blue_channel = pixel[2].
if ...
nombre_pxl_noir +=1
...
else:
...
return {"noir": nombre_pxl_noir, "rouge": nombre_pxl_rouge, "blanc": nombre_pxl_blanc}
Tipp Python-Syntax für for-Schleifen, anstatt die Indizes i und j zu verwenden, um auf die Elemente eines Arrays zuzugreifen, können Sie die Syntax ändern und einfach schreiben :
for line in image:
for pixel in line:
rot = pixel[0]
grün = pixel[1]
blau = pixel[2]
...
Rennen mit autonomen Robotern und weitere Verbesserungen
Nun können Sie damit beginnen, Rennen zwischen Ihren Robotern zu veranstalten.
Diese werden noch mehr gewürzt, wenn Sie weiterhin versuchen, Ihr Programm zu verbessern, indem Sie z. B. Folgendes ändern: Bewegungsgeschwindigkeiten, Farbschwellen, zusätzliche Aktionen (neben der Drehung durch Drehen auf der Stelle auch eine Drehung durch Vorwärtsgehen) usw.
Bilanz und Feedback
In der Programmierung wird die Liste der zugänglichen Funktionen eines Programms als API bezeichnet, was für Application Programming Interface(Schnittstelle zur Anwendungsprogrammierung) steht. Sie wird von Programmierern verwendet, um herauszufinden, wie sie mit dem Programm interagieren können. Die API des Python-Moduls alphai finden Sie unter folgendem Link: https: //drive.google.com/file/d/1C4ovPW_eH5KFz5Y9JvSrzLhtmdOpcp6-/view
TP zum Herunterladen (Lehrer und Schüler)