diff options
Diffstat (limited to 'src/main/java/frc/robot/util')
-rw-r--r-- | src/main/java/frc/robot/util/IMUGyro.java | 83 |
1 files changed, 3 insertions, 80 deletions
diff --git a/src/main/java/frc/robot/util/IMUGyro.java b/src/main/java/frc/robot/util/IMUGyro.java index 8d41c63..aa4563b 100644 --- a/src/main/java/frc/robot/util/IMUGyro.java +++ b/src/main/java/frc/robot/util/IMUGyro.java @@ -28,21 +28,17 @@ public class IMUGyro private final int GYRO_ADDR = 0x43; private final int GYRO_CONFIG = 0x1B; - private final int ACCL_ADDR = 0x3B; - private final int ACCL_CONFIG = 0x1C; - private final double SCALE_GYRO = (Math.PI/(180*16.384) * 2 /*??*/); - private final double SCALE_ACCL = (1/16.384); public IMUGyro(I2C gyro) { mpu = gyro; reset(); - mpu.write(CONFIG_ADDR, 0b00000100); - mpu.write(SMPLRT_DIV, 0b00010011); + mpu.write(CONFIG_ADDR, 0b00000101); + // mpu.write(SMPLRT_DIV, 0b00010011); mpu.write(GYRO_CONFIG, 0b00011000); - mpu.write(ACCL_CONFIG, 0b00000000); + // mpu.write(ACCL_CONFIG, 0b00000000); } public void reset() @@ -95,11 +91,6 @@ public class IMUGyro return scaledRates(GYRO_ADDR, SCALE_GYRO); } - private double[] acclRates() - { - return scaledRates(ACCL_ADDR, SCALE_ACCL); - } - private double[] scaledRates(int addr, double scale) { byte[] buffer = new byte[6]; @@ -114,73 +105,5 @@ public class IMUGyro { return ((first << 8) | second); } - - // mahony quaternion - private double[] q = {1.0, 0.0, 0.0, 0.0}; - // mahony integral term - private double[] i = new double[3]; - - private double[] fromQuaternion(double[] q) - { - return new double[] { - Math.atan2((q[0] * q[1] + q[2] * q[3]), 0.5 - (q[1] * q[1] + q[2] * q[2])), - Math.asin(2.0 * (q[0] * q[2] - q[1] * q[3])), - -Math.atan2((q[1] * q[2] + q[0] * q[3]), 0.5 - (q[2] * q[2] + q[3] * q[3])) - }; - } - - private void mahony(double Ki, double Kp, double[] gRates, double[] aRates, double dt) - { - double gx = gRates[0], gy = gRates[1], gz = gRates[2]; - double ax = aRates[0], ay = aRates[1], az = aRates[2]; - - double tmp = ax * ax + ay * ay + az * az; - if(tmp > 0.0) - { - tmp = Math.sqrt(tmp); - ax /= tmp; ay /= tmp; az /= tmp; - - // estimated direction of gravity in the body frame - double vx = q[1] * q[3] - q[0] * q[2]; - double vy = q[0] * q[1] + q[2] * q[3]; - double vz = q[0] * q[0] - 0.5f + q[3] * q[3]; - - // error is cross product - double ex = (ay * vz - az * vy); - double ey = (az * vx - ax * vz); - double ez = (ax * vy - ay * vx); - - // integral feedback - if(Ki > 0.0) { - i[0] += Ki * ex * dt; - i[1] += Ki * ey * dt; - i[2] += Ki * ez * dt; - gx += i[0]; - gy += i[1]; - gz += i[2]; - } - - gx += Kp * ex; - gy += Kp * ey; - gz += Kp * ez; - } - - // integrate quaternion - dt /= 2; // ?? - gx *= dt; gy *= dt; gz *= dt; - - double qa = q[0], qb = q[1], qc = q[2], qd = q[3]; - q[0] += (-qb * gx - qc * gy - qd * gz); - q[1] += (qa * gx + qc * gz - qd * gy); - q[2] += (qa * gy - qb * gz + qd * gx); - q[3] += (qa * gz + qb * gy - qc * gx); - - // renormalize - double qnorm_factor = Math.sqrt(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]); - q[0] /= qnorm_factor; - q[1] /= qnorm_factor; - q[2] /= qnorm_factor; - q[3] /= qnorm_factor; - } } |