Følge kanten af en sort streg

Ole Caprani
Institut for Datalogi, Aarhus Universitet,
ocaprani@cs.au.dk

Sidst opdateret 28.6.16.

Programmering af kørsel langs kanten af en sort streg

På de fleste robotbaner er der sorte streger, som kan benyttes, når robotten skal navigeres rundt imellem forskellige positioner på banen. Med en farvesensor monteret foran på robotten, som f.eks. vist her:
kan en robot f.eks. programmeres til at følge kanten af den sorte streg.

Ideen er, at farvesensoren under kørslen registrerer, hvor stregen er i forhold til robotten og på basis af farvesensorens registrering programmeres robottens to motorer til at styre hjulene, så robotten holder sig i nærheden af kanten af stregen under kørslen langs stregen.

På videoen kan det ses, hvordan en robot ved hjælp af registreringer fra farvesensoren følger den inderste kant af en sorte streg rundt i en cirkel:

Programmet, testLeftEdgeDrive.ev3p, som styrer robotten på videoen, ser sådan her ud:

Den brugerdefinerede programmeringsblok LeftEdgeDrive bruger en farvesensor og de fire tal: 3, 40, 20 og 0,2 til at sikre, at robotten kører fremad med farvesensoren over den venstre kant af den sorte streg. Programmet testLeftEdgeDrive.ev3p findes i EV3 projektet FollowEdge.ev3.

For at få robotten til at følge ventre kant af en sort steg skal LeftEdgeDrive, som vist, have fire tal - også kaldet parametre til LeftEdgeDrive. Parametrene har fået navne som afspejler, hvordan LeftEdgeDrive bruges tallene. Navnene kan ses her:

De fire parameterværdier bliver brugt af langsVkant sådan her:
  • Port: angiver den port (1,2,3 eller 4) som farvesensoren er tilsluttet.
  • offset: den lysprocent farvesensoren viser lige over kanten imellem sort og hvid, altså når farvesensoren har denne position:
  • minPower: angiver den fart robotten kører lige ud med, når robotten er på kanten af stregen.
  • pFaktor: angiver hvordan robotten skal svinge mod kanten af stregen, når farvesensoren ikke er over kanten. En lille værdi får robotten til at svinge blødt, en stor værdi får robotten til at svinge skarpt.
Opgave 1: Prøv at eksperimenterer med de to input parametre minPower og pFaktor for at finde ud af hvilke værdier, som får robotten til at følge en kant så hurtigt som muligt uden at robotten kører væk fra kanten. Prøv med streger med forskellig krumning.

Opgave 2: Gentag opgave 1 men nu med programmet testRightEdgeDrive.ev3p fra EV3 projektet FollowEdge.ev3.

Programmering af kørsel langs kanten af en sort streg

Nu forklares, hvordan en robot ved hjælp af registreringer fra farvesensoren kan programmeres til at følge kanten af en sort streg. Under kørslen langs den venstre kant af stregen i robottens kørselsretning, ønskes det altså, at robotten programmeres til en styring, så robotten kører ligeud, når farvesensoren er lige over kanten af stregen:

Når robotten under kørslen har farvesensoren på det hvide til venstre for kanten eller på den sorte streg til højre for kanten, skal robotten altså "rettes op", så den igen kører med farvesensoren over kanten. Det betyder, at robotten skal holde til højre, når farvesensoren registrerer hvid og robotten skal holde til venstre, når farvesensoren registrerer sort:
For at køre ligeud og samtidig holde til højre, skal motor B dreje hurtigere rundt end motor C. For at få robotten til at holde til venstre skal motor C dreje hurtigere end motor B. Men hvor meget hurtigere? Og når farvesensoren er langt væk fra kanten af stregen, skal robotten vel rettes mere op end når farvesensoren er næsten over kanten? Det viser sig, at farvesensorens registrerede lysværdi kan benyttes til at afgøre, hvor meget hurtigere det ene hjul skal dreje end det andet og dermed rette robotten mere eller mindre op afhængig af, hvor tæt farvesensoren er over kanten.

Hvis farvesensoren benyttes til at måle intensitet af reflekteret lys, vil farvesensoren registrerer en lysværdi, der ligger imellem f.eks. 10% (farvesensors røde lysende cirkel helt over sort) og 84% (farvesensor over hvid). Med den røde lysende cirkel halvt over hvid og halvt over sort er farvesensoren lige over kanten og så registreres en lysværdi, som er (84+10)/2 = 47%.

Det betyder, at at lysværdien kan bruges til at afgøre hvor farvesensoren befinder sig i forhold til kanten af den sorte streg:
  • lysværdi større end 47% betyder, at farvesensoren er til venstre for kanten, mere over hvid end sort.
  • lysværdi mindre end 47% betyder, at farvesensoren er til højre for kanten, mere over sort end hvid.
