Sprint 5 · Functies & scope  ·  Project  ·  ±4 uur  ·  Individueel

Project: Modulaire Drone Console

De clubconsole krijgt een missiemodus. Een lid schrijft een reeks opdrachten; jouw console controleert die, rekent hem door vóór het opstijgen, vliegt hem af en maakt een rapport. Je bouwt het als een project van modules die je zonder drone kunt testen. Daarmee sluit je fase 1 af.

functies & return tuples & standaardwaarden modules & imports scope testen zonder drone

Wat ga je maken?

±25 min

In sprint 4 bestuurde je de drone live met het toetsenbord. De vliegclub wil nu ook missies: een vaste reeks opdrachten die de drone zelf afvliegt, bijvoorbeeld een rondje door de zaal met een foto op elke hoek. Een missie gaat pas de lucht in als de console hem gecontroleerd en doorgerekend heeft. Jij bouwt die missiemodus — niet als één lang script, maar als een klein project van modules.

Deel A — De missie

Een missie is een lijst met tekstregels in missions.py. Elke regel is één stap:

RegelBetekenis
forward 100 · back · left · rightVliegen in centimeters, 20 tot en met 500. De richting is ten opzichte van waar de neus van de drone naar wijst.
up 50 · down 50Stijgen of dalen in centimeters, 20 tot en met 500.
cw 90 · ccw 90Draaien rechtsom (clockwise) of linksom. Alleen 90, 180, 270 of 360 graden.
photoEén foto maken. Er staat geen getal achter.

Hoofdletters en extra spaties maken niet uit:   FORWARD   100 is hetzelfde als forward 100. Opstijgen en landen staan niet in de missie; dat doet de console zelf.

Deel B — Elke regel controleren

Klopt een regel niet, dan noemt de console het regelnummer en de reden. Hij stopt niet bij de eerste fout: alle foute regels komen in beeld. Een missie met één of meer foute regels vliegt niet. Een lege missie ook niet.

FoutVoorbeeld van een melding
Onbekend commandoregel 2: onbekend commando 'jump'
Getal ontbreektregel 4: getal ontbreekt
Geen geheel getalregel 5: 'abc' is geen geheel getal
Afstand buiten 20–500regel 1: afstand 10 cm (min: 20, max: 500)
Verkeerde draairegel 3: draai 45° (alleen 90, 180, 270 of 360)
Te veel onderdelen, of een getal achter photoregel 6: photo heeft geen getal nodig

De teksten mag je zelf kiezen, zolang het regelnummer, de waarde en de grens erin staan.

Deel C — Doorrekenen vóór het opstijgen

Is elke regel goed, dan rekent de console de hele missie door zonder te vliegen. Hij houdt bij waar de drone is en welke kant hij op kijkt.

  • Het startpunt is (0, 0, 0): x is links–rechts, y is voor–achter, z is de hoogte boven het opstijgpunt. Bij de start wijst de neus naar voren: dat is 0°.
  • forward vliegt in de kijkrichting. Na cw 90 kijkt de drone naar rechts, dus gaat forward daarna in de x-richting. back, left en right draaien mee.
  • De drone blijft in de zaal: x en y liggen van -300 tot en met 300 cm.
  • De hoogte ligt van 0 tot en met 200 cm.
  • Komt de drone ergens buiten die grenzen, dan wordt de missie afgekeurd, met het nummer van de eerste stap waar dat gebeurt.

Daarnaast schat de console het accuverbruik:

OnderdeelVerbruik
Opstijgen en landen samen10%
Bewegen, alle zes richtingen4% per 100 cm
Draaien1% per 90°
Foto0%

De missie mag alleen de lucht in als de geschatte accu aan het eind minstens 20% is. Precies 20 mag nog. Vóór het opstijgen print de console: de afstand, het aantal gedraaide graden, het aantal foto's, de eindpositie, het hoogste punt, het geschatte verbruik en de geschatte eindaccu.

