Kunstige Lego væsner

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

Sidst opdateret 8.9.12.

I byggevejledningen for robotbilen, side 24-26 , ses hvordan en lydsensor - en mikrofon, kan monteres på siden af bilen og tilsluttes NXT på port 2:
Værktøjet Try Me på NXT kan bruges til at starte simple færdige programmer, som f.eks. bruger en lydsensor til at bestemme, hvordan robotbilen skal bevæge sig. Brug de to lysegrå knapper og på NXT til at finde Try Me blandt de valg, som kan foretages lige efter NXT er tændt:
Når Try Me vises midt på skærmen, vil et tryk på den orange knap vise valget Try-Color. Brug de to lysegrå knapper til at finde Try-Sound. Et tryk på orange vælger Try-Sound og skærmen viser, at programmet Try-Sound er klar til at blive aktiveret (Run). Endnu et tryk på orange aktiverer programmet og på skærmen vises en tekst som minder om, at lydsensoren skal tilsluttes NXT på port 2:
Et tryk på den den mørkegrå firkantede knap standser programmet Try-Sound.

Beskriv hvordan robotbilen bevæger sig afhængig af lyden i omgivelserne. Kan bilen stå helt stille? Hvor hurtigt ændrer bilens bevægelse sig, når lyden ændrer sig? Hvordan afhænger bilens hastighed af lydens styrke?

Eksperimenter med programmet Try-Sound viser, at jo kraftigere lyd lydsensoren måler jo højere hastighed får bilen. Det PC baserede programmeringsværktøjet til NXT kan bruges til at undersøge nærmere, hvordan sensores målinger kan bestemme robotbilens bevægelser, f.eks. så bilen søger mod lys, eller henmod en person som taler.

Programmet Try-Sound kan udtrykkes ved hjælp af ikonerne i programmeringsværktøjet sådan her:

Løkke ikonen sørge for, at robotbilen bliver ved med at lade robotbilens hastighed afhænge af det lydniveau, som måles af lydsensoren. Det første ikon i løkken er et lydsensor ikon. Lydsensor ikonen findes blandt Sensor-ikonerne i hele programmeringspaletten:
Løkke og kør ikonen kan også findes i hele programmeringspaletten under Standard-ikoner. Læs videre om programmeringspaletter og de forskellige ikoner i NXT Brugervejledning side 57-59.

De to ikoner i løkken er konfigureret sådan:

Det lydniveau som lydsensor ikonen måler, et tal imellem 0 og 100, overføres fra lydsensor ikonen til kør ikonen via et såkaldt datakabel, den gule streg som forbinder lydsensor ikonen's lydniveau udgangsstik med kør ikonen's motorstyrke indgangsstik:
Det betyder, at det aktuelt målte lydniveau hver gang lydsensor ikonen udføres overføres til motorstyrke indgangen på kør ikonen og den målte værdi bruges i kør ikonen som motorstyrke. Virkningen er, at lydniveauet hele tiden bestemmer den hastighed robotbilen kører fremad med, som i Try-Sound programmet.

Prøv programmet. Hjælp til at trække datakabler kan findes i Datakabler. Hjælpetekster, som den om datakabler, nås via tryk på Mere Hjælp ... i nederste højre hjørne af programmeringsværktøjet:

Hurtigere i lys - langsommere i mørke

I byggevejledningen for robotbilen, side 32-33 og side 36, ses hvordan en lyssensor kan monteres foran på bilen og tilsluttes NXT på port 3:
For at lave et program, som får robotbilen til at bevæge sig hurtigere jo mere lys lyssensoren måler, kan lyssensor ikonen bruges til at måle det aktuelle lysniveau, ganske som lydsensor ikonen lige blev brugt til at måle lydniveauet:
Lyssensor ikonen findes, ligesom lydsensor ikonen, blandt sensor-ikonerne i hele programmeringspaletten.

Eksperimenter med at lade robotbilen køre under forskellige lysforhold. Anbringes bilen helt i mørke vil den stå stille. Stilles bilen, så den kan køre ind i mørke f.eks. under et møbel vil det se ud som om bilen søger hen i mørke.

Hurtigere i mørke - langsommere i lys

Robotbilen med en lyssensor kunne også programmeres til at søge væk fra mørke, altså køre stærkt i mørke og holde stille i lys. Lysniveauet skal igen bruges til at bestemme motorstyrken, dog ikke direkte som før men som motorstyrke = 100 - lysniveau. Så er motorstyrke nemlig 0 ved fuld lys og 100 ved total mørke. Programmet ser sådan her ud:
Et matematik ikon, som findes i hele programmeringspaletten under Data-ikoner, er sat ind imellem lyssensor ikonen og kør ikonen. Det er matematik ikonen, som ved hjælp af konfigureringen:
og de trukne datakabler, sørger for, at lysniveauet bliver trukket fra 100 og at dette resultat bruges som motorstyrke. Læs om hvad matematik ikonen under Hjælp for Matematik-ikon.

