Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

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.