Skip to content

P krmiljenje

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

Opis

Način sledenja črti s pomočjo P 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. S pomočjo vrednosti error 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 pomnožimo s konstanto, ki ji pravimo koeficient proporcionalnega ojačanja (kp). Č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)

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]
  
  rotate = - 0.1 * error; //odmik pomnožimo s konstanto -> večji odmik od sredine robota pomeni močnejše zavijanje
  
  robot.drive(0.2, rotate); //vozi s hitrostjo 0.2 in izračunano rotacijo
}

Glej tudi

robot.buttonPressed()

robot.motor[].setVoltage()

robot.line.calibrate()

robot.line.getPosition()

robot.drive()

Opombe

Program je v nekaterih pogledih podoben tistemu v IF stavki 8 senzorjev. Prav tako uporablja vseh 8 senzorjev, ne uporablja pa if stavkov. Podobno kot v omenjenem primeru spreminja spremenljivko rotate tako, da če je robot preveč na levi zavije desno. Razlika pa je v tem, da pri tem načinu ne spremljamo stanja posameznih senzorjev. Uporabi kar funkcijo robot.line.getPosition(), ki vrne odmik črte od sredine robota. Iz odmika lahko ugotovi v katero smer in kako močno zaviti. Če je odmik od sredine velik robot močno zavije.

P krmiljenje vsebuje le eno konstanto označeno s kp. Njen predznak določa smer zavijanja, velikost pa hitrost odziva za odmik robota od črte. Prevelika vrednost povzroči nestabilno vožnjo (premočno zavijanje), premajhna pa prepočasen odziv in padec iz črte (premajhno zavijanje). Več o teoriji P krmiljenja lahko najdete tukaj.

Video

Video: Sledenje črti s P krmiljenjem

Clone this wiki locally