首页 > 解决方案 > OpMode 卡在 stop() Android 工作室

问题描述

我们正在为 FTC Skystone 制作停车代码,其中颜色传感器正在寻找色调值的变化以停止机器人。它在大多数情况下都能正常工作,但如果我们按下停止按钮,代码会继续运行,并且带有 OpMode 的错误会卡在 stop() 中。

除此之外,传感器只会读取五次中的四次,我们不知道还需要做什么才能使其正常工作。这是我们的代码:

@Override
public void runOpMode(){

    // Drive train initialization
    motorFrontRight = hardwareMap.dcMotor.get("FR");
    motorFrontLeft = hardwareMap.dcMotor.get("FL");
    motorBackLeft = hardwareMap.dcMotor.get("BL");
    motorBackRight = hardwareMap.dcMotor.get("BR");

    motorFrontLeft.setDirection(DcMotor.Direction.FORWARD);
    motorFrontRight.setDirection(DcMotor.Direction.REVERSE);
    motorBackLeft.setDirection(DcMotor.Direction.FORWARD);
    motorBackRight.setDirection(DcMotor.Direction.REVERSE);

    // Color sensor initialization
    sensorColor = hardwareMap.get(ColorSensor.class, "color_sensor");
    color2 = hardwareMap.get(ColorSensor.class, "color2");
    sensorDistance = hardwareMap.get(DistanceSensor.class, "color_sensor");

    // Color Sensor Values
    float hsvValues[] = {0F, 0F, 0F};
    final float values[] = hsvValues;.
    final double SCALE_FACTOR = 255;

    telemetry.addData("Status: ", "Initialized");
    telemetry.addData(">", "Press Play to start op mode");
    telemetry.update();
    waitForStart();

    while (opModeIsActive()){
        // Color Sensor Code

        Color.RGBToHSV((int) (color2.red() * SCALE_FACTOR),
                (int) (color2.green() * SCALE_FACTOR),
                (int) (color2.blue() * SCALE_FACTOR),
                hsvValues);
        Color.RGBToHSV((int) (sensorColor.red() * SCALE_FACTOR),
                (int) (sensorColor.green() * SCALE_FACTOR),
                (int) (sensorColor.blue() * SCALE_FACTOR),
                hsvValues);

        // Send the info back to driver station using telemetry function.
        telemetry.addData("Step: ", step);
        telemetry.addData("Hue", hsvValues[0]);
        telemetry.update();

        // Move forward
        if (step == 0){
            motorFrontRight.setPower(.2);
            motorFrontLeft.setPower(.2);
            motorBackLeft.setPower(.2);
            motorBackRight.setPower(.2);
        }

        // Does it see the line?
        while (step == 0){
            if (opModeIsActive()){
                Color.RGBToHSV((int) (sensorColor.red() * SCALE_FACTOR),
                        (int) (sensorColor.green() * SCALE_FACTOR),
                        (int) (sensorColor.blue() * SCALE_FACTOR),
                        hsvValues);
                Color.RGBToHSV((int) (color2.red() * SCALE_FACTOR),
                        (int) (color2.green() * SCALE_FACTOR),
                        (int) (color2.blue() * SCALE_FACTOR),
                        hsvValues);

                // Send the info back to driver station using telemetry function.
                telemetry.addData("Step: ", step);
                telemetry.addData("Hue", hsvValues[0]);
                telemetry.update();
            }
            if (hsvValues[0] > 150 ){ // Checks if it is red or blue
                step++;
            }
        }

        if (step == 1){
            motorFrontRight.setPower(0);
            motorFrontLeft.setPower(0);
            motorBackLeft.setPower(0);
            motorBackRight.setPower(0);
            step++;
        }

        if (step == 2){
            motorFrontRight.setPower(-.5);
            motorFrontLeft.setPower(-.5);
            motorBackLeft.setPower(-.5);
            motorBackRight.setPower(-.5);
            sleep(200);
            step++;
        }

        if (step == 3){
            motorFrontRight.setPower(0);
            motorFrontLeft.setPower(0);
            motorBackLeft.setPower(0);
            motorBackRight.setPower(0);
        }
    }
}

标签: javaandroid

解决方案


我们通过 FTC 论坛发现 while (step == 0){ if (opModeIsActive()){

while (step == 0 && opModeIsActive()){

推荐阅读