Changelog
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.
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 blockgithub.iocan still install, update and download YAGSL. The vendordep JSON URLs arehttps://cdn.yassrobotics.com/yagsl_commands2.jsonandhttps://cdn.yassrobotics.com/yagsl_commands3.json, andhttps://cdn.yassrobotics.com/is the only maven URL. The oldyet-another-software-suite.github.io/YAGSLvendordep and maven URLs are stale. (#57)The YAGSL vendordeps require only YAMS.
yagsl_commands2.jsonrequires YAMS (Commands v2) andyagsl_commands3.jsonrequires 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.canbusis read the same way for every vendor through the newswervelib.core.parser.CANBuses. (#59)canbusBus
""(or missing)can_s0(bus 0)"0"to"4"can_s0tocan_s4, so"1"iscan_s1"5"to"24"Motioncore
can_d0tocan_d19anything else
passed to the vendor, such as a CANivore's name for CTRE devices
Behavior change: CTRE devices with an empty
canbusare now oncan_s0, like every other vendor. Before, Phoenix 6 put them on its SystemCore default,can_s2. Configurations whose CTRE devices are oncan_s2need"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
NovaWrapperon ThriftyLib 2027. (#58)Motor types are
nova_<motor>:nova_minionandnova_pulsarselect those motors on the Nova, and anything else, such asnova_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_attachedencoders are now supported on a Nova.The
canbusof 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
typetosystemcore_internalto use the IMU built into the SystemCore. It needs no vendordep, ignoresidandcanbus, 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 areChassisSpeeds, nowChassisVelocities, andSwerveModuleState, nowSwerveModuleVelocity.Two vendordeps, one per command framework. Install exactly one, they conflict with each other.
VendordepArtifactsCommand frameworkyagsl_commands2.jsonYAGSL-core,YAGSL-commands2Commands v2
yagsl_commands3.jsonYAGSL-core,YAGSL-commands3Commands v3
YAGSL-javais replaced byYAGSL-coreplusYAGSL-commands2orYAGSL-commands3. Remove the oldyagsl.jsonfrom yourvendordepsfolder.Packages. Command framework agnostic code moved to
swervelib.core:swervelib.parseris nowswervelib.core.parser, andswervelib.telemetryis nowswervelib.core.telemetry.Entry point. Create the drive with
swervelib.commands2.SwerveParserorswervelib.commands3.SwerveParser. They return the matching YAMSSwerveDrive(yams.commands2.swerve.SwerveDriveoryams.commands3.swerve.SwerveDrive).SwerveParser.parse(directory)works as before.YAMS packages. YAMS classes are now under
yams.core.*,yams.commands2.*andyams.commands3.*. For exampleyams.mechanisms.config.SwerveDriveConfigis nowyams.commands2.config.SwerveDriveConfig,yams.mechanisms.swerve.utility.SwerveInputStreamis nowyams.commands2.swerve.SwerveInputStream, andSmartMotorControllerConfig.TelemetryVerbosityis nowyams.core.telemetry.enums.TelemetryVerbosity.Gyro API.
SwerveDrive.getGyroAngle()is removed, usegetGyroRotation3d().SwerveDriveConfig.withGyrotakes aSupplier<Rotation3d>, for examplewithGyro(gyro::getRotation3d).
Other changes:
Gyros now hand YAMS their full
Rotation3dattitude. The heading axis fromgyroAxisis applied in one place (YAMS'sGyroAxis, throughwithGyroHeadingAxis), and inversion is left to YAMS'swithGyroInverted. 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
canbusfield now selects the bus for REV devices as well (see2026.10.09for 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 WPILib2027_alpha7home folder for offline installs, plusexample-commands2.zipandexample-commands3.zip.The example is now two projects,
examples/commands2andexamples/commands3.
Not available yet on 2027_alpha7:
StudicaLib and the AndyMark library have no 2027 vendordep, so the
navx3_cangyro and theandymarkhexbore_canencoder 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
SwerveParserno longer forces module state optimization on. Control it withSwerveDriveConfig.withModuleStateOptimization(boolean).
2026.9.17
SmartIO encoders (
*_dioand*_analogabsolute encoders) now read their port from thechannelfield, notid. (#54)
2026.9.16
Fixed attached absolute encoders so
absoluteEncoderOffsetis applied as the external encoder's zero offset.Updated to YAMS
2026.9.16.
2026.9.02.1
Telemetry settings from your
SwerveDriveConfigare 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'sSwerveDriveTelemetryConfig.withDataLogName(...).Trimmed the per-motor telemetry. Drive motors publish stator and supply current plus
measurement/positionandmeasurement/velocity. Azimuth motors publish stator and supply current,mechanism/positionandmechanism/velocity, and the external encoder position and velocity.
2026.8.31
Telemetry is configured with YAMS's
SwerveDriveTelemetryConfigandSwerveModuleTelemetryConfig. When you only give a telemetry verbosity, YAGSL still writes the DataLog underSwerve/.The example gained vision simulation, with telemetry fixes from YAMS.
2026.8.25
Added
SwerveParser.createSwerveDriveDevices(config), which returns theSwerveDrivetogether 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
customgyro type, for supplying your own gyro in code. See Use a custom gyro.
2026.8.17
SwerveParsernow 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.
Added cosine compensation, drive and angle feedforward support, and an automatic theoretical drive feedforward when the drive
vgain is0.Added
pidfproperties_sim.json, which replacespidfproperties.jsonin simulation.Module telemetry names no longer include the
.jsonsuffix.Added attached absolute encoder support for REV, CTRE and Thrifty Nova motor controllers, plus the
analog,analog5v,dutycycleandsplineencoderencoder types.All vendor devices are created through reflection.
Pre-rewrite history
2026.4.1
setActiveOverrideshould be public, not protected. by @twisterjafla in #43
2026.3.12
Adds overrides to activity when
shouldClockis set to false. by @twisterjafla in #34Fix drive base to vision pose fusion by @Chris7898 in #36
EmptyOpponent by @konnorreynolds in #38
Alert fix in #41
Change
aimTargetto useSupplier<Pose2d>by @Hello2Krish19 in #40
2026.3.5
Fixed SparkFlex sim motor issue in #29
An offset can be added to the aiming functionality by @J-Kistner in #32
Studica update and REV fix in #33
2026.2.21
Do not round location values parsed from JSON by @Scaratech in #22
Fix some simulation issues by @clrozeboom in #26
Fix broken link in README by @nickmcski in #18
2026.2.03
2026.1.24
Removed an extra println by @twisterjafla in #11
Changes where MapleSim publishes goal poses by @twisterjafla in #13
Disable bump collision by @konnorreynolds in #16
2026.1.14
Updated vendordep error messages for clarity by @twisterjafla in #10
Made Studica device creation reflective.
2026.1.13
Additional example projects, reworked alliance based gyro zeroing by @HolyArtist31656 in #1
Fixed unneeded alliance flipping by @HolyArtist31656 in #2
Updates to Thrifty API for ThriftyNova code by @clrozeboom in #4
MapleSim update by @konnorreynolds in #8
Adds rebuilt by @twisterjafla in #9
2025.8.0
Fix attached absolute encoders with brushed SparkMAX's
2025.7.2
fix setAbsoluteEncoderOffset() by @MEisSCAMMER in #338
Patched crash when starting while enabled.
2025.7.1
Fixed
SwerveInputStream.allianceRelativeControlPrevent crashing midmatch if robot code restarts.
Added
SwerveInputStream.translationHeadingOffsetRemoved gyro zeroing from YAGSL startup. You must now call gyro zero on
autonomousInitor use theRobotModeTriggersAdded 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?
