Skip to content

Releases: SleipnirGroup/Choreo

Choreo v2026.0.0-beta-1

20 Nov 05:14
b5bbf1c

Choose a tag to compare

Pre-release

Choreo v2026.0.0-beta-1

This first 2026 prerelease is mostly non-user-facing build system improvements. The changes highlighted below are not an exhaustive list, and focuses on potentially breaking changes or new workflow features.

ChoreoLib Vendordep URL (Java/C++)

https://choreo.autos/lib/ChoreoLib2026Beta.json
Though we published a Python 2026.0.0 beta 1 ChoreoLib, that still is against the last 2025 RobotPy stable release, since RobotPy has not released 2026 betas yet.

Trajectory Schema Change

The .traj schema version is now 2. This version adds an alpha parameter to the DifferentialSample: the chassis angular acceleration of the state in rad/s².

  • This is exported to support better interpolation of differential samples. See the ChoreoLib section.

NOTE: Trajectories of both drive types will need to be regenerated after first being opened in this version.

ChoreoLib

All

  • ChoreoLib Java and C++ are updated to work with WPILib v2026.1.1-beta-1. ChoreoLib Python is still built against the last RobotPy stable release.

  • ChoreoLib is now hosted on the Artifactory instance shared with WPILib.

  • DifferentialSample is updated to reflect the above schema change. This is BREAKING for code that constructs DifferentialSamples directly.

  • For both SwerveSamples and DifferentialSamples, interpolation now integrates the acceleration instead of linearly interpolating all elements of the state.

Java

  • AutoRoutine
    • Removed the deprecated function. Use anyDoneDelayed.
@Deprecated(forRemoval = true, since = "2025")
  public Trigger anyDone(
      int cyclesToDelay, AutoTrajectory trajectory, AutoTrajectory... trajectories)

C++

  • Removed the deprecated kTrajSpecVersion in util/TrajSchemaVersion.h. Use kTrajSchemaVersion.

Python

  • Added FMS Usage Reporting for ChoreoTrajectory

Choreo GUI

  • Choreo is now using Tauri v2 instead of v1.
  • Add timestamp of last project save, in the main menu.
  • Added button to save an unsaved project. This is next to the Undo and Redo buttons.
  • The sidebar icon next to each path is now clickable to generate the path if it is stale.
  • Added Generate All button.

What's Changed

Read more

Choreo v2025.0.3

07 Feb 05:49
fe1f4fc

Choose a tag to compare

This release brings a few features related to variables, some new ChoreoLib AutoTrajectory Triggers, other ChoreoLib bugfixes, and internal changes.

Pose Assignment Dropdown

The waypoint configuration panel now has a searchable input to assign a pose variable to the waypoint. If you type a name that does not exist, it has an option to use the current waypoint expressions for a new pose variable.

The input does not show the last assigned variable, due to there being no waypoint-wide "assignment" property.

image
image

Pose Variable Panel Clarification

image

The expression fields in the pose variable list are now labeled matching the way they are accessed.

ChoreoLib

C++

  • Updated trajectory schema version to be correct

Python

  • Fixed several major type safety bugs.
  • Switched to dataclasses for SwerveSample, SwerveTrajectory, DifferentialSample, DifferentialTrajectory, and EventMarker
  • Added mypy type checking to our CI setup to catch further issues.

Java

  • Changed isAutonomousEnabled checks to isEnabled, allowing Choreo usage in teleop.
    • This does mean AutoRoutines do not automatically end on a transition from auto directly to teleop (a nearly sim-only situation).
    • However, if using RobotModeTriggers.autonomous().whileTrue() or the default template getAutonomousCommand(), those have mechanisms to end the routine when autonomous ends.
  • Added AutoRoutine.idle(), returning a Trigger that goes false at the start and true at the end of every routine.trajectory.cmd() command. idle() can be true when the routine is not being polled.
  • Deprecated AutoRoutine.anyDone(...) in favor if AutoRoutine.anyDoneDelayed(...) with identical usage.
  • Added AutoRoutine.allInactive(AutoTrajectory, AutoTrajectory...), returning a Trigger that is true when none of the provided trajectories are running, but the routine is still being polled.
  • AutoTrajectory: New Triggers, which standardize on seconds instead of cycles for delays.
    • Deprecated done(int cycles).
    • Added doneDelayed(double seconds) which rises to true a given time after the trajectory ends and falls on the next robot cycle.
    • Added doneFor(double seconds) which rises to true when the trajectory ends and falls after a given time.
    • Added recentlyDone() which rises to true when the trajectory ends and falls when another begins.
    • Added atTimeBeforeEnd(double timeBeforeEnd) which is similar to atTime but offsets from the end of the trajectory.
  • AutoTrajectory: Other new features
    • Added chain(AutoTrajectory other) which is shorthand for .done().onTrue(other.cmd())
    • Added spawnCmd() which schedules the .cmd() and ends instantly.
      • This is useful for ending a command group, such as:
