diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMU.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMU.java deleted file mode 100644 index 115ac5366d7..00000000000 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMU.java +++ /dev/null @@ -1,187 +0,0 @@ -/* -Copyright (c) 2016 Robert Atkinson - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted (subject to the limitations in the disclaimer below) provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of Robert Atkinson nor the names of his contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS -LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -package org.firstinspires.ftc.robotcontroller.external.samples; - -import com.qualcomm.hardware.adafruit.BNO055IMU; -import com.qualcomm.hardware.adafruit.JustLoggingAccelerationIntegrator; -import com.qualcomm.robotcore.eventloop.opmode.Autonomous; -import com.qualcomm.robotcore.eventloop.opmode.Disabled; -import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; - -import org.firstinspires.ftc.robotcore.external.Func; -import org.firstinspires.ftc.robotcore.external.navigation.Acceleration; -import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; -import org.firstinspires.ftc.robotcore.external.navigation.AxesOrder; -import org.firstinspires.ftc.robotcore.external.navigation.AxesReference; -import org.firstinspires.ftc.robotcore.external.navigation.Orientation; -import org.firstinspires.ftc.robotcore.external.navigation.Position; -import org.firstinspires.ftc.robotcore.external.navigation.Velocity; - -import java.util.Locale; - -/** - * {@link SensorAdafruitIMU} gives a short demo on how to use the BNO055 Inertial Motion Unit (IMU) from AdaFruit. - * - * Use Android Studio to Copy this Class, and Paste it into your team's code folder with a new name. - * Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list - * - * @see Adafruit IMU - */ -@Autonomous(name = "Sensor: Adafruit IMU", group = "Sensor") -@Disabled // Uncomment this to add to the opmode list -public class SensorAdafruitIMU extends LinearOpMode - { - //---------------------------------------------------------------------------------------------- - // State - //---------------------------------------------------------------------------------------------- - - // The IMU sensor object - BNO055IMU imu; - - // State used for updating telemetry - Orientation angles; - Acceleration gravity; - - //---------------------------------------------------------------------------------------------- - // Main logic - //---------------------------------------------------------------------------------------------- - - @Override public void runOpMode() { - - // Set up the parameters with which we will use our IMU. Note that integration - // algorithm here just reports accelerations to the logcat log; it doesn't actually - // provide positional information. - BNO055IMU.Parameters parameters = new BNO055IMU.Parameters(); - parameters.angleUnit = BNO055IMU.AngleUnit.DEGREES; - parameters.accelUnit = BNO055IMU.AccelUnit.METERS_PERSEC_PERSEC; - parameters.calibrationDataFile = "AdafruitIMUCalibration.json"; // see the calibration sample opmode - parameters.loggingEnabled = true; - parameters.loggingTag = "IMU"; - parameters.accelerationIntegrationAlgorithm = new JustLoggingAccelerationIntegrator(); - - // Retrieve and initialize the IMU. We expect the IMU to be attached to an I2C port - // on a Core Device Interface Module, configured to be a sensor of type "AdaFruit IMU", - // and named "imu". - imu = hardwareMap.get(BNO055IMU.class, "imu"); - imu.initialize(parameters); - - // Set up our telemetry dashboard - composeTelemetry(); - - // Wait until we're told to go - waitForStart(); - - // Start the logging of measured acceleration - imu.startAccelerationIntegration(new Position(), new Velocity(), 1000); - - // Loop and update the dashboard - while (opModeIsActive()) { - telemetry.update(); - } - } - - //---------------------------------------------------------------------------------------------- - // Telemetry Configuration - //---------------------------------------------------------------------------------------------- - - void composeTelemetry() { - - // At the beginning of each telemetry update, grab a bunch of data - // from the IMU that we will then display in separate lines. - telemetry.addAction(new Runnable() { @Override public void run() - { - // Acquiring the angles is relatively expensive; we don't want - // to do that in each of the three items that need that info, as that's - // three times the necessary expense. - angles = imu.getAngularOrientation().toAxesReference(AxesReference.INTRINSIC).toAxesOrder(AxesOrder.ZYX); - gravity = imu.getGravity(); - } - }); - - telemetry.addLine() - .addData("status", new Func() { - @Override public String value() { - return imu.getSystemStatus().toShortString(); - } - }) - .addData("calib", new Func() { - @Override public String value() { - return imu.getCalibrationStatus().toString(); - } - }); - - telemetry.addLine() - .addData("heading", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.firstAngle); - } - }) - .addData("roll", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.secondAngle); - } - }) - .addData("pitch", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.thirdAngle); - } - }); - - telemetry.addLine() - .addData("grvty", new Func() { - @Override public String value() { - return gravity.toString(); - } - }) - .addData("mag", new Func() { - @Override public String value() { - return String.format(Locale.getDefault(), "%.3f", - Math.sqrt(gravity.xAccel*gravity.xAccel - + gravity.yAccel*gravity.yAccel - + gravity.zAccel*gravity.zAccel)); - } - }); - } - - //---------------------------------------------------------------------------------------------- - // Formatting - //---------------------------------------------------------------------------------------------- - - String formatAngle(AngleUnit angleUnit, double angle) { - return formatDegrees(AngleUnit.DEGREES.fromUnit(angleUnit, angle)); - } - - String formatDegrees(double degrees){ - return String.format(Locale.getDefault(), "%.1f", AngleUnit.DEGREES.normalize(degrees)); - } -} diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMUCalibration.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMUCalibration.java deleted file mode 100644 index 98cdfd1f923..00000000000 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorAdafruitIMUCalibration.java +++ /dev/null @@ -1,239 +0,0 @@ -/* -Copyright (c) 2016 Robert Atkinson - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted (subject to the limitations in the disclaimer below) provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of Robert Atkinson nor the names of his contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS -LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -package org.firstinspires.ftc.robotcontroller.external.samples; - -import com.qualcomm.hardware.adafruit.AdafruitBNO055IMU; -import com.qualcomm.hardware.adafruit.BNO055IMU; -import com.qualcomm.robotcore.eventloop.opmode.Autonomous; -import com.qualcomm.robotcore.eventloop.opmode.Disabled; -import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; -import com.qualcomm.robotcore.eventloop.opmode.TeleOp; -import com.qualcomm.robotcore.util.ReadWriteFile; - -import org.firstinspires.ftc.robotcore.external.Func; -import org.firstinspires.ftc.robotcore.external.navigation.Acceleration; -import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; -import org.firstinspires.ftc.robotcore.external.navigation.AxesOrder; -import org.firstinspires.ftc.robotcore.external.navigation.AxesReference; -import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit; -import org.firstinspires.ftc.robotcore.external.navigation.Orientation; -import org.firstinspires.ftc.robotcore.external.navigation.Position; -import org.firstinspires.ftc.robotcore.internal.AppUtil; - -import java.io.File; -import java.util.Locale; - -/** - * {@link SensorAdafruitIMUCalibration} calibrates the IMU accelerometer per - * "Section 3.11 Calibration" of the BNO055 specification. - * - *

