0

Naprednije praćenje linije

Upute

Za točno prećenje linije je nužna potpuno točna detekcija pozicije linije. Koristite senzore ML-R Reflectance Sensor A (mrm-ref-a) ili ML-R Reflectance Sensor D, sidelooker (mrm-ref-d). Ako ih poredate jednog do drugog, na visinu od 13 mm, neka razmak među sredinama senzora bude 11 mm. Tako su poredani na slici dolje. Povećavanje razmaka rezultira zonama među senzorima koje nisu dovoljno dobro pokrivene. Senzore možete staviti niže, uz proporcionalno smanjenje udaljenosti među njima. Očito postoji visina ispod koje se ne može više ići jer senzori ne mogu biti bliže. Senzore je moguće podići i tako je moguće dobiti veći razmak među njima - no i smanjenu razliku između crnog i bijelog. Koristite desetak senzora.

Točnu poziciju crte dobijete interpolacijom. Pozicija crte (npr. 0 je sredina robota, lijevo su negativne vrijednosti, desno pozitivne) koristite kao ulazni parametar za PID kontroler algoritam. Obavezno koristite PID jer na većim brzinama povratna veza prema grešci nije dovoljna. Zamislite da je crta na +3 cm (desno od osi robota). Koliko da skrećete desno? Vi to ne možete zaključiti iz samo ovog parametra jer ne uzima u obzir smjer kretanja robota. Ako robot već ide oštro desno, samo nastavljanje kretanja naprijed će ispraviti grešku. Ako baš ide jako desno, bit će potrebno skretanje ulijevo da bi se došlo na optimalan način do linije koja je desno! Obrnut je primjer kad robot ide ulijevo. Ova se greška ispravlja derivativnom komponentom (brzinom promjene greške, znači derivacijom greške po vremenu). Tu je još integralna komponenta, u slučaju da je robotu konstantno crta na npr. -0.5 cm. Drugim riječima, ako robotu na maloj brzini crta bježi jednu pa na drugu stranu, povećajte proporcionalni faktor PID algoritma. Ako oscilira, povećajte derivativni. Ako ima konstantnu grešku lijevo ili desno i na maloj brzini, integralni.

Ako crta pobjegne na jednu stranu, ostavite čitanje senzora na toj strani na maksimumu i idite npr. još pola sekunde. Robot će imati dobru šansu okrenuti se dovoljno i uloviti opet crtu.

Pazite na težište robota. Robot se okreće oko njega. Težište treba biti naprijed, ne daleko iza senzora linije. U protivnom će senzori u okretima raditi preširoki krug i neće moći dobro pratiti kratke zavoje.

Parametre PIDa možete izabrati tako da robot jako prati crtu ili slabo. Ako izaberete jako, slijedit će svaki zavoj, ali će ići sporo. Slabo praćenje neće biti dobro za vrlo oštre zavoje, no robot će ići brzo jer motori neće svaki čas mijenjati snagu ili čak i smjer.

Redoslijed konstrukcije sistema za praćenje linije bio bi:

  • Na robota stavite držač senzora i senzore.
  • Provjerite testom vidi li u svakom času bar jedan senzor liniju.
  • Kalibrirajte senzore. ReflectanceSensors.cpp, funkcija calibrate().
  • Postavite neki proporcionalni faktor, npr 2. Derivacijski i integracijski stavite na 0. Pustite robota da prati crtu na vrlo maloj brzini. Korigirajte proporcionalni dok ne počne pratiti crtu bez greške.
  • Povećavajte brzinu. Robot će se početi kretati nestabilno, oscilirajuće. Povećavajte derivacijsku komponentu dok ne dobijete glatko gibranje.
  • Neka robot prati dovoljno dugu, ravnu crtnu. Pogledajte je li linija u sredini robota. Ako nije, korigirajte integracijsku komponentu.