firstTrajectory.done().onTrue(
  Commands.sequence(
    score(), // Requiring intake
    secondTrajectory.spawnCmd() // secondTrajectory triggers an intake command
  )
);

Without the secondTrajectory being scheduled separately from the sequence, it will be part of the sequence, which has all the requirements of score(), specifically the intake. This would lead to the sequence being cancelled when secondTrajectory triggers another intake command.

What's Changed

Full Changelog: v2025.0.2...v2025.0.3

Choreo v2025.0.2

22 Jan 19:12
ef22708

Choose a tag to compare

This release brings critical fixes to ChoreoLib in all three languages and usability improvements in the UI. We also now build the UI and CLI for Linux aarch64.

New Tips and Tricks

  • Disable or delete the default field border Keep In Rect constraint on any paths that do not need it. Especially on simpler paths, it has been shown to significantly affect generation time. In this update, the constraint is disabled by default.

ChoreoLib Python

BREAKING: .chor files need to be saved in [project root]/deploy/choreo now. Docs here have been updated to match.

  • Fixed a bug with load_trajectory() requiring absolute paths. After doing the above file move, use the trajectory name alone, such as choreo.load_trajectory("testPath") to load [project root]/deploy/choreo/testPath.traj.

ChoreoLib C++

  • Fixed several compilation errors, so the C++ library is usable now.

ChoreoLib Java

  • Fixed behavior of AutoFactory.trajectoryCmd(...). It is now a command that requires the drivetrain, so can be used in sequence with resetOdometry as intended.
  • Fixed an issue with the AutoTrajectory.done() Trigger where it would sometimes not switch true at the end of the trajectory, especially when running the trajectory a second time.

Choreo GUI

  • Fixed a bug where a zero-max-angular-velocity constraint between a pose and translation waypoint would fail in a way that required manual correction beyond undoing that setup.
  • Fixed an issue with two identical waypoints in sequence, which would cause an error about "nonfinite cost or constraints". Both waypoints now constrain the same sample in the path. This situation is not recommended, but is intended to at least generate if the constraints are compatible.
  • Fixed an issue with variables that depend on other variables. This would cause a UI crash if the dependency variable was deleted. Now it shows the depending variable as an invalid input.
  • Variables in the variable panel are now visually sorted alphabetically, but still separated between standalone variables and pose variables.
  • Fixed an issue with the icons in the path list, where trajectories would be incorrectly shown as out-of-date upon opening a project.
  • Added a Generate All Outdated button above of the path list, next to the Add Path and Duplicate Path buttons.
  • The Keep In Rect constraint for the field borders is disabled in new paths. For paths that do not get near the wall, the constraint is an unnecessary performance hit.

File Format

No breaking changes. However, the .chor variables section is now always saved in alphabetical order by variable name. Previously it was nondeterministic and changed almost every time a variable was modified. This change should reduce lines changed in source control diffs.

What's Changed

New Contributors

Full Changelog: v2025.0.1...v2025.0.2

Choreo v2025.0.1

09 Jan 03:55
284d827

Choose a tag to compare

These notes will be replaced by a larger announcement post soon. The below is meant for users upgrading from 2025 beta.

ChoreoLib

ChoreoLib is now in the WPILib vendor dependencies panel, which is now the recommended way to install it. The vendordep URL https://lib.choreo.autos/dep/ChoreoLib2025.json.

There are no ChoreoLib changes between 2025.0.0 and 2025.0.1.

Major Changes since Beta 9

  • 2025 field
    • Thanks to @mjansen4857 for giving us a copy of the PathPlanner field background to adapt for Choreo.
    • Trajectories will be rotated around the field center, but retain a blue origin.
    • If upgrading paths, note that the default Keep In Rectangle dimensions need to be updated manually. Use a width of 17.548 m and a height of 8.052 m
  • Unitless values are no longer accepted and autofilled with a default unit in expression inputs.
  • Variable names can be used without parentheses; a bugfix corrected this for .x, .y, and .heading inside pose variables.
  • In the list of paths, a generate button replaces the normal icon if the path is different than what was last generated.
    • This mechanic is why the .traj files include a snapshot section.
  • AutoBindings
    • Removed from the AutoFactory constructor and made package-private.
    • Use AutoFactory.bind(String eventName, Command command) instead, which now returns the AutoFactory for chaining.
  • AutoTrajectory.resetOdometry() is added, as a replacement to AutoRoutine.resetOdometry(AutoTrajectory), which no longer exists.
  • AutoChooser
    • We intend to ensure that the command creator functions are only run when the alliance is correct. Thus:
    • Changing alliance will re-run the creator.
    • In simulation only, going directly from Disconnected to Autonomous for the first run will generate the command on autonomousInit. In real life, the auto will stop with a dashboard alert, since this is an unrealistic scenario.
  • Many bugs with the library and the UI have been fixed.

Choreo v2025.0.0

06 Jan 05:29
97962cb

Choose a tag to compare

Choreo v2025.0.0 Pre-release
Pre-release

ARCHIVED.

The GUI is broken, but the vendordep is (to our knowledge) usable for building projects against WPILib's stable 2025 release.

These notes will be replaced by a larger announcement post soon. The below is meant for users upgrading from 2025 beta.

Use the vendor dependencies panel in VS Code (recommended) or the URL https://lib.choreo.autos/dep/ChoreoLib2025.json

Major Changes since Beta 9

  • 2025 field
    • Thanks to @mjansen4857 for giving us a copy of the PathPlanner field background to adapt for Choreo.
    • Trajectories will be rotated around the field center, but retain a blue origin.
    • If upgrading paths, note that the default Keep In Rectangle dimensions need to be updated manually. Use a width of 17.548 m and a height of 8.052 m
  • Unitless values are no longer accepted and autofilled with a default unit in expression inputs.
  • Variable names can be used without parentheses; a bugfix corrected this for .x, .y, and .heading inside pose variables.
  • In the list of paths, a generate button replaces the normal icon if the path is different than what was last generated.
    • This mechanic is why the .traj files include a snapshot section.
  • AutoBindings
    • Removed from the AutoFactory constructor and made package-private.
    • Use AutoFactory.bind(String eventName, Command command) instead, which now returns the AutoFactory for chaining.
  • AutoTrajectory.resetOdometry() is added, as a replacement to AutoRoutine.resetOdometry(AutoTrajectory), which no longer exists.
  • AutoChooser
    • We intend to ensure that the command creator functions are only run when the alliance is correct. Thus:
    • Changing alliance will re-run the creator.
    • In simulation only, going directly from Disconnected to Autonomous for the first run will generate the command on autonomousInit. In real life, the auto will stop with a dashboard alert, since this is an unrealistic scenario.
  • Many bugs with the library and the UI have been fixed.

What's Changed

Full Changelog: v2025.0.0-beta-9...v2025.0.0

Choreo v2025.0.0-beta-9

20 Dec 05:29
4edab1b

Choose a tag to compare

Pre-release

This is a fix to the Choreo GUI only. It fixes an issue with Choreo exporting the wrong trajectory schema version.

ChoreoLib 2025.0.0-beta-9 is published, but is identical to beta 8.

Choreo v2025.0.0-beta-8

19 Dec 07:14
2a73934

Choose a tag to compare

Pre-release

Choreo v2025.0.0-beta-8

Please read through the post entirely, since many breaking changes have been made.

This release focuses on internal infrastructure and breaking API improvements in ChoreoLib.

v2025.0.0-beta-8 is built for WPILib beta 3. It is likely mostly identical to the first full 2025 release of Choreo, which will be released after the WPILib full 2025 release.

NOTE: This changelog describes changes since beta-6.

https://choreo.autos : New Docs Domain

We recently registered the domain choreo.autos to replace sleipnirgroup.github.io/Choreo. We have set up the latter to redirect to the former. Documentation is still being updated over the coming weeks before kickoff.

Document Schemas and Auto Upgrade

