Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iterate through changed links only in UpdateSim #678

Merged
merged 1 commit into from
Apr 1, 2021

Conversation

adlarkin
Copy link
Contributor

@adlarkin adlarkin commented Mar 10, 2021

Signed-off-by: Ashton Larkin [email protected]

🎉 New feature

requires:

related to gazebosim/gz-physics#219

Summary

As mentioned in gazebosim/gz-physics#219, UpdateSim in the ign-gazebo physics system iterates over all links, because it has no way of knowing which links have moved. gazebosim/gz-physics#223 and gazebosim/gz-physics#238 should resolve this issue, so this PR uses each of these ign-physics PRs (and gazebosim/gz-math#196) to have UpdateSim iterate over just the links that have moved.

As a result of this change, the link pose caching that was done in #669 is no longer needed if a physics engine is being used that writes output pose data (we still need the caching done in #656 regardless of whether the physics engine being used writes output pose data or not). I also had to add some functionality to the EntityFeatureMap class (introduced in #586) that maps physics link entity IDs (std::size_t) to the corresponding entity in ign-gazebo (the link data that ign-gazebo gets from ign-physics contains a link's pose and link ID).

This new behavior is optional. In other words, if a physics engine is being used that writes output pose data, then the output pose data will be used to update the simulation state. If a physics engine is being used that does not write output pose data, then the approach for updating the simulation state remains unchanged (getting all link poses from the latest step via ECM).

Test it

Testing this PR can follow the testing approach taken in #656 and #669, which involves profiling a world as follows:

Profiling the world above can be done with both DART and TPE physics engines. In the comparisons below, the metrics being compared to (i.e., before this PR) are being done on commit 2bf29c2 of ign-gazebo, and commit gazebosim/gz-physics@54d2a44 of ign-physics.

TPE

Static

Before this PR:

  • RTF: 21%
  • UpdateSim time: 3ms

static_tpe_pre_PR

After this PR:

  • RTF: 40%
  • UpdateSim time: 0.67ms

static_tpe_post_PR

Non-Static

Before this PR:

  • RTF: 4.8%
  • UpdateSim time: 13.6ms

non_static_tpe_pre_PR

After this PR:

  • RTF: 13.8%
  • UpdateSim time: 0.8ms

non_static_tpe_post_PR

DART

Static

Before this PR:

  • RTF: 8.5%
  • UpdateSim time: 4.1ms

static_dart_pre_PR

After this PR:

  • RTF: 12.5%
  • UpdateSim time: 1.1ms

static_dart_post_PR

Non-Static

Before this PR:

  • RTF: 0.95%
  • UpdateSim time: 15.6ms

non_static_dart_pre_PR

After this PR:

  • RTF: 1.1%
  • UpdateSim time: 2.8ms

non_static_dart_post_PR

Takeaways

The TPE performance improvement is noticeable (2x RTF increase for static shapes, and 3x RTF increase for non-static shapes). The performance improvement for DART is not as noticeable (1.5x RTF increase for static shapes, and no real change in RTF for non-static shapes), probably because UpdateSim is a small part of the Update in the physics system - for DART, most of the work in the physics system Update comes from the physics step itself, which we probably don't have a ton of control over when it comes to optimization.

Future Work

Although there are noticeable performance improvements here, there are a few things that I'd like to do next to create even more performance improvements:

  1. address Add a topologically sorted list of models to the physics system #706 - if you take a look at the profiler images above, you'll notice that most of the time in UpdateSim is taken up by Models, which is a loop that updates model poses if necessary. Since we now only have the links that have changed after each physics step, it would be nice to make a bi-directional mapping between models and their canonical links (currently, we only have a mapping from a model to its canonical link - see Support individual canonical links for nested models #685). That way, we can loop through all of the changed links and update the models that have this link as its canonical link instead of looping through all of the models and seeing if a model's canonical link has changed pose. I believe that this would decrease the Model block time significantly.
  2. optimize the EntityComponentManager::Each call. As I mentioned in iterate through changed links only in UpdateSim #678 (comment), reducing the number of components used in the ecm.Each call sped up the time for the ecm.Each call to complete by approximately 3x (wow!). Considering how often we use ecm.Each in ign-gazebo, I imagine that optimizing this function call would result in a massive performance benefit. I have created an issue for this so that it can be tracked: Improve the performance of EntityComponentManager::Each #711

