Interactieve simulatorBeginner

Simulatie: lijnvolger afstellen in je browser

Bouw een virtuele lijnvolgende robot, visualiseer zijn sensoren, en stel een PID-regelaar af met een interactieve robotsimulator in de browser.

Categorie
Arduino
Tijd
45–90 min
Platform
Browser · Arduino
Technisch schema: Simulatie: lijnvolger afstellen in je browserSENSOR ERROR

01 / Begin hier

Inleiding

Een lijnvolgende robot maakt van sensoraflezingen stuurcorrecties. Met dit project teken je een parcours, verander je de geometrie van de robot en de sensoren, en kijk je vervolgens naar een deterministische PID-regelaar in realtime reageren. Gebruik het om regeltheorie te verbinden met het gedrag dat je van een Arduino-robot op een fysiek parcours zou zien.

Live lab / Deterministic 60 Hz model

Line follower simulator

Run the starter track, tune the controller, or pause and draw a course of your own.

Browser native
A top-down line-follower robot simulator. Use the controls below to run the simulation or read the complete algorithm and theory after this lab.

Bright nodes are sensors currently detecting the track. The lavender heading line shows steering output. Drawing pauses the robot automatically.

Simulation

Paused. Press Start or Step to begin.

Robot geometry
PID calibration
Elapsed
0.0 s
Distance
0 units
Line error
0.000
Steering
0.000
Track contact
100%

Keyboard: focus the course, then use Space to run/pause, N to step, R to reset, D to draw, and F for full screen.

Bediening

Gebruik de parcoursvoorinstellingen om een basis vast te leggen, of pauzeer de rit en teken direct op het parcours. De robotsnelheid bepaalt hoe ver het chassis per update opschuift. Het aantal sensoren en hun onderlinge afstand veranderen het gezichtsveld. De bedieningen P, I en D veranderen de stuurrespons; Stap zet één deterministische update vooruit terwijl je gepauzeerd bent.

Begin met een matige snelheid, vijf sensoren en de standaardversterkingen. Verander één variabele per keer en vergelijk de fout, de rondetijd en de tijd-op-het-parcours.

Theorie

De sensorbalk neemt reflectie waar over de voorkant van de robot. Elke actieve sensor draagt zijn positie met voorteken bij aan een gewogen gemiddelde. Het midden van de balk is fout nul; aflezingen links of rechts van het midden leveren negatieve of positieve fout.

Staafdiagram van vijf reflectiesensoren over de robotbalk. De lijn ligt rechts van het midden, dus de sensoren rechts lezen het sterkst. Een stippellijn markeert het midden van de balk (fout nul) en een doorgetrokken lijn markeert de reflectiegewogen positie op plus 0,69, de berekende stuurfout.
Het gewogen gemiddelde van de sensoraflezingen geeft een gladde lijnpositie: hier ligt de lijn rechts van het midden, dus de fout is positief en de regelaar stuurt terug naar nul. SVG downloaden

De regelaar combineert drie termen:

$$u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de(t)}{dt}$$

De correctie $u(t)$ versnelt het ene wiel en vertraagt het andere. Proportionele regeling reageert op de huidige afwijking, integrale regeling corrigeert aanhoudende vertekening, en differentiale regeling dempt snelle veranderingen.

Algoritme

  1. Lees elke sensor met een vast interval.
  2. Bereken een gewogen lijnpositie en normaliseer die rond het midden.
  3. Hergebruik de laatst waargenomen lijnrichting wanneer alle sensoren de lijn kwijt zijn.
  4. Werk de integraal- en differentiaalterm bij met dezelfde vaste tijdstap.
  5. Begrens de correctie, bereken de motoropdrachten voor links en rechts, en integreer de robotpose.

Stel de proportionale versterking af tot de robot zachte bochten volgt, voeg differentiaalversterking toe tot de oscillatie stabiliseert, en introduceer alleen genoeg integraalversterking om een reproduceerbare offset te verwijderen.

Broncode

De browsersimulator en een microcontroller hebben dezelfde regelvorm. Een compacte Arduino-lus ziet er zo uit:

float integral = 0.0f;
float previousError = 0.0f;

void controlStep(float dt) {
  float error = readWeightedLinePosition();
  integral = constrain(integral + error * dt, -2.0f, 2.0f);
  float derivative = (error - previousError) / dt;
  float correction = kp * error + ki * integral + kd * derivative;

  setMotorSpeeds(baseSpeed - correction, baseSpeed + correction);
  previousError = error;
}

Houd het echte regelinterval stabiel. Een variabele vertraging verandert de differentiaal- en integraalterm, ook als de versterkingen hetzelfde blijven.

Aannames en hardwareverschillen

