Schema Changes (Migrating from pre-2026.8.05)
Between the 2026.4.1 and 2026.8.05 releases, YAGSL was rewritten from its own standalone swerve implementation into a thin JSON parser that builds a YAMS SwerveDrive (swervelib.parser.SwerveParser → yams.mechanisms.swerve.SwerveDrive). The JSON configuration schema changed to match what YAMS's config builders need. If your src/main/deploy/swerve/ directory predates this, none of your old JSON files will parse correctly against the new schema — this page is a field-by-field diff to help you port them by hand. For a fresh config, it's easier to just regenerate everything from config.yagsl.com.
This is a breaking change, not an additive one. The parser silently ignores unknown fields (FAIL_ON_UNKNOWN_PROPERTIES = false), so an old file will "parse" without errors but silently drop every renamed/restructured field, leaving you with defaults you didn't intend. Don't assume an old config "still works" just because it loads without an exception — diff it against this page.
swervedrive.json
imu: {type, id, canbus}
gyro: {type, id, canbus}
Renamed. Old type values like "pigeon2", "pigeon", "navx" also changed shape — see below.
invertedIMU: boolean
gyroInvert: boolean
Renamed.
(none)
gyroAxis: "yaw"|"pitch"|"roll"
New, optional, defaults to "yaw".
modules: string[]
modules: string[]
Unchanged.
Old:
{
"imu": { "type": "pigeon2", "id": 13, "canbus": "canivore" },
"invertedIMU": true,
"modules": ["frontleft.json", "frontright.json", "backleft.json", "backright.json"]
}New:
{
"gyro": { "type": "pigeon2_can", "id": 13, "canbus": "canivore" },
"gyroAxis": "yaw",
"gyroInvert": true,
"modules": ["frontleft.json", "frontright.json", "backleft.json", "backright.json"]
}Note the type string itself changed too — old bare names ("pigeon2", "pigeon", "navx") became explicit <device>_<connection> strings ("pigeon2_can"). See Device Type Strings for the current, complete list.
Module JSON (e.g. frontleft.json)
encoder: {type, id, canbus}
absoluteEncoder: {type, id, channel, canbus}
Renamed, and gained a channel field for analog/DIO-connected encoders. type strings changed ("cancoder" → "cancoder_can", etc.) — see Device Type Strings.
absoluteEncoderOffset: number
absoluteEncoderOffset: number
Unchanged (degrees).
(none)
absoluteEncoderInverted: boolean
New, optional, defaults to false.
drive / angle: {type, id, canbus}
Same shape, but type strings changed to <controller>_<motor> (e.g. "sparkmax_neo" unchanged, but "talonfx" alone became "talonfx_krakenx60" etc. — the motor is now part of the type string).
See Device Type Strings.
(module-level conversion lived only in physicalproperties.json)
gearing: {drive: {gearRatio, diameter}, angle: {gearRatio}} (optional, per-module override)
New: a module can now override the shared gearing without touching physicalproperties.json.
inverted: {drive, angle}
inverted: {drive, angle}
Unchanged.
location: {front, left}
location: {front, left}
Unchanged (inches).
Old:
New:
modules/physicalproperties.json
conversionFactors: {drive: {gearRatio, diameter, factor}, angle: {gearRatio, factor}}
gearing: {drive: {gearRatio, diameter}, angle: {gearRatio}}
Renamed and simplified — the precomputed factor override is gone; YAMS derives the conversion internally from gearRatio/diameter.
currentLimit: {drive, angle}
statorCurrentLimit: {drive, angle}
Renamed. Defaults are now 40/20 if omitted.
friction: {drive, angle}
(removed)
No longer configurable via JSON.
steerRotationalInertia: number
(removed)
No longer configurable via JSON.
robotMass: number
(removed)
No longer configurable via JSON.
rampRate: {drive, angle}
(removed)
No longer configurable via JSON.
wheelGripCoefficientOfFriction: number
(removed)
No longer configurable via JSON.
optimalVoltage: number
(removed)
No longer configurable via JSON.
Old:
New:
If your old config relied on rampRate, friction, robotMass, steerRotationalInertia, or wheelGripCoefficientOfFriction for simulation fidelity, that modeling now lives inside YAMS/the motor sim itself rather than being team-configurable per robot via this file.
modules/pidfproperties.json
p, i, d
p, i, d
Unchanged.
f: number
(removed, replaced by s/v/a)
Old f was a flat feedforward multiplier; the new fields model a proper SimpleMotorFeedforward (kS, kV, kA) instead.
iz: number (integral zone)
(removed)
No longer configurable.
output: {min, max} (clamp)
(removed)
No longer configurable via JSON.
(none)
s, v, a: number (all optional)
New feedforward gains. If drive.v is left 0/omitted, the parser auto-derives kV from the drive motor's free speed.
Old:
New:
You'll need to re-tune from scratch rather than porting old p/i/d values directly — the old gains were tuned against a different internal control loop (raw f/iz) than the new feedforward-based one. See How to Tune PIDF Gains.
controllerproperties.json — removed entirely
Pre-2026.8.05 YAGSL read a controllerproperties.json with an angleJoystickRadiusDeadband and a heading: {p, i, d} heading-hold PID, used internally by a swervelib.SwerveController class to build field-relative driving with heading lock. Both the file and the class are gone.
Field-relative/heading-based driving is now built in your own robot code using YAMS's yams.mechanisms.swerve.utility.SwerveInputStream, not a JSON-configured heading PID. See SwerveInputStream reference and the tutorial's driving step for the current pattern.
Hardware support that was dropped, not just renamed
This isn't just a field-rename — some previously-supported gyro and motor-controller hardware has no equivalent type string at all in the current parser (swervelib.parser.deserializer.reflections). If your old config used one of these, there's no direct migration — you need different hardware or a custom fork:
Gyros: the roboRIO-attached NavX2 (
navx,navx_spi,navx_i2c,navx_mxp_serial,navx_usb), the original Pigeon (gen 1), and analog SPI gyros (adxrs450,adis16448,adis16470) are all gone. Onlypigeon2_can,navx3_can, andcanandgyro_canare currently supported. (systemcore_internalis listed in the schema but currently throws"Internal gyro not supported yet!"— don't use it yet.)Motor controllers:
talonsrxand brushedsparkmax_brushedare gone — only the five brushless controller families (talonfx,talonfxs,sparkmax,sparkflex,nova) are supported now, each paired with a brushless motor. See Device Type Strings.
If you're on old gyro/motor hardware that's no longer supported, budget time to swap hardware, not just JSON — this is a real capability change, not a documentation gap.
Behavior changes that aren't JSON fields
Cosine compensation used to be toggleable per-module (
useCosineCompensator, defaulttrue). It's now always applied by the parser — there's no way to disable it via config.Deploy directory construction changed from directly instantiating
SwerveDrive/module classes tonew SwerveParser(dir).createSwerveDrive(new SwerveDriveConfig()...). See Deploy and Drive.
Migration checklist
Regenerate from config.yagsl.com if at all possible — it's faster and less error-prone than hand-porting every field above.
If hand-porting: rename
imu→gyro,invertedIMU→gyroInvertinswervedrive.json; addgyroAxis: "yaw".Rename
encoder→absoluteEncoderin every module file, add achannel(usually0if CAN), addabsoluteEncoderInverted: false.Update every
typestring to the new<device>_<connection>convention — see Device Type Strings.Replace
conversionFactors→gearinginphysicalproperties.json, dropping anyfactoroverride. ReplacecurrentLimit→statorCurrentLimit.Delete
controllerproperties.json; move any heading-lock behavior into robot code viaSwerveInputStream.Re-tune PIDF from scratch using the new
p/i/d/s/v/ashape — old gains don't transfer.Delete any
rampRate/friction/robotMass/steerRotationalInertia/wheelGripCoefficientOfFriction/optimalVoltagefields — they're ignored now.
Last updated
Was this helpful?