Checklist

  • Signed all commits for DCO
  • Added tests
  • Added example and/or tutorial
  • Updated documentation (as needed)
  • Updated migration guide (as needed)
  • codecheck passed (See contributing)
  • All tests passed (See test coverage)
  • While waiting for a review on your PR, please help review another open pull request to support the maintainers

Note to maintainers: Remember to use Squash-Merge

@github-actions github-actions bot added the 🔮 dome Ignition Dome label Mar 10, 2021
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch from ba6fc7f to bebb175 Compare March 10, 2021 17:56
@chapulina chapulina added enhancement New feature or request needs upstream release Blocked by a release of an upstream library performance Runtime performance labels Mar 10, 2021
@adlarkin adlarkin self-assigned this Mar 11, 2021
Copy link
Contributor

@azeey azeey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At a high level, my main concern is that this changes the requirement on the ign-physics plugin such that the ForwardStep::World::Step function now has to return the world poses. We have been trying not to require features in a released version and this feels like we're breaking that. I'd like to hear @chapulina's thoughts on this.

A possible workaround to maintain backward compatibility would be to populate stepOutput in ign-gazebo if the return of ForwardStep::World::Step doesn't contain any world poses.

@chapulina
Copy link
Contributor

We have been trying not to require features in a released version

+1, we should be mindful of not introducing new required APIs that may break existing 3rd party physics engines.

possible workaround to maintain backward compatibility

That sounds like a good idea.

Another thing to consider is working on this feature on top of Edifice so that we're free to change requirements and implement the feature in the ideal way. Once that's settled, we can think of how to backport it.

@adlarkin
Copy link
Contributor Author

Thanks for the comments, @azeey and @chapulina. I am going to update this PR and gazebosim/gz-physics#223 to target Edifice, and then we can determine the next best steps.

@adlarkin adlarkin changed the base branch from ign-gazebo4 to main March 15, 2021 17:25
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch from 4942e42 to 2e844bf Compare March 15, 2021 17:29
@adlarkin adlarkin changed the base branch from main to ign-gazebo4 March 15, 2021 19:05
@adlarkin adlarkin changed the base branch from ign-gazebo4 to main March 15, 2021 19:07
@chapulina chapulina added 🏢 edifice Ignition Edifice and removed 🔮 dome Ignition Dome labels Mar 15, 2021
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch from 2e844bf to 9a3aaa8 Compare March 15, 2021 19:46
@adlarkin
Copy link
Contributor Author

This is now ready for review, and targets Edifice (main branch).

As I mentioned in the PR description, this change eliminates the need for #669, which is something to keep in mind when we make the next forward-port.

We'll need to make a minor release for ign-math6 so that gazebosim/gz-math#196 can be used.

@adlarkin adlarkin marked this pull request as ready for review March 16, 2021 17:32
@adlarkin adlarkin requested review from azeey, chapulina and iche033 March 16, 2021 17:32
@chapulina chapulina added the beta Targeting beta release of upcoming collection label Mar 17, 2021
@adlarkin
Copy link
Contributor Author

As I mentioned in the PR description, this change eliminates the need for #669, which is something to keep in mind when we make the next forward-port.

I just updated this branch to include the changes in #695, and resolved conflicts to use the changes in this PR instead of the changes in #669: 1074b5a

Copy link
Contributor

@azeey azeey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@azeey
Copy link
Contributor

azeey commented Mar 23, 2021

@osrf-jenkins run tests please

@adlarkin
Copy link
Contributor Author

LGTM!

I'm making one last change that will make this new physics output optional (if poses aren't a part of ignition::physics::ForwardStep::Output, then the physics system will iterate through all of the links in UpdateSim instead of through the links in ignition::physics::ForwardStep::Output). Once that change is in, I believe this can be merged.

@adlarkin
Copy link
Contributor Author

adlarkin commented Mar 25, 2021

Conflicts have been resolved in dca0f66, but it looks like there's a new test failure that I need to resolve (INTEGRATION_wind_effects). Using physics engine output to determine which links changed is still optional behavior (if a physics engine doesn't write output, the ECM is used like we've been doing up until this point).