Dit is een onderwijsmodel, geen hardwarekopie. Het parcours is een vlak, contrastrijk binair masker zonder variatie in omgevingslicht, dus de sensorbalk ziet perfect zwart en wit — op echte tape, kamerverlichting, oppervlakteglans en sensorhoogte veranderen de aflezingen en je moet ijken volgens de stappen in de bedradingsnotities. De timing is ideaal: de regelaar draait op een vast interval zonder delay()-jitter, terwijl een echte Arduino-lus meebeweeft met ander werk en die jitter verandert de PID-respons. Het chassis is kinematisch: de wielen slippen nooit, de motoren reageren direct en de accu zakt nooit door. Behandel de hier gevonden versterkingen als een bruikbaar beginpunt, en stel ze opnieuw af op de echte robot na het ijken.

Schakelschema

Sluit de sensoruitgangen aan op ingangen die analoog kunnen lezen, deel de massa tussen alle modules, en bestuur de motoren via een H-brug in plaats van vanaf controllerpinnen.

Blokdiagram van de bedrading van de lijnvolger. Een IR-sensorarray voedt analoge ingangen op een Arduino, de Arduino stuurt PWM- en richtingsignalen naar een motorbesturing, en de motorbesturing voedt de motoren. Een aparte accu en spanningsregelaar verzorgt de Arduino.
Signalen lopen van links naar rechts; motorstroom komt uit een aparte geregelde voeding, nooit door de logische regelaar van de controller. SVG downloaden

Controleer de nominale spanning van de motorvoeding en plaats lokale ontkoppeling dicht bij de controller en de besturing. Leid motorstroom nooit door de logische regelaar van een ontwikkelbord.

Begeleide experimenten

Elk van deze isoleert één variabele, en dat is precies wat lastig is op echte hardware waar alles tegelijk verandert.

1. Vind de ultieme versterking en halveer hem dan

Zet de integraal- en differentiaalversterking op nul en verhoog de proportionale versterking tot de robot stabiel slingert langs een recht stuk — in weven met constante amplitude in plaats van een groeiende of krimpende. Halveer die waarde.

Je hebt nu een beginwaarde voor Kp die uit een meting komt in plaats van uit een gok, en hij zal in de buurt liggen. Voeg vanaf daar D toe tot het weven uitdempt.

2. Bewijs dat versterkingen snelheidsafhankelijk zijn

Stel de robot af tot hij schoon volgt bij een lage basissnelheid. Verhoog nu de snelheid met de helft en voer dezelfde versterkingen uit zonder iets te veranderen.

Hij zal weven, bochten afsnijden, of de lijn kwijtraken. Er is niets aan de regelaar veranderd — maar dezelfde stuurcorrectie levert nu per eenheid parcours een grotere verandering in de koers, dus de effectieve versterking steeg mee met de snelheid. Elke afstelling is een afstelling bij een bepaalde snelheid, en daarom remt een wedstrijdrobot af voor bochten in plaats van overal één versterking te rijden.

3. Kijk hoe het sensoraantal verandert wat mogelijk is

Rij hetzelfde parcours met drie, vijf en acht sensoren en dezelfde versterkingen.

Sensoren Positiesignaal Effect op de afstelling
3 Grof, feitelijk drie gebieden Volgt, maar kan niet strak worden afgesteld — de fout wordt gekwantiseerd
5 Glad genoeg voor proportionele sturing De gebruikelijke zoete plek
8 Fijn Maakt hogere versterkingen en hogere snelheid mogelijk zonder oscilleren

Het interessante resultaat is dat meer sensoren het plafond verhogen in plaats van de vloer te verbeteren. Bij lage snelheid zijn drie sensoren prima. De extra resolutie begint pas te lonen op de snelheden waar het grove foutsignaal de beperkende factor wordt.

4. Breek hem met opzet in een scherpe hoek

Verhoog de snelheid tot de robot de lijn kwijtraakt in de krapste hoek. Kijk wat hij daarna doet. Denk dan na over wat de echte robot zou moeten doen: rechtdoor rijden is de slechtste optie, want de lijn boog weg.

Dat is de redenering achter het vasthouden van de laatste fout bij lijnverlies in plaats van die op nul zetten — nul betekent “gecentreerd”, en dat beveelt volle snelheid rechtdoor. De laatste fout vasthouden laat de robot doordraaien in de richting waarin hij al draaide, en dat is waar de lijn heen ging.

Wat je moet zien

Symptoom in de grafiek Oorzaak Oplossing
Steeds weven op rechte stukken Kp te hoog, of Kd te laag Halveer Kp, verhoog dan Kd
Weven dat groeit Kp boven de ultieme versterking Verlaag hem
Brede, trage bochtafsnijding Te snel voor de voorsprong van de sensor Rem af, of verplaats de array naar voren
Grillig stuurverschil Kd werkt op een ruisende positie Filter, of verlaag Kd
Volgt altijd iets uit het midden Ongelijke ijk per sensor Normaliseer elk kanaal tegen het eigen bereik
Verliest de lijn en rijdt rechtdoor Fout op nul gezet bij lijnverlies Houd de laatste fout vast