Što kad se nikako ne može dobiti da robot dobro prati crtu. Provjerite:

  • Rade li sigurno svi senzori dobro? To što daje neku vrijednost van ne znači puno jer analogni pin uvijek čita nešto, bilo nešto spojeno na njega ili ne. Čak i ako daje vrijednost koja ovisi o prelasku preko crne linije, ni to ne znači da radi. U mikrokontroleru je obično samo 1 ADC (pretvara analogni signal, koji zavisi o svjetlu, u digitalni), koji se u vremenu dijeli na više ulaza (pinovi na mikrokontroleru). Ulazi nisu potpuno nezavisni pa čitanje pina (analogRead()), na koji nije spojeno ništa, isto daje rezultat, koji ovisi o vrijednostima drugih pinova! Ako je senzor dobro spojen, pin (analogni ulaz) mora davati stabilnu vrijednost. Ne može varirati za 50 ili 100 dok je senzor na mjestu. Mora se mijenjati jako (bar 200-300, bolje 500) mijenjanjem crno-bijelo i ta promjena mora biti ponovljiva. Razloga za loš rad senzora morže biti više: loš senzor, loši kablovi, loše zalemljen pin mikrokontrolera, softverska greška. Nađite drugi senzor koji radi na drugom pinu i onda mijenjate komponente dok ne nađete kad prestane raditi.
  • Provjerite još jednom da nema rupe u čitanju između senzora. Koristite klasu ReflectanceSensors i funkciju test(false). Dobiveni X-evi moraju tvoriti neprekinuti niz. Ako postoji rupa, ona će davati grešku u korištenju derivacijske komponente i robot će se kretati trzavo.
  • Ako robot konstantno titra istom amplitudom, moguće je da čita 2 udaljena senzora pa se ne može odlučiti između njih. Možda je obasjan sunčanim svjetlom? Na jakom suncu je vrlo teško pratiti liniju. Ako niste prije, kalibrirajte senzore.
  • Sunce je težak problem jer zrači infracrvene zrake, koje senzori primaju. Borite se protiv tog fenomena oklapanjem senzora u 3D štampano kućište koje propušta zrake samo okomito na senzor. Kućište obojite iznutra mat crnom bojom. Alternativno, koristite senzore koji čitaju vrlo uzak kut, kao što su gotovo svi ML-R senzori.

Kod za senzore linije

Instalirajte ovu biblioteku: https://www.github.com/PribaNosati/MRMS.

Uključite klasu u vaš kod naredbom na početku .ino datoteke:

#include "ReflectanceSensors.h"

U skinutoj ReflectanceSensors.h su 2 parametra koja je moguće mijenjati:

#define MAX_REFLECTANCE_SENSORS 30
#define SerialPortReflectance Serial2
U prvom se maksimalan broj senzora može smanjiti, za uštedu memorije, ili povećati, ako ih stvarno ima tako puno. Drugi je za definiciju UARTa na koji se vrši ispis, ako je potreban. Ako se na Serial2 spoji npr. Bluetooth, konfiguracija ostaje kakva je ovdje. Ako se koristi UART 1, samo se upiše Serial1 umjesto Serial2.

Deklarirajte objekt kao globalnu varijablu (izvan loop, setup i drugih funkcija):

ReflectanceSensors lineSensors(0);//0 - no autocalibration, 1 - autocalibration

Jedan po jedan dodajte sve senzore u funkciji setup:

lineSensors.add(A12, -44, false);// It isn't included in array of line searching sensors.
lineSensors.add(A13, -44);
lineSensors.add(A17, -33);

Želite li testirati senzore, koristite npr. naredbu:

lineSensors.test(false);
Pogledajte opcije funkcije test. Drugi parametar je uvjet (funkcija) za prekid testa. O njoj više uprimjerima naredbi.

Centar linije nađete kodom:

bool lineFound, nonLineFound;
	double centerMm = lineSensors.findLine(lineFound, nonLineFound);

Za kalibraciju pokrenite:

lineSensors.calibrate();
Pokrenete funkciju i 10 sec. pomičete robota preko bijelog i crnog svim senzorima. Kalibracija će biti zapisana u EEPROM pa neće nestati isključivanjem mikrokontrolera. Kalibracija zapisuje najveće i najmanje vrijednosti čitanja svakog senzora koje mogu biti specifične za danu podlogu i uvjete osvjetljenja. Robota je potrebno kalibrirati na mjestu takmičenja.

Kod za PIDCode for PID

Pogledajte ovu stranicu.