mirror of
https://github.com/Team4388/2025RidgeScape.git
synced 2026-06-08 16:28:04 -06:00
105 lines
3.3 KiB
Java
105 lines
3.3 KiB
Java
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
package frc4388.robot.commands;
|
|
|
|
import edu.wpi.first.math.geometry.Rotation2d;
|
|
import edu.wpi.first.math.geometry.Translation2d;
|
|
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
|
import edu.wpi.first.wpilibj2.command.Command;
|
|
import frc4388.robot.subsystems.Lidar;
|
|
import frc4388.robot.subsystems.SwerveDrive;
|
|
|
|
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
|
|
public class LidarAlign extends Command {
|
|
private SwerveDrive swerveDrive;
|
|
private Lidar lidar;
|
|
|
|
private int currentFinderTick;
|
|
// private int tickFoundPipe;
|
|
private boolean foundReef;
|
|
private boolean headedRight;
|
|
private double speed;
|
|
private int bounces;
|
|
// private final boolean constructedHeadedRight;
|
|
|
|
/** Creates a new LidarAlign. */
|
|
public LidarAlign(SwerveDrive swerveDrive, Lidar lidar) {//, boolean headedRight) {
|
|
// Use addRequirements() here to declare subsystem dependencies.
|
|
|
|
this.swerveDrive = swerveDrive;
|
|
this.lidar = lidar;
|
|
|
|
addRequirements(swerveDrive, lidar);
|
|
}
|
|
|
|
// Called when the command is initially scheduled.
|
|
@Override
|
|
public void initialize() {
|
|
this.currentFinderTick = 0;
|
|
this.speed = 0.4; // TODO: find good speed for this
|
|
this.foundReef = false;
|
|
this.headedRight = !(GotoLastApril.tagRelativeXError < 0);
|
|
this.bounces = 0;
|
|
}
|
|
|
|
|
|
// Called every time the scheduler runs while the command is scheduled.
|
|
@Override
|
|
public void execute() {
|
|
if (lidar.withinDistance()) {
|
|
swerveDrive.softStop();
|
|
foundReef = true;
|
|
return;
|
|
}
|
|
|
|
if (currentFinderTick > 10) { //arbutrary threshhold for now.
|
|
headedRight = !headedRight;
|
|
currentFinderTick *= -1;
|
|
bounces++;
|
|
if (bounces == 2) return;
|
|
}
|
|
double currentHeading = (swerveDrive.getGyroAngle() * 180) / Math.PI;
|
|
double relAngle = (Math.round(currentHeading / 60.d) * 60); // Relative driving to the side of the reef
|
|
SmartDashboard.putNumber("Rel Angle", relAngle);
|
|
SmartDashboard.putNumber("heading", currentHeading);
|
|
if (!headedRight) {
|
|
swerveDrive.driveRelativeLockedAngle(new Translation2d(0, -speed), Rotation2d.fromDegrees(relAngle));
|
|
} else {
|
|
swerveDrive.driveRelativeLockedAngle(new Translation2d(0, speed), Rotation2d.fromDegrees(relAngle));
|
|
}
|
|
|
|
currentFinderTick++;
|
|
}
|
|
|
|
// Called once the command ends or is interrupted.
|
|
@Override
|
|
public void end(boolean interrupted) {
|
|
|
|
}
|
|
|
|
// Returns true when the command should end.
|
|
@Override
|
|
public boolean isFinished() {
|
|
if (lidar.getDistance() < 4) {
|
|
swerveDrive.stopModules();
|
|
return true;
|
|
} else if (foundReef && lidar.withinDistance()) { // spot on
|
|
swerveDrive.stopModules();
|
|
return true;
|
|
} else if (foundReef && !lidar.withinDistance()) { // over shot
|
|
speed = speed / 2;
|
|
headedRight = !headedRight;
|
|
currentFinderTick = 0;
|
|
foundReef = false;
|
|
return false;
|
|
} else if (bounces == 2) {
|
|
swerveDrive.stopModules();
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|