Naar de hardware

Dit lab Een echte robot
Perfect periodieke lus Jittert tenzij je dt meet; een delay() maakt Kd volledig onwerkbaar
Ideale ijk Moet elke rit opnieuw, op het werkelijke oppervlak
Binair contrastrijk parcours Glanzende tape, stof en omgevingsinfrarood verminderen allemaal het contrast
Geen wielslip Slip bij hoge snelheid, en twee verschillende dode zones van de motoren
Motoren reageren direct Beide wielen gaan draaien bij verschillende inschakelduuren
Constante accuspanning De spanning zakt, dus dezelfde inschakelduur levert naarmate de rit vordert minder snelheid

De hier gevonden versterkingen gaan over als bruikbaar beginpunt, en de afstelmethode gaat volledig over. Verwacht dat je op je eigen tape opnieuw moet afstellen — en verwacht dat de grootste enkele verbetering op hardware niet uit de versterkingen komt maar uit de lusfrequentie, want een eerste bouw draait vaak op 20–50 Hz en makkelijk enkele honderden haalt puur door blokkerende aanroepen weg te halen. De volledige bouw staat in bouw een lijnvolgende robot.

Hardwarechecklist

Componenten

  • Arduino Uno of compatibele controller
  • Drie tot negen IR-reflectiesensoren
  • Twee gelijkstroomkastmotoren en wielen
  • Dubbele H-brugmotorbesturing
  • Accupakket, chassis en zwenkwiel

Verken de graaf

Waar deze simulator wordt gebruikt

De projecten, leerroutes en tutorials die op dit lab voortbouwen.

Verder bouwen

Hulpmiddelen downloaden

Gebruik deze naslag op de pagina terwijl je het project doorwerkt. Downloadbare projectpakketten komen er pas bij nadat hun broncode en versie zijn gepubliceerd.

Veelgestelde vragen

Veelgestelde vragen

Waarom oscilleert de robot rond de lijn?

Oscillatie betekent meestal dat de proportionale versterking te hoog is, de differentiaaldemping te laag, of dat de robot sneller rijdt dan zijn sensorverversingssnelheid aankan. Verlaag eerst de snelheid, stel dan P en D af. Op een echte robot is een lange delay() in de lus een veelvoorkomende verborgen oorzaak: de dode tijd die die toevoegt maakt de differentiaalterm onwerkbaar, hoe hoog je hem ook instelt.

Hoeveel sensoren moet een lijnvolger gebruiken?

Vijf sensoren zijn een nuttig beginpunt — ze onthullen de richting en de grootte van de fout terwijl de berekende gewogen positie eenvoudig te controleren blijft. Drie sensoren werken bij lage snelheden, terwijl wedstrijdrobots er vaak acht gebruiken voor een fijnere positieresolutie bij hoge snelheid.

Waarom verliest mijn lijnvolger de lijn in scherpe bochten?

Het chassis beweegt sneller dan de sensorbalk de kromming kan onderscheiden, dus de lijn verlaat de array voordat de regelaar reageert. Verlaag de snelheid, verbreed de sensorbalk, of verhoog de sensorverversingssnelheid. Een goede regelaar hergebruikt ook de laatst bekende lijnrichting wanneer alle sensoren de lijn kwijt zijn, zodat hij terugdraait naar de lijn in plaats van rechtdoor te rijden.

Moet ik analoge of digitale IR-sensoren gebruiken voor lijnvolging?

Analoge reflectiesensoren geven een doorlopende waarde, waarmee je een gladde gewogen lijnpositie kunt berekenen en proportioneel kunt sturen. Digitale sensoren geven alleen aan of uit na een interne drempel, wat eenvoudiger is maar grovere positie-informatie oplevert. Deze simulator modelleert de analoge benadering met gewogen positie.

Hoe ij ik de IR-sensorarray?

Beweeg de sensoren voor een rit over zowel de lijn als de achtergrond en leg voor elke sensor de minimum- en maximumwaarde vast, en normaliseer daarna live aflezingen tegen dat bereik. IJken is belangrijk omdat sensorhoogte, oppervlaktereflectie en omgevingslicht de ruwe waarden veranderen, en een niet-geijkte array verschuift de gewogen positie.

Wat zijn goede beginwaarden voor de PID van een Arduino-lijnvolger?

Behandel gepubliceerde versterkingen als beginpunt, niet als kopie-en-plak-antwoord: motorrespons, sensorhoogte, accuspanning, oppervlaktereflectie en lus-timing veranderen allemaal de versterkingen die een fysieke robot nodig heeft. Begin alleen met P, verhoog die tot de robot zachte bochten volgt met lichte slingering, voeg dan D toe om de slingering weg te nemen en alleen een heel kleine I als er een reproduceerbare offset overblijft.

Verder lezen

Bronnen

Gezaghebbende bronnen om dieper te gaan dan het afgebakende leermodel van deze simulator.