Drive Util
NextFTC v2 provides functions to drive mecanum and tank drivetrains from a gamepad, so you don’t have to write the math yourself.
Register your motors on a Drivetrain mechanism
Section titled “Register your motors on a Drivetrain mechanism”class Drivetrain : Mechanism { val frontLeft = NextMotor(//...) val frontRight = NextMotor(//...) val backLeft = NextMotor(//...) val backRight = NextMotor(//...)}public class Drivetrain implements Mechanism { public Drivetrain(){}
public final NextMotor frontLeft = new NextMotor(//...); public final NextMotor frontRight = new NextMotor(//...); public final NextMotor backLeft = new NextMotor(//...); public final NextMotor backRight = new NextMotor(//...);}Register it on your NextRobot’s getMechanisms() set, just like any other mechanism.
In your Robot class, add a startDrive method like this:
Section titled “In your Robot class, add a startDrive method like this:”fun startDrive(gamepad1: Gamepad) { mecanumDrive( drivetrain.frontLeft, drivetrain.frontRight, drivetrain.backLeft, drivetrain.backRight, gamepad1, )()}public void startDrive(Gamepad gamepad1) { DriveCommands.mecanumDrive( drivetrain.frontLeft, drivetrain.frontRight, drivetrain.backLeft, drivetrain.backRight, gamepad1, )();}For a tank drivetrain, swap in tankDrive
Call startDrive in your TeleOp
Section titled “Call startDrive in your TeleOp”Call this once, in your TeleOp’s constructor and your set!
robot.startDrive(gamepad1)robot.startDrive(gamepad1);Field-Centric
Section titled “Field-Centric”mecanumDriveFieldCentric rotates stick input by the robot’s current heading, so “forward” on the stick always moves the robot away from the driver.
mecanumDriveFieldCentric( drivetrain.frontLeft, drivetrain.frontRight, drivetrain.backLeft, drivetrain.backRight, gamepad1, { //insert heading},)()DriveCommands.mecanumDriveFieldCentric( drivetrain.frontLeft, drivetrain.frontRight, drivetrain.backLeft, drivetrain.backRight, gamepad1, () -> //insert heading,)();Scalars
Section titled “Scalars”Multiplies your gamepad inputs by a scalar to support different speed modes or sensitivities.
scalar = 0.5 // makes it half speedDriveCommands.setScalar(0.5); // makes it half speedA common way to use Scalar is a slow mode:
gp1.leftBumper().whileTrue(Commands.infinite { scalar = 0.4 })gp1.leftBumper().whileTrue(Commands.infinite(() -> DriveCommands.setScalar(0.4)));