The version control in the .chor and .traj schemas is no longer a semver string. It is now an integer, starting at 1, and is different for .traj and .chor. A string in the version key is interpreted as version 0.

The Choreo app is able to automatically load non-current versions of both files (including existing files from beta-6) and upgrade them to the current schema. Usually, this will require regeneration, depending on the changes in the update.

This is a feature Choreo had in 2024, but it has been completely reimplemented.

For contributors, a guide to defining new schema versions has been added here.

The three ChoreoLib languages will not automatically upgrade old trajectories when reading them.

Removal of C++ AutoFactory API

Unfortunately, we found many severe bugs in our port of the Java AutoFactory API to C++, and decided to delete that attempt. We apologize for the inconvenience.

ChoreoLib Changes (Mostly Breaking)

See below for details on these changes.

General

  • Changes to how Choreo handles alliance flipping. See below.
  • Many bugs with the sample flipping algorithms have been fixed.
  • ChoreoLib no longer reads the .chor file to know what sample type to expect, or what the differential track width is, as needed for DifferentialSample.getChassisSpeeds(). This information is now in the .traj file. Details below.

Raw API

Trajectory

  • [Java] Trajectory.getInitialSample(), getFinalSample(), getInitialPose(), getFinalPose(), sampleAt() now return Optional<Pose2d> instead of a potentially null Pose2d. This matches prior behavior of the other two languages (C++ with std::optional and Python with returning None)
  • [C++] Trajectory::GetInitialState() is now GetInitialSample().
  • [Java, C++] Trajectory.getInitialSample()/GetInitialSample() and getFinalSample()/GetFinalSample() now take a boolean parameter that is true if the sample should be returned flipped. This does not check the current alliance; if the parameter is true, the sample will be flipped.
  • [Java] Trajectory.sampleArray() has been removed due to causing runtime crashes and being type-unsafe.

ProjectFile

Removed, since it is no longer needed.

DifferentialSample

A new field omega was added, instead of calculating angular velocity from vl, vr and the trackwidth from the robot config in the .chor file.

Java Auto API

  • Driver Station warnings from ChoreoLib have moved to use the new Alerts API.

New Recommended Practices

  • The AutoRoutine.trajectory(String name) has been added and is the new recommended way to load AutoTrajectories, instead of AutoFactory.trajectory(String name, AutoRoutine routine).
  • Trigger AutoRoutine.observe(BooleanSupplier condition) has been added. This can be used to create Triggers that are part of the AutoRoutine and will only be polled during the routine. It can also be used to "sanitize" Triggers that are used elsewhere. See below for details on why this is necessary.
  • To help handle odometry resetting when the start pose depends on alliance, AutoFactory and AutoTrajectory now have resetOdometry capability. More details in the changelog just below.

AutoLoop

  • choreo.auto.AutoLoop is now choreo.auto.AutoRoutine.
    • AutoFactory.newLoop() and voidLoop() were renamed to newRoutine() and voidRoutine().
  • AutoRoutine.cmd() will end immediately with a console warning if alliance flipping is enabled and the alliance is not known on command initialize.
  • AutoLoop.enabled() was replaces with AutoRoutine.active().
  • AutoLoop.poll() will return immediately if the alliance is needed for flipping and not known. This is the same behavior as if poll() is called on a killed routine, or not while enabled and in autonomous.
  • Trigger anyDone(AutoTrajectory... trajectories) has been added, which creates a trigger that is true for one cycle when any of the input trajectories finishes. A variant also exists that applies a delay to the rising edge.
  • Trigger anyActive(AutoTrajectory... trajectories) creates a trigger that is true whenever any input trajectory is active.

AutoTrajectory

  • AutoTrajectory.done() behavior has changed. The trigger will become true for one cycle when the trajectory completes without being interrupted. Previously, interrupted trajectories would still fire the done() trigger.
  • AutoTrajectory.getInitialPose() and getFinalPose() will now return Optional.empty() if alliance flipping is enabled and the alliance is not known.
  • Removed AutoTrajectory.atTimeAndPlace(). Use trajectory.atTime(String eventName).and(trajectory.atPose(String eventName)) or similar.
  • AutoTrajectory.atPose(...) did not check the rotation portion of the pose. atPose(...) now takes a rotation tolerance (default 3 degrees).
  • For the previous behavior of just checking the translation, AutoTrajectory.atTranslation() has been added, which is similar to atPose() but accepts Translation2ds.
  • AutoTrajectory.atPose(...) and atTranslation(..) now properly flip the target pose/translation every time the Trigger is checked, based on the current alliance if alliance flipping is enabled. If the alliance is unknown and flipping is enabled, the Trigger will be false.
  • AutoTrajectory.collectEventPoses now returns an ArrayList<Supplier<Optional<Pose2d>>> of poses that flip based on the current alliance and flipping enabled status.

AutoFactory

  • The Choreo controller function now only takes a SwerveSample or DifferentialSample, not an additional Pose2d for the current pose.
  • AutoFactory.clearCache() was replaced with AutoFactory.cache().clear() since the user can now access the trajectory cache.
  • A new parameter Consumer<Pose2d> resetOdometry has been added. This is used with AutoTrajectory to create a Command that calls the resetOdometry callback with the first pose of
  • trajectoryCommand() has been renamed to trajectoryCmd()
  • trajectoryLogger is no longer an Optional. It is a no-op if left unspecified.

AutoChooser

  • AutoChooser now implements Sendable, so can be logged with SmartDashboard.putData() or similar.

  • The API to add options has changed.

    • One option is to call addRoutine(String name, Supplier<AutoRoutine> generator).
    • The other is to call addCmd(String name, Supplier<Command> generator).
    • Both versions will call the given function when the option becomes selected.
  • AutoChooser's options are now functions that consume nothing and return an AutoRoutine or a Command. It is expected that users will call to their AutoFactory instance like they would a subsystem, instead of having it passed into the function.

  • The constructor is now new AutoChooser(), since the table name is handled by logging it like a Sendable, and the chooser does not need to pass a factory into the generator functions.

  • AutoChooser.getSelectedAutoRoutine() has been removed.

  • To run the selected auto, use Command selectedCommand() or Command selectedCommandScheduler().

  • The former is the analogue to the SendableChooser approach of getting the selected command and directly scheduling it in autonomousInit().
  • The latter returns a deferred Command. Use this if binding autonomous commands to run on autonomousInit() with RobotModeTriggers.autonomous(), since it does not evaluate the selected command as of the time of binding.
  • AutoChooser will only update if the DriverStation is connected (so that the alliance is known).

Changes to alliance-based trajectory flipping

Several issues were identified with the way ChoreoLib, especially the Java higher-level API, handled alliance flipping, given that the alliance can change after auto routines are created, and the alliance can be unknown before the call of autonmousInit.

  • The higher-level API now uses Optional<Pose2d> and Supplier<Optional<Pose2d>> instead of Pose2d in many places, to better represent poses that depend on the currently selected alliance.
  • AutoFactory/Choreo.createAutoFactory no longer take a BooleanSupplier mirrorTrajectory that returns true when trajectories should be flipped. Instead they take a BooleanSupplier useAllianceFlipping to enable alliance-based flipping in general and a separate Supplier<Optional<Alliance>> that defaults to DriverStation::getAlliance(). The BooleanSupplier was moved elsewhere in the parameter list to force a compiler error.

Trigger Sanitization

AutoRoutine.observe was added to help prevent problems where a Trigger on the default CommandScheduler loop is used when creating an AutoRoutine. This is especially easy to mess up when that Trigger is combined with a Trigger on the AutoRoutine event loop, using decorators like .and(), .or(), etc.

Combined Triggers are polled on the first Trigger's loop. Thus if the default-loop Trigger is first in a combination, the combined trigger will be polled every loop, even if the auto routine is not running and has not been run.

Example:

Pose2d shotLocation = ...;
// trajec...
Read more

Choreo v2025.0.0-beta-6

19 Oct 02:27
5c8d164

Choose a tag to compare

Pre-release

What's Changed

Full Changelog: v2025.0.0-beta-5...v2025.0.0-beta-6

Choreo v2025.0.0-beta-5

15 Oct 18:17
9d2c6e5

Choose a tag to compare

Pre-release

What's Changed

Full Changelog: v2025.0.0-beta-4...v2025.0.0-beta-5

Choreo v2025.0.0-beta-4

15 Oct 03:38
c0ae10b

Choose a tag to compare

Pre-release

This is the first release that requires the WPILib 2025 beta and 2025 roboRIO image.

What's Changed

Full Changelog: v2025.0.0-beta-3...v2025.0.0-beta-4