Giter Club home page Giter Club logo

choreo's People

Contributors

autumn-ou avatar awesomeplayer165 avatar bhjelstrom avatar bruingineer avatar calcmogul avatar codehc avatar galexy727 avatar jlbabilino avatar joshuaan avatar lewis-seiden avatar max-niederman avatar nlaverdure avatar omegametor avatar penguin212 avatar progfrogs avatar r4stered avatar rgodha24 avatar shueja avatar smartyguy001 avatar spacey-sooty avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

choreo's Issues

Add eslint to CI

It prints a lot of warnings on app startup that should get fixed. We can catch them in CI instead.

[0] Compiled with warnings.
[0] 
[0] [eslint] 
[0] src/components/field/Field.tsx
[0]   Line 4:8:   'DocumentManagerContext' is defined but never used  @typescript-eslint/no-unused-vars
[0]   Line 5:8:   'FieldOverlay' is defined but never used            @typescript-eslint/no-unused-vars
[0]   Line 8:8:   'Moveable' is defined but never used                @typescript-eslint/no-unused-vars
[0]   Line 17:3:  Useless constructor                                 @typescript-eslint/no-useless-constructor
[0] 
[0] src/components/field/svg/FieldOverlayRoot.tsx
[0]   Line 1:10:   'autorun' is defined but never used                   @typescript-eslint/no-unused-vars
[0]   Line 1:19:   'IReactionDisposer' is defined but never used         @typescript-eslint/no-unused-vars
[0]   Line 3:28:   'LegacyRef' is defined but never used                 @typescript-eslint/no-unused-vars
[0]   Line 3:39:   'ReactNode' is defined but never used                 @typescript-eslint/no-unused-vars
[0]   Line 7:10:   'IHolonomicWaypointStore' is defined but never used   @typescript-eslint/no-unused-vars
[0]   Line 8:8:    'styles' is defined but never used                    @typescript-eslint/no-unused-vars
[0]   Line 10:8:   'OverlayWaypointOld' is defined but never used        @typescript-eslint/no-unused-vars
[0]   Line 11:13:  'd3' is defined but never used                        @typescript-eslint/no-unused-vars
[0]   Line 20:7:   'FieldBackground' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0] 
[0] src/components/field/svg/OverlayWaypoint.tsx
[0]   Line 6:8:     'ReactDOM' is defined but never used                     @typescript-eslint/no-unused-vars
[0]   Line 7:10:    'DragContainerElement' is defined but never used         @typescript-eslint/no-unused-vars
[0]   Line 14:7:    'ROTATE_HANDLE_DIST' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0]   Line 131:28:  Expected '===' and instead saw '=='                      eqeqeq
[0]   Line 132:28:  Expected '===' and instead saw '=='                      eqeqeq
[0]   Line 140:11:  'px' is assigned a value but never used                  @typescript-eslint/no-unused-vars
[0] 
[0] src/components/navbar/PathSelect.tsx
[0]   Line 44:3:   Useless constructor                  @typescript-eslint/no-useless-constructor
[0]   Line 51:45:  Expected '!==' and instead saw '!='  eqeqeq
[0]   Line 51:91:  Expected '!==' and instead saw '!='  eqeqeq
[0] 
[0] src/components/sidebar/Sidebar.tsx
[0]   Line 10:9:   'faDiscord' is defined but never used  @typescript-eslint/no-unused-vars
[0]   Line 10:20:  'faGithub' is defined but never used   @typescript-eslint/no-unused-vars
[0]   Line 11:9:   'faGear' is defined but never used     @typescript-eslint/no-unused-vars
[0] 
[0] src/document/DocumentModel.ts
[0]   Line 215:15:  'element' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0] 
[0] Search for the keywords to learn more about each warning.
[0] To ignore, add // eslint-disable-next-line to the line before.
[0] 
[0] WARNING in [eslint] 
[0] src/components/field/Field.tsx
[0]   Line 4:8:   'DocumentManagerContext' is defined but never used  @typescript-eslint/no-unused-vars
[0]   Line 5:8:   'FieldOverlay' is defined but never used            @typescript-eslint/no-unused-vars
[0]   Line 8:8:   'Moveable' is defined but never used                @typescript-eslint/no-unused-vars
[0]   Line 17:3:  Useless constructor                                 @typescript-eslint/no-useless-constructor
[0] 
[0] src/components/field/svg/FieldOverlayRoot.tsx
[0]   Line 1:10:   'autorun' is defined but never used                   @typescript-eslint/no-unused-vars
[0]   Line 1:19:   'IReactionDisposer' is defined but never used         @typescript-eslint/no-unused-vars
[0]   Line 3:28:   'LegacyRef' is defined but never used                 @typescript-eslint/no-unused-vars
[0]   Line 3:39:   'ReactNode' is defined but never used                 @typescript-eslint/no-unused-vars
[0]   Line 7:10:   'IHolonomicWaypointStore' is defined but never used   @typescript-eslint/no-unused-vars
[0]   Line 8:8:    'styles' is defined but never used                    @typescript-eslint/no-unused-vars
[0]   Line 10:8:   'OverlayWaypointOld' is defined but never used        @typescript-eslint/no-unused-vars
[0]   Line 11:13:  'd3' is defined but never used                        @typescript-eslint/no-unused-vars
[0]   Line 20:7:   'FieldBackground' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0] 
[0] src/components/field/svg/OverlayWaypoint.tsx
[0]   Line 6:8:     'ReactDOM' is defined but never used                     @typescript-eslint/no-unused-vars
[0]   Line 7:10:    'DragContainerElement' is defined but never used         @typescript-eslint/no-unused-vars
[0]   Line 14:7:    'ROTATE_HANDLE_DIST' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0]   Line 131:28:  Expected '===' and instead saw '=='                      eqeqeq
[0]   Line 132:28:  Expected '===' and instead saw '=='                      eqeqeq
[0]   Line 140:11:  'px' is assigned a value but never used                  @typescript-eslint/no-unused-vars
[0] 
[0] src/components/navbar/PathSelect.tsx
[0]   Line 44:3:   Useless constructor                  @typescript-eslint/no-useless-constructor
[0]   Line 51:45:  Expected '!==' and instead saw '!='  eqeqeq
[0]   Line 51:91:  Expected '!==' and instead saw '!='  eqeqeq
[0] 
[0] src/components/sidebar/Sidebar.tsx
[0]   Line 10:9:   'faDiscord' is defined but never used  @typescript-eslint/no-unused-vars
[0]   Line 10:20:  'faGithub' is defined but never used   @typescript-eslint/no-unused-vars
[0]   Line 11:9:   'faGear' is defined but never used     @typescript-eslint/no-unused-vars
[0] 
[0] src/document/DocumentModel.ts
[0]   Line 215:15:  'element' is assigned a value but never used  @typescript-eslint/no-unused-vars
[0] 
[0] webpack compiled with 1 warning

