Skip to content

Releases: SleipnirGroup/Choreo

Choreo v2025.0.0-beta-9

20 Dec 05:29
4edab1b
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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

Choreo v2025.0.0-beta-3

12 Oct 06:44
6b63ad6
Compare
Choose a tag to compare
Pre-release

This is the last release that supports WPILib 2024.

Event Markers

Event markers have now been added.
image
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:
image
After:
image
With variable tolerance:
image
Across multiple waypoints:
image

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.
image

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.

image

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

02 Oct 21:54
721ea59
Compare
Choose a tag to compare
Pre-release

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

Full Changelog: v2025.0.0-beta-1...v2025.0.0-beta-2

Choreo v2025.0.0-beta-1

02 Oct 06:53
97f6b77
Compare
Choose a tag to compare
Pre-release

Choreo 2025

The SleipnirGroup team of developers is ready to release the open beta of Choreo for the 2025 season.

Get It Here!

|624x323

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:

  1. Default units (SI, radians) being inflexible, unintuitive, and forcing the user to convert by hand.
  2. No good way to define field constants or waypoint locations that are shared among all trajectories.
  3. 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.

|624x177

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.

|624x439

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.

|163x99

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.

|223x49

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.

|364x63

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!

|386x152

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.

|230x39

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 ...

Read more

Choreo v2025.0.0-alpha-3

01 Oct 20:55
cbef0db
Compare
Choose a tag to compare
Pre-release
[ci] Fix release executable upload (#798)

Choreo v2024.2.3

19 Jun 06:36
bb79db0
Compare
Choose a tag to compare

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.
image

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.

image

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.
image

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 doubles. 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 and moduleForcesY, 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

Read more