Detecting countours

Can anyone explain why my code will not stop once centerX1 is equal to 237?

package org.usfirst.frc.team1025.robot.commands.Vision;

import org.usfirst.frc.team1025.robot.Robot;
import org.usfirst.frc.team1025.robot.subsystems.ChassisSubsystem;
import org.usfirst.frc.team1025.robot.subsystems.VisionSubsystem;
import org.usfirst.frc.team1025.robot.subsystems.VisionSubsystem;

import edu.wpi.first.wpilibj.command.Command;

/**
*
*/
@SuppressWarnings(“unused”)
public class VisionAuton extends Command {
double centerX1;
double centerX2;
private boolean isCenter = false;

public VisionAuton() {
	// Use requires() here to declare subsystem dependencies
	// eg. requires(chassis);
	requires(Robot.visionSubsystem);
	requires(Robot.chassisSubsystem);
}

// Called just before this Command runs the first time
protected void initialize() {

}

// Called repeatedly when this Command is scheduled to run
protected void execute() {
	synchronized (Robot.visionSubsystem.imgLock) {
		Robot.visionSubsystem.centerX1 = this.centerX1;
		Robot.visionSubsystem.centerX2 = this.centerX2;
	}
	// double TargetMidpoint = (centerX2 - centerX1) / 2;
	// double disp = (TargetMidpoint - Robot.vision.IMG_WIDTH / 2);
	@SuppressWarnings("static-access")
	double Turn = centerX1 - (Robot.visionSubsystem.IMG_WIDTH / 2);
	//+ centerX2 - (Robot.visionSubsystem.IMG_WIDTH / 2);
	// double Turn = (centerX2 - centerX1) / 2 - Robot.vision.IMG_WIDTH / 2;
	Robot.chassisSubsystem.getRobotDrive().arcadeDrive(-0.6, Turn * 0.005);

}

// Make this return true when this Command no longer needs to run execute()
public boolean isFinished() {
	if(centerX1  == 237.0 + 10){
		return isCenter = true;
	}
	else if(centerX1 == 237.0 - 10){
		return isCenter = true;
	}
	else{
		return isCenter == false;
	}
	
	


}

// Called once after isFinished returns true
protected void end() {
}

// Called when another command which requires one or more of the same
// subsystems is scheduled to run
protected void interrupted() {
}

}

Because you only return true if centerX1 is 247 or 227, not anything in between.

You might go about using the values in between something like this:


return Math.abs( centerX1 - 237 ) < 10;

What this does is

  1. finds the difference between 237 and centerX1
  2. gets the absolute value of that
  3. compares it to 10. Increasing or decreasing 10 will result in a larger or smaller error margin.

To add on to MuskieProgramme,

This doesn’t do what you think it does

Actually, it does exactly what he thinks it does. It makes isCenter true and then returns true.

The assignment operator in Java returns the assigned value (like it does, e.g., in c).

The problem that people are trying to point out is that your CenterX1 will have to be** EXACTLY **that value for it to return true. It’s not easy to move the robot to the exact pixel position you want, or at least it’s typically not necessary to be that exact.
What MuskieProgramme correctly suggests is to give it an acceptable margin of error. In his example code, it will return true if CenterX1 is within 10 pixels of 237. Your acceptable error may be different.