Manual calibration of the IMU is definitely NOT necessary: except for the magnetometer - * (which is not used by the default {@link com.qualcomm.hardware.adafruit.BNO055IMU.SensorMode#IMU - * SensorMode#IMU}), the BNO055 is internally self-calibrating and thus can be very successfully - * used without manual intervention. That said, performing a one-time calibration, saving the - * results persistently, then loading them again at each run can help reduce the time that automatic - * calibration requires.

- * - *

This summary of the calibration process, from - * Intel, is informative:

- * - *

"This device requires calibration in order to operate accurately. [...] Calibration data is - * lost on a power cycle. See one of the examples for a description of how to calibrate the device, - * but in essence:

- * - *

There is a calibration status register available [...] that returns the calibration status - * of the accelerometer (ACC), magnetometer (MAG), gyroscope (GYR), and overall system (SYS). - * Each of these values range from 0 (uncalibrated) to 3 (fully calibrated). Calibration [ideally] - * involves certain motions to get all 4 values at 3. The motions are as follows (though see the - * datasheet for more information):

- * - *
  • - *
      GYR: Simply let the sensor sit flat for a few seconds.
    - *
      ACC: Move the sensor in various positions. Start flat, then rotate slowly by 45 - * degrees, hold for a few seconds, then continue rotating another 45 degrees and - * hold, etc. 6 or more movements of this type may be required. You can move through - * any axis you desire, but make sure that the device is lying at least once - * perpendicular to the x, y, and z axis.
    - *
      MAG: Move slowly in a figure 8 pattern in the air, until the calibration values reaches 3.
    - *
      SYS: This will usually reach 3 when the other items have also reached 3. If not, continue - * slowly moving the device though various axes until it does."
    - *
  • - * - *

    To calibrate the IMU, run this sample opmode with a gamepad attached to the driver station. - * Once the IMU has reached sufficient calibration as reported on telemetry, press the 'A' - * button on the gamepad to write the calibration to a file. That file can then be indicated - * later when running an opmode which uses the IMU.

    - * - *

    Note: if your intended uses of the IMU do not include use of all its sensors (for exmaple, - * you might not use the magnetometer), then it makes little sense for you to wait for full - * calibration of the sensors you are not using before saving the calibration data. Indeed, - * it appears that in a SensorMode that doesn't use the magnetometer (for example), the - * magnetometer cannot actually be calibrated.

    - * - * @see AdafruitBNO055IMU - * @see com.qualcomm.hardware.adafruit.BNO055IMU.Parameters#calibrationDataFile - * @see BNO055 product page - * @see BNO055 specification - */ -@TeleOp(name = "Sensor: Adafruit IMU Calibration", group = "Sensor") -@Disabled // Uncomment this to add to the opmode list -public class SensorAdafruitIMUCalibration extends LinearOpMode - { - //---------------------------------------------------------------------------------------------- - // State - //---------------------------------------------------------------------------------------------- - - // Our sensors, motors, and other devices go here, along with other long term state - BNO055IMU imu; - - // State used for updating telemetry - Orientation angles; - - //---------------------------------------------------------------------------------------------- - // Main logic - //---------------------------------------------------------------------------------------------- - - @Override public void runOpMode() { - - telemetry.log().setCapacity(12); - telemetry.log().add(""); - telemetry.log().add("Please refer to the calibration instructions"); - telemetry.log().add("contained in the Adafruit IMU calibration"); - telemetry.log().add("sample opmode."); - telemetry.log().add(""); - telemetry.log().add("When sufficient calibration has been reached,"); - telemetry.log().add("press the 'A' button to write the current"); - telemetry.log().add("calibration data to a file."); - telemetry.log().add(""); - - // We are expecting the IMU to be attached to an I2C port on a Core Device Interface Module and named "imu". - BNO055IMU.Parameters parameters = new BNO055IMU.Parameters(); - parameters.loggingEnabled = true; - parameters.loggingTag = "IMU"; - imu = hardwareMap.get(BNO055IMU.class, "imu"); - imu.initialize(parameters); - - composeTelemetry(); - telemetry.log().add("Waiting for start..."); - - // Wait until we're told to go - while (!isStarted()) { - telemetry.update(); - idle(); - } - - telemetry.log().add("...started..."); - - while (opModeIsActive()) { - - if (gamepad1.a) { - - // Get the calibration data - BNO055IMU.CalibrationData calibrationData = imu.readCalibrationData(); - - // Save the calibration data to a file. You can choose whatever file - // name you wish here, but you'll want to indicate the same file name - // when you initialize the IMU in an opmode in which it is used. If you - // have more than one IMU on your robot, you'll of course want to use - // different configuration file names for each. - String filename = "AdafruitIMUCalibration.json"; - File file = AppUtil.getInstance().getSettingsFile(filename); - ReadWriteFile.writeFile(file, calibrationData.serialize()); - telemetry.log().add("saved to '%s'", filename); - - // Wait for the button to be released - while (gamepad1.a) { - telemetry.update(); - idle(); - } - } - - telemetry.update(); - } - } - - void composeTelemetry() { - - // At the beginning of each telemetry update, grab a bunch of data - // from the IMU that we will then display in separate lines. - telemetry.addAction(new Runnable() { @Override public void run() - { - // Acquiring the angles is relatively expensive; we don't want - // to do that in each of the three items that need that info, as that's - // three times the necessary expense. - angles = imu.getAngularOrientation().toAxesReference(AxesReference.INTRINSIC).toAxesOrder(AxesOrder.ZYX); - } - }); - - telemetry.addLine() - .addData("status", new Func() { - @Override public String value() { - return imu.getSystemStatus().toShortString(); - } - }) - .addData("calib", new Func() { - @Override public String value() { - return imu.getCalibrationStatus().toString(); - } - }); - - telemetry.addLine() - .addData("heading", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.firstAngle); - } - }) - .addData("roll", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.secondAngle); - } - }) - .addData("pitch", new Func() { - @Override public String value() { - return formatAngle(angles.angleUnit, angles.thirdAngle); - } - }); - } - - //---------------------------------------------------------------------------------------------- - // Formatting - //---------------------------------------------------------------------------------------------- - - String formatAngle(AngleUnit angleUnit, double angle) { - return formatDegrees(AngleUnit.DEGREES.fromUnit(angleUnit, angle)); - } - - String formatDegrees(double degrees){ - return String.format(Locale.getDefault(), "%.1f", AngleUnit.DEGREES.normalize(degrees)); - } -} \ No newline at end of file