0

PID kontroler, što je to?

Ideja

Dok se vaš robot kreće sporo, ne zamarajte se ovim pojmom. Situacija se bitno mijenja pri velikim brzinama. Želite li pratiti brzo crtu, zid, držati smjer nogometaša prema protivničkom golu, uočit ćete brzo rastuću nestabilnost. Intuitivna korekcija greške je prema njenoj veličini: ako je crta malo lijevo od robota, skrećemo malo lijevo. Ako je jako lijevo, idemo i mi jako lijevo. Međutim, ako je crta lijevo i robot ide jako brzo lijevo, još jakog skretanje lijevo će samo pojačati problem jer će robot preletjeti liniju, koja će ostati jako desno. Pokušamo li opet riješiti problem na isti način, izletjet će jako desno - evo oscilatornog gibanja. Smanjivanjem ovisnosti o veličini greške smanjit ćemo i oscilacije, ali robot više neće dobro pratiti crtu. U oštrijem zavoju će otići ravno. Bez PIDa nema rješenja zato što ovom primjeru korekcija ne može ovisiti samo o grešci, nego i o promjeni greške. Ako se greška brzo smanjuje, trebamo značajno manje korigirati smjer (npr. skretanje robota ulijevo) ili čak korigirati u suprotom smjeru (u našem primjeru bismo za crtu koja je lijevo od robota trebali skretati desno).

Novi je problem, recimo opet na primjeru robota koji prati liniju, da motori nisu nikad isti, kotači isto, kao i drugi elementi. Rezultat je da robot nikad ne ide potpuno ravno. Rezultat je da npr. crta uvijek na 0.5 cm od sredine robota. Tu je grešku moguće popraviti tako da se uvijek lijevi motori pokreću nešto jače. Opisali smo integracijsku komponentu PIDa.

Kod

Ovdje je biblioteka: https://www.github.com/PribaNosati/MRMS. Trebate ju uključiti u vaš projekt. Korekcijom 3 parametra konstruktora je moguće dobiti stabilno kretanje robota.

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

#include "PID.h"

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

#define SerialPortPID Serial2
#define PrintSpeed
Prvi 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. Drugi proširuje ispis, ako je definiran.

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

PID pid(4, 900, 0);

Izračunajte korekciju, npr. za praćenje linije, gdje je centa trenutna udaljenost crte od uzdužne osi robota:

double pidCorrection = pid.calculate(centerMm, false);

Jedan od jednostavnih načina da koristite korekciju za pokretanje robota je da lijevi motor pokrećete brzinom 70 - pidCorrection, desni 70 + pidCorrection. 70 je primjer, možete staviti i neki drugi broj. Ako koristite Motor.cpp klasu, naredba je:

motors.go(speedAhead + pidCorrection, speedAhead - pidCorrection);