Deel D — Vliegen

  • In config.py staat SIMULATION. Staat die op True, dan is er geen drone: de startaccu komt uit config.py, opstijgen en landen kosten meteen 10%, en elke stap kost het geschatte verbruik plus SIM_EXTRA_DRAIN. Met die laatste bootst je een accu na die sneller leegloopt dan je berekening.
  • Met de echte drone meet je de accu na elke stap. Bij photo sla je het huidige camerabeeld op, met het stapnummer in de bestandsnaam.
  • Is de accu na een stap onder de 15% en komen er nog stappen, dan breekt de console af: hij landt en slaat de rest over. Na de laatste stap hoeft er niets afgebroken te worden.
  • De drone landt altijd, ook als er iets misgaat.
  • Van elke stap komt een regel in het logboek: een lijst met een dictionary per stap. Daarin staan het stapnummer, het commando, de waarde, de status (uitgevoerd of overgeslagen) en de accu na die stap.

Deel E — Het rapport

Na de landing print de console:

  • de naam van de missie, en of hij voltooid is of afgebroken na stap …;
  • hoeveel stappen er zijn uitgevoerd, van het totaal;
  • de afstand, de graden en het aantal foto's van de uitgevoerde stappen;
  • de eindpositie, en of de drone boven het startpunt geëindigd is;
  • de accu bij de start en aan het eind, en het werkelijke verbruik naast het geschatte — met één cijfer achter de komma.

Deel F — De projectstructuur

mission_console/ ├── config.py ← alleen constanten ├── missions.py ← alleen missies: lijsten met regels ├── mission_check.py ← regels opknippen en controleren ├── navigation.py ← richting, positie, zaal en accuschatting ├── flight.py ← stappen uitvoeren: drone of simulatie ├── report.py ← voorbeschouwing en rapport opmaken ├── main.py ← alleen opstarten, max 30 regels └── test_mission.py ← tests die zonder drone draaien
  • Modules bevatten alleen definities: importeren geeft geen uitvoer.
  • Functies die controleren of rekenen, printen niets — ze geven hun uitkomst terug. Alleen main.py en je testbestand printen.
  • main.py bevat geen def en draait alles achter if __name__ == "__main__":.
  • Er staat nergens global. Wat een functie verandert, komt terug via return — tenzij het een lijst is die de functie bewust vult, en de naam van de functie dat zegt.
  • Elke grens en elk verbruik staat één keer, in config.py.

Wat oefen je?

User storyWaar zit het in dit project?
US1 · DRY & functiesDezelfde controle en dezelfde accuformule voor doorrekenen én vliegen; elke grens één keer in config.py.
US2 · Parameters & returnFuncties die meer dan één waarde teruggeven en die je uitpakt; een positie als tuple; minstens één parameter met een standaardwaarde.
US3 · Drone-helpersModules met één onderwerp, een main-guard, en een testbestand dat zonder drone draait.
US4 · ScopePositie en kijkrichting via return in plaats van global; een logboek dat bewust gevuld wordt; startwaarden vóór je lussen.

User stories

  • Als clublid wil ik een missie als simpele tekstregels schrijven, zodat ik geen Python hoef te kennen om een route te plannen.
  • Als clublid wil ik bij een foute regel precies zien welke regel het is en waarom, zodat ik hem zelf kan verbeteren.
  • Als veiligheidsverantwoordelijke wil ik dat een missie die buiten de zaal komt, te hoog gaat of te veel accu kost niet opstijgt, zodat er niets tegen de muur of het plafond vliegt.
  • Als piloot wil ik dat de drone halverwege landt als de accu sneller leegloopt dan berekend, zodat hij nooit uit de lucht valt.
  • Als bestuurslid wil ik na elke missie het geschatte en het werkelijke verbruik zien, zodat we de schatting kunnen verbeteren.
  • Als ontwikkelaar wil ik de controles en berekeningen testen zonder drone, zodat ik fouten vind aan mijn bureau in plaats van in de lucht.

Planning maken

Maak een bestand project_plan.md. Beschrijf in welke stappen je dit aanpakt, hoelang je per stap denkt nodig te hebben, waar je problemen verwacht, en welke functies je zonder drone kunt testen. In het tabblad Ontwerpen komt er nog een functietabel bij.

Wat hoort eruit te komen?

Typ een missie — één stap per regel — en zie wat je console hoort te doen: welke regels fout zijn, hoe de missie doorgerekend wordt, of hij de lucht in mag, en wat er in simulatie gebeurt. Hier staat geen Python — alleen het gedrag dat je console moet vertonen.