@azeey, I had to make a few changes to the physics system when resolving merge conflicts in order to support the work you did in #685. The main difference that was made was including a modelWorldPoses cache since the frame data that is used in UpdateSim only contains links that have changed instead of all links (which means that we don't update every model's pose every time, so we should cache model poses to avoid losing pose information for models that aren't updated). Also, as we discussed offline, I made some optimizations to the model pose update ecm.each call in 2571923.

To give more insight into the benefits of 2571923, here are the profiler results before this commit using the same testing methodology described in the PR description (static models world with TPE). As we can see, the ecm.Each model loop takes 2.5ms:

ecm_each_original

After applying the changes made in 2571923, the ecm.Each model loop takes 0.79ms:

modified_ecm_each

It's interesting to see how much faster the ecm.Each call can be when it is used with fewer components (in this case, we only use the components we absolutely need with ecm.Each, and then query other components later on if we need them). Perhaps optimizing ecm.Each is something I can look into as I continue to work on simulation performance updates.


Testing the optional behavior

To revert to the old behavior of using the ECM to go through all links for updates instead of using physics output for updating links, make the following changes in ign-physics (this is assuming you're on commit b10a4c3 in ign-physics):

diff --git a/dartsim/src/SimulationFeatures.cc b/dartsim/src/SimulationFeatures.cc
index 2c4ef89..e7aa863 100644
--- a/dartsim/src/SimulationFeatures.cc
+++ b/dartsim/src/SimulationFeatures.cc
@@ -59,7 +59,7 @@ void SimulationFeatures::WorldForwardStep(
 
   // TODO(MXG): Parse input
   world->step();
-  this->Write(_h.Get<ChangedWorldPoses>());
+  //this->Write(_h.Get<ChangedWorldPoses>());
   // TODO(MXG): Fill in state
 }
 
diff --git a/tpe/plugin/src/SimulationFeatures.cc b/tpe/plugin/src/SimulationFeatures.cc
index 30db7b4..10992c3 100644
--- a/tpe/plugin/src/SimulationFeatures.cc
+++ b/tpe/plugin/src/SimulationFeatures.cc
@@ -62,7 +62,7 @@ void SimulationFeatures::WorldForwardStep(
     }
   }
   world->Step();
-  this->Write(_h.Get<ChangedWorldPoses>());
+  //this->Write(_h.Get<ChangedWorldPoses>());
 }

You can also add some print statements inside the if...else block of the PhysicsPrivate::ChangedLinks method in the physics system to get further validation on which method is being used for recording link updates.

@chapulina
Copy link
Contributor

Removing from beta, this can come in a minor release.

@chapulina chapulina removed the beta Targeting beta release of upcoming collection label Mar 25, 2021
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch 3 times, most recently from 8c9da97 to 4f44bfc Compare March 26, 2021 02:37
@adlarkin
Copy link
Contributor Author

it looks like there's a new test failure that I need to resolve (INTEGRATION_wind_effects)

I fixed the failure in 4f44bfc. The issue was that since we are now only updating the simulation if a pose change greater than 1e-6 took place (check in ign-physics if the engine writes output and check in ign-gazebo if the physics engine doesn't write output), the object wasn't moving fast enough after applying the wind force in the test. As a result, it took several iterations after applying the wind force for the object to undergo a pose change greater than 1e-6, so an update wasn't registered until this point, and this check failed:

ign-gazebo/test/integration/wind_effects.cc:325: Failure
Expected: (std::fabs(lastVelMagnitude - velMagnitude)) < (1e-6), actual: 6.34714e-05 vs 1e-06

[  FAILED  ] WindEffectsTest.TopicsAndServices (90 ms)
[----------] 4 tests from WindEffectsTest (1445 ms total)

[----------] Global test environment tear-down
[==========] 4 tests from 1 test suite ran. (1445 ms total)
[  PASSED  ] 3 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] WindEffectsTest.TopicsAndServices

 1 FAILED TEST

I increased the amount of wind force applied so that the object has a higher velocity, which results in more frequent physics updates after the wind force is no longer applied. This ensures that we don't see any velocity jumps after applying the wind force in the INTEGRATION_wind_effects test.

@adlarkin
Copy link
Contributor Author

