Bio-Inspired Robotics Testbed
BRT bridges robotics and biology with MuJoCo simulation environments of animals. One task implementation
runs on CPU with MuJoCo, and on accelerators with MJX or MuJoCo Warp, so you can go from a single interactive
rollout to thousands of parallel environments without changing your code.
Two communities, one testbed
For roboticists
Benchmarks for bio-inspired design and control
Animal morphologies are parameterised by plain Python specifications, so the same task can benchmark
controllers, morphologies, or both at once. Environments expose standard observation and action spaces,
a Gymnasium adapter, and JAX-native batching for large-scale learning and co-design.
For biologists
Robots as a controlled comparative method
Simulated animals let you change one trait at a time, such as arm count, leg proportions, or sensing, and
measure the effect on behaviour. That makes hypotheses about behaviour, ecology and evolution testable in
ways that are hard or impossible with living animals.
Environments
Each animal comes with a parameterised morphology, arenas, and tasks or an open playground. Open a demo to run the model in your browser.
Echinoderm
Brittle star
A central disk with segmented arms, each segment actuated in and out of plane. Brittle stars move without a
fixed front, coordinating many arms through a decentralised nervous system.
- undirected_locomotion
- directed_locomotion
- light_escape
Arachnid
Jumping spider
A cephalothorax, abdomen and eight multi-segment legs. Jumping spiders leap many times their body length
with precise aim, combining leg extension with hydraulic pressure and a stabilising dragline.
- long_jump
- directed_jump
- platform_jump
Fish
Seahorse tail
The prehensile tail of a seahorse: vertebrae inside overlapping bony plates, pulled by long HM and short
MVM muscles. No task: configure the muscle architecture and drive it with open-loop controls. From
Marzougui et al. (2025).
Abstract swimmer
Swimmer
An abstract anguilliform swimmer: a planar chain of capsules in a viscous fluid that swims by sending a
wave along its body. Its body length, taper and joint stiffness are parameters, and a task rewards
swimming head first.
Quickstart
Install
pip install biorobot
Run an episode on the CPU
import biorobot
env = biorobot.make("brittle_star/undirected_locomotion", backend="mjc")
state = env.reset(0)
while not (state.terminated or state.truncated):
action = env.action_space.sample()
state = env.step(state, action)
print(state.reward, state.observations.keys())
Batch thousands of environments with JAX
import jax
import biorobot
num_envs = 1024
# With backend="warp", num_envs sizes MuJoCo Warp's contact buffer, which all environments share.
env = biorobot.make("brittle_star/undirected_locomotion", backend="mjx", num_envs=num_envs)
keys = jax.random.split(jax.random.PRNGKey(0), num_envs)
reset = jax.jit(jax.vmap(env.reset))
step = jax.jit(jax.vmap(env.step))
states = reset(keys)
actions = jax.numpy.zeros((num_envs, env.action_space.shape[0]))
states = step(states, actions)
Backends
| Backend |
Engine |
Arrays |
Use it for |
mjc |
MuJoCo (C) |
NumPy |
Debugging, interactive rendering, Gymnasium, CPU evolution strategies |
mjx |
MJX, JAX implementation |
JAX |
jax.jit / jax.vmap on GPU or TPU |
warp |
MJX with MuJoCo Warp |
JAX |
Fast, contact-rich batched simulation on NVIDIA GPUs |
The task logic is written once and shared by all three backends. Version 1.0 is a rewrite on native
mujoco.MjSpec; if you depend on the old API, pin biorobot==0.4.*.
Contribute
Would you like a model of your favourite animal? Tell us about it through the
model request form. Bug reports, new tasks and new animals
are welcome as issues and pull requests on GitHub.