Package swervelib
Class SwerveInputStream
java.lang.Object
swervelib.SwerveInputStream
- All Implemented Interfaces:
Supplier<ChassisSpeeds>
Helper class to easily transform Controller inputs into workable Chassis speeds. Intended to easily create an
interface that generates
ChassisSpeeds from XboxController
Inspired by SciBorgs FRC 1155.
Example:
XboxController driverXbox = new XboxController(0);
SwerveInputStream driveAngularVelocity = SwerveInputStream.of(drivebase.getSwerveDrive(),
() -> driverXbox.getLeftY() * -1,
() -> driverXbox.getLeftX() * -1) // Axis which give the desired translational angle and speed.
.withControllerRotationAxis(driverXbox::getRightX) // Axis which give the desired angular velocity.
.deadband(0.01) // Controller deadband
.scaleTranslation(0.8) // Scaled controller translation axis
.allianceRelativeControl(true); // Alliance relative controls.
SwerveInputStream driveDirectAngle = driveAngularVelocity.copy() // Copy the stream so further changes do not affect driveAngularVelocity
.withControllerHeadingAxis(driverXbox::getRightX,
driverXbox::getRightY) // Axis which give the desired heading angle using trigonometry.
.headingWhile(true); // Enable heading based control.
-
Constructor Summary
ConstructorsConstructorDescriptionSwerveInputStream(SwerveDrive drive, DoubleSupplier x, DoubleSupplier y, DoubleSupplier rot) Create aSwerveInputStreamfor an easy way to generateChassisSpeedsfrom a driver controller.SwerveInputStream(SwerveDrive drive, DoubleSupplier x, DoubleSupplier y, DoubleSupplier headingX, DoubleSupplier headingY) Create aSwerveInputStreamfor an easy way to generateChassisSpeedsfrom a driver controller. -
Method Summary
Modifier and TypeMethodDescriptionAim theSwerveDriveat this pose while driving.Aim theSwerveDriveat this pose while driving.aimFeedforward(double kS, double kV, double kA) Aim feedforward for better tracking of the target.aimHeadingOffset(boolean enabled) Aim heading offset enabledaimHeadingOffset(Rotation2d offset) Set the aim heading offset.aimHeadingOffset(BooleanSupplier enabled) Aim heading offset enabled boolean supplier.Aim is locked onto the target.aimLookahead(Time lookaheadTime) Aim lookahead time for theSwerveDriveto estimate its current position while driving.aimWhile(boolean trigger) Enable aiming while the trigger is true.aimWhile(BooleanSupplier trigger) Enable aiming while the trigger is true.allianceRelativeControl(boolean enabled) Modify the outputChassisSpeedsso that it is always relative to your alliance.allianceRelativeControl(BooleanSupplier enabled) Modify the outputChassisSpeedsso that it is always relative to your alliance.booleanatTargetPose(double toleranceMeters) When theSwerveInputStreamis inSwerveInputStream.SwerveInputMode.DRIVE_TO_POSEthis function will return if the robot is at the desired pose within the defined tolerance.calculateAngularVelocity(Angle target) Calculate the angular velocity required for the given target with the current heading, `controllerproperties.json` PID, and feedforward (if defined).copy()Copy theSwerveInputStreamobject.cubeRotationControllerAxis(boolean enabled) Cube the angular velocity controller axis for a non-linear controls scheme.Cube the angular velocity controller axis for a non-linear controls scheme.cubeTranslationControllerAxis(boolean enabled) Cube the translation axis magnitude for a non-linear control schemeCube the translation axis magnitude for a non-linear control scheme.deadband(double deadband) Set a deadband for all controller axis.driveToPose(Supplier<Pose2d> pose, ProfiledPIDController xPIDController, ProfiledPIDController omegaPIDController) Drive to a given pose with the providedProfiledPIDControllersdriveToPoseEnabled(boolean enabled) Enable driving to the target pose.driveToPoseEnabled(BooleanSupplier enabled) Enable driving to the target pose.get()Gets aChassisSpeedsgetTargetVector(Pose2d target) Get the target vector with a lookahead, if defined.headingWhile(boolean headingState) Set the heading enable state.headingWhile(BooleanSupplier trigger) OutputChassisSpeedsbased on heading while the supplier is True.static SwerveInputStreamof(SwerveDrive drive, DoubleSupplier x, DoubleSupplier y) Create basicSwerveInputStreamwithout any rotation components.robotRelative(boolean enabled) Set the stream to output robot relativeChassisSpeedsrobotRelative(BooleanSupplier enabled) Set the stream to output robot relativeChassisSpeedsscaleRotation(double scaleRotation) Scale the rotation axis input forSwerveInputStreamto reduce the range in which they operate.scaleTranslation(double scaleTranslation) Scale the translation axis forSwerveInputStreamby a constant scalar value.translationHeadingOffset(boolean enabled) Heading offset enableSet the heading offset angle.translationHeadingOffset(BooleanSupplier enabled) Heading offset enabled boolean supplier.translationOnlyHeading(Angle heading) Set the translation only heading to be the provided heading.translationOnlyWhile(boolean translationState) Enable locking of rotation and only translating, overrides everything.translationOnlyWhile(BooleanSupplier trigger) Enable locking of rotation and only translating, overrides everything.withControllerHeadingAxis(DoubleSupplier headingX, DoubleSupplier headingY) Add heading axis for Heading based control.Add a rotation axis for Angular Velocity control
-
Constructor Details
-
SwerveInputStream
Create aSwerveInputStreamfor an easy way to generateChassisSpeedsfrom a driver controller.- Parameters:
drive-SwerveDriveobject for transformation.x- Translation X input in range of [-1, 1]y- Translation Y input in range of [-1, 1]rot- Rotation input in range of [-1, 1]
-
SwerveInputStream
public SwerveInputStream(SwerveDrive drive, DoubleSupplier x, DoubleSupplier y, DoubleSupplier headingX, DoubleSupplier headingY) Create aSwerveInputStreamfor an easy way to generateChassisSpeedsfrom a driver controller.- Parameters:
drive-SwerveDriveobject for transformation.x- Translation X input in range of [-1, 1]y- Translation Y input in range of [-1, 1]headingX- Heading X input in range of [-1, 1]headingY- Heading Y input in range of [-1, 1]
-
-
Method Details
-
of
Create basicSwerveInputStreamwithout any rotation components.- Parameters:
drive-SwerveDriveobject for transformation.x-DoubleSupplierof the translation X axis of the controller joystick to use.y-DoubleSupplierof the translation X axis of the controller joystick to use.- Returns:
SwerveInputStreamto use as you see fit.
-
copy
Copy theSwerveInputStreamobject.- Returns:
- Clone of current
SwerveInputStream
-
robotRelative
Set the stream to output robot relativeChassisSpeeds- Parameters:
enabled- Robot-RelativeChassisSpeedsoutput.- Returns:
- self
-
robotRelative
Set the stream to output robot relativeChassisSpeeds- Parameters:
enabled- Robot-RelativeChassisSpeedsoutput.- Returns:
- self
-
driveToPose
public SwerveInputStream driveToPose(Supplier<Pose2d> pose, ProfiledPIDController xPIDController, ProfiledPIDController omegaPIDController) Drive to a given pose with the providedProfiledPIDControllers -
driveToPoseEnabled
Enable driving to the target pose.- Parameters:
enabled- Enable state of drive to pose.- Returns:
- self.
-
driveToPoseEnabled
Enable driving to the target pose.- Parameters:
enabled- Enable state of drive to pose.- Returns:
- self.
-
translationHeadingOffset
Heading offset enabled boolean supplier.- Parameters:
enabled- Enable state- Returns:
- self
-
translationHeadingOffset
Heading offset enable- Parameters:
enabled- Enable state- Returns:
- self
-
translationHeadingOffset
Set the heading offset angle.- Parameters:
angle-Rotation2doffset to apply- Returns:
- self
-
allianceRelativeControl
Modify the outputChassisSpeedsso that it is always relative to your alliance.- Parameters:
enabled- Alliance awareChassisSpeedsoutput.- Returns:
- self
-
allianceRelativeControl
Modify the outputChassisSpeedsso that it is always relative to your alliance.- Parameters:
enabled- Alliance awareChassisSpeedsoutput.- Returns:
- self
-
cubeRotationControllerAxis
Cube the angular velocity controller axis for a non-linear controls scheme.- Parameters:
enabled- Enabled state for the stream.- Returns:
- self.
-
cubeRotationControllerAxis
Cube the angular velocity controller axis for a non-linear controls scheme.- Parameters:
enabled- Enabled state for the stream.- Returns:
- self.
-
cubeTranslationControllerAxis
Cube the translation axis magnitude for a non-linear control scheme.- Parameters:
enabled- Enabled state for the stream- Returns:
- self
-
cubeTranslationControllerAxis
Cube the translation axis magnitude for a non-linear control scheme- Parameters:
enabled- Enabled state for the stream- Returns:
- self
-
withControllerRotationAxis
Add a rotation axis for Angular Velocity control- Parameters:
rot- Rotation axis with values from [-1, 1]- Returns:
- self
-
withControllerHeadingAxis
public SwerveInputStream withControllerHeadingAxis(DoubleSupplier headingX, DoubleSupplier headingY) Add heading axis for Heading based control.- Parameters:
headingX- Heading X axis with values from [-1, 1]headingY- Heading Y axis with values from [-1, 1]- Returns:
- self
-
deadband
Set a deadband for all controller axis.- Parameters:
deadband- Deadband to set, should be between [0, 1)- Returns:
- self
-
scaleTranslation
Scale the translation axis forSwerveInputStreamby a constant scalar value.- Parameters:
scaleTranslation- Translation axis scalar value. (0, 1]- Returns:
- this
-
scaleRotation
Scale the rotation axis input forSwerveInputStreamto reduce the range in which they operate.- Parameters:
scaleRotation- Angular velocity axis scalar value. (0, 1]- Returns:
- this
-
headingWhile
OutputChassisSpeedsbased on heading while the supplier is True.- Parameters:
trigger- Supplier to use.- Returns:
- this.
-
headingWhile
Set the heading enable state.- Parameters:
headingState- Heading enabled state.- Returns:
- this
-
aim
Aim theSwerveDriveat this pose while driving.- Parameters:
aimTarget-Pose2dto point at.- Returns:
- this
-
aim
Aim theSwerveDriveat this pose while driving. -
aimLookahead
Aim lookahead time for theSwerveDriveto estimate its current position while driving.Your camera takes a picture. It takes 10ms to process. It sends the data to the Rio/Control Hub (another 5ms). Your loop calculates the turret angle. You send the command. The turret motor takes time to accelerate.
By the time the ball actually leaves the robot, you are in a different place than when you took the picture.
The Fix: Project your position forward.
double latencySeconds = CAMERA_LATENCY + MOTOR_LAG + SHOOTING_TIME;
You will need to tune latencySeconds. It's often higher than you think (sometimes 100-200ms or more depending on the system).
- Parameters:
lookaheadTime- Lookahead time for theSwerveDriveto estimate its current position.- Returns:
SwerveInputStreamfor chaining.
-
aimFeedforward
Aim feedforward for better tracking of the target.- Parameters:
kS- kS gain (voltage)kV- kV gain (radians/s/voltage)kA- kA gain (radians/s^2/voltage)- Returns:
SwerveInputStreamfor chaining.
-
aimWhile
Enable aiming while the trigger is true.- Parameters:
trigger- When True will enable aiming at the current target.- Returns:
- this.
-
aimLock
Aim is locked onto the target.- Parameters:
tolerance- Tolerance of the lock.- Returns:
Triggerfor aim lock.
-
aimWhile
Enable aiming while the trigger is true.- Parameters:
trigger- When True will enable aiming at the current target.- Returns:
- this.
-
aimHeadingOffset
Aim heading offset enabled boolean supplier.- Parameters:
enabled- Boolean supplier to enable aim heading offset.- Returns:
- this.
-
aimHeadingOffset
Aim heading offset enabled- Parameters:
enabled- Boolean to enable aim heading offset.- Returns:
- this.
-
aimHeadingOffset
Set the aim heading offset.- Parameters:
offset- The offset applied to the aim heading target.- Returns:
- this.
-
translationOnlyWhile
Enable locking of rotation and only translating, overrides everything.- Parameters:
trigger- Translation only while returns true.- Returns:
- this
-
translationOnlyHeading
Set the translation only heading to be the provided heading.- Parameters:
heading- Heading to lock the translation to.- Returns:
SwerveInputStreamfor chaining.
-
translationOnlyWhile
Enable locking of rotation and only translating, overrides everything.- Parameters:
translationState- Translation only if true.- Returns:
- this
-
atTargetPose
public boolean atTargetPose(double toleranceMeters) When theSwerveInputStreamis inSwerveInputStream.SwerveInputMode.DRIVE_TO_POSEthis function will return if the robot is at the desired pose within the defined tolerance.- Parameters:
toleranceMeters- Tolerance in meters.- Returns:
- At target pose, true if current mode is not
SwerveInputStream.SwerveInputMode.DRIVE_TO_POSEand no pose supplier has been given.
-
getTargetVector
Get the target vector with a lookahead, if defined. Useful for shooting on the move implementations.NOTE: This is best when going in a straight line! Do not try to drive with a curve while doing this for the best results!
- Parameters:
target- Target pose to- Returns:
Translation2dof the target vector.
-
calculateAngularVelocity
Calculate the angular velocity required for the given target with the current heading, `controllerproperties.json` PID, and feedforward (if defined).- Parameters:
target- Target angle to calculate for.- Returns:
AngularVelocityto reach the targetAngle.
-
get
Gets aChassisSpeeds- Specified by:
getin interfaceSupplier<ChassisSpeeds>- Returns:
ChassisSpeeds
-