Genesis Forge
Genesis Forge is a powerful robotics reinforcement learning framework using the Genesis physics simulator. It provides a flexible and modular architecture to get your robot up and running quickly with less boilerplate work.
RL Robotics What?
Today, modern robots learn to balance, walk, and manipulate objects using Reinforcement Learning algorithms. You simply create a program that defines a task and provides feedback on the robot's performance — much like training a dog with treats and commands. But with modern GPUs, you can parallelize this process across thousands of simulated robots at a time. Genesis Forge is a framework that makes this very easy to do, with documentation and examples to get you started.
Features:
- 🦿 Action manager - Control your joints and actuators, within limits and with domain randomization
- 🏆 Reward/Termination managers - Simple and extensible reward/termination handling with automatic logging
- ↪️ Command managers - Commands your robot with debug visualization
- 🏔️ Terrain manager - Helpful terrain utilities and curriculums
- 💥 Contact manager - Comprehensive contact/collision detection and reward/termination functions
- 🎬 Video Wrapper - Automatically records videos at regular intervals during training
- 🕹️ Gamepad interface - Control trained policies directly with a physical gamepad controller.
- 🤖 Deployment export - Move a trained policy to a real robot without hand-recreating the observation and action pipelines
- And more...
Learn more in the documentation
Install
Before installing Genesis Forge, ensure you have:
- Python >=3.10,<3.14
- pip package manager
(Optional) CUDA-compatible GPU for faster training
pip install genesis-forge
To run a trained policy on a robot, install only the simulation-free runtime -- it depends on numpy alone, so it fits on a Raspberry Pi or Jetson:
pip install genesis-forge-runtime
See the deployment guide for the full walkthrough.
Example
Here's an example of a environment to teach the Go2 robot how to follow direction commands. See the full runnable example here.
class Go2CEnv(ManagedEnvironment):
def __init__(self, num_envs: int = 1):
super().__init__(num_envs=num_envs)
# Construct the scene
self.scene = gs.Scene(show_viewer=False)
self.scene.add_entity(gs.morphs.Plane())
self.robot = self.scene.add_entity(
gs.morphs.URDF(
file="urdf/go2/urdf/go2.urdf",
pos=[0.0, 0.0, 0.35],
quat=[1.0, 0.0, 0.0, 0.0],
),
)
def config(self):
# Robot manager - Reset the robot's initial position on reset
self.robot_manager = EntityManager(
self,
entity=self.robot,
on_reset={
"position": {
"fn": reset.position(
position=[0.0, 0.0, 0.35],
quat=[1.0, 0.0, 0.0, 0.0],
),
},
},
)
# Joint Actuators & Actions
self.actuator_manager = ActuatorManager(
self,
joint_names=[".*"],
default_pos={
".*_hip_joint": 0.0,
".*_thigh_joint": 0.8,
".*_calf_joint": -1.5,
},
kp=20,
kv=0.5,
)
self.action_manager = PositionActionManager(
self,
scale=0.25,
use_default_offset=True,
actuator_manager=self.actuator_manager,
)
# Commanded direction
self.velocity_command = VelocityCommandManager(
self,
range={
"lin_vel_x": [-1.0, 1.0],
"lin_vel_y": [-1.0, 1.0],
"ang_vel_z": [-1.0, 1.0],
},
)
# Rewards
RewardManager(
self,
cfg={
"base_height_target": {
"weight": -50.0,
"fn": rewards.base_height(target_height=0.3),
},
"tracking_lin_vel": {
"weight": 1.0,
"fn": rewards.command_tracking_lin_vel(
vel_cmd_manager=self.velocity_command,
),
},
"tracking_ang_vel": {
"weight": 1.0,
"fn": rewards.command_tracking_ang_vel(
vel_cmd_manager=self.velocity_command,
),
},
"lin_vel_z": {
"weight": -1.0,
"fn": rewards.lin_vel_z_l2(),
},
},
)
# Termination conditions
self.termination_manager = TerminationManager(
self,
logging_enabled=True,
term_cfg={
# The episode ended
"timeout": {
"fn": terminations.timeout(),
"time_out": True,
},
# Terminate if the robot's pitch and yaw angles are too large
"fall_over": {
"fn": terminations.bad_orientation(limit_angle=10), # degrees
},
},
)
# Observations
ObservationManager(
self,
cfg={
"velocity_cmd": {"fn": self.velocity_command.observation},
"angle_velocity": {
"fn": lambda env: self.robot_manager.get_angular_velocity(),
},
"linear_velocity": {
"fn": lambda env: self.robot_manager.get_linear_velocity(),
},
"projected_gravity": {
"fn": lambda env: self.robot_manager.get_projected_gravity(),
},
"dof_position": {
"fn": lambda env: self.action_manager.get_dofs_position(),
},
"dof_velocity": {
"fn": lambda env: self.action_manager.get_dofs_velocity(),
"scale": 0.05,
},
"actions": {
"fn": observations.current_actions(),
},
},
)
Learn More
Check out the user guide and API reference
Citation
If you used Genesis Forge in your research, we would appreciate it if you could cite it.
@misc{Genesis-Forge,
author = {Jeremy Gillick},
title = {Genesis Forge: A modular framework for RL robot environments},
month = {September},
year = {2025},
url = {https://github.com/jgillick/genesis-forge}
}
Metadata
Release files for genesis-forge 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| genesis_forge-1.0.0.tar.gz | 174.9 kB | Without provenance | Details for genesis_forge-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| genesis_forge-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for genesis_forge-1.0.0-py3-none-any.whl |
Total release size: 317.7 kB
Release files / genesis_forge-1.0.0.tar.gz
| Download URL | genesis_forge-1.0.0.tar.gz |
|---|---|
| Size | 174.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c8294282fe6fb485806e061f103d3c06363e970999a09058632df615acb32a30
|
|
BLAKE2b-256 checksum How to use checksums |
97ab8b5a06c4a9bd133609d1a6ba82d1c8534f906da940c78d9019ac5ee73347
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / genesis_forge-1.0.0-py3-none-any.whl
| Download URL | genesis_forge-1.0.0-py3-none-any.whl |
|---|---|
| Size | 142.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
668a09f207566d60abac4a3de7ec0f89ea3e57534314e11f6553c3e4f80655e7
|
|
BLAKE2b-256 checksum How to use checksums |
fedbc58e9a51ff7c01a4ebc0ac2e0ff305b4acf2294404fb629975608bc0a268
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for genesis-forge 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.