For the complete documentation index, see llms.txt. This page is also available as Markdown.

Changelog

YAGSL was rewritten as a JSON-config parser around YAMS's SwerveDrive between versions 2026.4.1 and 2026.8.05, and ported to WPILib 2027 and the SystemCore in 2026.10.08. Entries from 2026.8.05 onward describe the current architecture. Everything from 2026.4.1 down is the old, pre-rewrite library, kept under Pre-rewrite history.

Pull requests are reviewed

I highly encourage anyone who wants to help make YAGSL better to create pull requests with any modifications you have made that increases your quality of life.

Contributing

YAGSL development is done on the main branch of the YAGSL repository, with the library source at yagsl/java/swervelib.

YAGSL repository

All PR's should be based off of and merged into main.

2026.10.09

Install from https://cdn.yassrobotics.com/yagsl_commands2.json or https://cdn.yassrobotics.com/yagsl_commands3.json. See Install YAGSL.

  • Vendordeps and artifacts now come from cdn.yassrobotics.com, so networks that block github.io can still install, update and download YAGSL. The vendordep JSON URLs are https://cdn.yassrobotics.com/yagsl_commands2.json and https://cdn.yassrobotics.com/yagsl_commands3.json, and https://cdn.yassrobotics.com/ is the only maven URL. The old yet-another-software-suite.github.io/YAGSL vendordep and maven URLs are stale. (#57)

  • The YAGSL vendordeps require only YAMS. yagsl_commands2.json requires YAMS (Commands v2) and yagsl_commands3.json requires YAMS (Commands v3). REVLib, Phoenix 6, ReduxLib and ThriftyLib are no longer required: YAGSL loads a vendor's device classes through reflection only when a JSON configuration uses that vendor's devices, so you install vendor libraries for the hardware you have.

  • canbus is read the same way for every vendor through the new swervelib.core.parser.CANBuses. (#59)

    canbus

    Bus

    "" (or missing)

    can_s0 (bus 0)

    "0" to "4"

    can_s0 to can_s4, so "1" is can_s1

    "5" to "24"

    Motioncore can_d0 to can_d19

    anything else

    passed to the vendor, such as a CANivore's name for CTRE devices

    • Behavior change: CTRE devices with an empty canbus are now on can_s0, like every other vendor. Before, Phoenix 6 put them on its SystemCore default, can_s2. Configurations whose CTRE devices are on can_s2 need "canbus": "2".

    • Behavior change: REV devices no longer take port names such as "CAN_S1". Use "1".

    • REV and Thrifty devices reject anything other than a bus number, with an error that explains the bus numbers. A bus number that does not exist, such as "25", also gives a clear error.

    • Redux devices take bus numbers too. ReduxLib bus strings such as "socketcan:can_s1" still work, since they are passed through.

  • Thrifty Nova is supported again, through YAMS's NovaWrapper on ThriftyLib 2027. (#58)

    • Motor types are nova_<motor>: nova_minion and nova_pulsar select those motors on the Nova, and anything else, such as nova_neo, is run as a NEO.

    • An absolute encoder attached to the Nova's data port (revthroughbore_attached, canandmag_attached, srxmag_attached, thrifty_attached, andymarkhexbore_attached, dutycycle_attached) sets the Nova's absolute encoder type and direction, and is used as the external feedback encoder.

    • Attached analog_attached encoders are now supported on a Nova.

    • The canbus of a Nova must be empty or a bus number, since ThriftyLib does not take bus names.

  • SystemCore IMU added as a gyro. Set the gyro type to systemcore_internal to use the IMU built into the SystemCore. It needs no vendordep, ignores id and canbus, and is created with a flat mount orientation. (#56)

  • The Commands v2 and Commands v3 vendordeps are no longer listed as direct requirements of the YAGSL vendordeps. They come in through YAMS.

  • Built against YAMS 2026.10.09.

2026.10.08

YAGSL 2027. The library, vendordep build and examples were ported to WPILib 2027 (2027_alpha7), Java 25 and the SystemCore, on top of YAMS's 2027 core/commands split. (#55)

Breaking changes for robot code:

  • WPILib 2027. WPILib Java packages are org.wpilib.* (edu.wpi.first.* no longer exists), and several types were renamed. The ones you meet with YAGSL are ChassisSpeeds, now ChassisVelocities, and SwerveModuleState, now SwerveModuleVelocity.

  • Two vendordeps, one per command framework. Install exactly one, they conflict with each other.

    Vendordep
    Artifacts
    Command framework

    yagsl_commands2.json

    YAGSL-core, YAGSL-commands2

    Commands v2

    yagsl_commands3.json

    YAGSL-core, YAGSL-commands3

    Commands v3

    YAGSL-java is replaced by YAGSL-core plus YAGSL-commands2 or YAGSL-commands3. Remove the old yagsl.json from your vendordeps folder.

  • Packages. Command framework agnostic code moved to swervelib.core: swervelib.parser is now swervelib.core.parser, and swervelib.telemetry is now swervelib.core.telemetry.

  • Entry point. Create the drive with swervelib.commands2.SwerveParser or swervelib.commands3.SwerveParser. They return the matching YAMS SwerveDrive (yams.commands2.swerve.SwerveDrive or yams.commands3.swerve.SwerveDrive). SwerveParser.parse(directory) works as before.

  • YAMS packages. YAMS classes are now under yams.core.*, yams.commands2.* and yams.commands3.*. For example yams.mechanisms.config.SwerveDriveConfig is now yams.commands2.config.SwerveDriveConfig, yams.mechanisms.swerve.utility.SwerveInputStream is now yams.commands2.swerve.SwerveInputStream, and SmartMotorControllerConfig.TelemetryVerbosity is now yams.core.telemetry.enums.TelemetryVerbosity.

  • Gyro API. SwerveDrive.getGyroAngle() is removed, use getGyroRotation3d(). SwerveDriveConfig.withGyro takes a Supplier<Rotation3d>, for example withGyro(gyro::getRotation3d).

Other changes:

  • Gyros now hand YAMS their full Rotation3d attitude. The heading axis from gyroAxis is applied in one place (YAMS's GyroAxis, through withGyroHeadingAxis), and inversion is left to YAMS's withGyroInverted. This fixes the Canandgyro being inverted twice.

  • JSON parsing moved from Jackson, which WPILib 2027 no longer ships, to WPILib's avaje-jsonb. The parsing code is generated at compile time and ships in YAGSL-core. Your JSON files do not change, and properties the schema does not know, such as $schema, are still ignored.

  • The canbus field now selects the bus for REV devices as well (see 2026.10.09 for the final rules).

  • The azimuth motor controller is created once per module. It was created twice before, which made YAMS register duplicate alerts and throw.

  • Releases now attach <version>-YAGSL-Offline.zip, which extracts into the WPILib 2027_alpha7 home folder for offline installs, plus example-commands2.zip and example-commands3.zip.

  • The example is now two projects, examples/commands2 and examples/commands3.

Not available yet on 2027_alpha7:

  • StudicaLib and the AndyMark library have no 2027 vendordep, so the navx3_can gyro and the andymarkhexbore_can encoder fail at startup.

  • YALL (Limelight) and PhotonLib have no 2027 vendordep, so the example's vision subsystems are parked outside the build.

  • Thrifty Nova was unavailable in this release. It returned in 2026.10.09.

2026.10.03

  • Fixed the maximum module speed calculation. The motor's free speed is now reduced through the drive gearing to get the wheel speed, and the drive desaturates towards the slowest module so every module can reach its commanded speed.

  • Added simulation tests for the example's vision subsystem.

2026.9.27

  • SwerveParser no longer forces module state optimization on. Control it with SwerveDriveConfig.withModuleStateOptimization(boolean).

2026.9.17

  • SmartIO encoders (*_dio and *_analog absolute encoders) now read their port from the channel field, not id. (#54)

2026.9.16

  • Fixed attached absolute encoders so absoluteEncoderOffset is applied as the external encoder's zero offset.

  • Updated to YAMS 2026.9.16.

2026.9.02.1

  • Telemetry settings from your SwerveDriveConfig are passed down to the modules and their motor controllers: the modules follow the drive's telemetry verbosity when one is given, and the DataLog names follow the drive's SwerveDriveTelemetryConfig.withDataLogName(...).

  • Trimmed the per-motor telemetry. Drive motors publish stator and supply current plus measurement/position and measurement/velocity. Azimuth motors publish stator and supply current, mechanism/position and mechanism/velocity, and the external encoder position and velocity.

2026.8.31

  • Telemetry is configured with YAMS's SwerveDriveTelemetryConfig and SwerveModuleTelemetryConfig. When you only give a telemetry verbosity, YAGSL still writes the DataLog under Swerve/.

  • The example gained vision simulation, with telemetry fixes from YAMS.

2026.8.25

  • SwerveParser methods are static: call SwerveParser.parse(directory) and then SwerveParser.createSwerveDrive(config), with no instance to create. By @DanPeled in #52

  • Added SwerveParser.createSwerveDriveDevices(config), which returns the SwerveDrive together with the raw vendor devices YAGSL created (motor controllers, absolute encoders and the gyro). See Access raw hardware devices.

  • The examples were merged into a single example project, which now includes vision and autonomous.

2026.8.18

  • Added the custom gyro type, for supplying your own gyro in code. See Use a custom gyro.

2026.8.17

  • SwerveParser now controls which telemetry fields the swerve drive exposes.

  • Fixed the DataLog location.

2026.8.05

First release of the rewritten YAGSL: a JSON configuration parser that builds a YAMS SwerveDrive. The JSON schema changed, see Schema Changes.

  • Cleaned up createSwerveDrive by @DanPeled in #48

  • Fixed to use correct imports by @DanPeled in #49

  • Added cosine compensation, drive and angle feedforward support, and an automatic theoretical drive feedforward when the drive v gain is 0.

  • Added pidfproperties_sim.json, which replaces pidfproperties.json in simulation.

  • Module telemetry names no longer include the .json suffix.

  • Added attached absolute encoder support for REV, CTRE and Thrifty Nova motor controllers, plus the analog, analog5v, dutycycle and splineencoder encoder types.

  • All vendor devices are created through reflection.

Pre-rewrite history

2026.4.1

2026.3.12

2026.3.5

  • Fixed SparkFlex sim motor issue in #29

  • Added offset to calculateAngularVelocity by @Kfir-bot in #30

  • An offset can be added to the aiming functionality by @J-Kistner in #32

  • Studica update and REV fix in #33

2026.2.21

2026.2.03

  • Fix ThriftyLib crash in #17

  • Made CTRE device creation reflective in #20

2026.1.24

2026.1.14

  • Updated vendordep error messages for clarity by @twisterjafla in #10

  • Made Studica device creation reflective.

2026.1.13

2025.8.0

  • Fix attached absolute encoders with brushed SparkMAX's

2025.7.2

  • fix setAbsoluteEncoderOffset() by @MEisSCAMMER in #338

  • Enable Continuous Input for omegaPIDController by @Sate04 in #337

  • Patched crash when starting while enabled.

2025.7.1

  • Fixed SwerveInputStream.allianceRelativeControl

  • Prevent crashing midmatch if robot code restarts.

  • Added SwerveInputStream.translationHeadingOffset

  • Removed gyro zeroing from YAGSL startup. You must now call gyro zero on autonomousInit or use the RobotModeTriggers

  • Added RobotModeTriggers.autonomous().onTrue(Commands.runOnce(this::zeroGyroWithAlliance));to the example code.

2025.7.0

2025.3.0

2025.2.2

2025.2.1

2025.2.0

2025.1.3

2025.1.2

2025.1.1

2025.1.0.1

2025.1.0

2025.0.0

2024.7.0 - Last version for 2024 WPILib

2024.6.1.0

2024.6.0.0

2024.5.0.4

2024.5.0.3

2024.5.0.1

2024.5.0.0

2024.4.8.7

2024.4.8.6

2024.4.8.5

2024.4.8.4

2024.4.8.3

2024.4.8.2

2024.4.8.1

2024.4.8

2024.4.7

2024.4.6.3

2024.4.6.1

2024.4.6

2024.4.5

2024.4.2

Last updated

Was this helpful?