Increase user feedback

From #115 and others

  • solver failure: error snackbar
  • save file load failure/invalid: error snackbar
  • Export Trajectory: disable w/tooltip if no trajectory samples exist

Can't Generate Path

After making a fairly long path, the generate button becomes disabled with the text "Generate path (needs 2 waypoints)". This is on the current alpha release version.

Path:

{
    "version": "v0.0.0",
    "robotConfiguration": {
        "mass": 63.5029,
        "rotationalInertia": 5.6,
        "wheelMaxTorque": 1.9,
        "wheelMaxVelocity": 16,
        "wheelbase": 0.57785,
        "trackWidth": 0.57785,
        "bumperLength": 0.9,
        "bumperWidth": 0.9,
        "wheelRadius": 0.0508
    },
    "paths": {
        "Broken Path": {
            "waypoints": [
                {
                    "x": 1.847985029220581,
                    "y": 2.9409890174865723,
                    "heading": 3.1286062808745037,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 2.8469085693359375,
                    "y": 3.332319974899292,
                    "heading": 3.141592653589793,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 5.946660995483398,
                    "y": 3.414705514907837,
                    "heading": 0,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 6.8940935134887695,
                    "y": 3.404407262802124,
                    "heading": 0,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 6.430675506591797,
                    "y": 3.404407262802124,
                    "heading": 0,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 5.26698112487793,
                    "y": 3.414705514907837,
                    "heading": 3.1254650337956287,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 2.970486640930176,
                    "y": 3.404407262802124,
                    "heading": 3.134599712470048,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 1.9612650871276855,
                    "y": 3.6000726222991943,
                    "heading": 3.141592653589793,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 2.8366103172302246,
                    "y": 3.3735127449035645,
                    "heading": 0.00961515464871096,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 5.339068412780762,
                    "y": 3.394109010696411,
                    "heading": 0,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 6.337991714477539,
                    "y": 3.929614543914795,
                    "heading": 0.7562093421285745,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 6.852900505065918,
                    "y": 4.413629055023193,
                    "heading": 0.7509291723814462,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 6.440973281860352,
                    "y": 4.053192615509033,
                    "heading": 0.7356656243694437,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 5.318471908569336,
                    "y": 3.414705514907837,
                    "heading": 3.126778992329981,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 2.795417547225952,
                    "y": 3.3735127449035645,
                    "heading": 2.9729955306423057,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                },
                {
                    "x": 2.0333521366119385,
                    "y": 3.476494550704956,
                    "heading": 3.0118902024990373,
                    "velocityMagnitude": 0,
                    "velocityAngle": 0,
                    "xConstrained": true,
                    "yConstrained": true,
                    "headingConstrained": true,
                    "velocityMagnitudeConstrained": false,
                    "velocityAngleConstrained": false,
                    "angularVelocity": 0,
                    "angularVelocityConstrained": false,
                    "controlIntervalCount": 0
                }
            ],
            "trajectory": null
        }
    }
}

Allow a different robot configuration for each path

Due to the current state of the trajectory generator, the physics parameters of the robot often need to be modified and tuned for each path. This is not ideal, but it's just the way it is right now. I know this from using HelixNavigator in the 2023 season.

If this feature is not added, users will be forced into creating a separate document file for each path, not utilizing the multi-path selection user interface within the app.

Pipe robot config to generate function from frontend.

Currently, the robot config set in the frontend is not plumbed to the Rust function for generating trajectories.
Create the proper structs in Rust and JS plumbing to accept a robot config in the generate command.

Running in MacOS not working

Whenever I try to run the program on MacOS (Intel Silicon), I'm getting issues with it finding the dylib for /usr/local/lib/libTrajoptLib.dylib. I get the error of

dyld[53276]: Library not loaded: @rpath/libTrajoptLib.dylib
  Referenced from: <A497B11A-EBBB-325A-9BD5-006564060FE6> /Users/bacon/dev/frc/UntitledWaypointEditor/src-tauri/target/debug/untitled-waypoint-editor
  Reason: tried: '/Users/bacon/dev/frc/UntitledWaypointEditor/src-tauri/target/debug/libTrajoptLib.dylib' (no such file), '/Users/bacon/dev/frc/UntitledWaypointEditor/src-tauri/target/debug/libTrajoptLib.dylib' (no such file), '/usr/local/lib/libTrajoptLib.dylib' (no such file), '/usr/lib/libTrajoptLib.dylib' (no such file, not in dyld cache)

Is there a step that's not included in the readme that I'm missing?

Note: I've tried setting LD_LIBRARY_PATH and it doesn't seem to affect anything.

Add keybinds

Keybinds for the most used parts of the UI:

  • The generate button
  • Showing and hiding the grid, field, etc.
  • Saving, exporting, opening files
  • Playing and pausing the animation

Pass path data to native code as serialized JSON string, not FFI arguments

This enables more flexibility and less duplication of data types.

There are two main options to do this:
1.
a. TS frontend sends path string to Tauri Rust backend through a Tauri command.
b. Rust parses it and sets up TrajoptLib through CXX bindings similar to the existing setup.
c. TrajoptLib returns an array of samples, which Rust serialized and returns as the command response.
2. Same as 1 but Rust directly forwards the string to be parsed by TrajoptLib, negating the need for individual bindings.

Suggestions for improved numeric input boxes