Opgave 3: Prøv at bruge portvisning til at undersøge, hvordan lysværdien ændres, når farvesensoren føres fra én position helt over sort til én position helt over hvid. Se eventuelt under EV3 hjælp > Generelt > Hardwareside > Portvisning. Når farvesensoren er lige over kanten, registreres en værdi, som kaldes offset. I eksemplet er offset altså = 47%. Ved at sammelligne den registrerede lysværdi, kaldet lightValue, med offset, kan det afgøres i hvilken retning robotten skal styres i forhold til kanten:
  • offset = lightValue, farvesensoren er lige over kanten, robotten skal køre ligeud.
  • offset < lightValue, farvesensoren er til venstre for kanten, mere over hvid end sort, robotten skal holde til højre.
  • offset > lightValue, farvesensoren er til højre for kanten, mere over sort end hvid, robotten skal holde til venstre.
Forskellen imellem offset og lightValue, altså offset-lightValue, er et mål for, hvor langt farvesensoren er fra kanten. Denne forskel kan bruges til at afgøre, hvor meget robotten skal holde til højre eller venstre, når robotten skal rettes op. Hvis forskellen er lille, skal robotten blot rettes lidt op, er forskellen stor, skal robotten rettes meget op. Ideen er altså, at forskellen i motorhastighed imellem de to motorer skal være propertional med forskellen offset-lightValue. Det kan f.eks. opnås således:
I den første ligning udregnes turn til at være propertional med forskellen offset-lightValue. Propertionalitetsfaktoren kaldes P. Hvis P er positiv, har turn samme fortegn som offset-lightValue. I de to sidste ligninger bruges turn til at justere power til de to motorer i forhold til en konstant power kaldet minPower. Ved at se på de tre tilfælde igen som ovenfor, kan det ses, at ligningerne netop giver den ønskede styring:
  • turn = 0, altså offset = lightValue, ingen forskel i motorhastighed på de to motorer: robotten kører ligeud med minPower på begge motorer.
  • turn < 0, altså offset < lightValue, robotten holder til højre, da power til motor B er abs(turn) højere end minPower og power til motor C er abs(turn) mindre end minPower.
  • turn > 0, altså offset > lightValue, robotten holder til venstre, da power til motor C er turn højere end minPower og power til motor B er turn mindre end minPower.
Denne idé til hvordan motorerne skal styres for at holde robotten på kanten af stregen, kaldes P-regulering eller propertional regulering (Se en mere detaljeret gennemgang i J. Sluka, A PID Controller For Lego Mindstorms Robots).

LeftEdgeDrive

Robotten på videoen ovenfor har en farvesensor tilsluttet port 3 og to motorer tilsluttet port B og C. Robotten styres af et program, som hedder testLeftEdgeDrive.ev3p. Programmet findes i projektet FollowEdge.ev3. Programmet ser sådan her ud:
I programmet gentages udførelsen af den brugerdefinerede programmeringsblok LeftEdgeDrive ubegrænset i løkken. LeftEdgeDrive benytter P-regulering til at styre de to motorer, så robotten følger venstre kant af en sorte streg. For at kunne følge kanten ved hjælp af P-regulering input parametrene sættes i LeftEdge Drive. LeftEdgeDrive har fire input parametre, Port, offset, minPower og pFaktor:
  • Parametren Port er sat til 3 svarende til den port farvesensoren er tilsluttet.
  • Parametren offset er sat til den aktuelle lysværdi farvesensoren registrerer over kanten. En måde at finde hvilken værdi offset skal have er at måle lysværdien over hvid og sort og udregne gennemsnit af de to værdier, f.eks. som vist (75+6)/2 % = 40,5 % (rundet til 40 for nemheds skyld):
  • Parametren minPower er sat til 20 og bestemmer, hvor meget power de to motorer skal have, når robotten kører ligeud over kanten af stregen.
  • Parametren pFaktor er sat til 0,2 og er propertionalitetsfaktoren P i P-reguleringen. Jo større pFaktor værdi jo skarpere drejer robotten mod kanten, når farvesensoren ikke er over kanten.
Åbnes LeftEdgeDrive ser den sådan her ud:
Blokken udregner power til motor B og C ud fra lysværdien fra farvesensoren på den port som parametren Port angiver, værdien af parametren offset samt de to parametre minPower og pFaktor. Det sker ud fra P-reguleringsligningerne:
Den første ligning udregnes af den første matematik-blok, se EV3 hjælp > Programmering > Data-blokke > Matematik. Lysværdien fra farvesensoren registreres af en farvesensor-blok, se EV3 hjælp > Programmering > Sensorblokke > Farve. Værdien af turn fra den første ligning er altså resultatet af udregningen fra den første matematik-blok. Værdien af turn føres videre til de to andre matematik-blokke, som udregner power til motor B og C ud fra de to næste ligninger.

RightEdgeDrive

I projektet FollowEdge.ev3 findes også et program testRightEdgeDrive.ev3p som får robotten til at følge højre kant af en sort streg ved hjælp af den brugerdefinerede programmeringsblok RightEdgeDrive, som ser sådan her ud:
RightEdgeDrive fås ud fra LeftEdgeDrive ved at ombytte navnene i de to motorblokke.