DART (Dynamic Animation and Robotics Toolkit) is an open-source, research-focused physics engine for robotics, animation, and machine learning. It provides transparent kinematics, dynamics, collision, and constraint-solving foundations for users who need more than a black-box simulator. DART uses generalized coordinates for articulated rigid body systems and Featherstone's Articulated Body Algorithm for accurate, stable motion dynamics.
Important
Which DART is this? This main branch tracks DART 7, an in-progress
redesign that is not yet recommended for production use. Its documentation
is the latest site.
For a stable release, use DART 6 LTS:
documentation ·
release-6.19 branch.
- Research-grade dynamics — Featherstone algorithms, generalized coordinates, and direct access to dynamics quantities
- Easy to start — Python and C++ packages through common package managers, plus reproducible source builds with pixi
- Extensible foundations — Math, native collision, constraints, model loading, benchmarks, and tests that support new algorithms and baseline comparisons
- Unified model loading — Load URDF, SDF, and MJCF models through a single API
- Scalable compute roadmap — Cross-platform CPU support today, with roadmap work for multi-core, SIMD, and accelerator backends
- Battle-tested ecosystem — Powers Gazebo, research labs, and production systems worldwide, with best-effort support for production use
Python
import dartpy as dart
world = dart.World()
# Load a robot from URDF
urdf = dart.io.UrdfParser()
robot = urdf.parse_skeleton("dart://sample/urdf/KR5/KR5 sixx R650.urdf")
world.add_skeleton(robot)
# Simulate 100 steps
for _ in range(100):
world.step()
print(f"Positions: {robot.get_positions()}")C++
The DART 7 C++ simulation facade is available in source builds while the final
public header transaction is still in progress. Use the C++ API shape recorded
in docs/design/simulation_cpp_api.md
for current source-checkout examples; DART 6 C++ snippets remain on the
release-6.* branches for compatibility-line users.
The quick-start snippets above target the current main branch and DART 7 API.
Until DART 7 package artifacts are published, package managers resolve the
latest published DART 6 artifacts instead, and different indexes may briefly
serve different DART 6 patch releases until their packages finish publishing.
Use the file-free package smoke checks below for the installed package version,
or use the source checkout path for the DART 7 quick starts.
| Method | Command |
|---|---|
| uv (preferred) | uv add dartpy |
| pip | pip install dartpy |
| pixi | pixi add dartpy |
| conda | conda install -c conda-forge dartpy |
| Platform | Command |
|---|---|
| Cross-platform (recommended) | pixi add dartsim-cpp or conda install -c conda-forge dartsim-cpp |
| Ubuntu | sudo apt install libdart-all-dev |
| Arch Linux | yay -S libdart |
| FreeBSD | pkg install dartsim |
| macOS | brew install dartsim |
| Windows | vcpkg install dartsim:x64-windows |
These snippets create a tiny model in code, so they do not depend on sample data files being present in the installed package.
Python package
import dartpy as dart
world = dart.simulation.World()
skeleton = dart.dynamics.Skeleton("box")
skeleton.createFreeJointAndBodyNodePair()
world.addSkeleton(skeleton)
world.step()
print(f"Positions: {skeleton.getPositions()}")C++ package
The published C++ package smoke for the compatibility line is maintained on
release-6.*. DART 7 C++ package smoke checks move through
check-dart7-artifacts and the local source-checkout promotion gates until
DART 7 C++ artifacts are published.
pixi install
# Smoke the Python-first DART 7 rigid-body demo surface.
pixi run py-demos -- --scene rigid_body --headless --frames 1
# Open the curated rigid-body GUI verifier.
pixi run py-demos
pixi run py-demos -- --scene rigid_solver_compare
# Capture docked visual evidence for the solver comparison.
pixi run py-demo-capture -- --scene rigid_solver_compare --frames 24 --width 960 --height 540 --show-ui
# Optional C++ World-only companion smoke.
pixi run demos -- --scene rigid_body --headless --frames 1The full 36-row rigid-body visual verification workflow, Rigid Workflow
search terms, and capture commands are in the
Python demos README.
- Static Docs: English | 한국어
- AI Docs (experimental): DeepWiki for quick codebase Q&A | NotebookLM (Google account required)
- Questions: Ask in GitHub Discussions when you want maintainer or community input.
- Developer Onboarding Guide — Architecture, components, and workflows
- Contributing Guide — Style guide and contribution process
- Project Direction — Research-focused north star and priorities
- Living Plans — Active and proposed roadmap items
- Background Theory — Dynamics, contact solving, and mathematical foundations
- Gazebo Integration — gz-physics integration workflow
- Release Roadmap — Compatibility, deprecations, and future plans
main— Active development targeting DART 7 (not yet production-ready)release-6.19— Maintenance branch for DART 6 LTS (critical fixes only); see the DART 6 documentation
If you use DART in an academic publication, please consider citing this JOSS Paper:
@article{Lee2018,
doi = {10.21105/joss.00500},
url = {https://doi.org/10.21105/joss.00500},
year = {2018},
publisher = {The Open Journal},
volume = {3},
number = {22},
pages = {500},
author = {Jeongseok Lee and Michael X. Grey and Sehoon Ha and Tobias Kunz and Sumit Jain and Yuting Ye and Siddhartha S. Srinivasa and Mike Stilman and C. Karen Liu},
title = {DART: Dynamic Animation and Robotics Toolkit},
journal = {Journal of Open Source Software}
}DART is licensed under the BSD 2-Clause License.