Here is my idea for a better way of doing the numeric input text boxes:

  • The Input component should have three states: non-focused, focused, and editing.
  • non-focused is the default state which is shown before the user interacts with anything.
  • In the non-focused state, only three digits of precision are shown, and the value rendered is bound to the current state in the document model.
  • When the user clicks on the text box area, the state goes to focused.
  • In the focused state, all digits of precision are shown, and the value rendered is bound to the current state in the document model. The text is always completely selected in the focused state.
  • When in the focused or editing state, if the user clicks outside the box, it goes back to the non-focused state.
  • When in the focused state, if the user types anything in the text box or makes it so the text isn't completely selected, it goes into the editing state.
  • In the editing state, the value rendered is not bound to the state in the document model.
  • When in the editing state and the user presses "Enter", the value in the text box is saved in the document model, and the state switches back to focused
  • When in the editing state and the user presses "Escape", the state switches back to focused and whatever value is in the text box is thrown away (it won't save the new value and will revert back to the value before editing).

Note that this approach would mean the value in the document model won't update until the user presses "Enter". I think that's fine though.

Dalton's Feedback

I didn't actually check if any issues are already open, but this is a collection of my feedback.

Feature Requests

  • Custom field image

Bugs

  • No way to close "Robot Config" after clicking on it.
  • Clicking off of a path name should save the name (I didn't realize I needed to press "enter" to save the path)
  • F5 and right click menu should be disabled. I accidentally refreshed and lost all my progress
  • After deleting all waypoints, I was unable to add any?

Choreo_fTp8ZgqL4I

  • Memory leak when adding paths. Added 100 paths, initially spiked to 200MB then settled down to 100. Was initially 80. I can reliably reproduce this and have gotten it to about 300MB settled after ~300 paths.

General Things

  • Application started very tiny (maybe like 600x600px)
  • Click area for an existing waypoint is too tiny
  • Opening an invalid JSON doesn't do anything (my shrek movie as JSON passed), but it should at least tell the user it's bad.
  • Creating a new file and attempting to export a trajectory (no points created), does nothing.
    • In general, a couple more things need user feedback (notifying the user something is happening)
    • e.g. generating trajectory,
  • Tooltips for Mass/Mol/Robot constants should be added
  • Choreo version should be added somewhere, maybe titlebar of the application (for user debugging, I just pulled the artifact from
    53be0fa.
  • Launches with a cmdline, that should probably be hidden
  • Name of the app in task manager seems incorrect
    image

Overall thoughts

Application is quite stable for me. Wasn't able to force a crash without doing malicious things (deleting app/system files). My complains are honestly pretty minor.

Add commandline interface

In the spirit of one-click builds, I'd like the build task of a freshly cloned robot project to noninteractively generate trajectories and output them to the deploy folder for GradleRIO to deploy. A noninteractive commandline mode would facilitate this.

This makes tweaking waypoints before a match via the project JSON or via the UI less error-prone, because it ensures the generated outputs during a deploy are up to date.

Memory leak when adding paths

From #115

Memory leak when adding paths. Added 100 paths, initially spiked to 200MB then settled down to 100. Was initially 80. I can reliably reproduce this and have gotten it to about 300MB settled after ~300 paths.

Hypothesis: is this the undo history? investigate limited-length undo history.

Linux version installed with `.deb` fails to run

Opening Choreo:

./choreo: error loading shared libraries: libcasadi.so.3.7: cannot open shared object file: No such file or directory

So choreo is able to find libTrajoptLib.so, but it can't find libcasadi.so.3.7.

objdump -x libTrajoptLib.so |grep 'R.*PATH'

This yields the following:

RUNPATH              /home/runner/work/Choreo/Choreo/src-tauri/target/release/build/trajoptlib-c5c9b7a7279c9368/out/lib

There should be another rpath entry for the current directory, so $ORIGIN/.

This is likely an issue with TrajoptLib not adding the proper rpath entries to libTrajoptLib.so.

Inconsistent pointer behavior

The mouse pointer currently changes to a finger when you hover above the orientation handle for a waypoint.
For consistency, recommend also doing this when you hover above the x-y position handle.

`npm run tauri dev` can't find libTrajoptLib.so

I followed these steps:

  1. Delete the target folder and any left over .so files in the src-tauri folder.
  2. Run npm install from the repo root
  3. Run npm run tauri dev from the repo root
    Finished dev [unoptimized + debuginfo] target(s) in 2m 30s
/home/tav/git/Choreo/src-tauri/target/debug/choreo: error while loading shared libraries: libTrajoptLib.so: cannot open shared object file: No such file or directory

Here's what's in my folders:

[tav@myriad Choreo]$ ls
icon        node_modules       public     spec       tsconfig.json
index.html  package-lock.json  README.md  src        tsconfig.node.json
LICENSE     package.json       scripts    src-tauri  vite.config.ts
[tav@myriad src-tauri]$ pwd
/home/tav/git/Choreo/src-tauri
[tav@myriad src-tauri]$ ls
build.rs                    libcasadi_nlpsol_ipopt.so      libTrajoptLib.so
Cargo.lock                  libcoinmetis.so.2              src
Cargo.toml                  libcoinmumps.so.3              target
icons                       libgfortran-040039e1.so.5.0.0  tauri.conf.in.json
libcasadi-tp-openblas.so.0  libipopt.so.3                  tauri.conf.json
libcasadi.so.3.7            libquadmath-96973f99.so.0.0.0
[tav@myriad debug]$ pwd
/home/tav/git/Choreo/src-tauri/target/debug
[tav@myriad debug]$ ls
build  choreo  choreo.d  deps  examples  incremental

Allow exporting a trajectory file

Add a button to export just the trajectory (sequence of sample points). These files could be placed in the “deploy” directory of a robot project so the robot code would have access to them.

Split README into user and developer files

There's a lot of detail for developers in the main readme that users don't care about. The main readme should talk about high-level things the user cares about, as well as demos and how to use it.

A later section can link to a document with how to build it, since there's so much.

Visualize the optimization

Use TrajoptLib's interface for getting the current state of the solver variables to visualize the evolution of the optimization.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.