Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Shooting while driving to Pose (translation) #101

Open
danjburke12 opened this issue Mar 12, 2024 · 1 comment
Open

Implement Shooting while driving to Pose (translation) #101

danjburke12 opened this issue Mar 12, 2024 · 1 comment

Comments

@danjburke12
Copy link
Contributor

No description provided.

@mpulte
Copy link
Contributor

mpulte commented Mar 13, 2024

@danjburke12 Here is a stub for the command.

package com.team1701.robot.commands;

import java.util.Set;
import java.util.function.Supplier;

import com.team1701.lib.util.LoggedTunableNumber;
import com.team1701.robot.Constants;
import com.team1701.robot.states.RobotState;
import com.team1701.robot.subsystems.drive.Drive;
import com.team1701.robot.subsystems.indexer.Indexer;
import com.team1701.robot.subsystems.shooter.Shooter;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.math.geometry.Pose2d;
import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.math.trajectory.TrapezoidProfile;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.CommandScheduler;
import edu.wpi.first.wpilibj2.command.Subsystem;
import org.littletonrobotics.junction.Logger;

public class ShootAndDriveToPose extends Command {
    private static final String kLoggingPrefix = "Command/RotateToSpeakerAndDriveToPose/";
    private static final TrapezoidProfile.State kZeroState = new TrapezoidProfile.State();

    private static final LoggedTunableNumber kTranslationKp =
            new LoggedTunableNumber(kLoggingPrefix + "TranslationKp", 6.0);
    private static final LoggedTunableNumber kTranslationKi =
            new LoggedTunableNumber(kLoggingPrefix + "TranslationKi", 0.0);
    private static final LoggedTunableNumber kTranslationKd =
            new LoggedTunableNumber(kLoggingPrefix + "TranslationKd", 0.0);

    private final Drive mDrive;
    private final RobotState mRobotState;
    private final Command mShootAndMoveCommand;
    private final Supplier<Pose2d> mTargetPoseSupplier;
    private final PIDController mTranslationController;
    private final TrapezoidProfile mTranslationProfile;
    private final FinishedState mFinishedState;

    private TrapezoidProfile.State mTranslationState = kZeroState;
    private boolean mAtPose = false;

    public ShootAndDriveToPose(
            Drive drive,
            Shooter shooter,
            Indexer indexer,
            RobotState robotState,
            Supplier<Pose2d> targetPoseSupplier,
            FinishedState finishedState) {
        mDrive = drive;
        mRobotState = robotState;
        mTargetPoseSupplier = targetPoseSupplier;
        mFinishedState = finishedState;

        mTranslationController = new PIDController(
                kTranslationKp.get(), kTranslationKi.get(), kTranslationKd.get(), Constants.kLoopPeriodSeconds);
        mTranslationProfile = new TrapezoidProfile(new TrapezoidProfile.Constraints(
                Constants.Drive.kSlowTrapezoidalKinematicLimits.maxDriveVelocity(),
                Constants.Drive.kSlowTrapezoidalKinematicLimits.maxDriveAcceleration()));

        mShootAndMoveCommand = new ShootAndMove(drive, shooter, indexer, robotState, this::getSpeeds);
        CommandScheduler.getInstance().registerComposedCommands(mShootAndMoveCommand);
    }

    @Override
    public void initialize() {
        mShootAndMoveCommand.initialize();
        mDrive.setKinematicLimits(Constants.Drive.kFastKinematicLimits);

        // TODO: Initialize the translation state
        // TODO: Initialize the translation PID controller
    }

    @Override
    public void execute() {
        mShootAndMoveCommand.execute();
        Logger.recordOutput(kLoggingPrefix + "TranslationError", mTranslationController.getPositionError());
    }

    @Override
    public void end(boolean interrupted) {
        mShootAndMoveCommand.end(interrupted);
    }

    @Override
    public boolean isFinished() {
        // TODO: Return conditionally based on if FinishedState is reached
        // May be easier to move FinishedState to ShootAndMove and implement there
        return mShootAndMoveCommand.isFinished();
    }

    @Override
    public Set<Subsystem> getRequirements() {
        return mShootAndMoveCommand.getRequirements();
    }

    private Translation2d getSpeeds() {
        // TODO: Calculate the translation speeds with TrapezoidProfile
        return new Translation2d();
    }

    public static enum FinishedState {
        NONE,
        END_AFTER_SHOOTING_AND_MOVING,
        END_AFTER_SHOOTING,
        END_AFTER_MOVING
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants