Skip to content

feat(drivetrain): smooth arcade drive inputs with asymmetric acceleration limiter#2

Draft
IamCoder18 wants to merge 8 commits into
mainfrom
feat/drivetrain-slew-rate-limiters
Draft

feat(drivetrain): smooth arcade drive inputs with asymmetric acceleration limiter#2
IamCoder18 wants to merge 8 commits into
mainfrom
feat/drivetrain-slew-rate-limiters

Conversation

@IamCoder18

@IamCoder18 IamCoder18 commented Jun 25, 2026

Copy link
Copy Markdown
Member

Context

Smooth driver control by limiting the rate of change of joystick inputs to arcade drive.

Initial attempt with WPILib's SlewRateLimiter (PR predecessor) didn't work well because it's symmetric. It limits both acceleration and deceleration, which makes the robot unsafe to stop quickly and is unsafe.

Issue

Closes #1

Implementation

  • It's asymmetric. It snaps on deceleration, but uses a curve to limit on acceleration.
  • Self-resets: if dt > 200 ms and snaps to current input.

Tuning

Constants are in DrivetrainConstants and can be easily modified by both drivers and programmers.

@IamCoder18 IamCoder18 marked this pull request as draft June 25, 2026 01:48
@IamCoder18 IamCoder18 force-pushed the feat/drivetrain-slew-rate-limiters branch from 7e3a2e9 to 2a018e5 Compare June 25, 2026 01:49
@IamCoder18

Copy link
Copy Markdown
Member Author

Draft while I fix failing build and we verify on the robot, especially since we may want to tune the values further.

@IamCoder18 IamCoder18 force-pushed the feat/drivetrain-slew-rate-limiters branch from 2a018e5 to 63f140f Compare June 25, 2026 02:04
Smooth driver control by limiting the rate of change of forward and
turn inputs via SlewRateLimiter filters (0.5 and 0.3 respectively).
@IamCoder18

Copy link
Copy Markdown
Member Author

Checks pass; ready to test!

@IamCoder18 IamCoder18 changed the title feat(drivetrain): add slew rate limiters to arcade drive inputs feat(drivetrain): smooth arcade drive inputs with asymmetric acceleration limiter Jul 1, 2026
Replaces SlewRateLimiter with a custom AccelerationLimiter (frc.robot.util) that operates on magnitude, snaps on deceleration, and applies a power curve on remaining distance for acceleration. Drive: maxRate=44, exponent=3 (~0.6 instant, ~0.85 in 0.5s). Turn: maxRate=40, exponent=4 (~0.5 instant, ~0.75 in 0.5s).

Also fixes the arcadeDrive(xSpeed, zRotation) axis binding: previously getLeftX (turn) was passed as xSpeed and getLeftY (forward) as zRotation, so pushing forward made the robot turn.

Wires Drivetrain.resetAccelerationLimiters() via .beforeStarting(...) on the default command so enable cycles don't leak limiter state.
- Clamp drive/turn outputs to +/- kDriveMaxPower/kTurnMaxPower
- Fix Math.clamp min/max argument order
- Tune acceleration limiter rates, curve exponents, and max power
- Switch arcade drive turn axis to right stick X
Math.clamp was added in Java 21 but this project targets Java 17 (build.gradle:9-10).
@IamCoder18

Copy link
Copy Markdown
Member Author

Very close to be ready to merge. Some testing has been done on the robot. We just need to deploy the latest code and verify it works, and we're good to merge!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add slew rate limiters to drivetrain arcade drive

1 participant