Skip to content

PI krmiljenje

diko-p edited this page Aug 26, 2018 · 10 revisions

Opis

Način sledenja črti s pomočjo PI krmiljenja. Uporabljenih je 8 senzorjev, ki so na spodnji sliki obkroženi z rdečo.

robot_8_sensors

Znotraj void.setup() poteka kalibracija senzorjev za črto. Vedno pred sledenjem črti je potrebno te senzorje kalibrirati (bolj podroben opis kalibracije najdemo v primeru kalibracija).

Znotraj void.loop() pa je del programa za sledenje črti. Deluje tako, da s pomočjo funkcije robot.line.getPosition() preverja odmik črte od sredine robota in ga shranjuje v spremenljivko error. Izračuna se tudi integral, ki je seštevek predhodnih odmikov omejen z minimalno in maksimalno vrednostjo. S pomočjo vrednosti error in integral se izračuna vrednost spremenljivke rotate, ki opisuje zavijanje robota in je na koncu uporabljena v funkciji robot.drive(). Pri izračunu rotate vrednost error in integral pomnožimo s konstantama. Pravimo jima koeficient proporcionalnega ojačanja (kp) in koeficient integralnega ojačanja (ki). Če je odmik majhen bo zavijanje rahlo, če je odmik velik pa bo zavijanje močno. Predznak odmika govori o tem v katero smer je potrebno zaviti.

Koda

#include <Robot.h>

int rotate = 0; //definicija spremenljivke, ki govori o rotaciji robota
float error = 0; //definicija spremenljivke, ki govori o napaki (odstopanju sredine robota od črte)
float integral = 0;  //definicija spremenljivke, ki govori o integralu napake

void setup() {
  while (!robot.buttonPressed()); //čaka na pritisk tipke
  delay(250); //250 ms
  robot.motor[LEFT].setVoltage(1); //na levem motorju nastavi napetost 1 V
  robot.motor[RIGHT].setVoltage(-1); //na desnem motorju nastavi napetost -1 V
  robot.line.calibrate(2000); //kalibrira 2000ms
  robot.motor[LEFT].setVoltage(0); //na levem motorju nastavi napetost 0 V
  robot.motor[RIGHT].setVoltage(0); //na desnem motorju nastavi napetost 0 V
  while (!robot.buttonPressed()); //čaka na pritisk tipke
  delay(250);
}

void loop() {
  error = robot.line.getPosition()*1000;  //prebere stanje senzorjev in vrne lokacijo črte glede na robota [mm]
  integral = constrain(integral + error, - 5, 5); //integral  dobimo kot seštevek napak pri čemer ga omejimo med -5 in 5, da ne naraste preveč 

  rotate = - 0.1 * error - 0.1 * integral; //odmik in integral pomnožimo s svojima konstantama -> večja vrednost rotate pomeni močnejše zavijanje

  robot.drive(0.2, rotate); //vozi s hitrostjo 0.2 in izračunano rotacijo
}

Poglej tudi

robot.buttonPressed()

robot.motor[].setVoltage()

robot.line.calibrate()

robot.line.getPosition()

robot.drive()

Opombe

Program je v mnogih pogledih podoben tistemu v P krmiljenju. Prav tako uporablja vseh 8 senzorjev, spremlja odmik od črte s funkcijo robot.line.getPosition() in za prilagajanje zavijanja spreminja spremenljivko rotate.

PI krmiljenje vsebuje dve konstanti označeni s kp in ki. Njun predznak govori o smeri zavijanja, velikost pa o načinu odziva na odmik robota od črte. P del krmiljenja je opisan že pod P krmiljenje. Integralni del pa je pomemben, saj s seštevanjem majhnih odmikov integral sčasoma postane dovolj velik, kar pa popravi tudi majhne odmike. Več o teoriji PI krmiljenja lahko najdete tukaj.

Video

Video: Sledenje črti s PI krmiljenjem

Clone this wiki locally