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
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.
Bright nodes are sensors currently detecting the track. The lavender heading line shows steering output. Drawing pauses the robot automatically.
- 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.
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
- Lees elke sensor met een vast interval.
- Bereken een gewogen lijnpositie en normaliseer die rond het midden.
- Hergebruik de laatst waargenomen lijnrichting wanneer alle sensoren de lijn kwijt zijn.
- Werk de integraal- en differentiaalterm bij met dezelfde vaste tijdstap.
- 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.
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.