2019-11-11 22:26:34 +01:00
|
|
|
#include "drivecontroller.h"
|
|
|
|
#include "sensors.h"
|
|
|
|
|
|
|
|
DriveController::DriveController(Motor* m1_, Motor* m2_, Motor* m3_, Motor* m4_){
|
2019-11-13 16:26:03 +01:00
|
|
|
m1 = m1_;
|
|
|
|
m2 = m2_;
|
|
|
|
m3 = m3_;
|
|
|
|
m4 = m4_;
|
|
|
|
|
2019-11-11 22:26:34 +01:00
|
|
|
for(int i = 0; i < 360; i++){
|
2019-11-18 14:37:55 +01:00
|
|
|
sins[i] = (float) sin(torad(i));
|
|
|
|
cosins[i] = (float) cos(torad(i));
|
2019-11-11 22:26:34 +01:00
|
|
|
}
|
2019-12-05 11:53:01 +01:00
|
|
|
|
|
|
|
pDir = 0;
|
|
|
|
pSpeed = 0;
|
|
|
|
pTilt = 0;
|
|
|
|
|
|
|
|
vx = 0;
|
|
|
|
vy = 0;
|
|
|
|
|
|
|
|
speed1 = 0;
|
|
|
|
speed2 = 0;
|
|
|
|
speed3 = 0;
|
|
|
|
speed4 = 0;
|
|
|
|
|
|
|
|
delta = 0;
|
|
|
|
errorP = 0;
|
|
|
|
errorI = 0;
|
|
|
|
errorD = 0;
|
2019-12-05 12:51:23 +01:00
|
|
|
|
|
|
|
errorePre = 0;
|
|
|
|
pidfactor = 0;
|
|
|
|
integral = 0;
|
2020-01-29 18:56:49 +01:00
|
|
|
canUnlock = true;
|
|
|
|
unlockTime = 0;
|
|
|
|
|
|
|
|
vxp = 0;
|
|
|
|
vxn = 0;
|
|
|
|
vyp = 0;
|
|
|
|
vyn = 0;
|
2019-11-11 22:26:34 +01:00
|
|
|
}
|
|
|
|
|
2020-01-15 15:16:05 +01:00
|
|
|
void DriveController::prepareDrive(int dir, int speed, int tilt){
|
2019-11-11 22:26:34 +01:00
|
|
|
pDir = dir;
|
|
|
|
pSpeed = speed;
|
|
|
|
pTilt = tilt;
|
|
|
|
}
|
|
|
|
|
2020-01-31 13:35:40 +01:00
|
|
|
void DriveController::prepareDrive(int dir, int speed){
|
|
|
|
pDir = dir;
|
|
|
|
pSpeed = speed;
|
|
|
|
}
|
|
|
|
|
2019-11-11 22:26:34 +01:00
|
|
|
void DriveController::drivePrepared(){
|
|
|
|
drive(pDir, pSpeed, pTilt);
|
|
|
|
}
|
|
|
|
|
2019-11-18 14:37:55 +01:00
|
|
|
float DriveController::torad(float f){
|
|
|
|
return (f * PI / 180.0);
|
|
|
|
}
|
|
|
|
|
2019-12-11 16:29:18 +01:00
|
|
|
void DriveController::drive(int dir, int speed, int tilt){
|
2019-11-11 22:26:34 +01:00
|
|
|
vx = ((speed * cosins[dir]));
|
|
|
|
vy = ((-speed * sins[dir]));
|
|
|
|
|
2020-01-29 18:56:49 +01:00
|
|
|
if((((vy < 0 && vxn == 1) || (vy > 0 && vxp == 1) || (vx < 0 && vyp == 1) || (vx > 0 && vyn == 1)) && canUnlock) || (millis() > this->unlockTime+UNLOCK_THRESH)) {
|
|
|
|
vxn = 0;
|
|
|
|
vxp = 0;
|
|
|
|
vyp = 0;
|
|
|
|
vyn = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if((vy > 0 && vxn == 1) || (vy < 0 && vxp == 1)) vy = 0;
|
|
|
|
if((vx > 0 && vyp == 1) || (vx < 0 && vyn == 1)) vx = 0;
|
|
|
|
|
2019-11-11 22:26:34 +01:00
|
|
|
speed1 = ((vx * sins[m1->angle] ) + (vy * cosins[m1->angle] ));
|
|
|
|
speed2 = ((vx * sins[m2->angle]) + (vy * cosins[m2->angle]));
|
|
|
|
speed3 = -(speed1);
|
|
|
|
speed4 = -(speed2);
|
|
|
|
|
|
|
|
// calcola l'errore di posizione rispetto allo 0
|
|
|
|
delta = compass->getValue();
|
|
|
|
if(delta > 180) delta = delta-360;
|
2019-11-12 09:03:18 +01:00
|
|
|
delta = delta - tilt;
|
2019-11-11 22:26:34 +01:00
|
|
|
|
|
|
|
// calcola correzione proporzionale
|
|
|
|
errorP = KP * delta;
|
|
|
|
|
|
|
|
// calcola correzione derivativa
|
|
|
|
errorD = KD * (delta - errorePre);
|
|
|
|
errorePre = delta;
|
|
|
|
|
|
|
|
// calcola correzione integrativa
|
|
|
|
integral = 0.5 * integral + delta;
|
|
|
|
errorI = KI * integral;
|
|
|
|
// calcota correzione complessiva
|
|
|
|
pidfactor = errorD + errorP + errorI;
|
|
|
|
|
|
|
|
speed1 += pidfactor;
|
|
|
|
speed2 += pidfactor;
|
|
|
|
speed3 += pidfactor;
|
|
|
|
speed4 += pidfactor;
|
|
|
|
|
|
|
|
speed1 = constrain(speed1, -255, 255);
|
|
|
|
speed2 = constrain(speed2, -255, 255);
|
|
|
|
speed3 = constrain(speed3, -255, 255);
|
2019-12-05 11:53:01 +01:00
|
|
|
speed4 = constrain(speed4, -255, 255);
|
2019-11-11 22:26:34 +01:00
|
|
|
|
|
|
|
m1->drive((int) speed1);
|
|
|
|
m2->drive((int) speed2);
|
|
|
|
m3->drive((int) speed3);
|
|
|
|
m4->drive((int) speed4);
|
|
|
|
}
|