#define DEF_WIFI
#define DEF_MOTOR
#define DEF_I2C
#define DEF_PENDULUM
using namespace std;
double map(
double x,
double in_min,
double in_max,
double out_min,
double out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
if(!
myRIO_init()) {cout <<
"Error initializing myRIO";
return -1;}
#ifdef DEF_MOTOR
Log logL(
"logL"), logR(
"logR");
const long sampleTimeUs = 500;
#endif
#ifdef DEF_I2C
double xAcc, lastxAcc = 180, zAcc;
const double ACC_G = 1.042968750;
double accFilterA = 0.6321, accFilterB = 0.3679;
double accFiltered = 180, oldAccFiltered = 180, oldAcc = 180;
double angle = 180;
if(
myRIO_error()) {cout <<
"Gyro - Error while initializing" << endl;
return -1;}
if(
myRIO_error()) {cout <<
"Gyro - Error while calibrating" << endl;
return -1;}
const double GYRO_WEIGHT = 0.9;
#ifdef DEF_PENDULUM
double pendulumSetpoint = 90;
pendulum.setSetpoint(pendulumSetpoint);
double motorSpeed;
Time::wait_s(1);
Time::wait_s(1);
Time::wait_s(1);
Time::wait_s(2);
#endif
#ifdef DEF_WIFI
Wifi w([&](
short setpoint) {
#ifdef DEF_PENDULUM
pendulum.setSetpoint(pendulumSetpoint);
#endif
cout << "Setpoint = " << setpoint << endl;
});
while(!w.isConnected());
#endif
system("clear");
xAcc = asin(xAcc/ACC_G)*180./3.1415926535898;
if(zAcc>=0) xAcc=180-xAcc;
if(xAcc!=xAcc) xAcc = lastxAcc;
if(xAcc<90) xAcc =
map(xAcc, 0, 78.894271, 0, 90);
else xAcc =
map(xAcc, 103.148749, 180, 90, 180);
accFiltered = accFilterA*oldAcc + accFilterB*oldAccFiltered;
oldAccFiltered = accFiltered;
oldAcc = xAcc;
angle = GYRO_WEIGHT*(angle + vxRot * dt * 1e3) + (1.-GYRO_WEIGHT)*accFiltered;
#ifdef DEF_PENDULUM
motorSpeed = pendulum.compute(angle, vxRot);
if(motorSpeed>100) motorSpeed = 100;
if(motorSpeed<-100) motorSpeed = -100;
motorLeftPid.setSetpoint(motorSpeed);
motorRightPid.setSetpoint(motorSpeed);
#else
cout << "dt " << dt*1e9 << " xAcc " << xAcc << " angle " << angle << endl;
logA.println(dt*1e9, xAcc, angle);
#endif
#ifdef DEF_WIFI
w.updateAngle((short)angle);
#endif
});
#endif
while(1) {
long encL = motorLeft.getEncoderPulses();
if(motorLeft.getDefaultDirection()==
CCW) encL = - encL;
double correctedL = motorLeftPid.compute(encL);
motorLeft.setAngularSpeedAndDirection(correctedL);
logL.println(sampleTimeUs, motorLeftPid.getSetpoint(), correctedL, motorLeftPid.getAvgSpeed(), angle);
long encR = motorRight.getEncoderPulses();
if(motorRight.getDefaultDirection()==
CCW) encR = - encR;
double correctedR = motorRightPid.compute(encR);
motorRight.setAngularSpeedAndDirection(correctedR);
logR.println(sampleTimeUs, motorRightPid.getSetpoint(), correctedR, motorRightPid.getAvgSpeed(), angle);
Time::wait_us(sampleTimeUs);
}
return 0;
}