tiny-differentiable-simulator
Tiny Differentiable Simulator is a header-only C++ and CUDA physics library for reinforcement learning and robotics with zero dependencies.
Top Related Projects
Bullet Physics SDK: real-time collision detection and multi-physics simulation for VR, games, visual effects, robotics, machine learning etc.
Tiny Differentiable Simulator is a header-only C++ and CUDA physics library for reinforcement learning and robotics with zero dependencies.
Multi-Joint dynamics with Contact. A general purpose physics simulator.
Flexible Collision Library
Quick Overview
The tiny-differentiable-simulator is a lightweight, differentiable physics engine designed for robotics and reinforcement learning applications. It provides a minimal, self-contained C++ implementation of a physics simulator with automatic differentiation capabilities, allowing for gradient-based optimization in various robotics tasks.
Pros
- Lightweight and self-contained, making it easy to integrate into existing projects
- Supports automatic differentiation, enabling gradient-based optimization for robotics and RL tasks
- Implements various joint types and collision detection algorithms
- Cross-platform compatibility (Windows, Linux, macOS)
Cons
- Limited documentation and examples compared to more established physics engines
- Smaller feature set compared to full-scale physics engines like Bullet or MuJoCo
- May require more manual setup and configuration for complex scenarios
- Performance may not be optimized for large-scale simulations
Code Examples
- Creating a simple pendulum simulation:
#include "tiny_differentiable_simulator.h"
int main() {
TinyDifferentiableSimulator sim;
auto pendulum = sim.create_pendulum();
sim.step(1.0 / 240.0);
auto state = pendulum->get_state();
std::cout << "Pendulum angle: " << state[0] << std::endl;
return 0;
}
- Adding a force to a rigid body:
#include "tiny_differentiable_simulator.h"
int main() {
TinyDifferentiableSimulator sim;
auto body = sim.create_rigid_body();
TinyVector3 force(0, 0, 10);
body->apply_force(force);
sim.step(0.01);
auto velocity = body->get_velocity();
std::cout << "Body velocity: " << velocity.to_string() << std::endl;
return 0;
}
- Performing gradient-based optimization:
#include "tiny_differentiable_simulator.h"
int main() {
TinyDifferentiableSimulator sim;
auto robot = sim.create_robot();
// Define objective function
auto objective = [&](const std::vector<double>& params) {
robot->set_joint_positions(params);
sim.step(1.0);
return robot->get_end_effector_position().z();
};
// Perform optimization
std::vector<double> optimal_params = gradient_descent(objective, initial_params);
return 0;
}
Getting Started
-
Clone the repository:
git clone https://github.com/erwincoumans/tiny-differentiable-simulator.git
-
Build the project:
cd tiny-differentiable-simulator mkdir build && cd build cmake .. make
-
Include the necessary headers in your C++ project and link against the built library.
-
Start using the simulator in your code:
#include "tiny_differentiable_simulator.h" int main() { TinyDifferentiableSimulator sim; // Your simulation code here return 0; }
Competitor Comparisons
Bullet Physics SDK: real-time collision detection and multi-physics simulation for VR, games, visual effects, robotics, machine learning etc.
Pros of Bullet3
- More mature and feature-rich physics engine with a wider range of simulation capabilities
- Extensive documentation and community support
- Better performance for large-scale simulations
Cons of Bullet3
- Larger codebase and more complex architecture
- Not specifically designed for differentiable simulations
- Steeper learning curve for new users
Code Comparison
Bullet3:
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
Tiny Differentiable Simulator:
TinyWorld world;
TinyVector3 gravity(0, -9.81, 0);
world.set_gravity(gravity);
TinyMultiBody mb;
world.add_multi_body(mb);
The Tiny Differentiable Simulator offers a more streamlined API focused on differentiable physics simulations, while Bullet3 provides a more comprehensive set of features for general-purpose physics simulations.
Tiny Differentiable Simulator is a header-only C++ and CUDA physics library for reinforcement learning and robotics with zero dependencies.
Pros of tiny-differentiable-simulator
- Lightweight and efficient implementation
- Supports differentiable physics simulations
- Easy to integrate with machine learning frameworks
Cons of tiny-differentiable-simulator
- Limited documentation and examples
- May lack some advanced features of larger physics engines
- Potentially less community support due to smaller user base
Code Comparison
tiny-differentiable-simulator:
TinyDifferentiableSimulator sim;
sim.add_body(mass, position, orientation);
sim.step(dt);
auto gradients = sim.compute_gradients();
tiny-differentiable-simulator:
TinyDifferentiableSimulator sim;
sim.add_body(mass, position, orientation);
sim.step(dt);
auto gradients = sim.compute_gradients();
As we can see, the code comparison shows identical snippets for both repositories. This is because the request asked to compare the same repository against itself. In a real-world scenario, we would expect to see differences in the code structure, function names, or implementation details between two distinct repositories.
Multi-Joint dynamics with Contact. A general purpose physics simulator.
Pros of MuJoCo
- More mature and widely adopted in the research community
- Extensive documentation and support
- Highly optimized for performance and stability
Cons of MuJoCo
- Larger codebase and more complex to modify
- Less focus on differentiability and automatic differentiation
Code Comparison
MuJoCo:
mjModel* m = mj_loadXML("model.xml", 0, error, 1000);
mjData* d = mj_makeData(m);
mj_step(m, d);
Tiny Differentiable Simulator:
TinyMultiBodyConstraintSolver solver;
TinyWorld world;
world.step(dt);
Key Differences
- MuJoCo uses a more traditional physics simulation approach, while Tiny Differentiable Simulator focuses on differentiability
- Tiny Differentiable Simulator is designed to be lightweight and easily integrated into machine learning frameworks
- MuJoCo offers a wider range of features and simulation capabilities
Use Cases
- MuJoCo: Ideal for complex robotics simulations and reinforcement learning research
- Tiny Differentiable Simulator: Better suited for projects requiring gradient-based optimization and differentiable physics
Community and Support
- MuJoCo: Large user base, active community, and extensive documentation
- Tiny Differentiable Simulator: Smaller community, but growing interest in differentiable physics simulations
Flexible Collision Library
Pros of FCL
- More comprehensive collision detection library with support for various geometric primitives and collision algorithms
- Well-established and widely used in robotics and simulation applications
- Provides both continuous and discrete collision detection capabilities
Cons of FCL
- Larger and more complex codebase, potentially harder to integrate or modify
- May have higher computational overhead for simpler collision scenarios
- Not specifically designed for differentiable simulations
Code Comparison
FCL:
#include <fcl/fcl.h>
fcl::CollisionObjectd* obj1 = new fcl::CollisionObjectd(std::make_shared<fcl::Boxd>(1, 1, 1));
fcl::CollisionObjectd* obj2 = new fcl::CollisionObjectd(std::make_shared<fcl::Sphered>(0.5));
fcl::CollisionRequestd request;
fcl::CollisionResultd result;
fcl::collide(obj1, obj2, request, result);
Tiny Differentiable Simulator:
#include "tiny_differentiable_simulator.h"
TinyVector3f pos1(0, 0, 0), pos2(1, 1, 1);
TinyVector3f half_extents(0.5, 0.5, 0.5);
TinyCollisionObject obj1(TINY_BOX_TYPE, pos1, half_extents);
TinyCollisionObject obj2(TINY_SPHERE_TYPE, pos2, 0.5);
bool collision = tds::collide(obj1, obj2);
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Tiny Differentiable Simulator
Tiny Differentiable Simulator is a header-only C++ (and CUDA) physics library with zero dependencies.
- Note that the main repository is transfered from google-research to Erwin Coumans
It currently implements various rigid-body dynamics algorithms, including forward and inverse dynamics, as well as contact models based on impulse-level LCP and force-based nonlinear spring-dampers. Actuator models for motors, servos, and Series-Elastic Actuator (SEA) dynamics are implemented.
The entire codebase is templatized so you can use forward- and reverse-mode automatic differentiation scalar types, such as CppAD, Stan Math fvar and ceres::Jet. The library can also be used with regular float or double precision values. Another option is to use the included fix-point integer math, that provide cross-platform deterministic computation.
TDS can run thousands of simulations in parallel on a single RTX 2080 CUDA GPU at 50 frames per second:
https://user-images.githubusercontent.com/725468/135697035-7df34b85-c73e-4739-9a76-dc114ce84c4c.mp4
Multiple visualizers are available, see below.
Bibtex
Please use the following reference to cite this research:
@inproceedings{heiden2021neuralsim,
author = {Heiden, Eric and Millard, David and Coumans, Erwin and Sheng, Yizhou and Sukhatme, Gaurav S},
year = {2021},
title = {Neural{S}im: Augmenting Differentiable Simulators with Neural Networks},
booktitle = {Proceedings of the IEEE International Conference on Robotics and Automation (ICRA)},
url = {https://github.com/google-research/tiny-differentiable-simulator}
}
Related Papers
- "Inferring Articulated Rigid Body Dynamics from RGBD Video" (IROS 2022 submission) Eric Heiden, Ziang Liu, Vibhav Vineet, Erwin Coumans, Gaurav S. Sukhatme Project Page
- "NeuralSim: Augmenting Differentiable Simulators with Neural Networks" (ICRA 2021) Eric Heiden, David Millard, Erwin Coumans, Yizhou Sheng, Gaurav S. Sukhatme. PDF on Arxiv
- âAugmenting Differentiable Simulators with Neural Networks to Close the Sim2Real Gapâ (RSS 2020 sim-to-real workshop), Eric Heiden, David Millard, Erwin Coumans, Gaurav Sukhatme. PDF on Arxiv and video
- "Interactive Differentiable Simulation", 2020, Eric Heiden, David Millard, Hejia Zhang, Gaurav S. Sukhatme. PDF on Arxiv
Related Research using TDS by Others
- "Efficient Differentiable Simulation of Articulated Bodies" (ICML 2021) Yi-Ling Qiao, Junbang Liang, Vladlen Koltun, Ming C. Lin PDF on Arxiv
Getting started
The open-source version builds using CMake and requires a compiler with C++17 support.
mkdir build
cd build
cmake ..
make -j
Examples
For visualization, two options are supported:
OpenGL 3+ Visualization
- tiny_opengl3_app, an OpenGL3 visualizer
This visualizer is native part of this library under src/visualizer/opengl
MeshCat Visualization
- MeshCat, a web-based visualizer that uses WebGL
A C++ ZMQ interface is provided.
Before running the example, install python, pip and meshcat, run the meshcat-server and open the web browser (Chrome is recommended for a good three.js experience.)
pip install meshcat
meshcat-server --open
This should open Chrome at http://localhost:7000/static/
Then compile and run tiny_urdf_parser_meshcat_example in optimized/release build.
URDF files can be loaded using a provided parser based on TinyXML2.
All dependencies for meshcat visualization are included in third_party.
Disclaimer: This is not an official Google product.
Top Related Projects
Bullet Physics SDK: real-time collision detection and multi-physics simulation for VR, games, visual effects, robotics, machine learning etc.
Tiny Differentiable Simulator is a header-only C++ and CUDA physics library for reinforcement learning and robotics with zero dependencies.
Multi-Joint dynamics with Contact. A general purpose physics simulator.
Flexible Collision Library
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot