Releases: SleipnirGroup/Choreo
Choreo v2025.0.0-beta-9
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
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 returnOptional<Pose2d>
instead of a potentially nullPose2d
. This matches prior behavior of the other two languages (C++ withstd::optional
and Python with returningNone
) - [C++]
Trajectory::GetInitialState()
is nowGetInitialSample()
. - [Java, C++]
Trajectory.getInitialSample()/GetInitialSample()
andgetFinalSample()/GetFinalSample()
now take aboolean
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 loadAutoTrajectories
, instead ofAutoFactory.trajectory(String name, AutoRoutine routine)
. Trigger AutoRoutine.observe(BooleanSupplier condition)
has been added. This can be used to create Triggers that are part of theAutoRoutine
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 nowchoreo.auto.AutoRoutine
.AutoFactory.newLoop()
andvoidLoop()
were renamed tonewRoutine()
andvoidRoutine()
.
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 withAutoRoutine.active()
.AutoLoop.poll()
will return immediately if the alliance is needed for flipping and not known. This is the same behavior as ifpoll()
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 thedone()
trigger.AutoTrajectory.getInitialPose()
andgetFinalPose()
will now returnOptional.empty()
if alliance flipping is enabled and the alliance is not known.- Removed
AutoTrajectory.atTimeAndPlace()
. Usetrajectory.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 toatPose()
but acceptsTranslation2d
s. AutoTrajectory.atPose(...)
andatTranslation(..)
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 anArrayList<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
orDifferentialSample
, not an additionalPose2d
for the current pose. AutoFactory.clearCache()
was replaced withAutoFactory.cache().clear()
since the user can now access the trajectory cache.- A new parameter
Consumer<Pose2d> resetOdometry
has been added. This is used withAutoTrajectory
to create aCommand
that calls theresetOdometry
callback with the first pose of trajectoryCommand()
has been renamed totrajectoryCmd()
trajectoryLogger
is no longer anOptional
. It is a no-op if left unspecified.
AutoChooser
-
AutoChooser
now implementsSendable
, so can be logged withSmartDashboard.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.
- One option is to call
-
AutoChooser
's options are now functions that consume nothing and return anAutoRoutine
or aCommand
. It is expected that users will call to theirAutoFactory
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 aSendable
, 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()
orCommand selectedCommandScheduler()
.
- The former is the analogue to the
SendableChooser
approach of getting the selected command and directly scheduling it inautonomousInit()
. - The latter returns a deferred Command. Use this if binding autonomous commands to run on
autonomousInit()
withRobotModeTriggers.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>
andSupplier<Optional<Pose2d>>
instead ofPose2d
in many places, to better represent poses that depend on the currently selected alliance. AutoFactory
/Choreo.createAutoFactory
no longer take aBooleanSupplier mirrorTrajectory
that returns true when trajectories should be flipped. Instead they take aBooleanSupplier useAllianceFlipping
to enable alliance-based flipping in general and a separateSupplier<Optional<Alliance>>
that defaults toDriverStation::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...
Choreo v2025.0.0-beta-6
What's Changed
- Document release process by @calcmogul in #873
- Expand docs for estimating moment of inertia with SysId by @calcmogul in #875
- [choreo] Change default dt to 0.05 s by @calcmogul in #878
- [choreolib] Remove unused libraries and upgrade to 2025 NI libraries by @calcmogul in #879
- [choreolib] Fix swerve module force mirroring by @calcmogul in #877
- [choreolib] Upgrade to GSON 2.11.0 by @calcmogul in #874
- Bump version to v2025.0.0-beta-6 by @calcmogul in #880
Full Changelog: v2025.0.0-beta-5...v2025.0.0-beta-6
Choreo v2025.0.0-beta-5
What's Changed
- Rename macOS standalone executable by @calcmogul in #870
- Bump version to v2025.0.0-beta-5 by @calcmogul in #871
Full Changelog: v2025.0.0-beta-4...v2025.0.0-beta-5
Choreo v2025.0.0-beta-4
This is the first release that requires the WPILib 2025 beta and 2025 roboRIO image.
What's Changed
- Update C++ Autonomous Functionality by @r4stered in #849
- [choreolib] Fix trajectory splitting for C++ by @r4stered in #866
- [ci] Zip standalone executables by @calcmogul in #868
- [choreolib] Upgrade to WPILib 2025 by @calcmogul in #865
- Bump version to v2025.0.0-beta-4 by @spacey-sooty in #869
Full Changelog: v2025.0.0-beta-3...v2025.0.0-beta-4
Choreo v2025.0.0-beta-3
This is the last release that supports WPILib 2024.
Event Markers
Event markers have now been added.
GUI-wise, they function just like in 2024, except that the default command type is now "None", since these markers are also used for ChoreoLib timestamped triggers, and that the offset and wait time fields are time expressions.
Keep In Lane Constraint
A new Keep In Lane constraint has been added to replace the Straight Line constraint.
Before:
After:
With variable tolerance:
Across multiple waypoints:
This constraints the center of the robot to be within the two parallel lines for the entire scope of the constraint. Note that other keep-in constraints apply to the bumpers, unlike this one. Also note that the boundary lines actually extend to infinity, but are only drawn between the two waypoints.
Opening Previous Project
The behavior of re-opening a prior project has been re-added. Choreo betas have already been tracking the last-opened project, but for some users upgrading from 2024 versions directly to this beta, the app may try to open a 2024 project and fail.
ChoreoLib Changes
Renames
choreo.auto.AutoFactory.ChoreoAutoBindings -> choreo.auto.AutoFactory.AutoBindings
choreo.Choreo.ChoreoTrajectoryCache -> choreo.Choreo.TrajectoryCache
Breaking Changes
The AutoFactory constructor previously took a (Pose2d currentPose, Sample currentSample)->ChassisSpeeds
and a separate (ChassisSpeeds speeds)->void
. This is unnecessarily constraining. Now it just takes a (Pose2d currentPose, Sample currentSample)->void
as a control function. The ChoreoControlFunction
type alias for this parameter is also gone.
Control Function
Many have asked what to put for the control function. We intentionally don't provide a pre-made one because the function is more about plumbing than algorithms. Here is an example of a (swerve) control function that would be pasted into the drive subsystem.
public void choreoController(Pose2d curPose, SwerveSample sample) {
ChassisSpeeds speeds = ChassisSpeeds.fromFieldRelativeSpeeds(
new ChassisSpeeds(
xController.calculate(curPose.getX(), sample.x) + sample.vx,
yController.calculate(curPose.getY(), sample.y) + sample.vy,
thetaController.calculate(curPose.getRotation().getRadians(), sample.heading) + sample.omega
), curPose.getRotation());
this.driveRobotRelative(speeds);
}
While the basic controller is shown here, our approach allows teams to add logging, implement additional control influences like heading override, and even use the module forces and higher-derivative components of the sample as their drivetrain code permits. The latter is a main reason why the controller needs to encompass more than just outputting ChassisSpeeds.
Markers in ChoreoLib
There are two main ways to integrate the markers into ChoreoLib's autonomous utilities. For all ChoreoLib uses, the name of the marker is used to reference the event in bindings. The command type selected in the GUI is still a PathPlanner-only integration feature, and is not read by ChoreoLib.
Consider this event as an example.
The AutoBindings class specifies global command bindings. It is recommended to set up the bindings class entirely, before passing it into the AutoFactory.
new AutoFactory.AutoBindings()
.bind("Marker", Commands.print("This message triggers on any marker with that name, in any trajectory."))
The other way to use markers is with AutoTrajectory
, where they can be used to create triggers
Command myAuto() {
var loop = factory.newLoop("myAuto");
AutoTrajectory trajectory = factory.trajectory("MyAutoTrajectory", loop);
trajectory.atTime("Marker").onTrue(
Commands.print("This message only prints during this specific trajectory, but for every marker of that name in the trajectory."));
loop.enabled().onTrue(trajectory.cmd());
return loop.cmd();
}
What's Changed
- [trajoptlib] Make GetIndex() usage consistent and fix GetIndex() by @bruingineer in #820
- [choreolib] Remove Choreo suffix from remaining classes by @calcmogul in #822
- [build] Fixup CMake presets a bit by @spacey-sooty in #827
- [choreo] [trajoptlib] Use more robust time estimates for intervals and initial dt decision variable by @bruingineer in #821
- [docs] Treat JavaDoc and Doxygen warnings as errors by @calcmogul in #819
- [choreolib] Merge control function and outputChassisSpeeds by @spacey-sooty in #829
- [choreolib] Remove unused return type from ControlFunction by @spacey-sooty in #831
- [ci] Build TrajoptLib Rust in CI by @spacey-sooty in #832
- [trajoptlib] Make constraints use current and next index by @calcmogul in #830
- [trajoptlib] Fix order of trackwidth in FFI by @spacey-sooty in #834
- [ci] Upgrade to wpiformat 2024.42 by @calcmogul in #837
- [trajoptlib] Sort constraint types lexicographically by @calcmogul in #838
- [trajoptlib] Fix Translation2d and Rotation2d equality operators by @calcmogul in #839
- [trajoptlib] Use more compact differential drive model by @calcmogul in #833
- [trajoptlib] Add lane constraint by @spacey-sooty in #836
- Remove bad scope-fixing in heading conflict checks by @shueja in #842
- Use std instead of core by @spacey-sooty in #843
- [trajoptlib] Expose lane constraint to Rust by @spacey-sooty in #844
- Sort C++ PathBuilder functions and remove PathBuilder Rust trait by @calcmogul in #846
- [trajoptlib] fix inputModulus by @bruingineer in #847
- [choreo] Add Lane Constraint to UI by @spacey-sooty in #845
- Upgrade Cargo and pnpm dependencies by @calcmogul in #850
- [choreolib] Remove Choreo prefix from typedef by @calcmogul in #851
- [choreolib] Remove controller function typedef by @calcmogul in #852
- [choreo] Event marker refactor by @shueja in #773
- [choreolib] Add "struct:" prefix to struct serialization by @calcmogul in #857
- Use marker name for triggers; change spec to prepare for timestamp-range markers. by @shueja in #856
- Make sure trajectories have at least one split section by @shueja in #858
- Apply max height to variables panel. by @shueja in #859
- Add null tolerance when parsing commands in app. by @shueja in #861
- Filter event markers with null timestamps or empty names by @shueja in #862
- Re-enable opening of last project by @shueja in #863
- Change version to 2025.0.0-beta-3 by @shueja in #860
Full Changelog: v2025.0.0-beta-2...v2025.0.0-beta-3
Choreo v2025.0.0-beta-2
This update fixes a critical issue with ChoreoLib Java, leading to trajectories unable to load.
It also removes a useless item that was being written to files but was unused, and should not have been in the v2025.0.0 spec.
FYI: Documentation improvement is underway and is visible in the below changelog, but the published documentation is not tied to releases.
What's Changed
- [docs] Upgrade to Doxygen Awesome 2.3.4 by @calcmogul in #809
- Run wpiformat on all files by @calcmogul in #810
- Fix typos by @spacey-sooty in #805
- [choreolib] Fix issue with using reader twice in Java project file by @shueja in #815
- Fix typos by @calcmogul in #814
- Remove forcesAvailable item accidentally included in beta1 by @shueja in #817
- [docs] Fix nav bar and update ChoreoLib usage docs by @calcmogul in #813
- Change version to 2025.0.0-beta-2 by @shueja in #818
Full Changelog: v2025.0.0-beta-1...v2025.0.0-beta-2
Choreo v2025.0.0-beta-1
Choreo 2025
The SleipnirGroup team of developers is ready to release the open beta of Choreo for the 2025 season.
Thank you to all the teams that used Choreo in 2024 and shared your needs, struggles, and suggestions for improvement. Our work for 2025 has focused on many issues and enhancements.
General
Math Expressions with Variable and Unit Support:
This feature addresses a few struggles in 2024 Choreo:
- Default units (SI, radians) being inflexible, unintuitive, and forcing the user to convert by hand.
- No good way to define field constants or waypoint locations that are shared among all trajectories.
- No good way to define robot configuration in terms of other constants (i.e. bumper size and module placement in terms of frame size.
To improve user experience, we have replaced almost every number input in the application with mathematical expression inputs, powered by mathJS. MathJS has full dimensional analysis awareness, allowing inputs to be specified in whichever unit you like, and rejecting inputs that are not dimensionally correct. Choreo will also save the expression as you typed it, instead of evaluating and discarding it at the moment of submission.
Furthermore, Choreo allows you to define a project-wide set of variables that can be substituted into any appropriate expression in the project. Variables can be defined as single numbers with a variety of dimensions, but Choreo also has aggregate variables to organize the x, y, and heading components of an important pose.
The expression and variable features open up a wide range of capabilities, similar to parametric sketches in a CAD program. We’re excited to see how teams use these new tools.
Robot Config
Support for non-centered/non-rectangular modules
Choreo 2024 asked for a wheelbase, track width, bumper length, and bumper width. This described many robots, but especially in 2024, many robots had intakes that made the bumpers not centered at the center of rotation, or they had module placement that was not centered or even rectangular. Choreo 2025 makes robot configuration more flexible, permitting and honoring these configurations.
NOTE: due to path mirroring, Choreo 2025 still only supports module and bumper dimensions that are symmetric across the robot x-axis (the front-back line, meaning left-right mirror symmetry). In robot configuration, users only edit the left side of the robot dimensions.
The user interface design for robot configuration is an area of planned improvement.
Generation
Command-Line Generation
Choreo now ships with a command-line tool that takes in a .chor file and one or more associated .traj, and generates the .traj files, modifying them in-place. Further details will be described in the docs.
Fix Inability to Cancel Generation
This issue was inherent to the architecture of Choreo, but through the architecture changes related to command-line generation, we were able to make generation individually cancelable at any point.
(Proper) Continuous Heading Support
Choreo 2025 modifies the internal logic of the solver to handle robot rotation as a unit vector instead of an angle number. This allows Choreo to take the fastest rotational movement, even if it would previously wrap -pi to pi. Therefore, heading initial guesses are not as important to manually tweak.
Waypoints
Heading Initial Guess
Choreo 2025 removes the ability to set the heading initial guess on translation and empty waypoints. Due to the above improvements to the solver, and other logic implemented to automatically calculate heading initial guesses, the feature was unnecessary, counterproductive, and cluttered the UI.
Remove Initial Guess Points
Choreo 2025 removes the (non-constrainable) initial guess point waypoint type and subsumes its functionality into the Empty Waypoint, whose location can be constrained using Keep-In or Keep-Out Zones. The Empty Waypoint can be the endpoint of a path, but not the start point.
Individual Sample Override
Instead of a default sample override being applied to an entire path, with the same number of samples for each waypoint, Choreo 2025 has a checkbox on each waypoint to specify an individual override between that waypoint and the next.
Constraints
Interactive Constraint Overlay
The user interface for adding and editing constraints has been revised. Previously, a click target for adding a constraint was at every waypoint and the midpoint of every segment. Now, click one waypoint, then click the other, without the UI clutter.
When a constraint is selected, the field highlights the range it applies to. For constraints with additional field points/lines to modify (currently Point At and Keep In/Out Zones), the field will also display draggable field objects tied to the constraint.
The display also shows when hovering over the constraint in the sidebar.
Keep-In Zones/Field Border Constraint
Choreo 2025 adds a new type of constraint, which is a zone (currently rectangle or circle) that the robot must stay entirely inside, including the bumpers, for the duration of the constraint scope. For the first beta, a Keep-In Rectangle the size of the field will be part of new paths. If and when arbitrary (convex) polygons are supported as Keep-In zones, functionality will be added to add a polygon that better fits the field border.
Obstacles (Keep-Out Zones) as Constraints
Obstacles have been changed to be part of the constraints system and renamed to Keep-Out zones for consistency. While the solver still struggles in some obstacle setups, the ability to apply the constraint to only a section of the path makes the problem more feasible.
Toggleable Constraints
Choreo 2025 adds a checkbox to each constraint that allows the constraint to be disabled without being deleted. This can be useful for comparing the effects of individual constraints.
Generation Pre-checks/Feedback
Choreo 2025 expands the additional checks on the trajectory, performed before starting the solver, which are intended to identify conflicting constraints and other causes of infeasibility. New checks include:
- Verifying that Pose waypoints under Point-At constraints are compliant
- Verifying that 0 Max Angular Velocity constraints do not conflict with Pose waypoints with differing headings
- More to come!
Path Splitting
Splitting Paths
Splitting paths was previously done through a project-wide switch that made every Stop Point constraint be a path splitting point. In 2025, the Stop Point constraint is entirely separate from splitting. Every waypoint except for path endpoints has a checkbox which can be used to mark a waypoint as a split point. NOTE: Choreo does not enforce stopping at split points, but for most usage, adding a Stop Point constraint is still advised.
Artifacts
The releases now have many more artifacts than last year.
We support Windows arm64 and x86_64, MacOS aarch64 and x86_64, and Linux x86_64.
Users should normally be downloading the -setup installers for Windows, the .dmg for MacOS, and the AppImage, .deb for Debian and Ubuntu, or .rpm for Fedora.
For each platform, there is a separate executable for command-line generation. We hope to find a way to put the command-line functionality into the main Choreo app.
Finally, we have standalone executables. These are generated for potential bundling with WPILib 2025 and are not the recommended way of installing Choreo.
Choreolib
ChoreoLib 2025 Beta is compatible with WPILib 2024.
Python
ChoreoLib 2025 officially supports Python at PyPI (sleipnirgroup-choreolib). This is new for 2025.
C++/Java
For C++ and Java, the vendordep link is specific ...
Choreo v2025.0.0-alpha-3
[ci] Fix release executable upload (#798)
Choreo v2024.2.3
Choreo 2024.2.3
A Note on Support/Future Plans
This will be the last major feature update compatible with existing Choreo robot projects, but future bugfix updates to this version may occur if necessary. Please continue to report issues with 2024.2.3 on our bug tracker, but note that Choreo development will be shifting to features for 2025.
New Features in 2024.2.3
Solver Tolerance Relaxation: A change to the success conditions for generation has been made that relaxes the tolerance for feasibility/optimality, which was multiple orders of magnitude stricter than is sensible for the FRC usecase.
By relaxing this tolerance, we allow the optimizer to end earlier, and succeed in more conditions, without human-noticeable impact to the path.
Path Gradients: To present more information about the generated path, the trajectory line now has several options for a gradient along its length, mapped to various properties of the trajectory. See docs for details.
Solver Progress Animation: Choreo will now show intermediate states of the optimizer during generation. This is intended to give more visibility into what the optimizer is doing for a particular problem, and how it iteratively refines the initial guess in general.
Recording.2024-06-18.233111.mp4
Max Velocity Constraint Path Detail Fix: The Maximum Velocity constraint previously caused generation issues when set too low, because Choreo did not provide enough path detail for the slower section. This constraint has now been incorporated into the path detail counter to fix this issue.
Constraints
Point-At Constraint: This new constraint on segments or waypoints constrains the robot heading to face the given point, within the specified tolerance. Note that this constraint requires all waypoints in its range to be heading-unconstrained (i.e. translation waypoints), and works best when the robot enters the range already close to the desired angle. Additionally, rotating the initial-guess heading box of the translation waypoints towards the desired angle helps with optimization. This constraint is a feature we will continue refining for 2025, to require less manual work.
Maximum Angular Velocity Magnitude Constraint has been added.
Zero Velocity/Zero Angular Velocity constraints have been removed, and projects will be automatically upgraded to replace them with Max Velocity/Max Angular Velocity set to 0. The Stop Point constraint remains, and still has special behavior regarding trajectory splitting. A Max Velocity = 0 and Max Angular Velocity = 0 on a waypoint will not be considered a split point. NOTE: Maximum Velocity = 0 on a segment is now possible, but will be infeasible.
Quality-of-Life
New Keyboard Shortcuts: Ctrl/Cmd-O for File Open, and Escape to unselect the current top bar and sidebar selections.
Keyboard Shortcuts Doc Panel: A list of all the shortcuts and gestures such as pan/zoom/etc is now in Document Settings -> Controls.
Right-Click Waypoint Add Menu: Right-clicking on the field now brings up a waypoint type selector. Clicking a type adds that waypoint where you right-clicked. This does not modify your navbar selection, and works when a waypoint type is not selected in the navbar.
Waypoint Number on Waypoint Config Panel: The waypoint config panel is now marked with the currently selected waypoint number.
Selected Waypoint Draws on Top: In areas where several waypoints are closely positioned, the selected one will now draw on top, so it can be clicked and dragged.
Heading Wraparound Bug Fix: A bug that could cause the robot to take the "long way" when heading wrapping has been fixed.
ChoreoLib
(C++/Java) Removed ChoreoTrajectoryState::AsArray()
/ChoreoTrajectoryState.asArray()
due to the increased complexity of the ChoreoTrajectoryState structure.
(C++/Java) Exposed module force vectors from TrajoptLib: ChoreoTrajectoryState
has two new fields moduleForcesX
and moduleForcesY
, each an array of four double
s. These arrays represent the X and Y components of the module force vectors in Newtons, in field-space. Forces appear in the following order: [FL, FR, BL, BR]. These are not used in the provided ChoreoLib path follower, but are now available for teams to incorporate in custom followers, especially to take advantage of torque control on drive motors.
.traj Spec Changes
- Added
moduleForcesX
andmoduleForcesY
, two arrays of four doubles, to the trajectory state. See the ChoreoLib section above for the significance of these. These additions should not break parsing except in libraries which error on JSON fields which do not match to object fields.
What's Changed
- Update supported systems table in docs by @calcmogul in #417
- [build] Replace deprecated eslint plugin by @spacey-sooty in #420
- Add Git and version numbers to build requirements by @calcmogul in #425
- Feature: Path Gradient by @Awesomeplayer165 in #419
- Fix app name in task manager by @bruingineer in #430
- Upgrade TrajoptLib to require lower minimum CMake version by @calcmogul in #431
- Unselect sidebar and navbar items with escape key by @calcmogul in #429
- Make control interval count heuristic account for max velocity constraint by @bruingineer in #426
- Add PointAt constraint by @bruingineer in #427
- Feature: Add Open File Shortcut by @Awesomeplayer165 in #435
- Codebase: Refactor from VisibilityPanel to ViewOptionsPanel by @Awesomeplayer165 in #437
- Update TrajoptLib to fix Sleipnir memory leak by @calcmogul in #440
- Condense Actions .yml scripts by @calcmogul in #441
- Docs: View Options Panel by @Awesomeplayer165 in #436
- Bugfix: Angular Velocity Gradient by @Awesomeplayer165 in #433
- Document Path Gradient API by @Awesomeplayer165 in #434
- Solver status feedback by @shueja in #439
- Make selected waypoint always draw above others by @shueja in #444
- Feature: add modal fade out effect by @Awesomeplayer165 in #449
- Add list of keyboard shortcuts to document settings by @shueja in #447
- Feature: Context Menu by @Awesomeplayer165 in #448
- Upgrade TrajoptLib to use larger solver tolerance by @calcmogul in #451
- Fix error when converting undefined waypoint id to index by @shueja in #452
- Upgrade Node dependencies by @calcmogul in #454
- Fix ChoreoSwerveCommand C++ constructor copy warnings by @spacey-sooty in #457
- Clear undo history after opening file by @shueja in #463
- Max angular velocity constraint by @bruingineer in #462
- Fix comma typos in ChoreoLib example by @calcmogul in #465
- Don't apply max velocity constraint to end point by @bruingineer in #466
- Apply angle modulus to initial guess dtheta by @bruingineer in #467
- remove duplicate initial guess waypoint constraint check by @bruingineer in #471
- Use Temurin JDK to build ChoreoLib by @calcmogul in #474
- Use ubuntu-22.04 instead of ubuntu-latest by @calcmogul in #473
- Upgrade to spotless 6.25.0 by @calcmogul in #475
- Upgrade to Tauri 1.6.5 by @calcmogul in #477
- Upgrade to Tauri 1.6.6 by @calcmogul in #481
- Remove ChoreoTrajectoryState::AsArray() by @calcmogul in #482
- Sort and auto-approve apt packages by @calcmogul in #483
- Upgrade to prettier 3.3.2 by @calcmogul in #486
- Fix ChoreoTrajectoryState constructor docs typo by @calcmogul in #485
- Fix ChoreoTrajectoryState member docs typo by @calcmogul in #488
- Move copy and open directory buttons in menu to stable position. by @shueja in #490
- Add waypoint number to config panel by @shueja in #445
- Upgrade TrajoptLib to expose swerve ...