Tutorial · Gevorderd · 25 min

Stoppen aan een rand: latentie en remafstand

Een afgrondssensor koopt je een vast aantal millimeters. Waar die heen gaan: reactieafstand die je aan latentie besteedt en remafstand die de vloer je berekent.

Het budget is in millimeters, niet in milliseconden

Een robot met een naar beneden gerichte sensor krijgt één gegeven — wit, nu — en een vaste afstand om daarop te reageren. Een mini-sumoring geeft 25 mm randlijn. Een tafelrand geeft wat de voorwaartse montage-offset van je sensor toevallig is. Het is in beide gevallen een afstand, en de robot besteedt hem op twee heel verschillende manieren:

overshoot = v × t_latency  +  v² / (2a)

De eerste term koop je en betaal je voordat er ook maar wordt geremd. De tweede is wat de vloer rekent zodra dat gebeurt.

Ze gedragen zich volstrekt anders naarmate de snelheid stijgt, en weten welke van de twee je betaalt is het verschil tussen dit in een middag verhelpen en je regellus voor niets herschrijven.

Twee gestapelde grafieken. Het bovenste toont de overschrijding voorbij de lijn in millimeters tegen de snelheid, als twee gestapelde ingekleurde banden: een lagere amberkleurige band voor de reactieafstand die lineair groeit, en een hogere cyaankleurige band voor de remafstand die kwadratisch groeit. Gestreepte horizontale lijnen markeren 25 millimeter voor alleen de randlijn en 65 millimeter inclusief een sensor die 40 millimeter vooruit zit, met een pijl die 0,98 meter per seconde markeert waar de totale kromme 65 millimeter snijdt. De onderste grafiek toont de snelste veilige snelheid die daalt naarmate de totale latentie van waarnemen tot remmen stijgt van nul naar 60 milliseconden, voor een siliconenband met wrijving 1,2 en een kunststofwiel met wrijving 0,7.
Boven: bij 25 ms latentie en µ 1,2 rijdt een robot die 1 m/s maakt 67 mm voorbij de lijn — 25 mm reageren en 42 mm remmen. De twee banden zijn even groot op 0.59 m/s; daarboven overheerst het remmen. Onder: bij 25 ms levert siliconen 0.98 m/s op en hard plastic slechts 0.79 m/s. SVG downloaden

Waar de latentie werkelijk heen gaat

“Latentie” is niet de sensor. Het is alles tussen het veranderen van de fotonen en de banden die kracht de andere kant op uitoefenen, en het wordt vrijwel altijd overheerst door een term die niemand heeft gemeten:

Fase Typisch
IR-zender en fototransistor bezinken ~1 ms
Wachten op de volgende doorgang van je lus tot 20 ms
Beslissing en PWM-schrijfactie <1 ms
Motorstroom die daadwerkelijk omkeert ~3 ms
Rondgang in de overbrenging overbruggen voordat het koppel het wiel bereikt ~1 ms
Totaal, slechtste geval ~25 ms

De lusperiode is vier vijfde daarvan, en dat is de enige regel die je gratis kunt verhelpen.

Een sensor die je op 50 Hz uitleest, is een sensor die je 20 ms tegelijk negeert. De gebruikelijke oorzaak is geen trage processor maar een blokkerende aanroep. Eén pulseIn() op een ultrasone sensor is tot 30 ms volledige blindheid, en een delay(20) voor een servo is hetzelfde met andere woorden. De randsensor elke doorgang van een niet-blokkerende lus uitlezen kost niets en haalt het meeste van de reactieafstand weg.

De laatste rij is de verrassing voor mensen. Motoren omkeren keert de wielen pas om nadat de koppels hun speling hebben overbrugd, dus de rondgang in de overbrenging is vrije slag op het slechtst mogelijke moment: 4° uitgaand spel op een wiel van 32 mm is 1.1 mm uitglijden voordat er enig remkoppel aankomt.

Remmen is een wrijvingsvraag, geen motorvraag

De tweede term lijkt af te hangen van hoe sterk de motoren zijn. Dat doet hij niet.

Dezelfde motoren die 25 N duwkracht kunnen leveren, zouden een robot van 500 g met 50 m/s² afremmen. De vloer staat µg toe — 11.8 m/s² op siliconen, 6.9 m/s² op hard plastic. De aandrijflijn heeft vier keer zoveel gezag als hij mag gebruiken, dus de stopafstand wordt volledig door de banden bepaald, en een grotere motor verkort hem met exact niets.

Daarom heeft het onderste paneel twee krommen in plaats van één. Bij 25 ms latentie verhoogt de overstap van plastic naar siliconen de veilige snelheid van 0.79 naar 0.98 m/s — een winst van 24% uit een onderdeel dat je ook 72% meer duwkracht geeft.

Eén eerlijke correctie: µ gemeten door een stilstaand staande robot te slepen is de statische coëfficiënt, en een harde omkering laat de wielen slippen, waarmee je op de kinetische komt — doorgaans 10–20% lager. Behandel de berekende snelheid als een optimistische grens en rij op ongeveer 80% daarvan.

Welke term overheerst, en dus wat je moet aanpakken

Stel de twee termen gelijk en het kruispunt is helder:

v × t = v² / 2a   →   v = 2at

Bij 25 ms en µ 1.2 is dat 0.59 m/s.

  • Daaronder ben je latentiegebonden. De lusperiode halveren levert meer op dan enige band. Dit is waar een zoekende robot leeft, en het is het goede nieuws: de oplossing is een softwarewijziging.
  • Daarboven ben je tractiegebonden. Grip en massaverdeling belangrijker dan de frequentie van de lus, en voorbij een bepaald punt is het enige resterende antwoord om langzamer te rijden.

