Official implementation of the paper: A Simulation Benchmark for Autonomous Racing with Large-Scale Human Data
[Website] [Dataset] [ROS2 interface] [Paper]
Gym interfaces with Assetto Corsa for Autonomous Racing. This repository integrates the Assetto Corsa racing simulator with the OpenAI's Gym interface, providing a high-fidelity environment for developing and testing Autonomous Racing algorithms in realistic racing scenarios.
Features:
- High-Fidelity Simulation: Realistic car dynamics and track environments.
- Customizable Scenarios: Various cars, tracks, and weather conditions.
- RL Integration: Compatible with Gym for easy application of RL algorithms.
- ROS2 interface
- Baselines: Soft Actor-Critic (SAC)(this code base) and TD-MPC2 (to be uploaded soon)
This repository contains all the necessary code to run the Gym interface for Assetto Corsa and RL benchmarks. For the ROS2 interface, refer to ROS2 interface
We base our SAC code on this implementation.
- assetto_corsa_gym
- assetto-corsa-autonomous-racing-plugin
- Plugin for AC
- AssettoCorsaConfigs
- cars
- controls maps
- tracks
- Track bounds
- Occupancy
- Racing line
- AssettoCorsaEnv
- Communication client
- OpenAI Gym interface
- assetto-corsa-autonomous-racing-plugin
- algorithm
- SAC baseline
- data
- Extra information of the dataset and statistics. Instructions to record human demonstrations
-
Install the AC plug-in Follow the instructions in
INSTALL.md
-
Install Python in Windows
-
Install Visual Studio Compiler
- To compile the necessary components for the plugin, download and install the Visual Studio compiler from: Visual Studio C++ Build Tools
- Make sure to install the C++ build tools component
-
Install Python using Anaconda
conda create -n p309 python=3.9.13 conda activate p309 pip install setuptools==65.5.0 pip install -r requirements.txt conda install pytorch==1.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge
-
-
Download the tracks occupancy grid
-
Get the files from here tracks.
-
Optionally, download them using the Huggingface Hub interface:
- Install it:
conda install -c conda-forge huggingface_hub
- And run:
python -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='dasgringuen/assettoCorsaGym', repo_type='dataset', local_dir='AssettoCorsaGymDataSet', allow_patterns='AssettoCorsaConfigs/tracks/*')"
- Move the pickle files to
assetto_corsa_gym/AssettoCorsaConfigs/tracks
.
- Install it:
-
To create a new track:
- Each track needs an occupancy grid (pickle), a reference line (can be the one from AC but also something else), and the track bounds. These files are located in
assetto_corsa_gym/AssettoCorsaConfigs/tracks
. - The reference line and the occupancy grid are needed to run the Gym interface.
- Create the occupancy grid, the reference path and the track bounds:
- Start Assetto Corsa and set the new track.
- Run
assetto_corsa_gym/AssettoCorsaConfigs/tracks/generate_track.ipynb
to create a new track. This script creates a pickle file with the occupancy grid, downloads the AC reference path, and visualizes the track. Make sure to update theassetto_corsa_gym/AssettoCorsaConfigs/tracks/config.yaml
file.
- Each track needs an occupancy grid (pickle), a reference line (can be the one from AC but also something else), and the track bounds. These files are located in
-
-
test_client.ipynb
- Demonstrates the use of the Assetto Corsa Sim interface (client) without the OpenAI Gym interface layer.
-
test_gym.ipynb
- Demonstrates the use of the Gym interface without an agent.
Experiments and parameters are configured via config.yml
and executed with python train.py
. Optionally, a different config file can be specified using python train.py config=<config_file>
. To enable logging to Weights and Biases, appropriate values should be set in the config file. Each parameter in the config file can be modified directly from the terminal using <field>=<value>
. For instance, to change the car, use AssettoCorsa.car=<car>
.
-
Train from SAC from Scratch
-
To train SAC from scratch in Barcelona/F317:
python train.py
-
To train on other cars and tracks (ensure the car and track are set first in AC):
python train.py AssettoCorsa.track=<track> AssettoCorsa.car=<car>
Example for Monza GT3:
python train.py AssettoCorsa.track=monza AssettoCorsa.car=bmw_z4_gt3
-
-
Test a model by loading a checkpoint
python train.py --test --load_path <path_to_model> AssettoCorsa.track=<track> AssettoCorsa.car=<car>
-
Train SAC from demonstrations using an ensemble of buffers
-
Update ac_offline_train_paths.yml (see available data in data\paths.yml).
-
Run:
python train.py load_offline_data=True Agent.use_offline_buffer=True dataset_path=<path_to_dataset>
-
-
Currently supported tracks:
- Barcelona:
ks_barcelona-layout_gp
- Monza:
monza
- Austria:
ks_red_bull_ring-layout_gp
- Oval:
indianapolis_sp
- Silverstone:
ks_silverstone-gp
- Barcelona:
-
To download everything at once (120GB):
git clone https://huggingface.co/datasets/dasgringuen/assettoCorsaGym # After cloning, delete the .git directory to free up space
-
To download one track and car combination at a time, run the following replacing and :
from huggingface_hub import snapshot_download snapshot_download( repo_id="dasgringuen/assettoCorsaGym", repo_type="dataset", local_dir="AssettoCorsaGymDataSet", allow_patterns="data_sets/<track>/<car>/*" )
Hugging Face is currently having some false positives in their dataset checking due to a security issue with pickle files importing numpy:
Detected Pickle imports: - "numpy.core.multiarray.scalar" - "numpy.core.multiarray._reconstruct" - "numpy.dtype" - "numpy.ndarray"
Hugging Face flags these for security reasons. You can see more about this in the issue here. We plan to convert the files to a safer format like Parquet in the future.
You are very welcome to contribute to this project. Feel free to open an issue or pull request if you have any suggestions or bug reports, but please review our guidelines first. Our goal is to build a codebase that can easily be extended to new environments and tasks, and we would love to hear about your experience!
This project is licensed under the MIT License - see the LICENSE
file for details. Note that the repository relies on third-party code, which is subject to their respective licenses.