I have addressed all review feedback and updated this PR with the latest updates from the main branch. All tests and codecheck pass for me locally. I believe this is ready for final review!

@adlarkin adlarkin requested a review from azeey March 26, 2021 15:46
Copy link
Contributor

@azeey azeey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work!!

@codecov
Copy link

codecov bot commented Mar 31, 2021

Codecov Report

❗ No coverage uploaded for pull request base (ign-gazebo5@0802698). Click here to learn what that means.
The diff coverage is n/a.

❗ Current head d3ee64a differs from pull request most recent head 1924de9. Consider uploading reports for the commit 1924de9 to get more accurate results
Impacted file tree graph

@@              Coverage Diff               @@
##             ign-gazebo5     #678   +/-   ##
==============================================
  Coverage               ?   65.32%           
==============================================
  Files                  ?      240           
  Lines                  ?    17624           
  Branches               ?        0           
==============================================
  Hits                   ?    11513           
  Misses                 ?     6111           
  Partials               ?        0           

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 0802698...1924de9. Read the comment docs.

@adlarkin
Copy link
Contributor Author

adlarkin commented Apr 1, 2021

Now that Edifice has been released, should I change the base branch to ign-gazebo5 before merging?

@chapulina chapulina changed the base branch from main to ign-gazebo5 April 1, 2021 19:03
adlarkin added a commit that referenced this pull request Apr 1, 2021
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch from 2c24f9d to 0b61cb1 Compare April 1, 2021 19:36
@adlarkin adlarkin removed the needs upstream release Blocked by a release of an upstream library label Apr 1, 2021
@adlarkin adlarkin mentioned this pull request Apr 1, 2021
8 tasks
@adlarkin adlarkin force-pushed the adlarkin/use_step_output_data branch from 0b61cb1 to 1924de9 Compare April 1, 2021 21:24
@adlarkin adlarkin merged commit 1924de9 into ign-gazebo5 Apr 1, 2021
@adlarkin adlarkin deleted the adlarkin/use_step_output_data branch April 1, 2021 22:43
scpeters added a commit that referenced this pull request May 19, 2021
* 🎈 3.8.0 (#688)

Signed-off-by: Louise Poubel <[email protected]>

* Make it so joint state publisher is quieter (#696)

Signed-off-by: Michael Carroll <[email protected]>

* [BULLET] Making GetContactsFromLastStepFeature optional in Collision Features (#690)

* GetContactsFromLastStepFeature made optional

Signed-off-by: Tomas Lorente <[email protected]>

Co-authored-by: Addisu Z. Taddese <[email protected]>

* Add test for thermal object temperatures below 0 kelvin (#621)

Signed-off-by: Ashton Larkin <[email protected]>

* Scenebroadcaster sensors (#698)

* Add sensors to scene broadcaster

Signed-off-by: Nate Koenig <[email protected]>

* Update src/systems/scene_broadcaster/SceneBroadcaster.cc

Co-authored-by: Michael Carroll <[email protected]>

* Fix codecheck

Signed-off-by: Nate Koenig <[email protected]>

Co-authored-by: Nate Koenig <[email protected]>
Co-authored-by: Michael Carroll <[email protected]>

* Fix diffuse and ambient values for ackermann example (#707)

Signed-off-by: Ammaar Solkar <[email protected]>

* 🎈 5.0.0 (#731)

Signed-off-by: Louise Poubel <[email protected]>

* Support configuring particle scatter ratio in particle emitter system (#674)

* set particle scatter ratio through sdf

Signed-off-by: Ian Chen <[email protected]>

* address feedback

Signed-off-by: Ian Chen <[email protected]>

* add todo note about merging forward

Signed-off-by: Ian Chen <[email protected]>

Co-authored-by: Ashton Larkin <[email protected]>

* Update PlaybackScrubber description (#733)

Signed-off-by: Ammaar Solkar <[email protected]>

* Iterate through changed links only in UpdateSim (#678)

Signed-off-by: Ashton Larkin <[email protected]>

* Do not pass -Wno-unused-parameter to MSVC compiler (#716)

Signed-off-by: Silvio Traversaro <[email protected]>

* Use Protobuf_IMPORT_DIRS instead of PROTOBUF_IMPORT_DIRS for compatibility with Protobuf CMake config (#715)

Signed-off-by: Silvio Traversaro <[email protected]>

* Fix component inspector shutdown crash (#724)

Signed-off-by: Louise Poubel <[email protected]>

Co-authored-by: Alejandro Hernández Cordero <[email protected]>

* Validate step size and RTF parameters (#740)

Only set them if they are strictly positive.

Signed-off-by: Luca Della Vedova <[email protected]>

* Fix compute_rtfs arguments (#737)

Signed-off-by: Caio Amaral <[email protected]>

* Fixed collision visual bounding boxes (#746)

Signed-off-by: Jenn Nguyen <[email protected]>

* Fix CMakelists.txt merge

Signed-off-by: Nate Koenig <[email protected]>

* ECM's ChangedState gets message with modified components (#742)

* ecm's ChangedState to contain modified components

Signed-off-by: Jenn Nguyen <[email protected]>

* updated log_system test

Signed-off-by: Jenn Nguyen <[email protected]>

* removed unnecessary calls

Signed-off-by: Jenn Nguyen <[email protected]>

Co-authored-by: Ian Chen <[email protected]>

* fixed particle emitter forward playback (#745)

Signed-off-by: Jenn Nguyen <[email protected]>

* Merge pull request #730 from ignitionrobotics/particle_emitter

Particle emitter based on SDF

* 4 7 0 prep (#755)

* Prepare for 4.7.0

Signed-off-by: Nate Koenig <[email protected]>

* Added placeholder

Signed-off-by: Nate Koenig <[email protected]>

Co-authored-by: Nate Koenig <[email protected]>

* Fix 'invalid animation update data' msg for actors (#754)

Signed-off-by: Ashton Larkin <[email protected]>

* Update benchmark comparison instructions (#766) (#766)

Signed-off-by: Ashton Larkin <[email protected]>

* [DiffDrive] add enable/disable (#772)

* add enable/disable diffdrive

Signed-off-by: Guillaume Doisy <[email protected]>

* remove debug

Signed-off-by: Guillaume Doisy <[email protected]>

* do not subscribe to enable if topic is empty

Signed-off-by: Guillaume Doisy <[email protected]>

* add test

Signed-off-by: Guillaume Doisy <[email protected]>

* lint and style

Signed-off-by: Guillaume Doisy <[email protected]>

* change enable type to bool and renamed to enabled

Signed-off-by: Guillaume Doisy <[email protected]>

* Add odometry publisher system (#547)

* Create Initial Odometry Publisher system plugin

Add code for initial plugin that gets position from Pose component and
calculates velocities based on rolling mean from displacement data.

Signed-off-by: Maganty Rushyendra <[email protected]>

* Remove Linear and Angular Velocity components

Also renames frames in Odometry msg to include model name, and makes
various style changes.

Signed-off-by: Maganty Rushyendra <[email protected]>

* Get World pose instead of pose of robot base frame

Signed-off-by: Maganty Rushyendra <[email protected]>

* Add documentation for variables and functions

Includes minor stylistic changes.

Signed-off-by: Maganty Rushyendra <[email protected]>

* Check for valid odomTopic and update copyright year

Signed-off-by: Maganty Rushyendra <[email protected]>

* Add tests for OdometryPublisherSystem and fix velocity calculation bug

Swap X and Y linear velocities when calculating odometry velocities
relative to robotBaseFrame.

Signed-off-by: Maganty Rushyendra <[email protected]>

Co-authored-by: ahcorde <[email protected]>

* Patch particle emitter2 service (#777)

* Patch particle emitter2 service

Signed-off-by: Nate Koenig <[email protected]>

* Remove condition variable

Signed-off-by: Nate Koenig <[email protected]>

* Set emitter frame and relative pose

Signed-off-by: Nate Koenig <[email protected]>

Co-authored-by: Nate Koenig <[email protected]>

* Preparing for 4.8.0 release (#780)

Signed-off-by: Nate Koenig <[email protected]>

Co-authored-by: Nate Koenig <[email protected]>

* 👩‍🌾 Enable Focal CI (#646)

Signed-off-by: Louise Poubel <[email protected]>

Co-authored-by: Michael Carroll <[email protected]>

* [TPE] Support setting individual link velocity  (#427)

Signed-off-by: claireyywang <[email protected]>
Signed-off-by: Ian Chen <[email protected]>

Co-authored-by: Ian Chen <[email protected]>
Co-authored-by: Louise Poubel <[email protected]>

* Don't store duplicate ComponentTypeId in ECM (#751)

Signed-off-by: Louise Poubel <[email protected]>

* Feature/hydrodynamics (#749)

Implement hydrodynamics and thruster plugin.

Signed-off-by: Arjo Chakravarty <[email protected]>
Co-authored-by: Mabel Zhang <[email protected]>
Co-authored-by: Carlos Agüero <[email protected]>

* Fix macOS build: components::Name in benchmark (#784)

Signed-off-by: Louise Poubel <[email protected]>

Co-authored-by: Steve Peters <[email protected]>

* Fix ColladaExporter submesh index bug (#763)

Signed-off-by: Jorge Perez <[email protected]>

* 👩‍🌾 Fix Windows build and some warnings (#782)

Signed-off-by: Louise Poubel <[email protected]>

Co-authored-by: Alejandro Hernández Cordero <[email protected]>

* Prevent crash on Plotting plugin with mutex (#747)

Signed-off-by: Louise Poubel <[email protected]>

* Bump ign-physics version to 3.2 (#792)

Signed-off-by: Louise Poubel <[email protected]>

* Bump to ign-msgs 7.1 / sdformat 11.1, Windows fixes (#758)

Signed-off-by: Louise Poubel <[email protected]>

* Util: Use public API from libsdformat for detecting non-file source (#794)

Signed-off-by: Eric Cousineau <[email protected]>

* Fix included nested model expansion in SDF generation (#768)

* fixed included nested model expansion

Signed-off-by: Jenn Nguyen <[email protected]>

* added resource path to test

Signed-off-by: Jenn Nguyen <[email protected]>

* use orig URIs & support multi level nesting

Signed-off-by: Jenn Nguyen <[email protected]>

* save fuel version when enabled

Signed-off-by: Jenn Nguyen <[email protected]>

* retrieve uri from map

Signed-off-by: Jenn Nguyen <[email protected]>

* copy included element

Signed-off-by: Jenn Nguyen <[email protected]>

* clear attributes before copying include element

Signed-off-by: Jenn Nguyen <[email protected]>

* Map canonical links to their models (#736)

Signed-off-by: Ashton Larkin <[email protected]>

* ColladaExporter, export submesh selected (#802)

* Export only submesh if selected
* Add test case for the PR
* Attempting a unified solution

Signed-off-by: Jorge Perez <[email protected]>
Co-authored-by: Nate Koenig <[email protected]>

Co-authored-by: Michael Carroll <[email protected]>
Co-authored-by: Jose Tomas Lorente <[email protected]>
Co-authored-by: Addisu Z. Taddese <[email protected]>
Co-authored-by: Ashton Larkin <[email protected]>
Co-authored-by: Nate Koenig <[email protected]>
Co-authored-by: Nate Koenig <[email protected]>
Co-authored-by: Ammaar Solkar <[email protected]>
Co-authored-by: Ian Chen <[email protected]>
Co-authored-by: Ashton Larkin <[email protected]>
Co-authored-by: Silvio Traversaro <[email protected]>
Co-authored-by: Alejandro Hernández Cordero <[email protected]>
Co-authored-by: Luca Della Vedova <[email protected]>
Co-authored-by: Caio Amaral <[email protected]>
Co-authored-by: Jenn Nguyen <[email protected]>
Co-authored-by: G.Doisy <[email protected]>
Co-authored-by: Rushyendra Maganty <[email protected]>
Co-authored-by: Claire Wang <[email protected]>
Co-authored-by: Arjo Chakravarty <[email protected]>
Co-authored-by: Mabel Zhang <[email protected]>
Co-authored-by: Carlos Agüero <[email protected]>
Co-authored-by: Steve Peters <[email protected]>
Co-authored-by: Jorge Perez <[email protected]>
Co-authored-by: Eric Cousineau <[email protected]>
Co-authored-by: Jorge Perez <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🏢 edifice Ignition Edifice enhancement New feature or request performance Runtime performance
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants