Programiranje omni kotača
Cilj
Demonstrirati kretanje robota koji ima omni kotače.
Inicijalizacija
void RobotMaze::omniWheelsTest() {
static uint8_t nextMove;
static uint32_t lastMs;
if (setup()) {
if (motorGroup == NULL) {
print("Differential motor group needed.");
end();
return;
}
nextMove = 0;
lastMs = millis();
}
...
}
"nextMove" će određivati tip kretanja u danom koraku.
Na početku u njega spremimo vrijednost "0", što znači da je na redu 1. korak.
U varijablu "lastMs" spremimo čas kad je test počeo.
Switch
void RobotMaze::omniWheelsTest() {
...
switch (nextMove) {
case 0:
...
break;
case 1:
...
break;
case 2:
...
break;
}
}
Drugi dio koda je "switch".
"nextMove" će mijenjati vrijednost i tako će se izvršavati razni "case" dijelovi.
Rasti će za 1, dok ne postane 2, onda će se vratiti na nulu.
Postrance
void RobotMaze::omniWheelsTest() {
...
switch (nextMove) {
case 0:
if (millis() - lastMs > 2000) {
lastMs = millis();
nextMove = 1;
}
else
motorGroup->go(20, 20, 70);
break;
case 1:
...
break;
case 2:
...
break;
}
}
Budući da je na početku "nextMove" "0", znači da će se prvo izvršiti dio u "case 0".
"if" mjeri jesu li prošle 2 sekunde.
Ako nisu, izvršava se "else" dio.
Taj pokreće lijeve i desne kotače brzinom 20.
Pojavio se i 3. parametar, u našem slučaju 70, koji pokreće robota postrance.
Da bi ovo radilo, robot mora imati mecanum (omni) kotače.
Kad isteknu 2 sekunde, izvrši se "if" dio, brojač vremena se resetira i "nextMove" poveća za 1.
Kružnica
void RobotMaze::omniWheelsTest() {
...
switch (nextMove) {
case 0:
...
break;
case 1:
if (millis() - lastMs > 15000) {
lastMs = millis();
nextMove = 2;
}
else {
float angle = (millis() - lastMs) / 1500.0;
int8_t x = cos(angle) * 50;
int8_t y = sin(angle) * 50;
motorGroup->go(y, y, x);
}
break;
case 2:
...
break;
}
}
Ovdje je "if" sličan kao i prije, ali else dio pogoni robota tako da ide u krug.
Varijable "angle" je u radijanima i raste kako raste vrijeme.
"x" i "y" će davati točke na kružnici.
"y" će biti brzina naprijed, "x" desno.
Na taj će način robot uvijek ići prema (x,y) točki na kružnici.
Zato su brzine obadvije grupe motora "y", a lateralna je "x".
Nakon 15 sekundi istekne timeout i robot ide u sljedeću fazu.
void RobotMaze::omniWheelsTest() {
...
switch (nextMove) {
case 0:
...
break;
case 1:
...
break;
case 2:
if (millis() - lastMs > 2000) {
lastMs = millis();
nextMove = 0;
}
else
motorGroup->go(-20, -20, -70);
break;
}
}
U ovom dijelu robot ide u suprotnom smjeru od smjera na početku, 2 sec.
Zadatak: kvadrat.
Neka robot slijedi kvadrat.
Primjedbe
Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a".
Relevantne stranice:
Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.