What is Nimble?
Nimble is a toolkit for doing AI on human biomechanics (physically simulated realistic human bodies), written in C++ for speed, but with nice Python bindings. It focuses on studying real physical human bodies.
Nimble started life as a general purpose differentiable physics engine, as a fork of the (not differentiable) DART physics engine. We wrote a paper about it, which you can find here. Over the years, to support projects like AddBiomechanics, we’ve added a lot of biomechanics-focused functionality to Nimble, including:
New types of biological joints (
CustomJoint
for knees,ConstantCurvatureJoint
for spines,EllipsoidJoint
for shoulders, etc), which are all differentiableSupport for loading, modifying, and saving OpenSim skeleton models
Support for handling raw motion capture data
Treating bone scales and optical marker offsets as first class differentiable quantities, even through physics, which is important when system-identifying a human body
Various optimization algorithms useful for biomechanics
Optimized computations to get Jacobians and gradients through most quantities of interest in the human body
… a bunch of other features too numerous to list here
Does Nimble do general purpose robotics simulation?
This documentation is focused on the tools you need when doing AI for human biomechanics. While Nimble is also a general purpose differentiable physics engine capable of simulating complex scenes with robots and collisions, we don’t cover that much here, because the past few years of research with differentiable physics engines have shown that the way Nimble gets gradients through rigid collisions is probably not the best way for complex trajectory optimization (TLDR: RL is onto something, and it has advantages even if the system is technically differentiable). If you are doing general purpose robotics research, we recommend looking at some of the following engines:
If you are here because you are interested in studying physical human bodies with AI, then read on!