2026 to 2027
This course teaches the 2026 release, because that is what the team's code is written in today. At kickoff you will switch to 2027, and a few names will be different. Here is the whole list.
The short version
Everything you learned about the shape of robot code survives. A subsystem is still a subsystem, a command is still a command, the loop still runs every 20ms. What changes is the imports and a handful of method names.
The same subsystem, twice
Left is what you write here. Right is the same file at kickoff. Look at how much of it is identical.
package frc.robot.subsystems;
import edu.wpi.first.wpilibj.motorcontrol.PWMVictorSPX;import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;import edu.wpi.first.wpilibj2.command.Command;import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class IntakeSubsystem extends SubsystemBase {
private final PWMVictorSPX motor = new PWMVictorSPX(2);
private void setSpeed(double speed) { motor.set(speed); }
public Command intakeCommand() { return startEnd(() -> setSpeed(0.7), () -> setSpeed(0.0)).withName("Intake"); }
@Override public void periodic() { SmartDashboard.putNumber("Intake Speed", motor.get()); }}package frc.robot.subsystems;
import org.wpilib.hardware.motor.PWMVictorSPX;import org.wpilib.command2.Command;import org.wpilib.command2.SubsystemBase;
public class IntakeSubsystem extends SubsystemBase {
private final PWMVictorSPX motor = new PWMVictorSPX(2);
private void setSpeed(double speed) { motor.setThrottle(speed); }
public Command intakeCommand() { return startEnd(() -> setSpeed(0.7), () -> setSpeed(0.0)).withName("Intake"); }
@Override public void periodic() { // SmartDashboard is gone; this is the Telemetry API's job now. }}Four lines moved: three imports and one method call. The class, the command factory, the lambdas, the periodic override and every idea in the file are untouched.
Every import gets a new address
edu.wpi.first becomes org.wpilib, and the tree is reorganised by topic while it moves — so it is not a find-and-replace. The good news: the VS Code project importer does the rename for you when you open last season's project.
| What it is | 2026 | 2027 |
|---|---|---|
| The robot base class | edu.wpi.first.wpilibj.TimedRobot | org.wpilib.framework.TimedRobot |
| Motor controllers | edu.wpi.first.wpilibj.motorcontrol.* | org.wpilib.hardware.motor.* |
| Drivetrains | edu.wpi.first.wpilibj.drive.* | org.wpilib.drive.* |
| Digital inputs | edu.wpi.first.wpilibj.DigitalInput | org.wpilib.hardware.discrete.* |
| The driver station | edu.wpi.first.wpilibj.DriverStation | org.wpilib.driverstation.* |
| Commands (the ones you know) | edu.wpi.first.wpilibj2.command.* | org.wpilib.command2.* |
| Commands v3 (brand new) | does not exist | org.wpilib.command3.* |
Six calls that change their name
robotInit()the Robot() constructor
robotInit is gone. You already write the constructor version here.
motor.set(0.5)motor.setThrottle(0.5)
Same number, same meaning, new name.
motor.stopMotor()motor.disable()
Same idea: stop driving this motor.
testInit() / testPeriodic()utilityInit() / utilityPeriodic()
Test mode becomes utility mode on the new driver station.
SmartDashboard.putNumber(...)the Telemetry API
SmartDashboard and Shuffleboard are removed. Tunables replace tuning sliders.
SendableChooserSelectable
The auto chooser, renamed.
What does not change at all
- The 20ms loop. autonomousInit, autonomousPeriodic, teleopInit, teleopPeriodic — same names, same order, 50 times a second.
- Subsystems and commands: initialize, execute, end, isFinished, requirements, default commands.
- Triggers: onTrue, whileTrue, toggleOnTrue, and binding them in one place.
- arcadeDrive, tankDrive and curvatureDrive — same arguments, same squaring by default.
- XboxController: getLeftY() is negative when you push forward, triggers are 0 to 1, the D-pad is degrees.
- MathUtil.clamp and MathUtil.applyDeadband, doing exactly what they do now.
The robot's computer changes too
The roboRIO is replaced by SystemCore. WPILib calls it the biggest control system update since the cRIO. It adds more CAN buses, Smart IO and an onboard gyro, and it drops relays, analog outputs and SPI. Java goes from 17 to 25, and there is a new cross-platform Driver Station that runs on macOS and Linux as well as Windows.
None of that is your problem on day one. Somebody on the team will have flashed the SystemCore and got the drivetrain moving before you are asked to add a button.
2027 is still alpha
As of September 2026 the newest 2027 build is v2027.0.0-alpha-7, and vendor libraries from REV and CTRE are still catching up with it. Details on this page can still move before the release lands at kickoff. That is exactly why this course teaches 2026 and this page is a heads-up rather than a lesson.
Where this came from
Everything above was read from the WPILib source at tags v2026.2.2 and v2027.0.0-alpha-7, and from WPILib's own “New for 2027” changelog, in the project's API research notes (WPILIB_REFERENCE.md, section A).