Als piloot, wil ik de drone live met het toetsenbord besturen terwijl ik het camerabeeld met de belangrijkste waarden zie, zodat ik meteen kan bijsturen en de vlucht later kan terugkijken.
In S3 gebruikte je waitKey() alleen om te stoppen met 'q'. Nu koppel je de return-waarde aan een volledige dispatch-dict — elke toets een eigen actie.
In S3 leerde je dat cv2.waitKey(1) een getal teruggeeft. Je gebruikte het op één manier:
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break # stoppen
Dat is één toets. De dispatch-dict uit U3 laat je datzelfde getal direct als sleutel gebruiken — voor elke toets een actie, zonder if/elif-keten.
cv2.waitKey(1) wacht 1 milliseconde en geeft terug:
ord('x')Die integer is precies hetzelfde als wat ord('p') geeft. Daardoor werkt de dispatch-dict uit U3 direct als opzoektabel:
# De drie stappen in de loop:
key = cv2.waitKey(1) & 0xFF # 1. lees toets (altijd bitmask)
if key == 255:
continue # 2. geen toets: sla over
action = keymap.get(key) # 3. dispatch naar actie
Dat zijn drie regels. Ze vervangen de oude if key == ord('q'): break en kunnen elke toets afhandelen.
Klik een toets. Zie hoe waitKey() het getal teruggegft en de dispatch-dict de actie opzoekt.
waitKey(1) & 0xFF geeft een integer — dezelfde als ord('x'). Filter 255 (geen toets) eruit, gebruik dan keymap.get(key) voor de actie.
Simuleer waitKey()-uitvoer met de dispatcher. Experimenteer met de keymap en test hoe 255 en onbekende toetsen verwerkt worden.
De drone vliegt en de videostream loopt. De piloot wil de drone besturen met het toetsenbord zonder de videoweergave te onderbreken. Bouw die koppeling. Bestand: drone_live.py
import cv2
from djitellopy import Tello
tello = Tello()
tello.connect()
tello.streamon()
frame_read = tello.get_frame_read()
De drone is verbonden en de stream staat aan. Zorg dat de piloot de drone via het toetsenbord kan besturen terwijl het videovenster actief blijft. Denk na over: welke toetsen, hoe je de invoer uitleest, hoe je voorkomt dat elke frame een actie triggert, en hoe je netjes afsluit.
Acceptatiecriteria
ord() als sleutels, minstens 8 toetsen.cv2.imshow().waitKey(1) & 0xFF, 255 gefilterd.