De meeste robots die van dingen vallen zitten in het eerste regime en worden afgesteld alsof ze in het tweede zaten.

Geef jezelf meer millimeters

Het budget is niet vast. Het is de breedte van de randlijn plus de afstand waarop de sensor voor de wielen is gemonteerd, en die tweede term is een vrije ontwerpvariabele:

budget = border + sensor lead

Een sensor 40 mm vóór de aandrijfas maakt van 25 mm randlijn 65 mm stopruimte, en dat is het verschil tussen 0.60 m/s en 0.98 m/s. Los het andersom op als je een doelsnelheid hebt:

budget = v·t + v²/(2a)

Praktische grenzen aan hoe ver vooruit je kunt gaan:

  • Hij moet de randlijn zien, niet de ring erbuiten. Te ver naar voren gemonteerd kijkt hij voorbij de lijn terwijl de robot nog veilig is, en dat kost je snelheid zonder reden.
  • Monteer laag en scherm hem af. Een IR-reflectiesensor op 3 mm leest het oppervlak; op 15 mm leest hij het oppervlak plus de kamerverlichting. Dit is hetzelfde drempel- en kalibratieprobleem dat een lijnvolger heeft, met een veel slechtere storingsvorm.
  • Zet er één bij elke voorhoek. Eén centrale sensor vertelt je dat de ergens vooruit ligt. Twee vertellen je welke kant op om ervan weg te draaien, zonder extra latentie.
  • Vergeet de achterkant niet. Een robot die naar achteren wordt geduwd steekt de randlijn over voorbij in de verkeerde richting, en de sensoren voorin zullen het nooit zien.

Eerst terug, dan draaien

Bij een vast budget is de volgorde van handelen belangrijker dan het afstellen.

Volledig terug, onmiddellijk. Niet uitglijden — een uitglijdende robot remt alleen op rolweerstand, een kleine fractie van µg, en de overschrijding verdrievoudigt ruwweg. Ook niet zacht remmen: dit is het ene moment waarop een bewegingsprofiel het verkeerde instinct is, want de beperking is afstand en niet gladheid.

Dan draaien, zodra je stilstaat. Draaien terwijl je nog vooruit beweegt maakt van je rechte-lijnprobleem een boog die een hoek van de robot verder naar buiten brengt dan zijn middelpunt. Stop eerst en richt je daarna opnieuw op — en onthoud dat een draai op de plaats de banden de hele tijd zijwaarts schuurt.

Registreer de detectie. Eén wit monster is genoeg. Wachten op twee opeenvolgende metingen om het te bevestigen verdubbelt je reactieafstand in het slechtste geval, en de fout-positief die je daarmee voorkomt is veel goedkoper dan het vallen.

Je eigen latentie meten

Het getal in de tabel is een beginschatting. De jouwe is in ongeveer vijftien minuten te meten.

Van binnenuit. Leg micros() vast wanneer de sensor de drempel passeert en nogmaals op de regel die de omgekeerde PWM schrijft. Dat vangt de softwarehelft, en dat is de helft die je kunt verhelpen. Print de slechtste waarde over honderd detecties, niet het gemiddelde — het slechtste geval bepaalt of de robot van de rand valt.

Van buitenaf. Film het met 240 fps op een telefoon. Tel de frames tussen het passeren van de sensor langs de lijn en het zichtbaar omkeren van de wielen; elk frame is 4.2 ms. Dit vangt de elektrische en mechanische vertraging die software niet kan zien, en het is de enige manier om het totaal te bevestigen.

Van begin tot eind. Rijdt op een bekende snelheid naar een afgeplakte lijn en meet hoe ver voorbij die lijn hij stopt. Trek de berekende remafstand v²/2a daarvan af en wat overblijft is v × t — de totale latentie, gemeten met een liniaal.

Die laatste kost vijf minuten en is de moeite waard vóór alle afstemming, want hij vertelt je welke van de twee termen je werkelijk betaalt.

Als het misgaat

Symptoom Meestal
Stopt betrouwbaar langzaam, valt snel Werkt zoals ontworpen — je bent voorbij de snelheid die het budget toestaat
Overschrijdt met een vaste hoeveelheid Latentie; meet hem van begin tot eind en verkort de lus
Overschrijdt met een wisselende hoeveelheid Een blokkerende aanroep ergens — de lusperiode is niet wat je denkt
Ziet de lijn te laat Sensor te hoog of te ver achteren gemonteerd, of drempel ingesteld voor een andere ruimte
Detecteert een randlijn die er niet is Reflecterende vloer of omgevings-IR; scherm de sensor af en herkalibreer
Stopt op tijd en rijdt toch van de rand af Het wegdraaien gebeurde terwijl hij nog bewoog; stop eerst
Valt naar achteren Geen sensoren aan de achterkant

Dezelfde rekensom geldt voor een robot aan een tafelrand, een stofzuiger die trappen vermijdt en een obstakelstop — alleen het budget verandert. De obstakelvermijdingssimulator legt precies deze stopafstandgeometrie bloot met een vooruitkijkende sensor in plaats van een naar beneden gerichte, en het mini-sumo-project is de plek waar het moet werken tegen een tegenstander die je bewust wilt laten falen.

Verken de graaf

Onderdeel van deze bouwprojecten

Projecten en leerroutes waarin deze tutorial voorkomt.

Verder lezen

Bronnen