Praćenje kompasa
Cilj
Robot treba ići ravno i kad nema zida za praćenje.
Displej
void RobotMaze::imuFollow() {
mrm_8x8a->bitmapCustomStoredDisplay(LedSign::MAZE_IMU_FOLLOW);
float errorCW = imuLastValid - mrm_imu->heading();
int16_t slowerMotor = TOP_SPEED - errorCW * IMU_FOLLOW_STRENGTH;
motorGroup->go(errorCW > 0 ? slowerMotor : TOP_SPEED,
errorCW < 0 ? TOP_SPEED : slowerMotor);
}
Na 8x8 displeju ispišemo znak za praćenje kompasa.
Znak smo prije toga spremili kao bitmapu.
Greška
void RobotMaze::imuFollow() {
mrm_8x8a->bitmapCustomStoredDisplay(LedSign::MAZE_IMU_FOLLOW);
float errorCW = imuLastValid - mrm_imu->heading();
int16_t slowerMotor = TOP_SPEED - errorCW * IMU_FOLLOW_STRENGTH;
motorGroup->go(errorCW > 0 ? slowerMotor : TOP_SPEED,
errorCW < 0 ? TOP_SPEED : slowerMotor);
}
Grešku dobijemo kao razliku željenog smjera i trenutnog.
Brzina druge strane
void RobotMaze::imuFollow() {
mrm_8x8a->bitmapCustomStoredDisplay(LedSign::MAZE_IMU_FOLLOW);
float errorCW = imuLastValid - mrm_imu->heading();
int16_t slowerMotor = TOP_SPEED - errorCW * IMU_FOLLOW_STRENGTH;
motorGroup->go(errorCW > 0 ? slowerMotor : TOP_SPEED,
errorCW < 0 ? TOP_SPEED : slowerMotor);
}
Izračunamo brzinu sporijeg motora tako da od maksimalno moguće brzine oduzmemo grešku, pomnoženu s faktorom.
Motori
void RobotMaze::imuFollow() {
mrm_8x8a->bitmapCustomStoredDisplay(LedSign::MAZE_IMU_FOLLOW);
float errorCW = imuLastValid - mrm_imu->heading();
int16_t slowerMotor = TOP_SPEED - errorCW * IMU_FOLLOW_STRENGTH;
motorGroup->go(errorCW > 0 ? slowerMotor : TOP_SPEED,
errorCW < 0 ? TOP_SPEED : slowerMotor);
}
Na kraju pokrećemo motore
Zadatak: parametar
Mijenjate "IMU_FOLLOW_STRENGTH" dok ne dobijete savršeno gibanje robota.
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.