package Systems; import com.kauailabs.navx.frc.AHRS; import edu.wpi.first.wpilibj.DriverStation; import edu.wpi.first.wpilibj.SPI; import edu.wpi.first.wpilibj.Timer; public class NavXSensor { private static boolean initialized = false; private static AHRS ahrs; private static double yawOffset = 0.0; public static class Angles { float roll = 0f; float pitch = 0f; float yaw = 0f; } public static void initialize() { if (!initialized) { System.out.println("NavXSensor::initialize() called..."); try { ahrs = new AHRS(SPI.Port.kMXP); } catch (RuntimeException ex ) { DriverStation.reportError("Error instantiating navX MXP: " + ex.getMessage(), true); } reset(); initialized = true; } } public static void reset() { System.out.println("NavXSensor::reset called!"); if (ahrs != null) { ahrs.reset(); ahrs.resetDisplacement(); ahrs.zeroYaw(); // allow zeroing to take effect Timer.delay(0.1); // get the absolute angle after reset - Not sure why it is non-zero, but we need to record it to zero it out yawOffset = ahrs.getAngle(); System.out.println("yawOffset read = " + yawOffset); } } public static boolean isConnected() { if (ahrs != null) { return ahrs.isConnected(); } return false; } public static boolean isCalibrating() { if (ahrs != null) { return ahrs.isCalibrating(); } return false; } public static Angles getAngles() { Angles angles = new Angles(); if (ahrs != null) { angles.roll = ahrs.getRoll(); angles.pitch = ahrs.getPitch(); angles.yaw = ahrs.getYaw(); } return angles; } // returns yaw angle (-180 deg to +180 deg) public static float getYaw() { float yaw = 0f; if (ahrs != null) { yaw = ahrs.getYaw(); } return yaw; } // returns absolute yaw angle (can be larger than 360 deg) public static double getAngle() { double yaw = 0f; if (ahrs != null) { yaw = ahrs.getAngle(); yaw -= yawOffset; // needed to get to true angle } return yaw; } }