Sprint 4 Β· Datastructuren & foutafhandeling  Β·  Project  Β·  Β±4 uur  Β·  Individueel

Project: Live Keyboard Drone Controller

Je bouwt een pilotenconsole: de drone luistert live naar het toetsenbord, weigert wat op dat moment niet veilig is, vangt fouten op zonder te crashen, en houdt van elke toetsaanslag een logboek bij. Na de landing rolt daar een vluchtrapport uit. Daarna test je je eigen werk en schrijf je een testverslag.

dispatch-dict lijst van dicts try / except live besturing testen

Wat ga je maken?

Β±25 min

De vliegclub laat leden met de drone vliegen, maar wil twee dingen beter regelen. Ten eerste mag een toets nooit iets doen wat op dat moment onveilig is. Ten tweede wil het bestuur nΓ‘ de vlucht kunnen zien wat er precies gebeurd is: wie drukte wat in, wat is er geweigerd, en waar ging het mis. Jij bouwt drone_pilot.py.

Deel A β€” Klaar om te vliegen?

VΓ³Γ³r het opstijgen gelden twee regels uit sprint 2:

  • De batterij is minstens 40%. Precies 40 mag nog.
  • De temperatuur is onder 60 Β°C. Precies 60 is al te warm.

Deel B β€” De toetsentabel

Elke toets die iets doet, staat in een tabel. Een lange if/elif-keten over toetsen is niet toegestaan: dat is precies wat US3 je afleert.

ToetsWat gebeurt er
w Β· s Β· a Β· dVooruit Β· achteruit Β· zijwaarts links Β· zijwaarts rechts, steeds 50 cm.
pijltje omhoog Β· omlaagStijgen Β· dalen, ook 50 cm.
pijltje links Β· rechtsDraaien om zijn as: linksom Β· rechtsom, steeds 45Β°.
t Β· lOpstijgen Β· landen.
fFoto: het huidige beeld opslaan als PNG.
vVideo-opname aan of uit (een schakelaar).
1 Β· 2Vliegsnelheid langzaam (30 cm/s) of snel (80 cm/s).
qStoppen: landen, opruimen, rapport.
iets andersNiet herkend β€” melden en gewoon doorgaan.
De pijltjestoetsen zijn lastiger dan de letters. Met cv2.waitKey(1) & 0xFF uit US4 · T1 knip je de toetscode af tot één byte, en dan zijn de pijltjes niet meer van elkaar te onderscheiden. Daarvoor bestaat cv2.waitKeyEx(), die de volledige code teruggeeft. Die codes verschillen per besturingssysteem, dus je kunt ze niet uit een boekje overnemen: druk de toetsen in, print de code die je terugkrijgt, en zet jouw codes als constanten bovenaan je script.

Deel C β€” Wanneer mag een toets niet?

SituatieWat doet je console?
Bewegen of draaien terwijl de drone nog op de grond staatWeigeren met een melding. De drone blijft staan.
Opstijgen terwijl hij al vliegt, of landen terwijl hij al staatWeigeren met een melding.
Bewegen of draaien terwijl de batterij onder de 20% isWeigeren. Landen, stoppen en een foto maken mogen dan nog wel.
Het drone-commando geeft een foutmeldingOpvangen, in het logboek zetten als fout, en doorgaan met de volgende toets.
Een geweigerde toets is geen crash. De console blijft draaien en de piloot ziet waarΓ³m het niet mocht. Alleen q beΓ«indigt de vlucht β€” en een noodgeval dat je zelf bedenkt in de Extra.

Deel D β€” Het logboek

Van Γ©lke toetsaanslag komt een regel in je logboek: een lijst van dictionaries. In zo'n regel staat minimaal welke toets het was, welk commando erbij hoorde, hoeveel centimeter of graden het was, en wat de uitkomst was: uitgevoerd, geweigerd, onbekend of fout.

Deel E β€” Het vluchtrapport

Na de landing print je script:

  • hoeveel toetsen er verwerkt zijn, en hoeveel daarvan uitgevoerd, geweigerd, onbekend of fout waren;
  • per commando hoe vaak het gebruikt is β€” met .items() over een telling die je zelf opbouwt;
  • de totaal gevlogen afstand in centimeters Γ©n het totaal aantal graden dat hij gedraaid heeft;
  • hoeveel foto's er gemaakt zijn, en of de video-opname aan het eind nog liep;
  • het percentage uitgevoerde toetsen, met één cijfer achter de komma;
  • het meest gebruikte commando;
  • de laatste drie regels uit je logboek.
Let op het randgeval. Een piloot die meteen q drukt, heeft nul uitgevoerde toetsen. Een percentage uitrekenen over nul toetsen kan niet. Je rapport moet dan iets zinnigs zeggen β€” en zeker niet crashen.

User stories

  • Als piloot wil ik de drone live met het toetsenbord besturen, zodat ik meteen kan bijsturen als er iets gebeurt.
  • Als piloot wil ik dat een toets die nu niet veilig is gewoon geweigerd wordt, zodat ik niet per ongeluk de drone tegen het plafond vlieg.
  • Als piloot wil ik zien wÑÑrom een toets geweigerd werd, zodat ik weet wat ik anders moet doen.
  • Als piloot wil ik dat één mislukt commando de hele vlucht niet afbreekt, zodat ik de drone altijd zelf aan de grond kan zetten.
  • Als bestuurslid wil ik na afloop een logboek van elke toetsaanslag, zodat ik kan nagaan wat er gebeurde als er iets misgaat.
  • Als bestuurslid wil ik een kort rapport met tellingen per commando, zodat ik zie hoe de drone gebruikt wordt.

Planning maken

Maak een bestand project_plan.md met je planning. Beschrijf in welke stappen je dit aanpakt, hoe lang je per stap denkt nodig te hebben, waar je problemen verwacht, en welke methodes uit djitellopy en cv2 je nodig hebt. In het tabblad Ontwerpen komt er nog een onderdeel bij.

Wat hoort eruit te komen?

Typ een reeks toetsen en zie wat je console hoort te doen: welke toets wordt uitgevoerd, geweigerd of niet herkend, en wat er in het vluchtrapport komt. Hier staat geen Python β€” alleen het gedrag dat je script moet vertonen.