Note: This repository is not being maintained any more. Please use AirSim Drone Racing Lab.
Note: If you use this repository in your research, please cite our pre-print, AirSim Drone Racing Lab.
@article{madaan2020airsim,
title={AirSim Drone Racing Lab},
author={Madaan, Ratnesh and Gyde, Nicholas and Vemprala, Sai and Brown, Matthew and Nagami, Keiko and Taubner, Tim and Cristofalo, Eric and Scaramuzza, Davide and Schwager, Mac and Kapoor, Ashish},
journal={arXiv preprint arXiv:2003.05654},
year={2020}
}
Final round binaries and environments (v1.1)
AirSim.zip
, and unzip it. Final_Tier_1_and_Tier_2.pak
and Final_Tier_3.pak
.AirSim/AirSimExe/Content/Paks
. settings.json
file to ~/Documents/AirSim/settings.json
. airsimneurips
>= 1.2.0Qualifier binaries and environments (v1.0)
AirSim.zip
, and unzip it. Qual_Tier_1_and_Tier_3.pak
and Qual_Tier_2.pak
.AirSim/AirSimExe/Content/Paks
. settings.json
file to ~/Documents/AirSim/settings.json
. Training binaries and environments (v0.3):
AirSim.zip
, and unzip it. Soccer_Field.pak
, ZhangJiaJie.pak
, and Building99.pak
. AirSim/AirSimExe/Content/Paks
. settings.json
file to ~/Documents/AirSim/settings.json
. Notes:
Source code (zip)
or Source code (tar.gz)
might not be up-to-date with the master branch of this repository. It can be lagging by n commits to master since this release
, specified on the released page.
For the code on this repository, it's best to just git clone
.
List of disabled APIs in qualification binaries: The following APIs on the server side in the qualification binaries. You should see an error message pop up in the terminal message when you call these. They do work in the training binaries:
simSetObjectPose
simSetVehiclePose
simSetObjectScale
simGetObjectScale
simSetSegmentationObjectID
simGetSegmentationObjectID
simPause
simContinueForTime
Linux
cd
to AirSim_Training/
or AirSim_Qualification
directory, and enter the following command:
./AirSimExe.sh -windowed -opengl4
DISPLAY= ./AirSimExe.sh -opengl4
-./AirSimExe.sh -nullrhi
Note that simGetImages
will not work with this option.
simGetImages
/ increase speed of Unreal Engine's game thread;
"ViewMode": "NoDisplay"
to your settings.json file, or use this file directly../AirSimExe.sh -windowed -NoVSync -BENCHMARK
You can also use the Unreal console commands Stat FPS
, Stat UnitGraph
, r.VSync
, t.maxFPS
. See Issue #111 for more details.
Windows
AirSim/
directory, and double-click run.bat
(or AirSimExe.exe -windowed
)Prerequisites:
Dockerfile:
We provide a sample dockerfile you can modify.
It downloads the training and qualification binaries automatically, and installs the python client.
By default, it uses Ubuntu 18.04 and CUDA 10.0 with OpenGL, and is build on top of nvidia/cudagl:10.0-devel-ubuntu18.04.
This can be changed of course, as explained in the following section.
Building the docker image:
You can use build_docker_image.py to build the dockerfile above (or your own custom one)
Usage (with default arguments)
cd docker/;
python3 build_docker_image.py \
--dockerfile Dockerfile \
--base_image nvidia/cudagl:10.0-devel-ubuntu18.04 \
-- target_image airsim_neurips:10.0-devel-ubuntu18.04
Running the docker image:
See docker/run_docker_image.sh to run the docker image:
Usage
$ ./run_docker_image.sh "" training
$ ./run_docker_image.sh "" qualification
$ ./run_docker_image.sh "" training headless
$ ./run_docker_image.sh "" qualification headless
$ ./run_docker_image.sh DOCKER_IMAGE_NAME:TAG
$ ./run_docker_image.sh DOCKER_IMAGE_NAME:TAG headless
To control your drone and get information from the environment, you will need the airsimneurips
API, which is accessible via Python.
We recommend you used python >= 3.6. Python 2.7 will go out of support soon
To install the Python API, do a :
pip install airsimneurips
See quick overview of the API below
The API is documented at airsimneurips API doc
Resources
For the qualification round, we have one race track for each tier. The relevant binaries (v1.0) are available for linux and windows
Qual_Tier_1_and_Tier_3.pak
pakfileQual_Tier_2.pak
pakfile. Qual_Tier_1_and_Tier_3.pak
pakfile. How to generate logfiles for each tier:
Loading level and starting race:
Please update your airsimneurips pythonclient (should be >=1.0.0).
Calling simStartRace(race_tier=1, 2, or 3)
generates the appropriate log files.
Tier 1:
airsim_client.simLoadLevel('Qualifier_Tier_1')
airsim_client.simStartRace(1)
Tier 2:
airsim_client.simLoadLevel('Qualifier_Tier_2')
airsim_client.simStartRace(2)
Tier 3:
airsim_client.simLoadLevel('Qualifier_Tier_3')
airsim_client.simStartRace(3)
As Tier 2 focuses on perception and Tier 3 focuses on both perception and planning, note that simGetObjectPose
returns noisy gate poses, after simStartRace(2)
and simStartRace(3)
is called.
As soon as simStartRace(1)
or simStartRace(3)
is called, drone_2
(MSR opponent racer) will start flying.
See baseline_racer.py
for sample code. The previous bullet points are being called in wrapper functions in the following snippet in baseline_racer.py
:
baseline_racer.load_level(args.level_name)
if args.level_name == "Qualifier_Tier_1":
args.race_tier = 1
if args.level_name == "Qualifier_Tier_2":
args.race_tier = 2
if args.level_name == "Qualifier_Tier_3":
args.race_tier = 3
baseline_racer.start_race(args.race_tier)
To submit your results to the leaderboard:
AirSimExe/Saved/Logs/RaceLogs
in your downloaded binary folder.drone_1
(call generate_settings_file.py
to generate an AirSim settings file, as done for the baseline_racer
below. report
section to help us verify the honesty of your submission for the Nov 21st deadline. Please summarize your approach for all tiers you make a submission for, with appropriate citations. The report PDF size should not exceed 10 MB, and should be a maximum of 4 pages in length. We leave the exact format of the report to your descrition, but the IEEE template is a good choice. Team ID
field. This helps us verify it was your team who indeed made the submission. For the final round, we have one race track for each tier. The relevant binaries (v1.1) are available for linux and windows
Final_Tier_1_and_Tier_2.pak
pakfileFinal_Tier_1_and_Tier_2.pak
pakfile. Final_Tier_3.pak
pakfile. How to generate logfiles for each tier:
Loading level and starting race:
Please update your airsimneurips pythonclient (should be >=1.2.0).
Calling simStartRace(race_tier=1, 2, or 3)
generates the appropriate log files. You can only run tier N
races in Final_Tier_N
levels.
Tier 1:
airsim_client.simLoadLevel('Final_Tier_1')
airsim_client.simStartRace(tier=1)
Tier 2:
airsim_client.simLoadLevel('Final_Tier_2')
airsim_client.simStartRace(tier=2)
Tier 3:
airsim_client.simLoadLevel('Final_Tier_3')
airsim_client.simStartRace(tier=3)
As Tier 2 focuses on perception and Tier 3 focuses on both perception and planning, note that simGetObjectPose
returns noisy gate poses.
As soon as simStartRace(tier=1)
or simStartRace(tier=3)
is called, drone_2
(MSR opponent racer) will start flying.
See baseline_racer.py
for sample code. The previous bullet points are being called in wrapper functions in the following snippet in baseline_racer.py
:
baseline_racer.load_level(args.level_name)
baseline_racer.start_race(args.race_tier)
To submit your results to the final leaderboard:
AirSimExe/Saved/Logs/RaceLogs
in your downloaded binary folder.drone_1
(call generate_settings_file.py
to generate an AirSim settings file, as done for the baseline_racer
below. report
section to help us verify the honesty of your submission by the Dec 5th, 2359 PST deadline. Please summarize your approach for all tiers you make a submission for, with appropriate citations. The report PDF size should not exceed 10 MB, and should be a maximum of 6 pages in length. We leave the exact format of the report to your descrition, but the IEEE template is a good choice. Team ID
field. This helps us verify it was your team who indeed made the submission. Plan and move on a minimum jerk trajectory using ground truth poses of gates:
$ cd baselines;
$ python generate_settings_file.py
$ python baseline_racer.py \
--enable_viz_traj \
--enable_viz_image_cv2 \
--planning_baseline_type all_gates_at_once \
--planning_and_control_api moveOnSpline \
--level_name ZhangJiaJie_Medium \
--race_tier 1
Usage is:
$ python baselines/baseline_racer.py -h
usage: baseline_racer.py [-h]
[--level_name {Soccer_Field_Easy,Soccer_Field_Medium,ZhangJiaJie_Medium,Building99_Hard,Qualifier_Tier_1,Qualifier_Tier_2,Qualifier_Tier_3,Final_Tier_1,Final_Tier_2,Final_Tier_3}]
[--planning_baseline_type {all_gates_at_once,all_gates_one_by_one}]
[--planning_and_control_api {moveOnSpline,moveOnSplineVelConstraints}]
[--enable_viz_traj] [--enable_viz_image_cv2]
[--race_tier {1,2,3}]
Plan a Game Theoretic Plan (GTP) trajectory for an ego drone based on an estimate of the opponent drone's behavior.
$ cd baselines;
$ python generate_settings_file.py
$ python baseline_racer_gtp.py \
--blocking_behavior \
--plot_gtp \
--enable_viz_traj \
--level_name Qualifier_Tier_1
We added some new APIs (marked with 💚) to AirSim for the NeurIPS competition binaries.
simLoadLevel(level_name)
💚
Possible values for level_name
are:
"Soccer_Field_Easy"
, "Soccer_Field_Medium"
, "ZhangJiaJie_Medium"
, "Building99_Hard"
in the training binaries (v0.3
). "Qualification_Tier_1"
, "Qualification_Tier_2"
, "Qualification_Tier_3"
in the qualification binaries (v1.0
). "Final_Tier_1"
, "Final_Tier_2"
, "Final_Tier_3"
in the final round binaries (v1.1
).
Before trying this, please ensure you've downloaded the corresponding training (v0.3
) / qualifier (v1.0
) / final round (v1.0
) binaries, as described aboveUI Menu
F10
to toggle the level menuAirSim/AirSimExe/Content/Paks
directory. Ensure you downloaded the pakfile, if you are not able to see a particular environment)Start a race:
simStartRace(tier=1/2/3)
💚
Reset race:
simResetRace()
💚
Check if racer is disqualified:
simIsRacerDisqualified()
💚
Get index of last gate passed:
simGetLastGatePassed()
💚
Disable generation of logfiles by race APIs:
simDisableRaceLog
💚
FPV like Angle rate setpoint APIs:
moveByAngleRatesThrottleAsync
💚moveByAngleRatesZAsync
💚 (stabilizes altitude)Angle setpoint APIs:
moveByRollPitchYawThrottleAsync
💚moveByRollPitchYawZAsync
💚 (stabilizes altitude)RollPitchYawrate setpoint APIs:
moveByRollPitchYawrateThrottleAsync
💚moveByRollPitchYawrateZAsync
💚 (stabilizes altitude)Velocity setpoints
moveByVelocityAsync
moveByVelocityZAsync
(stabilizes altitude)Position setpoints
Minimum jerk trajectory planning (using ethz-asl/mav_trajectory_generation), and trajectory tracking (using a pure pursuit like controller minimizing position and velocity errors), with position setpoints.
Optionally use the *lookahead*
parameters to start new trajectory from a point sampled n
seconds ahead for trajectory being tracked currently.
Minimum jerk trajectory planning (using ethz-asl/mav_trajectory_generation), and trajectory tracking (using a pure pursuit like controller minimizing position and velocity errors), with position setpoints and corresponding velocity constraints. Useful for making a drone go through a gate waypoint, while obeying speed and direction constraints.
Optionally use the *lookahead*
parameters to start new trajectory from a point sampled n
seconds ahead for trajectory being tracked currently.
Clear and stop following current trajectory.
setAngleRateControllerGains
💚setAngleLevelControllerGains
💚setVelocityControllerGains
💚setPositionControllerGains
💚setTrajectoryTrackerGains
💚 Object pose setter and getter:
Object scale setter and getter:
Object segmentation ID setter and getter:
Listing all the objects in the scene:
Gate specific APIs:
Please open a Github Issue on this repository (not AirSim) for any technical questions w.r.t. the Neurips competition.