Braitenberg Vehicles

Lydbilen og de to udgaver af lysbilen er simple eksempler på såkaldte Braitenberg Vehicles eller Braitenberg Creatures efter en biolog Valentino Braitenberg, som i 1984 udgav en bog:
med titlen "Vehicles - Experiments in Synthetic Psychology". Braitenberg beskriver i en række tankeeksperimenter, hvordan simple biler eller køretøjer (vehicles) med simple kontrolmekanismer kan have ret varierende og komplekse opførsler afhængig af de omgivelser bilerne anbringes i. I hvert eksperiment udstyres bilen med en eller flere sensorer. Afhængig af hvordan sensorerne forbindes til bilens motorer, vil bilerne opfører sig forskelligt. Måden sensorerne forbindes med motorer er inspiretet af Braitenbergs viden om, hvordan nervebaner forbinder sanseapparatet med bevægeapparatet i f.eks. insekter. Eksempler på de to første typer vehicles i hans bog kan ses her:
Vehicle 1 har en lyssensor, den lille røde halvcirkel, som er forbundet til en motor, den blå firkant. Et plus ( ) på forbindelsen bruger Braitenberg til at angive, at motoren drejer hurtigere rundt jo mere lys lyssensoren måler. Lego robotbilen har ganske vist to motorer, men udgaven med en lyssensor foran som er hurtigere i lys - langsommere i mørke, svarer til vehicle 1.

Vechicle 2a og 2b har begge to lyssensorer foran og to motorer. Forbindelserne er begge markeret med plus ( ) altså jo mere lys jo hurtigere drejer motoren. Men lyssensorer og motorer er forbundet forskelligt. Hvilken forskel mon det giver, når de to vehicles stilles i nærheden af en lyskilde? Selvfølgelig kan det gættes hvad der sker, men det kan også undersøges ved at bruge to lyssensorer på robotbilen. Og et program som laver forbindelserne i vehicle 2a og 2b.

Robotbilen kan udstyres med to lyssensorer på utroligt mange måder, her er en:

Programmet, som etablerer de to forbindelser, ser sådan ud:
I programmet forbindes en lyssensor på port 1 med en motor på port B og en lyssensor på port 4 med en motor på port C. Hvis lyssensoren på port 1 peger mod højre i kørselsretningen og lyssensoren på port 4 mod venstre, vil programmet altså være en implementering af vehicle 2a. Samme program kan bruges til at implementere vehicle 2b ved at bytte de to tilkoblinger for lyssensorerne om. Eller de to motorledninger.

På de to videoer kan det ses, hvordan robotbilen med to lyssensorer opfører sig i nærheden af en kraftig lyskilde, først vehicle 2a:

Dernæst vehicle 2b:
Næste video viser, at vehicle 2a først kører væk fra en kraftig lyskilde for dernæst at dreje af fra genskæret i væggen:
Se videoen LEGO Braitenberg Vehicle 2 som viser en række eksperimenter med en ældre udgave af Lego Mindstorms robotbyggesæt. Videoen viser ret klart, hvordan lyssensorer er forbundet til motorer og hvilken opførsel det giver i forskellige omgivelser. Prøv at gentage eksperimenterne. Prøv også at montere lys på robotbilen og lad flere udgaver af vehicle 2a/2b bevæge sig i nærheden af hinanden med lys på. Find mere inspiration ved at søge blandt You Tube videoer med søgeord som Lego Mindstorms Braitenberg Vehicles, Braitenberg Insects, Braitenberg Creatures, ...

Braitenbergs vehicle 3a og 3b illustreres sådan her i bogen:

På forbindelserne er angivet et minus (-). Det betyder jo mere lys jo mindre skal motoren dreje. Altså motorstyrke = 100 - lysniveau, som vist tidligere med en lyssensor. Prøv at bruge to lyssensorer og implementer vehicle 3a og 3b. Prøv også at forudse deres opførsel inden de sættes i omgivelser med en eller flere lyskilder.

Vender sig mod kraftig lyd

Robotbilen kan udstyres med to lydsensorer sådan her:

Lydsensorerne kan erstatte de to lyssensorer i vehicle2a og 2b. Og et lignende program kan implementere de to robotbiler nu med lydsensorer. Se hvordan vehicle 2a med lydsensorer reagerer på lyd tæt på en af de to lydsensorer:
Lydsensorerne sidder langt fra hinanden. Det skyldes, at der ellers ikke er den store forskel på det lydniveau, som måles. Lydsensorerne er ikke så retningsbestemte som lyssensorerne.

Se hvordan to lydsensorer er brugt til at registrere, hvorfra lyden kommer på videoen LEGO Edu NXT -- Robot with two sound sensors. Og se NXT: Sound following head. Søg efter flere videoer. Prøv også at afskærme lydsensorerne, som på NXT Robot with 2 Sound Sensors (moving).

Aktive i lys

De motorstyrkeværdier, som er brugt på de to motorer, har indtil nu været enten en simple voksende funktioner af sensormålingen (forbindelser med ) eller en aftagende funktion af sensormålingen (forbindelser med -):
Braitenberg har også beskrevet, hvordan andre funktioner kan tænkes. F.eks.:
Meningen er, at motorstyrken er 0, når lysniveauet er under 50. Når lysniveauet er over 50 er motorstyrke = 2 (lysniveau - 50), altså op på fuld styrke ved lysniveau 100 som før. Når en sådan forbindelse skal programmeres til robotbilen med en lyssensor foran, skal matematik ikonen bruges to gange for at udregne motorstyrken. Dernæst skal programmet afgøre, om motorstyrken er over eller under 0, inden kør ikonen kan bruges til enten at stoppe bilen eller få bilen til at køre fremad med den beregnede motorstyrke:
Programmet bruger en såkaldt variabel, med navnet motorstyrke, til at gemme den beregnede motorstyrke:
Variabel ikonen kan findes under Data-ikoner i hele paletten. På ikonen ses en kuffert. Det skal symbolisere, at en variabel er en navngiven mekanisme, her med navnet motorstyrke, som programmert kan bruge til at putte tal i ( kaldet skriv) og hente tal ud fra (kaldet læs). I hver variabel kan der højst gemmes en værdi. Når en ny værdi puttes i en variabel slettes den gamle værdi. Og det er altid den nyeste værdi som hentes. Konfigureringspanelet for den første variabel ikon er her:
Motorstyrken beregnes på basis af det målte lysniveau og den beregnede værdi skrives i variablen motorstyrke. Denne værdi kan så senere læses og bruges til at sætte motorstyrke værdien i kør ikonen:
Læs mere om variabel ikonen under Hjælp for Variabel-ikon f.eks. læs om hvordan variable defineres og navngives.

I programmet bruges et forgreningsikon til at afgøre om robotbilen skal køre fremad med den beregnede motorstyrke eller stoppe, dvs. sætte motorstyrken til 0:

Forgreningsikonen findes under Standard-ikoner eller under Flow-ikoner. Forgreningsikonens konfigurationspanel ser sådan ud:
Inden forgreningsikonen ses et sammenligningsikon:
med tilhørende konfigurationspanel:
Sammenligningsikonen kan findes under Data-ikoner i hele paletten. I sammenligningsikonen undersøges om den beregnede værdi af mototstyrke er større end 0. Resultatet er en såkaldt logisk værdi, sand eller falsk. Resultatet føres via det grønne datakabel til forgreningsikonen. Hvis resultatet er sandt, altså motorstyrken større end 0, vælges øverste forgrening og bilen sættes til at køre. Er resultatet falsk vælges den nederste forgrening og bilen stoppes.

Læs mere om forgreningsikonen under Hjælp for Forgrening-ikon og om sammenligningsikonen under Hjælp for Sammenlignings-ikon.

Den aktuelle værdi af variablen motorstyrke kan vises på NXT's skærm, når programmet kører. Tilføj:

f.eks. efter forgreningsikonen:
Tal til tekst ikonen og Display ikonen er brugt. Find hjælp til at læse mere om de to nye ikoner. Eller brug dem blot som her.

Hele programmet kan hentes som over50lysbil.rbt.

Prøv programmet. Prøv med andre værdier end 50 for hvornår lysniveauet skal påvirke bilen. Prøv med andre værdier end 2 som faktoren i motorstyrkeberegningen. Hvad sker ved at bruge større værdier end 2, og mindre?

Hold afstand

I byggevejledningen for robotbilen, side 28-30, ses hvordan en ultralydssensor, kan monteres på bilen og tilsluttes NXT på port 4:
Ultralydssensoren kan benyttes til at måle en afstand i cm til den nærmeste genstand foran sensoren. Afstanden kan i lighed med lysniveau eller lydniveau bruges som i Braitenbergs vehicle 1. Sammenhængen kunne f.eks. være sådan her:
Altså en simpel lineær funktion som skærer x aksen, f.eks. i 20 cm. For positive værdier af motorstyrke skal bilen køre fremad med den givne værdi som styrke, for negative værdier skal bilen bakke med den negerede værdi som styrke. Hvordan mon en sådan vehicle 1 vil opføre sig?
På videoen ses, at bilen kører frem mod en væk til den er cirka 20 cm fra væggen. Så holder den stille. Kommer en genstand tættere på sensoren, f.eks. som her en hånd, vil bilen bakke og så kører frem igen, når hånden fjernes.

Programmet, som får robotbilen til at holde stille i en afstand af 20 cm fra en genstand, minder om programmet som får robotbilen til at holde stille indtil lysniveauet er over 50. Der skal beregnes en motorstyrke ud fra en målt afstand og en forgrening afgør ud fra motorstyrkens fortegn om bilen skal køre frem eller bakke:

I programmet bruges fire brugerdefinerede programmeringsblokke, bStyrke, Frem, Bak og Vis for at gøre programmet mere overskueligt. I bStyrke beregnes motorstyrken ud fra den målte afstand. Derefter bruges en sammenlignings-ikon og en forgrenings-ikon til på basis af motorstyrkens fortegn at afgøre om bilen skal køre frem eller bakke. De to brugerdefinerede blokke Frem og Bak sørger for at bruge den beregnede motorstyrke til at styre bilen, så den kører frem eller tilbage. Endelig bruges Vis til at vise den aktuelle motorstyrke på NXT's skærm.

Hele programmet inclusive de fire brugerdefinerede programmeringsblokke kan hentes som holdAfstand.rbtx.

Prøv programmet. Lad f.eks. bilen starte på lang afstand af andre genstande. Prøv også at holde en genstand foran sensoren og bevæg genstanden frem. Så følger bilen efter.

I programmet bruges en konstant med navnet okAfstand til at fastsætte, hvilken afstand bilen skal standse ved foran en genstand. Konstanten okAfstand har værdien 20, men kan let ændres ved at gå ind i Rediger menuen:

Vælg Definer konstanter:
og i vinduet Rediger konstanter trykkes på Rediger:
Skriv en anden værdi end 20, f.eks. 50 og tryk på Ok og gem programmet. Hvis de to konstanter okAfstand og styrkeFaktor ikke er i listen over definerede konstanter, skal de blot defineres på ny. Hertil bruges Opret og Datatype sættes til Tal.

Når konstanterne er ændret og programmet gemt overføres programmet til robotbilen. Se nu om den opfører sig som forventet, altså holder en anden afstand. Fordelen ved at bruge en konstant som okAfstand er, at der kan eksperimenteres med forskellige værdier uden at ændre i programmet og uden at detaljerne i programmet skal kendes. Læs mere om konstanter under Hjælp for Konstant-ikon.

I programmet bruges en anden konstant med navnet styrkeFaktor. Den har værdien 10. Hvad sker ved at bruge mindre værdier end 10, f.eks. 1, og hvad sker ved at bruge større værdier f.eks. 50? Hvordan mon styrkeFaktor indgår i beregningen af motorstyrke?

Svaret kan ses ved at kigge i blokken bStyrke:

Værdien af motorstyrke beregnes ud fra den målte afstand fra ultralydsensoren på port 4 og de to konstanter som:
motorstyrke = styrkeFaktor x ( afstand - okAfstand )
Værdien af styrkeFaktor afgør altså, hvor kraftigt bilen skal reagerer, når bilen ikke er i den rigtige afstand fra en genstand, defineret af værdien i okAfstand. Små værdier får bilen til at reagerer sløvt, store værdier får bilen til at køre hurtigt frem og tilbage omkring en afstand på okAfstand fra en genstand. Brug flere biler af denne type og se om de kan køre i kolonne, altså med en førerbil, som blot kører lige ud og så de efterfølgende biler, der holder konstant afstand til bilen foran. Det kan blive nødvendigt at montere en plade så ultralydssensoren kan "se" bilen foran. Det kan også være nødvendigt at eksperimentere en del for at finde egnede værdier af styrkeFaktor.

Førerløse biler i kolonne har været prøvet f.eks. som på billedet fra 1998 på San Diego freeway:

Det er kun føreren i den forreste bil, som styrer. Førerne i de andre biler behøver ikke styre, det klarer bilens computer. Computeren sørger bl.a. for, at bilen hele tiden holder en konstant afstand til bilen foran.

De andre tre blokke er simplere end bStyrke. Blokken Frem fodrer blot et kør ikon med den aktuelle værdi af motorstyrke:

I blokken Bak negeres den negative værdi af motorstyrke og denne positive værdi bruges til at styre bilen baglæns:
Indholdet i blokken Vis har vi allerede set:

Prøv at se de værdier, som vises på skærmen under forskellige afstande fra genstande. Værdier kan blive over 100 og under -100. Når de fodres ind som motorstyrker til kør ikonerne, vil ikonerne automatisk sætte motorstyrken til 100, når værdierne er over 100.