This is an alpha release of WPILib for the 2027 season. Please join the discussions regarding Systemcore alpha testing at https://github.com/wpilibsuite/SystemcoreTesting/. This release incorporates hundreds of changes since alpha 6, including a number of breaking changes that will require code updates. Some notable changes:
- The main class has reverted to the 2026 approach (a factory loader); this will require a manual fix when upgrading from a previous 2027 alpha release (see below)
- SmartDashboard, SendableChooser, and Sendable APIs have been replaced with Telemetry and Tunables APIs. The new version of SendableChooser is called Selectable. While wpilib-docs has not yet been updated, API documentation and initial migration guides from the 2026 APIs are available for telemetry and tunables
- All constants (including enumerated values) have been changed to ALL_CAPS style
- The desktop GUI tools and simulation GUI now use SDL rendering and gamepad access for consistency with the 2027 Driver Station
- Commands v3 Mechanism is now an interface instead of a class
- Gamepad face buttons have been renamed and there's now a default deadband on axes
- Catch2 is now the default test framework for C++ (instead of GoogleTest)
- DriverStationDisplay has been added--this is a text display integrated into the DS that supports ANSI escape codes
- Update to C++23. MSVC 2026 is now required for C++ on Windows and G++ 14.x is required for C++ on Linux. wpi::expected and fmt::format have been replaced with std::expected and std::format
- The WPILib AprilTag and CameraServer libraries have been moved to vendordeps. AprilTagFields is now part of an integrated Fields class
- Integer (raw) timestamps are now nanoseconds instead of microseconds. Datalog and NT still use microseconds in files/network comms.
- Alert moved to wpiutil and has added functionality; usage reporting also moved to wpiutil. Joystick warnings are now alerts
- Updated hardware support (e.g. brownout, quadrature encoders, counters)
- All CAN device classes now take a CANPort enum
- More package moves in Java and header moves in C++. Some geometry classes moved to shape, Preferences moved to preferences
- Native Arm64 Installers are included for Windows and Linux.
Vendors are working on releasing updates to sync with this release. Alpha 6 and prior vendordeps will not work with Alpha 7. Systemcore image 14 is required for this release. FIRST Driver Station Alpha 7 is also required for this release.
If you're starting from a 2026 or earlier 2027 Alpha robot project, you will need to import your project to create a 2027 project. The import process is important, as it will make a few automated corrections for some breaking changes. It is also necessary to import vendor libraries again, since older vendor libraries must be updated to be compatible with 2027 Alpha 7 projects. If you're upgrading from an earlier 2027 alpha release, you will need to additionally fix the Main class by changing Robot.class to Robot::new or creating a new project and copying Main.java from it.
The 2027 documentation for WPILib is located at https://docs.wpilib.org/en/latest/.
If you're new to WPILib, start with Getting Started.
System Requirements: WPILib requires 64-bit Windows 11 (32-bit is not supported), Ubuntu 26.04, or macOS 15 or higher. C++ teams should note that the latest version of Visual Studio is required for desktop builds. Mac users will need to have the Xcode Command Line Tools installed before running the installer. This can be done by running xcode-select --install in the Terminal.
Known issues with this release can be found in Systemcore Testing issues.
WPILib is developed by a small team of volunteers and the FIRST community.
Downloads
- Windows (x64) (2.4 GB)
- Windows (arm64) (2.5 GB)
- Mac (Arm) (2.2 GB)
- Mac (Intel) (2.3 GB)
- Linux (x64) (2.9 GB)
- Linux (arm64) (2.6 GB)
What's Changed since 2027.0.0-alpha-6 (not an exhaustive list)
WPILib
- ExHub Follower Fixes by @ThadHouse in #8892
- Rename gamepad face-button trigger APIs to directional names (faceUp/Down/Left/Right) by @ThadHouse in #8896 and #8921
- Add a default deadband to all gamepads by @ThadHouse in #8897
- Cache HID wrappers by @ThadHouse in #8970
- Remove UserControls by @ThadHouse in #8973
- Add new generation for gamepads by @ThadHouse in #8957
- Remove Axis from Gamepad Triggers by @ThadHouse in #8956
- Change
DriverStationSimto usewpi::hal::RobotModeby @bhall-ctre in #8988 - Crash robot program if an exception occurs during opmode construction by @ThadHouse in #8982
- Add DS Display API by @ThadHouse in #8975
- Change DriverStationSim to use a C++ enum for alliance station by @pjreiniger in #8991
- Add expanded game controller list by @ThadHouse in #8959
- Fix incorrect robot name in reported error by @Gold856 in #8294
- Add DSGamepadChooser by @ThadHouse in #9048
- Rename FMSInfo table to DriverStation by @Gold856 in #9047
- Switch robot construction back to supplier by @ThadHouse in #9067
- Refactor ExpansionHubMotor to introduce NeutralMode for motor control by @zachwaffle4 in #8813
- Add GameCube and Steam gamepad types by @PeterJohnson in #9064
- OpModeRobot: Don't initialize classes during scan for opmodes by @JustJustjo in #9065
- Fix opmode reset and callback handling by @zachwaffle4 in #8888
- Use alerts for joystick warnings by @PeterJohnson in #9201
- Add Timer.createStarted() convenience factory by @SamCarlberg in #9218
- Add deadband to generated gamepads by @ThadHouse in #9243
- Switch all high level CAN devices to take enum for bus by @ThadHouse in #9240
- Put the OpModeRobot#addOpMode class/lambda arguments at the end by @zachwaffle4 in #9247
- Add option to varargs string array for DSGamepadChooser by @ThadHouse in #9329
- Move Preferences from util to preferences package by @PeterJohnson in #9337
- Remove useless AutoCloseable implementations by @Gold856 in #9344
- Add raw rumble API by @ThadHouse in #9346
Drivers
- Create drivers library by @ThadHouse in #9164
- Add Gobilda Pinpoint support by @ThadHouse in #9249
Commands v3
- Make Mechanism an interface by @Daniel1464 in #8303
- Make sideload functions scoped and improve docs by @SamCarlberg in #8900
- Add trigger multi press and continuous bindings by @SamCarlberg in #8901
- Add example and template projects for commands v3 and make hatchbot example idiomatic by @SamCarlberg in #8887
- Add Coroutine.waitUntil overload with timeout by @SamCarlberg in #9088
- Multiple periodic callbacks in the same scope by @JustJustjo in #9090
- Fix Untils not Including "Until Condition" by @Advay17 in #8906
- Allow fork/await failures to be handled by user code by @SamCarlberg in #9207
Math
- Add PoundSquareInches MOI unit, and improve KilogramMetersSquaredPerSecond definition by @crueter in #8838
- Fix C++ Odometry ResetRotation missing a negation by @bhall-ctre in #8949
- Use triangular solves to compute UKF Kalman gain by @calcmogul in #9009
- Add drivetrain anti-tipping utility by @SatchitK in #8787
- Add BiquadFilter class for Second Order Section filters by @r4stered in #8814
- Switch std::is_constant_evaluated() to consteval by @ThadHouse in #9013
- Rewrite Trajectory API by @zachwaffle4 in #8172
- Quaternion::Log(): Avoid potential divide-by-zero by @PeterJohnson in #9051
- Make TrajectorySample only contain time by @calcmogul in #9078
- Give trajectory generator and parameterizer more specific names by @calcmogul in #9086
- Fix trapezoid profile by @cb144p in #8556
- Add body rate integration to Rotation3d by @calcmogul in #9101
- Document that transforms are intrinsic by @dhyantsoni in #9124
- Use "reference" instead of "setpoint" in feedforward docs by @dhyantsoni in #9122
- Note that gain setters are for online tuning by @dhyantsoni in #9123
- Fix adaptive RKDP advancing by the next step size by @calcmogul in #9171
- Remove unused full-pivoting QR by @calcmogul in #9174
- Remove epsilon check from RKDP by @calcmogul in #9176
- Move Pair from wpimath to wpiutil by @PeterJohnson in #9177
- Move Ellipse and Rectangle to shape package by @PeterJohnson in #9175
- Split shape proto from geometry proto by @PeterJohnson in #9183
- Move generated Protobuf classes into separate proto packages by @PeterJohnson in #9184
- Make SimpleMotorFeedforward accept dimensionless units by @calcmogul in #9112
- Add atReference() to LinearSystemLoop (#4098) by @hehehe-hahaha in #9173
- Clean up DARE solver docs and cache intermediate result by @calcmogul in #9208
- Remove Matrix.diag() by @calcmogul in #9235
- Make Translation2d.getAngle() return optional by @calcmogul in #9266
- Add Matrix pseudoinverse by @calcmogul in #9282
- Add static methods for creating Rotation3d from Euler angles by @Brainiac11 in #8692
- Add TwoDeadWheelOdometry by @TheComputer314 in #9155
XRP/Romi
- Fix motor support by @PeterJohnson in #8916 and #8915
NetworkTables
- Add API to get and set user data on NT_Topic by @ThadHouse in #8962
- Add PubSubOption to disable handle signaling by @PeterJohnson in #8972
- Split SetServerTeam and SetServerFixed, add mDNS resolver by @ThadHouse in #8992
- Fix publish-triggered announcements being blocked by subscription announcements by @cjlawson02 in #8515
- Multiple bugfixes
Javac Plugin
- Add compiler check for integer division in floating-point contexts by @SamCarlberg in #8885
Simulation / Glass / GUI
- Sim GUI: Fix buttons starting at 1 instead of 0 by @ThadHouse in #8987
- Add sim GUI support for DS display by @PeterJohnson in #8998
- Change to SDL3 by @PeterJohnson in #9055
- [glass] Add NT button for System server, add force restart by @ThadHouse in #9268
Util
- Add protobuf List pack/unpack for Java by @thatcomputerguy0101 in #9042
- Add
Struct<char>support in C++ by @bhall-ctre in #9072 - Always use steady_clock for timestamp by @PeterJohnson in #9074
- Accept UTF-8 struct schema identifiers by @virtuald in #9244
- Move Alert from HAL/wpilib to wpiutil by @PeterJohnson in #9025
- Use nanoseconds for timestamps by @PeterJohnson in #9335
- Add usage reporting API by @PeterJohnson in #9339
DataLog
- Multiple bugfixes
Telemetry/Tunable
- Add Telemetry and Tunable APIs by @PeterJohnson in #7773
AprilTag/Fields
- [fields] Split images, change to generation, merge AprilTags content by @PeterJohnson in #9166
- [apriltag] Convert to vendordep by @PeterJohnson in #9203
New Contributors
- @SatchitK made their first contribution in #8787
- @JustJustjo made their first contribution in #9065
- @cb144p made their first contribution in #8556
- @nano-maxwell made their first contribution in #9083
- @dhyantsoni made their first contribution in #9125
- @alan412 made their first contribution in #9170
- @hehehe-hahaha made their first contribution in #9173
- @Brainiac11 made their first contribution in #8692
- @cjlawson02 made their first contribution in #8515
Full Changelog: v2027.0.0-alpha-6...v2027.0.0-alpha-7
SHA256 Hashes
bd5efaaff1abd7042c58c5e8f364fbc5cb0d84f656245d361872b54113ab30a2 WPILib_Linux-Arm64-2027.0.0-alpha-7.tar.gz
65378b77bf4499e80639d4506c9571af7e85e75e56b1be1667257afeb4db2ec8 WPILib_Linux-x64-2027.0.0-alpha-7.tar.gz
6c4fe800f1dd004d4bb11d269f7b22872c8bf82869b1491a871381559d38275e WPILib_Windows-Arm64-2027.0.0-alpha-7.iso
05f5b3af9e2d3866b71cd8883833864d23917b5d316f8b10e2d76630e8b1a84e WPILib_Windows-x64-2027.0.0-alpha-7.iso
2bcdd506537dc4efea058285f2065c30d413ba2ae56fc8d5b4cbbe9286f11a2e WPILib_macOS-Arm64-2027.0.0-alpha-7.dmg
5edc92ad1b54519bff430295f30233ebcefaa30f2c97aa364dce1ad263907920 WPILib_macOS-Intel-2027.0.0-alpha-7.dmg