Een afstand rijden
Basis aandrijving
In de vorige les hebben we geleerd hoe u de kracht van elke motor van uw robot afzonderlijk kunt instellen. Aangezien beide motoren de aandrijflijn van de robot vormen, is er een eenvoudigere manier om code te schrijven om de robot te laten bewegen.
Opmerking
Zet uw XRP voor deze les op een vlakke ondergrond zoals een tafel of de vloer.
Uw XRP-robot laten bewegen is eenvoudig! Hier is wat code die u kunt gebruiken om zowel de linker- als de rechtermotor met 50% inspanning aan te drijven:
PythonBlockly
0.5 en 0.5 zijn de parameters van de functie. De functies die u eerder gebruikte hadden slechts één parameter, maar functies kunnen zo weinig of zo veel parameters hebben als u wilt, of zelfs helemaal geen.
Tip
Parameters zijn ingangen voor een functie die attributen zoals afstand of hoek kunnen dicteren om het gedrag ervan te variëren.
Uitproberen
Voeg de code toe aan uw programma om uw robot te zien rijden.
Probeer verschillende waarden te gebruiken om de robot met verschillende snelheden te laten bewegen. Wat gebeurt er als u verschillende waarden gebruikt voor de linker- en rechterwielen?
Plaats de robot daarna op een helling en laat hem opnieuw draaien. Merk op dat de robot langzamer beweegt op de helling. Waarom gebeurt dit?
U kunt merken dat uw XRP niet perfect recht rijdt, ook al hebt u voor beide motoren dezelfde inspanningswaarde gebruikt. Dit komt doordat de motoren op de XRP niet perfect zijn. Elke motor is een beetje anders. Sommige hebben meer wrijving dan andere. In de volgende module leren we enkele manieren om dit probleem op te lossen, zodat uw robot elke keer recht gaat.
Een afstand rijden
Uw snelheid regelen
Naast het instellen van de inspanning van de motoren van de aandrijflijn, kunnen we ook hun snelheid instellen. Onthoud dat inspanning niet hetzelfde is als snelheid. We kunnen de motoren van de XRP ook vragen om een bepaalde snelheid te rijden. Wanneer u deze functie gebruikt, zal de XRP actief de snelheid van de wielen meten met behulp van de encoder van de motor. Als de snelheid te laag wordt, zal de motor automatisch de inspanning verhogen om weer snelheid te maken.
Tip
Maakt u zich geen zorgen als u nog nooit van een encoder hebt gehoord. We zullen er later in de les meer over vertellen.
Om de snelheid van de aandrijfmotoren in te stellen, gebruiken we een nieuwe functie:
Blockly
Deze vertelt de aandrijving om de snelheid van elk aandrijfwiel in te stellen op 5 centimeter per seconde. Dit betekent dat als u de robot neerzet en beide motoren op deze snelheid laat rijden, de robot elke seconde 5 centimeter vooruit gaat.
Uitproberen
Voeg de code toe aan uw programma en voer het uit. Probeer dezelfde oefening door iets tegen de wielen van uw XRP te duwen. Merk op dat wanneer u weerstand toevoegt, de motor meer kracht zal leveren om de snelheid constant te houden. Wanneer u de weerstand weghaalt, zal de kracht weer afnemen.
Aangezien beide wielen nu dezelfde snelheid hebben, zou uw robot nu ook recht moeten rijden, in tegenstelling tot wanneer u de functie set_effort gebruikt.
Tip
Als u wilt dat de robot achteruit gaat, gebruik dan een negatieve snelheidswaarde net zoals u deed met de inspanningswaarde.
Een afstand rijden
We weten dat we met een functie de wielen kunnen vragen om met een bepaalde snelheid te draaien, maar wat als we de robot een bepaalde afstand willen laten rijden?
We kunnen de robot vragen om met een bepaalde snelheid te rijden, en als we weten hoe ver hij per seconde zal rijden (in dit voorbeeld gebruiken we een snelheid van 5 cm/s), kunnen we berekenen hoeveel seconden we moeten rijden om die afstand te bereiken.
We gebruiken om de afstand die we willen rijden in cm weer te geven. Maar we willen een getal in seconden, dus we moeten omrekenen door middel van dimensionale analyse.
Om dit te doen, schrijft u een uitdrukking voor de bekende waarde met de eenheden erbij:
Bij dimensionale analyse wordt deze uitdrukking vermenigvuldigd met speciale weergaven van "1" om eenheden om te zetten. In dit geval is onze snelheid 5 cm per seconde, dus kunnen we gelijkstellen aan. Door herschikken hebben we onze speciale voorstelling van 1:
We kunnen onze uitdrukking nu vermenigvuldigen met deze speciale voorstelling van 1:
Als we de eenheden wegstrepen en vereenvoudigen, krijgen we:
Deze resulterende uitdrukking is logisch! Als we 5 cm willen rijden, vullen we d = 5 in en dus rijden we één seconde. Als we 2,5 cm willen gaan, vullen we d = 2,5 in en dus rijden we een halve seconde.
Houd er rekening mee dat deze vergelijking alleen geldig is als de robot met 5 cm per seconde beweegt. Als u die snelheid wijzigt in sneller of langzamer, moet u de noemer van de breuk wijzigen in die snelheid om de vergelijking op te lossen.
Probeer het uit
Bereken hoeveel seconden u moet rijden om één meter af te leggen als uw robot met 5 cm per seconde beweegt. Onthoud dat er 100 cm in een meter zitten.
Om de bovenstaande theorie in praktijk te brengen, moeten we een nieuwe functie in Python leren kennen: sleep, die de XRP een bepaald aantal seconden laat wachten voordat hij verder gaat met de volgende instructie in de code.
Blockly
Tip
Het # symbool in Python creëert een commentaar. Als u er een toevoegt aan een regel code, wordt alles wat erachter komt op die regel genegeerd door de robot. U kunt het gebruiken om notities voor uzelf achter te laten, of om snel een regel code uit te schakelen tijdens het debuggen van problemen.
Wij gebruiken commentaar in onze voorbeelden om u hints te geven over hoe u uw code moet schrijven. U hoeft ons commentaar niet te kopiëren naar uw code, maar u zou uw eigen commentaar moeten schrijven zodat u gemakkelijk kunt onthouden wat uw code doet.
Uitproberen
Voeg de code toe aan uw programma en probeer het uit. Vergeet niet om x te vervangen door de waarde die u hebt berekend. Probeer uw robot naast een meetlat te laten lopen om te zien hoe nauwkeurig uw robot rijdt!
Deze code die u hebt geschreven is erg nuttig, maar wat als u andere afstanden wilt rijden?
Laten we zeggen dat we drie afstanden achter elkaar willen rijden: 25, 50 en 75 cm. Hoe kunnen we de robot programmeren om dit te doen? De gemakkelijke oplossing is om de code die u eerder schreef drie keer te kopiëren en te plakken, en elke keer aan te passen:
uit XRPLib.defaults importeert *
uit tijd importeer sleep
# 25 cm rijden
drivetrain.set_speed(5, 5)
sleep(25 / 5) # Merk op hoe we wiskunde rechtstreeks in ons programma kunnen schrijven!
drivetrain.stop()
# Rijd 50 cm
drivetrain.set_speed(5, 5)
slaap(50 / 5)
drivetrain.stop()
# 75 cm rijden
drivetrain.set_speed(5, 5)
slaap(75 / 5)
drivetrain.stop()
Dit ziet er behoorlijk repetitief uit. Het grootste deel van deze code is precies hetzelfde. In feite is de enige verandering tussen elk blok de parameter die we doorgeven aan de slaapfunctie. Dit is een perfect voorbeeld van waarom we functies hebben. Laten we onze eigen functie schrijven om de robot een bepaalde afstand te laten rijden.
Blockly
In Blockly maakt u functies door een blok te slepen dat eruitziet als de afbeelding hieronder. De interface stelt u in staat om de functienaam op te geven en parameters door te geven aan het functiegedeelte. Hier hebben we een functie genaamd some_task (die u moet hernoemen op basis van wat uw functie doet) die een parameter genaamd text, aanneemt en de tekstwaarde afdrukt. Functies kunnen zoveel of zo weinig parameters hebben als u wilt, of zelfs helemaal geen parameters.
De onderstaande blokken roepen de functie aan die we hierboven gedefinieerd hebben om deze uit te voeren. De waarde "Hello" wordt doorgegeven aan de parameter text, waardoor "Hello" wordt afgedrukt op de console.
Uitproberen
Definieer een functie genaamd drive_distance die één parameter aanneemt: distance_to_drive. Gebruik de parameter in uw functie als de teller van uw breuk.
Gebruik uw functie om de robot 3 afstanden achter elkaar te laten rijden.
Tip
Definieer uw functies bovenaan in uw bestand, onder de importverklaringen. Op deze manier kan code later in het bestand ze gebruiken.