package com.team254.frc2015.subsystems.controllers; import com.team254.frc2015.Constants; import com.team254.frc2015.subsystems.Drive; import com.team254.lib.trajectory.TrajectoryFollower; import com.team254.lib.util.DriveSignal; import com.team254.lib.util.Pose; /** * Controls the robot to turn in place */ public class TurnInPlaceController implements Drive.DriveController { private final TrajectoryFollowingPositionController mController; private final Pose mSetpointRelativePose; public TurnInPlaceController(Pose poseToContinueFrom, double destHeading, double velocity) { TrajectoryFollower.TrajectoryConfig config = new TrajectoryFollower.TrajectoryConfig(); config.dt = Constants.kControlLoopsDt; config.max_acc = Constants.kTurnMaxAccelRadsPerSec2; config.max_vel = velocity; mController = new TrajectoryFollowingPositionController( Constants.kTurnKp, Constants.kTurnKi, Constants.kTurnKd, Constants.kTurnKv, Constants.kTurnKa, Constants.kTurnOnTargetError, config); TrajectoryFollower.TrajectorySetpoint initialSetpoint = new TrajectoryFollower.TrajectorySetpoint(); initialSetpoint.pos = poseToContinueFrom.getHeading(); initialSetpoint.vel = poseToContinueFrom.getHeadingVelocity(); mController.setGoal(initialSetpoint, destHeading); mSetpointRelativePose = poseToContinueFrom; } @Override public DriveSignal update(Pose pose) { mController.update(pose.getHeading(), pose.getHeadingVelocity()); double turn = mController.get(); return new DriveSignal(turn, -turn); } @Override public Pose getCurrentSetpoint() { TrajectoryFollower.TrajectorySetpoint setpoint = mController.getSetpoint(); // TODO: these encoder values are wrong, but this isn't a controller I want to use anyways return new Pose( mSetpointRelativePose.getLeftDistance(), mSetpointRelativePose.getRightDistance(), mSetpointRelativePose.getLeftVelocity(), mSetpointRelativePose.getRightVelocity(), setpoint.pos, setpoint.vel); } @Override public boolean onTarget() { return mController.isOnTarget(); } public double getHeadingGoal() { return mController.getGoal(); } }