├── .nojekyll ├── README.md ├── _images ├── access.png ├── basiclandingpad-perception-model-output-set1.jpg ├── basiclandingpad-perception-model-output-set2.jpg ├── basiclandingpad-perception-model-output-set3.jpg ├── basiclandingpad.png ├── blocks_in_play.jpg ├── cluster.png ├── data-plane.png ├── detectavoidenv-default-config.png ├── epic_learn_suntemple.jpg ├── epic_learn_suntemple_create.jpg ├── mrg.png ├── segmentation_mesh_names.jpg ├── segmentation_set_customdepth.jpg ├── segmentation_stencil_view.jpg ├── segmentation_viewport.jpg ├── setup.png ├── soccer_field_spawn_center.jpg ├── soccer_field_spawn_goal.jpg ├── stateful_set.png ├── takeoff-landing-app-cam-view.gif ├── vs2019_cmake_build.jpg ├── vs2019_cmake_detected.jpg ├── vs2019_cmake_targets_view.jpg ├── vs2019_folder_view.jpg ├── vs2019_unreal_configs.jpg ├── vscode_cmake_build.jpg ├── vscode_cmake_configs.jpg ├── vscode_debug_targets.jpg ├── vscode_intellisense_config.jpg ├── vscode_test_explorer.jpg ├── vscode_toolbar_ctest.jpg ├── vscode_toolbar_intellisense.jpg └── windows_smartscreen.jpg ├── _sources ├── api.md.txt ├── autonomy │ ├── autonomy.md.txt │ ├── gym │ │ └── gym_envs.md.txt │ └── setup.md.txt ├── changelog.md.txt ├── client_setup.md.txt ├── command_line_switches.md.txt ├── config.md.txt ├── config_env_actors.md.txt ├── config_env_objects.md.txt ├── config_robot.md.txt ├── config_scene.md.txt ├── controllers │ ├── controllers.md.txt │ ├── px4 │ │ ├── px4.md.txt │ │ ├── px4_build.md.txt │ │ ├── px4_hitl.md.txt │ │ ├── px4_lockstep.md.txt │ │ ├── px4_multi_vehicle.md.txt │ │ ├── px4_sitl.md.txt │ │ └── px4_sitl_wsl2.md.txt │ └── simple_flight.md.txt ├── datacollection │ ├── api.md.txt │ ├── augmentations.md.txt │ ├── azure.md.txt │ ├── config.md.txt │ ├── data_aggregation.md.txt │ ├── data_generation.md.txt │ ├── randomizations.md.txt │ └── trajectory.md.txt ├── faq.md.txt ├── gis_scenes.md.txt ├── index.md.txt ├── internal │ ├── dev_setup_linux.md.txt │ ├── dev_setup_win.md.txt │ ├── headless_cloud.md.txt │ ├── physics │ │ └── unreal_physics.md.txt │ ├── scene │ │ └── sim_clock_internal.md.txt │ ├── sensors │ │ └── display.md.txt │ ├── use_prebuilt.md.txt │ ├── use_source.md.txt │ └── vscode_user_settings.md.txt ├── license.md.txt ├── modify_drone_physical.md.txt ├── modify_drone_visual.md.txt ├── multiple_robots.md.txt ├── physics │ ├── fast_physics.md.txt │ └── matlab_physics.md.txt ├── ros │ ├── example_build_map.md.txt │ ├── example_navigate_map.md.txt │ ├── ros.md.txt │ ├── ros2.md.txt │ └── ros_examples.md.txt ├── scene │ ├── sim_clock.md.txt │ └── weather_visual_effects.md.txt ├── sensors │ ├── battery.md.txt │ ├── camera_capture_settings.md.txt │ ├── camera_post_processing_with_nn.md.txt │ ├── camera_streaming.md.txt │ ├── lidar.md.txt │ ├── radar.md.txt │ └── segmentation.md.txt ├── support.md.txt ├── system_specs.md.txt ├── transition_from_airsim.md.txt └── use_plugin.md.txt ├── _static ├── basic.css ├── css │ ├── badge_only.css │ ├── fonts │ │ ├── Roboto-Slab-Bold.woff │ │ ├── Roboto-Slab-Bold.woff2 │ │ ├── Roboto-Slab-Regular.woff │ │ ├── Roboto-Slab-Regular.woff2 │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ ├── lato-bold-italic.woff │ │ ├── lato-bold-italic.woff2 │ │ ├── lato-bold.woff │ │ ├── lato-bold.woff2 │ │ ├── lato-normal-italic.woff │ │ ├── lato-normal-italic.woff2 │ │ ├── lato-normal.woff │ │ └── lato-normal.woff2 │ └── theme.css ├── doctools.js ├── documentation_options.js ├── file.png ├── fonts │ ├── Lato │ │ ├── lato-bold.eot │ │ ├── lato-bold.ttf │ │ ├── lato-bold.woff │ │ ├── lato-bold.woff2 │ │ ├── lato-bolditalic.eot │ │ ├── lato-bolditalic.ttf │ │ ├── lato-bolditalic.woff │ │ ├── lato-bolditalic.woff2 │ │ ├── lato-italic.eot │ │ ├── lato-italic.ttf │ │ ├── lato-italic.woff │ │ ├── lato-italic.woff2 │ │ ├── lato-regular.eot │ │ ├── lato-regular.ttf │ │ ├── lato-regular.woff │ │ └── lato-regular.woff2 │ └── RobotoSlab │ │ ├── roboto-slab-v7-bold.eot │ │ ├── roboto-slab-v7-bold.ttf │ │ ├── roboto-slab-v7-bold.woff │ │ ├── roboto-slab-v7-bold.woff2 │ │ ├── roboto-slab-v7-regular.eot │ │ ├── roboto-slab-v7-regular.ttf │ │ ├── roboto-slab-v7-regular.woff │ │ └── roboto-slab-v7-regular.woff2 ├── js │ ├── badge_only.js │ ├── theme.js │ └── versions.js ├── language_data.js ├── minus.png ├── plus.png ├── pygments.css ├── searchtools.js └── sphinx_highlight.js ├── api.html ├── api_docs ├── _sources │ └── index.rst.txt ├── _static │ ├── _sphinx_javascript_frameworks_compat.js │ ├── basic.css │ ├── css │ │ ├── badge_only.css │ │ ├── fonts │ │ │ ├── Roboto-Slab-Bold.woff │ │ │ ├── Roboto-Slab-Bold.woff2 │ │ │ ├── Roboto-Slab-Regular.woff │ │ │ ├── Roboto-Slab-Regular.woff2 │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ ├── fontawesome-webfont.woff2 │ │ │ ├── lato-bold-italic.woff │ │ │ ├── lato-bold-italic.woff2 │ │ │ ├── lato-bold.woff │ │ │ ├── lato-bold.woff2 │ │ │ ├── lato-normal-italic.woff │ │ │ ├── lato-normal-italic.woff2 │ │ │ ├── lato-normal.woff │ │ │ └── lato-normal.woff2 │ │ └── theme.css │ ├── doctools.js │ ├── documentation_options.js │ ├── file.png │ ├── fonts │ │ ├── Lato │ │ │ ├── lato-bold.eot │ │ │ ├── lato-bold.ttf │ │ │ ├── lato-bold.woff │ │ │ ├── lato-bold.woff2 │ │ │ ├── lato-bolditalic.eot │ │ │ ├── lato-bolditalic.ttf │ │ │ ├── lato-bolditalic.woff │ │ │ ├── lato-bolditalic.woff2 │ │ │ ├── lato-italic.eot │ │ │ ├── lato-italic.ttf │ │ │ ├── lato-italic.woff │ │ │ ├── lato-italic.woff2 │ │ │ ├── lato-regular.eot │ │ │ ├── lato-regular.ttf │ │ │ ├── lato-regular.woff │ │ │ └── lato-regular.woff2 │ │ └── RobotoSlab │ │ │ ├── roboto-slab-v7-bold.eot │ │ │ ├── roboto-slab-v7-bold.ttf │ │ │ ├── roboto-slab-v7-bold.woff │ │ │ ├── roboto-slab-v7-bold.woff2 │ │ │ ├── roboto-slab-v7-regular.eot │ │ │ ├── roboto-slab-v7-regular.ttf │ │ │ ├── roboto-slab-v7-regular.woff │ │ │ └── roboto-slab-v7-regular.woff2 │ ├── jquery.js │ ├── js │ │ ├── badge_only.js │ │ ├── theme.js │ │ └── versions.js │ ├── language_data.js │ ├── minus.png │ ├── plus.png │ ├── pygments.css │ ├── searchtools.js │ └── sphinx_highlight.js ├── genindex.html ├── index.html ├── objects.inv ├── py-modindex.html ├── search.html └── searchindex.js ├── autonomy ├── autonomy.html ├── gym │ └── gym_envs.html └── setup.html ├── changelog.html ├── client_setup.html ├── command_line_switches.html ├── config.html ├── config_env_actors.html ├── config_env_objects.html ├── config_robot.html ├── config_scene.html ├── controllers ├── controllers.html ├── px4 │ ├── px4.html │ ├── px4_build.html │ ├── px4_hitl.html │ ├── px4_lockstep.html │ ├── px4_multi_vehicle.html │ ├── px4_sitl.html │ └── px4_sitl_wsl2.html └── simple_flight.html ├── datacollection ├── api.html ├── augmentations.html ├── azure.html ├── config.html ├── data_aggregation.html ├── data_generation.html ├── randomizations.html └── trajectory.html ├── faq.html ├── genindex.html ├── gis_scenes.html ├── index.html ├── internal ├── dev_setup_linux.html ├── dev_setup_win.html ├── headless_cloud.html ├── physics │ └── unreal_physics.html ├── scene │ └── sim_clock_internal.html ├── sensors │ └── display.html ├── use_prebuilt.html ├── use_source.html └── vscode_user_settings.html ├── license.html ├── modify_drone_physical.html ├── modify_drone_visual.html ├── multiple_robots.html ├── objects.inv ├── physics ├── fast_physics.html └── matlab_physics.html ├── ros ├── example_build_map.html ├── example_navigate_map.html ├── ros.html ├── ros2.html └── ros_examples.html ├── scene ├── sim_clock.html └── weather_visual_effects.html ├── search.html ├── searchindex.js ├── sensors ├── battery.html ├── camera_capture_settings.html ├── camera_post_processing_with_nn.html ├── camera_streaming.html ├── lidar.html ├── radar.html └── segmentation.html ├── support.html ├── system_specs.html ├── transition_from_airsim.html └── use_plugin.html /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/.nojekyll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 🚧 Coming Soon: Project AirSim by IAMAI 2 | 3 | We're putting the final touches on this repository — it will be live **very soon**! 4 | 5 | If you're excited about high-fidelity autonomy simulations and want to support our work, **give this repo a ⭐️** — it helps us bring it to you even faster and reach more contributors. 6 | 7 | You can also click **"Watch"** (🔔) above to get notified as soon as we go live. 8 | 9 | In the meantime, let’s connect: 10 | 11 | - 💬 [Join our Discord community](https://discord.gg/XprQ2w64uj) — meet the team, share ideas, and stay in the loop. 12 | - 💡 [Introduce yourself on GitHub Discussions](https://github.com/iamaisim/ProjectAirSim/discussions) 13 | 14 | Thanks for being here — exciting things ahead! 15 | 16 | Stay tuned! 17 | -------------------------------------------------------------------------------- /_images/access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/access.png -------------------------------------------------------------------------------- /_images/basiclandingpad-perception-model-output-set1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/basiclandingpad-perception-model-output-set1.jpg -------------------------------------------------------------------------------- /_images/basiclandingpad-perception-model-output-set2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/basiclandingpad-perception-model-output-set2.jpg -------------------------------------------------------------------------------- /_images/basiclandingpad-perception-model-output-set3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/basiclandingpad-perception-model-output-set3.jpg -------------------------------------------------------------------------------- /_images/basiclandingpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/basiclandingpad.png -------------------------------------------------------------------------------- /_images/blocks_in_play.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/blocks_in_play.jpg -------------------------------------------------------------------------------- /_images/cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/cluster.png -------------------------------------------------------------------------------- /_images/data-plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/data-plane.png -------------------------------------------------------------------------------- /_images/detectavoidenv-default-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/detectavoidenv-default-config.png -------------------------------------------------------------------------------- /_images/epic_learn_suntemple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/epic_learn_suntemple.jpg -------------------------------------------------------------------------------- /_images/epic_learn_suntemple_create.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/epic_learn_suntemple_create.jpg -------------------------------------------------------------------------------- /_images/mrg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/mrg.png -------------------------------------------------------------------------------- /_images/segmentation_mesh_names.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/segmentation_mesh_names.jpg -------------------------------------------------------------------------------- /_images/segmentation_set_customdepth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/segmentation_set_customdepth.jpg -------------------------------------------------------------------------------- /_images/segmentation_stencil_view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/segmentation_stencil_view.jpg -------------------------------------------------------------------------------- /_images/segmentation_viewport.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/segmentation_viewport.jpg -------------------------------------------------------------------------------- /_images/setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/setup.png -------------------------------------------------------------------------------- /_images/soccer_field_spawn_center.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/soccer_field_spawn_center.jpg -------------------------------------------------------------------------------- /_images/soccer_field_spawn_goal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/soccer_field_spawn_goal.jpg -------------------------------------------------------------------------------- /_images/stateful_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/stateful_set.png -------------------------------------------------------------------------------- /_images/takeoff-landing-app-cam-view.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/takeoff-landing-app-cam-view.gif -------------------------------------------------------------------------------- /_images/vs2019_cmake_build.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vs2019_cmake_build.jpg -------------------------------------------------------------------------------- /_images/vs2019_cmake_detected.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vs2019_cmake_detected.jpg -------------------------------------------------------------------------------- /_images/vs2019_cmake_targets_view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vs2019_cmake_targets_view.jpg -------------------------------------------------------------------------------- /_images/vs2019_folder_view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vs2019_folder_view.jpg -------------------------------------------------------------------------------- /_images/vs2019_unreal_configs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vs2019_unreal_configs.jpg -------------------------------------------------------------------------------- /_images/vscode_cmake_build.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_cmake_build.jpg -------------------------------------------------------------------------------- /_images/vscode_cmake_configs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_cmake_configs.jpg -------------------------------------------------------------------------------- /_images/vscode_debug_targets.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_debug_targets.jpg -------------------------------------------------------------------------------- /_images/vscode_intellisense_config.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_intellisense_config.jpg -------------------------------------------------------------------------------- /_images/vscode_test_explorer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_test_explorer.jpg -------------------------------------------------------------------------------- /_images/vscode_toolbar_ctest.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_toolbar_ctest.jpg -------------------------------------------------------------------------------- /_images/vscode_toolbar_intellisense.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/vscode_toolbar_intellisense.jpg -------------------------------------------------------------------------------- /_images/windows_smartscreen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_images/windows_smartscreen.jpg -------------------------------------------------------------------------------- /_sources/autonomy/setup.md.txt: -------------------------------------------------------------------------------- 1 | # Setting-up ProjectAirSim Autonomy Blocks 2 | 3 | 1. Setup the runtime environment and install dependencies 4 | 5 | 1. Setup the `ProjectAirSim` client by following the steps listed in [client_setup](../client_setup.md) based on your platform (Linux/Windows) 6 | 1. Activate the python environment where you have installed the `projectairsim` python client package and install the additional `autonomy` module dependencies using the following command where `VERSION` is the Project AirSim version ID such as `0.1.8` (e.g. `projectairsim-0.1.8-py3-none-any.whl`) depending on the wheel package you have. 7 | 8 | > Note: The extra **[autonomy]** (including the square braces) after the wheel file name is necessary. 9 | 10 | `python -m pip install projectairsim-{VERSION}-py3-none-any.whl[autonomy]` 11 | 12 | 13 | > Note: In order to run the pre-trained autonomy models efficiently, A CUDA-capable GPU device with the compatible driver is expected to be installed on your system. The above setup would install the necessary `cudatoolkit` and deep learning framework (PyTorch) for Linux. If you are using **Windows** or **Mac OS**, in order to utilize the GPU device using `cudatoolkit`, please install using the command provided at [https://pytorch.org](https://pytorch.org). As an example, for installing the PyTorch stable release version `1.10.1` on Windows using Pip and CUDA 11.3, run the following command: 14 | `python -m pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html` 15 | 16 | 1. Check if your setup went successful 17 | 18 | 1. Run the followingImport a perception module from Project AirSim Autonomy to ensure your `autonomy` module setup went through successfully: 19 | 20 | ```bash 21 | python -c "from projectairsim.autonomy.perception import PosePredictor" 22 | ``` 23 | 24 | If the above line executes without error on your `ProjectAirSim` python virtual environment, you are all set! 25 | 26 | While not absolutely necessary, it is recommended to have a GPU on your machine to run the perception models. You can check if you have a GPU device that the model can use using the following command returns True: 27 | 28 | ```bash 29 | python -c "import torch; print(torch.cuda.is_available())" 30 | ``` 31 | 32 | 1. Obtain the pre-trained models using the separate instructions provided to you or reach out to the ProjectAirSim Autonomy team for instructions. -------------------------------------------------------------------------------- /_sources/command_line_switches.md.txt: -------------------------------------------------------------------------------- 1 | # Command Line Switches 2 | 3 | Project AirSim supports the following command line switches. Since Project AirSim environments are built as Unreal executables, there are some Unreal command line switch options that can be useful: 4 | 5 | | Switch | Description | 6 | | ------ | ----------- | 7 | | ‑RenderOffScreen | Enable headless rendering (same for both Windows and Linux) | 8 | | ‑nullrhi | Disable rendering completely | 9 | | ‑log | For Windows, this switch will launch an additional command prompt that displays the log output as stdout (default behavior in Linux) | 10 | | ‑vulkan | Force Vulkan rendering instead of DirectX for Windows (Vulkan is already default for Linux) 11 | | ‑ResX=640 ‑ResY=480 | Set the main viewport rendering resolution (ex. 640x480) | 12 | | ‑windowed | Run in windowed mode | 13 | | ‑fullscreen | Run in full-screen mode | 14 | | ‑NoVSync | Disable VSync to prevent capping FPS at the monitor's refresh rate | 15 | | ‑nosound | Disable any sound output | 16 | | ‑benchmark | Enabled Unreal's benchmark mode that seems to remove any sleeps in between rendering/tick loops to run without limiting to any real-time execution rate FPS target (this mode needs further testing to confirm any side-effects and how it could be used properly) | 17 | | ‑gltfDir=dir/containing/tiles/ | If you'll be using a GIS scene, you can specify the directory to read the tiles from. Alternatively, if you're trying CesiumForUnreal you can provide the root tileset json file. | 18 | | ‑clientauthpubkey=public_key | Specify a client authorization public key to require clients to present a client authorization token before being allowed to use the client API. Overrides the key set by the [PROJECTAIRSIM_CLIENT_AUTH_PUBKEY](#environment_variables) environment variable. | 19 | 20 | The below simulation parameters can also be changed through the comand line: 21 | 22 | | Switch | Value | Default | Description | 23 | | ------ | ----- | ----- | ----- | 24 | | ‑topicsport | integer | 8989 | TCP port for pub-sub client connection (e.g. ‑topicsport=8989)| 25 | | ‑servicesport | integer | 8990 | TCP port for req-resp client connection (e.g. ‑servicesport=8990)| 26 | 27 | **Note**: The port values must be different from one another. 28 | 29 | 30 | # Environment Variables 31 | 32 | Project AirSim supports the following environment variables: 33 | 34 | | Environment Variable | Description | 35 | | -------------------- | ----------- | 36 | | PROJECTAIRSIM_CLIENT_AUTH_PUBKEY | Client authorization token public key 37 | 38 | --- 39 | 40 | Copyright (C) Microsoft Corporation. All rights reserved. 41 | -------------------------------------------------------------------------------- /_sources/config.md.txt: -------------------------------------------------------------------------------- 1 | # Configuration JSONC Settings 2 | 3 | Project AirSim configuration files use the [JSONC (JSON with Comments)](https://commentjson.readthedocs.io/en/latest/) file format. The configuration JSONC settings that client scripts load are stored in a `sim_config/` subfolder relative to the client script: 4 | 5 | ``` 6 | 7 | └─ sim_config 8 | scene_basic_drone.jsonc 9 | scene_... 10 | robot_quadrotor_fastphysics.jsonc 11 | robot_... 12 | ``` 13 | 14 | The configuration settings are split into two levels: 15 | 16 | 1. **[Scene config](#scene-config)** - Settings for a specific scene, such as a list of actors and clock settings for that scene. This can be any JSONC file in the `sim_config/` folder, but generally starts with `scene_` as a filename prefix. 17 | 18 | 2. **[Robot config](#robot-config)** - Settings for a specific robot, such as its link/joint structure, controller, sensors, etc. This can be any JSONC file in the `sim_config/` folder, but generally starts with `robot_` as a filename prefix. Multiple actors in a scene can reference the same config file. 19 | 20 | 3. **[Environment actors config](#environment-actors-config)** - Settings for a specific environment actor, such as its link/joint structure, controller, sensors, etc. This can be any JSONC file in the `sim_config/` folder. For drones, the filename prefix generally start with `env_actor_`; for cars, they start with `env_actor_car`; for humans, they start with `env_actor_human`; and for particles, they start with `env_particle_effect`. Multiple actors in a scene can reference the same config file. 21 | 22 | *Note: Unlike Python, the JSON standard requires double-quotes (`"`) so be sure not to use single-quotes (`'`) in the JSONC configuration files.* 23 | 24 | ## Scene config 25 | 26 | An example scene config look like: 27 | 28 | `scene_env_actor.jsonc` 29 | ``` json 30 | { 31 | "id": "SceneBasicDrone", 32 | "actors": [ 33 | { 34 | "type": "robot", 35 | "name": "Drone1", 36 | "origin": {...}, 37 | "robot-config": "robot_quadrotor_fastphysics.jsonc" 38 | } 39 | ], 40 | "environment-actors": [ 41 | { 42 | "type": "env_car", 43 | "name": "car1", 44 | "origin": {...}, 45 | "env-actor-config": "env_actor_car.jsonc" 46 | } 47 | ], 48 | "clock": {...}, 49 | "home-geo-point": {...}, 50 | "segmentation": {...}, 51 | "scene-type": "UnrealNative" 52 | } 53 | ``` 54 | 55 | The `actors` array contains a block for each robot to spawn in the simulation at its specified `origin` coordinates, and each robot's `robot-config` string points to the robot config JSON file to load for it. 56 | 57 | For more detailed info, see **[Scene Configuration Settings](config_scene.md)**. 58 | 59 | ## Robot config 60 | 61 | An example robot config looks like: 62 | 63 | `robot_quadrotor_fastphysics.jsonc` 64 | ``` json 65 | { 66 | "physics-type": "fast-physics", 67 | "links": [...], 68 | "joints": [...], 69 | "controller": {...}, 70 | "actuators": [...], 71 | "sensors": [...] 72 | } 73 | ``` 74 | 75 | For more detailed info, see **[Robot Configuration Settings](config_robot.md)**. 76 | 77 | ## Environment actors config 78 | 79 | An example environment actor config looks like: 80 | 81 | `env_actor_car.jsonc` 82 | ``` json 83 | { 84 | "links": [...], 85 | "joints": [...], 86 | } 87 | ``` 88 | 89 | For more detailed info, see **[Environment Actor Configuration Settings](config_env_actors.md)** and **[Environment Object Configuration Settings](config_env_objects.md)**. 90 | 91 | --- 92 | 93 | Copyright (C) Microsoft Corporation. All rights reserved. 94 | -------------------------------------------------------------------------------- /_sources/config_env_objects.md.txt: -------------------------------------------------------------------------------- 1 | # Environment Objects Configuration Settings 2 | 3 | Environment objects in Project AirSim are elements within the simulation that enhance visual realism without directly participating in the simulation's core tasks. These objects include various elements such as Niagara particle systems or Particle Components. 4 | 5 | Environment objects: 6 | - Particles: **[Particle configuration overview settings](#particle-configuration-overview)** 7 | 8 | The Particles are only configured by a **link**. 9 | 10 | ## Particle configuration overview 11 | 12 | Environment Particle Effects are dynamic visual effects used to enhance the realism and ambiance of a scene. Particularly in ProjectAirSim, these particles can simulate a wide range of natural and artificial phenomena, such as fire and smoke, contributing to the environment and immersion of the virtual world. 13 | These environment objects are nor affected by gravity or physics in general. 14 | 15 | `env_particle_effect_nfire_02.jsonc` 16 | ``` json 17 | { 18 | "visual": {...} 19 | } 20 | 21 | | Parameter | Value | Description | 22 | | --------- | ----- | ----------- | 23 | | `visual` | Array of **[Visual settings](#visual-settings)** | Visual settings for the link's rendered mesh. | 24 | 25 | ### Visual settings 26 | 27 | The link's visual settings consist of what visual element will be rendered for the link. 28 | 29 | ``` json 30 | "visual": { 31 | "geometry": { 32 | "type": "unreal_mesh", 33 | "name": "/ProjectAirSim/FireSmokeAnims/M5VFXVOL2/Niagara/Fire/NFire_06", 34 | "scale": "3.0 3.0 3.0" 35 | } 36 | } 37 | ``` 38 | 39 | | Parameter | Value | Description | 40 | | --------- | ----- | ----------- | 41 | | `geometry`: `type` | `unreal_mesh` | The type of mesh geometry to use. The mesh must be imported into the Unreal environment as a .uasset to be available at runtime. | 42 | | `geometry`: `name` | string | For `unreal_mesh`, this should be the Unreal content path to the mesh in the environment. **Note:** Make sure this is a Niagara Particle Component or a Cascade Particle System uasset, otherwise it will not show on the screen. And that the Pivot is located at the base of the component, otherwise the BoundingBox won't set 43 | correctly.| 44 | | `geometry`: `scale` | string of 3 floats | Adjust the mesh's scale. Defaults to all 1.0 if not specified. | 45 | 46 | --- 47 | 48 | Copyright (C) Microsoft Corporation. All rights reserved -------------------------------------------------------------------------------- /_sources/controllers/controllers.md.txt: -------------------------------------------------------------------------------- 1 | # Flight Controllers 2 | 3 | A flight controller provides automatic control of the vehicle. The amount of automatic control can vary from fully autonomous flight to assisted manual flight. 4 | 5 | Project AirSim supports the following flight controllers: Simple Flight, PX4 Autopilot, and Manual Controller. 6 | 7 | ## Simple Flight 8 | 9 | [Simple Flight](simple_flight.md) is a lightweight flight controller that comes with Project AirSim and enables you to setup and start flying quickly and easily. Simple Flight currently supports quadrotor, hexarotor, VTOL quad-x tailsitter, and VTOL quad tiltrotor airframes. 10 | 11 | ## PX4 Autopilot 12 | 13 | [PX4 Autopilot](px4/px4.md) is a popular open-source flight controller. Project AirSim using PX4 currently supports the quadrotor airframe in the Hardware-In-The-Loop (HITL) configuration, and quadrotor, hexarotor, VTOL quad-x tailsitter, and VTOL quad tiltrotor airframes in the Software-In-The-Loop (SITL) configuration. 14 | 15 | If you are not familiar with setting up PX4, you may find it easier to start with Simple Flight if your airframe is supported. 16 | 17 | ## Manual Controller 18 | 19 | Manual Controller is a pass-through controller type with control signal outputs that are set completely manually by API and optionally starts with initial values set by config. See [Manual Controller settings](../config_robot.md#manual-controller-settings) and [Manual Controller commands](../api.md#manual-controller-commands) for more details. 20 | 21 | ## Comparing controllers 22 | 23 | The following chart compares the flight controllers when used with Project AirSim: 24 | 25 | Feature | Simple Flight | PX4 | Manual Controller 26 | ------- | ------------- | --- | --- 27 | Project AirSim Airframes | Quadrotor, hexarotor, VTOL quad-x tailsitter, VTOL quad tiltrotor | Quadrotor, hexarotor, VTOL quad-x tailsitter, VTOL quad tiltrotor in SITL, quadrotor only in HITL | Any 28 | Controller Hardware | None | None for SITL, required for HITL | None 29 | Setup | Easy | Harder | Easy 30 | Use | Easy | Harder | Manual 31 | Tuning Support | No | Yes | N/A 32 | 33 | --- 34 | 35 | Copyright (C) Microsoft Corporation. All rights reserved. 36 | -------------------------------------------------------------------------------- /_sources/controllers/px4/px4.md.txt: -------------------------------------------------------------------------------- 1 | # PX4 Autopilot Flight Controller 2 | 3 | The [PX4 Autopilot software stack](http://github.com/px4/firmware) is a very popular open-source flight controller with support for a wide variety of boards and sensors as well as a built-in capability for higher level tasks such as mission planning. Please visit [px4.io](http://px4.io) for more information. 4 | 5 | **Warning**: While all releases of Project AirSim support PX4, setting up PX4 is not trivial. It may be easier to start with [Simple Flight](../simple_flight.md), the flight controller that comes with Project AirSim, before attempting to use PX4. 6 | 7 | ## Supported versions of PX4 8 | 9 | Project AirSim supports PX4 v1.12.3. Other versions may work but are unsupported. 10 | 11 | ## Software-In-The-Loop (SITL) 12 | 13 | The recommended way to use PX4 with Project AirSim is "Software In The Loop" or SITL. In this configuration, the PX4 software stack is running as a program on a PC and communicating with Project AirSim on the same computer or another computer on the local network. 14 | 15 | See [Use PX4 as Software In The Loop](px4_sitl.md) for setup and use. 16 | 17 | ## Hardware-In-The-Loop (HITL) 18 | 19 | Project AirSim also supports using PX4 as "Hardware In The Loop" or HITL. In this configuration the PX4 software stack is running on a dedicated controller board and communicating with Project AirSim via USB. Project AirSim requires that the PX4 hardware supports the [MAVLink protocol](https://mavlink.io) over USB and runs a supported version of the PX4 firmware. 20 | 21 | See [Use PX4 as Hardware In The Loop](px4_hitl.md) for setup and use. 22 | 23 | ## Which configuration? 24 | 25 | The following table compares using Project AirSim with PX4 in the SITL and HITL configurations: 26 | 27 | 28 | 29 | Feature | SITL (Recommended) | HITL 30 | ------- | ------------------ | ---- 31 | PX4 Device | No | Required 32 | Manual Flight | Via game controller or RC transmitter over USB| Optional via RC transmitter & receiver 33 | Airframes | All Project AirSim airframes | "HIL Quadcopter X" only 34 | Setup & Run | Harder | Easier 35 | Modifying/Debugging PX4 Software | Easier | Harder 36 | 37 | --- 38 | 39 | Copyright (C) Microsoft Corporation. All rights reserved. 40 | -------------------------------------------------------------------------------- /_sources/controllers/px4/px4_hitl.md.txt: -------------------------------------------------------------------------------- 1 | # Using a PX4 Controller as Hardware-In-The-Loop (HITL) 2 | 3 | In HITL, the PX4 flight controller software is running on a dedicated hardware controller board (frequently the same as would be used in a physical remote control (RC) vehicle) connected via USB to the PC running Project AirSim. 4 | 5 | ## Supported airframes 6 | 7 | When using PX4 HITL, Project AirSim only supports the Quadrotor airframe which corresponds to PX4's "HIL Quadcopter X" airframe. The VTOL Fixed-Wing Tailsitter airframe is not supported in simulation by PX4 HITL (but is supported by [PX4 SITL](px4_sitl.md)). 8 | 9 | ## Supported hardware 10 | 11 | Project AirSim has been tested with the following devices: 12 | 13 | * Pixhawk 1 (2.4.6) 14 | * Pixhawk 4 mini from Holybro 15 | 16 | ## Setting up PX4 Hardware-In-The-Loop 17 | 18 | You must have one of the supported devices listed above. For manual flight simulation, you will also need a ground-based RC radio unit (aka. *RC transmitter*) and a vehicle-based RC radio unit (aka. *RC receiver*). 19 | 20 | 1. For manual flight simulation: 21 | 1. Make sure your RC receiver and RC transmitter are bound to each other. 22 | 2. Connect the receiver (the vehicle-based radio unit) to the PX4 flight controller's RC port. 23 | 24 | Refer to your RC manual and [PX4 docs](https://docs.px4.io/en/getting_started/rc_transmitter_receiver.html) for more information. 25 | 26 | 2. Do not plug the PX4 flight controller device into your computer yet. 27 | 3. Download and install [QGroundControl](http://qgroundcontrol.com/). 28 | 4. Launch *QGroundControl* and go to the Vehicle Firmware Setup panel (click on the Ground Control logo, select the "Vehicle Setup" tool, then "Firmware" tab.) 29 | 5. Connect the PX4 flight controller device to a USB port on your computer. 30 | 6. *QGroundControl* should detect the PX4 hardware and offer to setup the firmware on the device. Select the "PX4 Pro Stable Release vx.xx.x" flight stack. 31 | See also the [initial firmware setup video](https://docs.px4.io/master/en/config/). 32 | 7. In *QGroundControl*, configure your PX4 flight controller device for HIL simulation by selecting under "Simulation (Copter)" the "HIL Quadrocopter X" airframe, then click "Apply and Restart" at the top. After the PX4 device reboots and *QGroundControl* reconnects to it, verify that "HIL Quadrocopter X" is still selected. 33 | 34 | For manual flight simulation, perform these additional steps: 35 | 36 | 8. In *QGroundControl*, go to Radio tab and calibrate (make sure the transmitter is on and that the receiver indicates it is bound to it). 37 | 9. Go to the Flight Mode tab and chose one of the remote control switches as the "Mode Channel". Then set (for example) Stabilized and Attitude flight modes for two positions of the switch. 38 | 10. Go to the Tuning section of *QGroundControl* and set appropriate values. For example, for Fly Sky's FS-TH9X remote control, the following settings give a more realistic feel: 39 | 40 | Setting | Value 41 | ------- | ----- 42 | Hover throttle | mid+1 mark 43 | Roll and pitch sensitivity | mid-3 mark 44 | Altitude and position control sensitivity | mid-2 mark 45 | 46 | 11. In the [robot configuration file](/config_robot.md), specify PX4 for your vehicle controller like this: 47 | ```jsonc 48 | { 49 | ... 50 | "controller": { 51 | "id": "PX4_Controller", 52 | "type": "px4-api", 53 | "px4-settings": { 54 | "use-serial": true, 55 | "serial-port": "serial device name", 56 | "qgc-host-ip": "127.0.0.1", 57 | "qgc-port": 14550, 58 | "parameters": { 59 | "NAV_RCL_ACT": 0, 60 | "NAV_DLL_ACT": 0, 61 | "COM_OBL_ACT": 1, 62 | "LPE_LAT": 47.641468, 63 | "LPE_LON": -122.140165 64 | } 65 | } 66 | }, 67 | ... 68 | } 69 | ``` 70 | 71 | The "use-serial" value indicates that Project AirSim will find the PX4 device on a serial port with the device name specified by "serial-port". The "qgc-host-ip" and "qgc-port" configure Project AirSim to communicate with *QGroundControl*. The "parameters" values configure PX4 to set the vehicle's local origin and set failsafe actions appropriate for Project AirSim. 72 | 73 | You'll need to replace the "serial-port" entry's value of "serial device name" with the actual device name of the serial port to the PX4 device. 74 | * On Windows the device name will be of the form "COM*x*" such as "COM10" which you can determine by using the Device Manager and locating the PX4 device under "Ports (COM & LPT)". 75 | * On Linux the device name will be of the form "/dev/tty*x*"; for example, "/dev/ttyS1", "/dev/ttyUSB2", or "/dev/ttyACM3". If the PX4 device is connected by USB, the "lsusb" command may help determine the correct device name. 76 | 77 | After completing the above setup you should now be able to use *QGroundControl* to fly the vehicle in Project AirSim. If an RC transmitter and receiver are connected and configured through the additional setup steps for manual flight simulation, you can manually fly using the RC transmitter. With manual flight you don't need *QGroundControl* after the initial setup. You can usually arm the vehicle by lowering and bringing the two sticks of the RC transmitter together down and inwards. Typically the Stabilized flight mode (instead of Manual) gives a better experience for beginners. For more information see the [PX4 Basic Flying Guide](https://docs.px4.io/master/en/flying/basic_flying.html). 78 | 79 | You can also control the drone with a Python script using [the Python APIs](/apis.md). 80 | 81 | --- 82 | 83 | Copyright (C) Microsoft Corporation. All rights reserved. 84 | -------------------------------------------------------------------------------- /_sources/controllers/px4/px4_lockstep.md.txt: -------------------------------------------------------------------------------- 1 | # PX4 Lockstep Mode 2 | 3 | Recent versions of PX4 support a new [lockstep feature](https://docs.px4.io/master/en/simulation/#lockstep-simulation) when communicating with a simulator over TCP. `Lockstep` decouples the internal clocks of PX4 and the simulator from real-time and synchronizes them to each other so that both internal clocks advance together. This allows PX4 to behave normally even during unusually long delays in simulator updates. 4 | 5 | It is recommended that when you are running a `lockstep`-enabled version of PX4 in SITL mode that you specify the controller settings within the robot configuration of Project AirSim to set `lock-step` to `true` and set `use-tcp` to `true`. 6 | 7 | ``` 8 | { 9 | ... 10 | "controller": { 11 | "id": "PX4_Controller", 12 | "type": "px4-api", 13 | "px4-settings": { 14 | "lock-step": true, 15 | "use-tcp": true, 16 | ... 17 | } 18 | ``` 19 | 20 | This configures Project AirSim to use a "non-realtime" clock that advances in step with each sensor update sent to PX4. PX4 thinks time is progressing smoothly no matter how long 21 | it takes Project AirSim to actually process each loop update. 22 | 23 | This has the following advantages: 24 | 25 | - Project AirSim can be used on slow machines that cannot update the simulation fast enough for real-time. 26 | - You can debug Project AirSim, hit a breakpoint, and PX4 will behave normally after you resume. 27 | - You can use very slow sensors (such as LIDAR with a large number of simulated points) and PX4 will still behave normally. 28 | 29 | There are some side effects to `lockstep`, primarily slower update loops. Running Project AirSim on an underpowered machine or with processing-heavy sensors (like LIDAR) will cause slow updates or show some visible jerkiness in the simulated flight when you watch the screen update in real-time. 30 | 31 | --- 32 | 33 | Copyright (C) Microsoft Corporation. All rights reserved. 34 | -------------------------------------------------------------------------------- /_sources/controllers/px4/px4_sitl_wsl2.md.txt: -------------------------------------------------------------------------------- 1 | # PX4 Software-in-the-Loop with WSL 2 2 | 3 | The [Windows Subsystem for Linux version 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10) uses a virtual machine with its own IP address separate from that of your Windows host machine. This means PX4 will not find Project AirSim on the "localhost" which is the default behavior for PX4. 4 | 5 | You will notice that the Windows command `ipconfig` returns a new Ethernet adapter for WSL like this (notice that the Ethernet adapter has `(WSL)` in the name): 6 | 7 | ```plain 8 | Ethernet adapter vEthernet (WSL): 9 | 10 | Connection-specific DNS Suffix . : 11 | Link-local IPv6 Address . . . . . : aaaa::bbbb:cccc:cccc:eeee%ff 12 | IPv4 Address. . . . . . . . . . . : www.xxx.yyy.zzz 13 | Subnet Mask . . . . . . . . . . . : mmm.nnn.ooo.ppp 14 | Default Gateway . . . . . . . . . : 15 | ``` 16 | 17 | `www.xxx.yyy.zzz` is the address of the Windows host machine on the virtual network also connected to WSL 2, and WSL 2 can reach your Windows host machine through this address. 18 | 19 | **Note**: If Windows has been rebooted this virtual Ethernet adapter may not be created until the first run of WSL 2 terminal and the IP address may change. 20 | 21 | Beginning with this [PX4 change request](https://github.com/PX4/PX4-Autopilot/commit/1719ff9892f3c3d034f2b44e94d15527ab09cec6) (which correlates to version v1.12.0-beta1 or newer) PX4 in SITL mode can now connect to Project AirSim at a remote IP address. To use this feature, make sure you have a version of PX4 containing this fix and set the following environment variable in the WSL 2 Linux instance running PX4: 22 | 23 | ```bash 24 | export PX4_SIM_HOST_ADDR=www.xxx.yyy.zzz 25 | ``` 26 | 27 | **Note:** Be sure to change `www.xxx.yyy.zzz` to match the IP address reported by the `ipconfig` command. 28 | 29 | In your network firewall configuration, allow incoming TCP/IP port 4560 and incoming UDP/IP port 14540. 30 | 31 | Edit your [robot config](../../config_robot.md#px4_settings) file and add the `local-host-ip` setting to tell Project AirSim to use the WSL ethernet adapter address instead of the default `localhost`. Project AirSim will then listen on a TCP port on that adapter through which PX4 will connect. Set `control-ip-address` to the special value `remote` so that Project AirSim will automatically connect the API/Offboard communication channel to PX4 at the WSL 2 remote IP address obtained when PX4 connects via the TCP/IP socket. 32 | 33 | ``` json 34 | "px4-settings": { 35 | "lock-step" : true, 36 | "use-serial": false, 37 | "use-tcp": true, 38 | "tcp-port": 4560, 39 | "local-host-ip": "www.xxx.yyy.zzz", 40 | "control-ip-address": "remote", 41 | "control-port-remote": 14580, 42 | "qgc-host-ip": "", //Set only when enabling GCS proxy 43 | "qgc-port": 14550, //Set only when enabling GCS proxy 44 | "parameters": { 45 | "NAV_RCL_ACT": 0, 46 | "NAV_DLL_ACT": 0, 47 | "COM_OBL_ACT": 1, 48 | "LPE_LAT": 47.641468, 49 | "LPE_LON": -122.140165 50 | }, 51 | ... 52 | } 53 | ``` 54 | 55 | Usually Lockstep mode is enabled for PX4 SITL. See [PX4 Lockstep Mode](px4_lockstep.md) for more information. 56 | 57 | If your local repo does not include [this PX4 commit](https://github.com/PX4/PX4-Autopilot/commit/292a66ce417c9769e1a7845fbc9b8d5e68e1cf0b), please edit the Linux file in `ROMFS/px4fmu_common/init.d-posix/rcS`. Make sure it is looking for the `PX4_SIM_HOST_ADDR` environment variable and passing that through to the PX4 simulator like this: 58 | 59 | ```bash 60 | # If PX4_SIM_HOST_ADDR environment variable is empty use localhost. 61 | if [ -z "${PX4_SIM_HOST_ADDR}" ]; then 62 | echo "PX4 SIM HOST: localhost" 63 | simulator start -c $simulator_tcp_port 64 | else 65 | echo "PX4 SIM HOST: $PX4_SIM_HOST_ADDR" 66 | simulator start -t $PX4_SIM_HOST_ADDR $simulator_tcp_port 67 | fi 68 | ``` 69 | 70 | **Note:** This code might already be there depending on the version of PX4 you are using. 71 | 72 | **Note:** Please be patient waiting for the message: 73 | 74 | ``` 75 | INFO [simulator] Simulator connected on TCP port 4560. 76 | ``` 77 | 78 | It can take a little longer to establish the remote connection than it does when PX4 and Project AirSim connect via `localhost`. 79 | 80 | To complete setting up PX4 SITL, perform the steps given in [Setting up PX4 Software-in-Loop](px4_sitl.md#setting_up_px4_software_in_the_loop). 81 | 82 | 83 | ## Using a ground control station 84 | 85 | Normally when using ground control station software with PX4 (like [*QGroundControl*](http://qgroundcontrol.com/)) the ground control station software will connect to PX4 directly. In this configuration, ground control station software running in Windows can't connnect to PX4 directly since PX4 is running in WSL 2. To connect the ground control station software to PX4, enable Project AirSim's ground control proxy by setting `qgc-host-ip` to `127.0.0.1`. The ground control station software can then communicate with PX4 via Project AirSim. 86 | 87 | --- 88 | 89 | Copyright (C) Microsoft Corporation. All rights reserved. 90 | -------------------------------------------------------------------------------- /_sources/datacollection/augmentations.md.txt: -------------------------------------------------------------------------------- 1 | # Image Level Augmentations 2 | 3 | The `Data Generation` module allows developers to introduce augmentations to the collected images. That is, enriching base dataset with operations like vertical and horizontal flipping. This allows for more variety in the collected data and leads to a more rounded dataset at the end. These augmentations can also be used to induce edge-case scenarios to the dataset; again for obtaining datasets that more closely represents the real-world scenarios. 4 | 5 | The augmentation module can be enabled using the following param: 6 | ````json 7 | "augmentation-spec": { 8 | "2DBBox": { 9 | "enabled": true 10 | }, 11 | } 12 | ```` 13 | 14 | Currently, the following properties can be augmented through the module: 15 | * [Horizontal Flipping](#horizontal-flipping) 16 | * [Vertical Flipping](#vertical-flipping) 17 | * [Random Rotation](#random-rotation) 18 | * [Random Cropping](#random-cropping) 19 | * [Affine Transformation](#affine-transformation) 20 | * [Brightness-Contrast](#brightness-contrast) 21 | * [Hue-Saturation-Value](#hue-saturation-value) 22 | * [Motion Blur](#motion-blur) 23 | * [Gaussian Noise](#gaussian-noise) 24 | 25 | An example for configuring these augmentations at an asset level can be found in [`datacollector_config.jsonc`](./../../client/python/example_user_scripts/datacollection/configs/datacollector_config.jsonc#L26) 26 | 27 | Refer to [`augmentation APIs`](api.md#augmentation-apis) section from `api.md` for the API reference for the augmentation module. 28 | 29 | ## Horizontal Flipping 30 | Allows for the flipping of the input horizontally around the y-axis. This feature can be configured using the following param: 31 | 32 | ````json 33 | "horizontal-flip": { //Flip horizontally around the y-axis. 34 | "enabled": true, 35 | "p": 1 //probability of applying the transform. Default: 1. 36 | } 37 | ```` 38 | 39 | ## Vertical Flipping 40 | Allows for the flipping of the input horizontally around the y-axis. This feature can be configured using the following param: 41 | 42 | ````json 43 | "vertical-flip": { //Flip horizontally around the y-axis. 44 | "enabled": true, 45 | "p": 1 //probability of applying the transform. Default: 1. 46 | } 47 | ```` 48 | 49 | ## Random Cropping 50 | Crops a random part of the input. This feature can be configured using the following param: 51 | 52 | ````json 53 | "crop": { //Crop a random part of the input 54 | "enabled": true, 55 | "crop-height": 224, //Height of cropped image 56 | "crop-width": 224, //Width of cropped image 57 | "p": 1 //probability of applying the transform. Default: 1. 58 | }, 59 | ```` 60 | 61 | ## Random Rotation 62 | Rotate the input by an angle selected randomly from the uniform distribution. This feature can be configured using the following param: 63 | 64 | ````json 65 | "rotate": { //Rotate the input by an angle selected randomly from the uniform distribution 66 | "enabled": true, 67 | "angular-limit": 180, //Rotation angle randomly selected from range(-limit, limit) 68 | "p": 1 //probability of applying the transform. Default: 1. 69 | }, 70 | ```` 71 | 72 | ## Affine Transformation 73 | Apply an affine transformation to the input image. This feature can be configured using the following param: 74 | 75 | ````json 76 | "affine-transform": { //Apply affine transformations to image 77 | "enabled": true, 78 | "translate-percent": 20, //Translation as a fraction of the image height/width 79 | "scale": 0.5, //Scaling factor in. Param Range - (0,1) 80 | "shear": 30, //Shear image along x-axis with angle in range(-angle, angle) 81 | "p": 1 82 | }, 83 | ```` 84 | 85 | ## Brightness-Contrast 86 | Randomly change brightness and contrast of the input image. This feature can be configured using the following param: 87 | 88 | ````json 89 | "brightness-contrast": { //Randomly change brightness and contrast of the input image 90 | "enabled": true, 91 | "brightness-limit": 0.5, //factor range for changing brightness. Select value from (0,1) 92 | "contrast-limit": 0.2, //factor range for changing contrast. Select value from (0,1) 93 | "p": 1 94 | }, 95 | ```` 96 | 97 | ## Hue-Saturation-Value 98 | Randomly change hue, saturation and value of the input image. This feature can be configured using the following param: 99 | 100 | ````json 101 | "hue-saturation-value": { //Randomly change hue, saturation and value of the input image 102 | "enabled": true, 103 | "hue-shift-limit": 20, //hue shift randomly selected from range(-limit, limit) 104 | "saturation-shift-limit": 50, //sat shift randomly selected from range(-limit, limit) 105 | "value-shift-limit": 30, //value shift randomly selected from range(-limit, limit) 106 | "p": 1 107 | }, 108 | ```` 109 | ## Motion Blur 110 | Apply motion blur to the input image using a random-sized kernel. This feature can be configured using the following param: 111 | 112 | ````json 113 | "motion-blur": { //Apply motion blur to the input image using a random-sized kernel 114 | "enabled": true, 115 | "blur-limit": 21, //maximum kernel size for blurring the input image. Must be a odd number 116 | "p": 1 117 | }, 118 | ```` 119 | ## Gaussian Noise 120 | Apply gaussian noise to the input image. This feature can be configured using the following param: 121 | 122 | ````json 123 | "gaussian-noise": { //Apply gaussian noise to the input image 124 | "enabled": true, 125 | "variance-limit": 200, //variance range for noise 126 | "p": 1 127 | } 128 | ```` 129 | -------------------------------------------------------------------------------- /_sources/datacollection/azure.md.txt: -------------------------------------------------------------------------------- 1 | # Data Generation On Azure 2 | 3 | This document serves as a guide to run the data generation module scripts on a scalable Azure infrastructure that allows the data gen job to be parallelized across multiple AKS instances. This functionality is integrated into the Project Airsim (`PAS`) Managed App and can be easily configured through the same. 4 | 5 | ## Prerequisites 6 | The following pieces are required for you to successfully run the data generation module on Azure: 7 | - An Azure subscription with access to the PAS Azure Offering 8 | - A PAS Managed App deployment on your Azure subscription 9 | - A blob container inside a storage account on your Azure subscription 10 | - Configured Data Generation PAS client script and subsequent data generation/scene and robot configs. Please refer to the [Data Generation](./data_generation.md) document for more information on how to configure these scripts and configs. 11 | 12 | This guide will walk you through the following steps: 13 | - [`Uploading data to the blob container`](#upload-data) 14 | - [`Configuring the data generation job on the Managed App`](#configure-job) 15 | - [`Accessing client logs to monitor the job`](#access-logs) 16 | 17 | 18 | 19 | ## Upload Data 20 | 21 | An [`Upload Script`](../../client/python/example_user_scripts/datacollection/azure/setup_blob_container.py) is provided to help you upload the data to the blob container. This script would be run from your local machine. The script requires the following parameters to be passed in: 22 | - `--sas-url`: SAS-URL of the blob container. Please provide `Read`, `Write`, `List`, `Create`, and `Add` permissions to the URL. 23 | - `--config-dir`: Directory that holds `datacollector_config.jsonc` and the scene/robot configs. The structure of the directory should be as follows: 24 | ``` 25 | config-dir 26 | ├── datacollector_config.jsonc 27 | ├── sim_config 28 | │ ├── scene_config.jsonc 29 | │ ├── robot_config.jsonc 30 | ├── schemas 31 | │ ├── datacollector_config_schema.jsonc 32 | ``` 33 | A sample config directory is provided [here](../../client/python/example_user_scripts/datacollection/configs). 34 | - `--script`: Path to the PAS client script. [`basic_datacollection_azure.py`](../../client/python/example_user_scripts/datacollection/azure/basic_datacollection_azure.py) is provided as a sample script. 35 | - `--asset-dir`: Directory that holds the assets to be used during the data gen job. 36 | - `--pas-whl`: Path to the PAS client `.whl` file 37 | ## Configure Job 38 | Once the data is uploaded to the blob container, you can configure the data generation job on the PAS Managed App. Follow the steps below to configure the job: 39 | - Navigate to the `Data Collection Workspaces` tab on the PAS Managed App and click on `Setup Data Collection`. 40 | ![Data Plane](../images/datacollection/data-plane.png) 41 | - Provide the relevant information in the subsequent tabs to point the downstream aks instances to the correct PAS binary and the data in your blob container. 42 | ![Data Plane](../images/datacollection/setup.png) 43 | - Submit the job 44 | ## Access Logs 45 | You can access logs from all associated AKS instances to monitor the state of your data collection job. Follow the steps below to access the logs: 46 | - Go to the `Managed resource group` associated to your managed app deployment. 47 | ![MRG](../images/datacollection/mrg.png) 48 | - Select the AKS cluster 49 | ![AKSCLuster](../images/datacollection/cluster.png) 50 | - Navigate to the `Access Control (IAM)` tab and click on `Add Role Assignment`. Give yourself/any relevant entities the `Azure Kubernetes Service RBAC Cluster Admin` role 51 | ![Role](../images/datacollection/access.png) 52 | - Navigate to the `Cluster Configuration` tab and set the following values. You now have the required permissions to access the logs. 53 | ![ClusterConfig](../images/datacollection/rbac.png) 54 | - Under the `Workloads` tab, select the `Stateful Sets` tab. Here, select `airsimvnext-dc-stateful-set' 55 | ![StatefulSet](../images/datacollection/stateful_set.png) 56 | - Click on `Live Logs` to access the logs from the AKS instances. -------------------------------------------------------------------------------- /_sources/datacollection/data_aggregation.md.txt: -------------------------------------------------------------------------------- 1 | # Data Aggregation 2 | 3 | Once the data is generated, the data can be aggregated into specific spec formats that can later be used for tasks such as ingestion to data curation tools or fine-tuning of a pre-trained model. The formats we support are: 4 | 5 | * [COCO JSON](#coco-json) 6 | * [JSON](#json) 7 | * [JSONL](#jsonl) 8 | * [CSV](#csv) 9 | 10 | Below are the structures of these specs for reference: 11 | 12 | #### COCO JSON 13 | `Note` - This spec only supports segmentation data (when segmentation data collection is enabled). None of the other specs hold segmentation data 14 | ````json 15 | { 16 | "info": { 17 | "description": "DFW Takeoff-Landing Data", 18 | "url": "", 19 | "version": 1.0, 20 | "year": 2021, 21 | "contributor": "Project AirSim" 22 | }, 23 | "licenses": [ 24 | { 25 | "id": 0, 26 | "url": "/", 27 | "name": "Public Domain" 28 | } 29 | ], 30 | "images": [ 31 | { 32 | "license": 0, 33 | "file_name": "images/0.png", 34 | "coco_url": "{Link to image on AML datastore}", 35 | "absolute-url": "{Link to image on blob-container}", 36 | "height": 225, 37 | "width": 400, 38 | "id": "0", 39 | "date-captured": "" 40 | } 41 | ], 42 | "categories": [ 43 | { 44 | "supercategory": "none", 45 | "id": 0, 46 | "name": "LandingPads" 47 | } 48 | ], 49 | "annotations": [ 50 | { 51 | "segmentation": [], 52 | "iscrowd": 0, 53 | "area": 52200, 54 | "image_id": "0", 55 | "bbox": [ 56 | 0.21, 57 | 0.0, 58 | 0.58, 59 | 1.0 60 | ], 61 | "category_id": 0, 62 | "id": "0" 63 | } 64 | ] 65 | } 66 | ```` 67 | 68 | #### JSON 69 | 70 | ````json 71 | { 72 | "baseuri": "{blob-container URL}", 73 | "categories": [ 74 | "BasicLandingPad" 75 | ], 76 | "dataset_name": "DatasetTwoTestTwo", 77 | "images": [ 78 | { 79 | "image-width": 400, 80 | "image-height": 225, 81 | "file": { 82 | "hash": "", 83 | "key": "", 84 | "object-type": "File", 85 | "storage-type": "azure-blob", 86 | "uri": "0.png" 87 | }, 88 | "format": ".png", 89 | "split": "validate", 90 | "polygon": [ 91 | {"3d BBOX Data"} 92 | ], 93 | "boxes": [ 94 | { 95 | "height": 0.1111111111111111, 96 | "left": 0.4375, 97 | "score": 1.0, 98 | "tag": "AirTaxi", 99 | "top": 0.2088888888888889, 100 | "width": 0.1225 101 | } 102 | ], 103 | "weather": "RAIN", 104 | "time": "2022-06-20T07:15:00", 105 | "geo-location": "DFW", 106 | "lat-lon": "33.032079,-97.284227" 107 | } 108 | ] 109 | } 110 | ```` 111 | #### JSONL 112 | ````json 113 | {"image_url": "{Link to image}", "image-width": 400, "image-height": 225, "label": {"label": "AirTaxi", "isCrowd": false, "label_confidence": [1.0], "topX": 0.4375, "topY": 0.2088888888888889, "bottomX": 0.56, "bottomY": 0.32, "polygon": [[217.0, 72.0], [218.0, 57.0], [182.0, 72.0], [181.0, 57.0], [223.0, 67.0], [224.0, 47.0], [176.0, 67.0], [175.0, 47.0]]}}, 114 | ```` 115 | #### CSV 116 | 117 | |ImageName|pose_x |pose_y|pose_z|roll|pitch|yaw |category|x0 |y0 |x1 |y1 |x2 |y2 |x3 |y3 |x4 |y4 |x5 |y5 |x6 |y6 |x7 |y7 |x_c |y_c |w |h | 118 | |---------|-------|------|------|----|-----|-----------|--------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|-----|----|---|---| 119 | |0.png |-557 |5 |-154 |0 |0 |3.141592654|AirTaxi |217|72 |218|57 |182|72 |181|57 |223|67 |224|47 |176|67 |175|47 |199.5|59.5|49 |25 | 120 | |1.png |-557.04|5 |-154 |0 |0 |3.141592654|AirTaxi |217|72 |218|57 |182|72 |181|57 |223|67 |224|46 |176|67 |175|46 |199.5|59 |49 |26 | -------------------------------------------------------------------------------- /_sources/datacollection/data_generation.md.txt: -------------------------------------------------------------------------------- 1 | # Data Generation 2 | 3 | This documents serves to provide a detailed overview on the components that make up a data generation run and how to configure it. The folder [`example_user_scripts/datacollection`](../../client/python/example_user_scripts/datacollection/) provides a set of example scripts and configs for the developer's reference. 4 | 5 | A data generation run consists of these main components: 6 | 7 | * [Trajectory Generation](#trajectory-generation) 8 | * [Data Collection](#data-collection) 9 | * [Data Aggregation](#data-aggregation) 10 | * [Data Validation](#data-validation) 11 | * [Data Augmentation](augmentations.md#image-level-augmentations) 12 | 13 | All these components are configured through [`datacollector_config.jsonc`](../../client/python/example_user_scripts/datacollection/configs/datacollector_config.jsonc) as well as a set of API's that allow for additional fine tuning on top of the config. For more information refer to [`config.md`](./config.md) and [`api.md`](./api.md) 14 | 15 | ### Note 16 | There is an extra installation step that you need to follow in order to use the `datacollection` module inside `projectairsim` client. Once you have installed the `projectairsim` module, please run the following command in your python env 17 | 18 | ````bash 19 | python -m pip install -U albumentations --no-binary qudida,albumentations 20 | ```` 21 | 22 | This manual step is required since the `albumentation` module installs `opencv-pyhton-headless` by default. Since this install interferes with the `opencv-python` install within the `projectairsim` module, we have not make it a dependancy within the wheel and are recommending users to manually install it with the above command, if using the `datacollection` module. 23 | 24 | ## Trajectory Generation 25 | During the data generation run, the drone moves along the `WayPoint` objects defined during trajectory generation which makes this step crucial in terms of the quantity, quality and variety of data generated through the module. 26 | 27 | For more information on the types of trajectories available out-of-the-box and how to configure them, checkout [`trajectory.md`](./trajectory.md) 28 | 29 | ## Data Collection 30 | 31 | The drone is moved along the generated trajectory. At each pose, ground-truth data is requested from the sim and saved along with other relevant meta data about that pose (weather/time conditions etc). What data is requested from the sim depends on the data-spec defined in the [`config`](./config.md#collection-spec)/through the [`API`](./api.md#pre-collection-apis) 32 | 33 | Here, the sim scene and drone are configured through the `scene` and `robot` configs. 34 | 35 | ## Data Validation 36 | 37 | Once the data is collected and stored in memory, the data generation module allows the develop to run a set of validation checks on the data. These validation checks clean the dataset of data points that do not pass these tests. It also generate a report on the remaining data - proving quantitative measurements of the collected dataset. 38 | 39 | These checks can be initiated through API calls to the data generator module. For more information, check out [`api.md`](./api.md#base-apis). [`datacollection_validation_apis.py`](../../client\python\example_user_scripts\datacollection/datacollection_validation_apis.py) is also included in the `example_user_scripts/datacollection` folder to provide an example usage of these API's 40 | ## Data Aggregation 41 | 42 | Once the data is collected and validated, the data can be aggregated into specific spec formats that can later be used for tasks such as ingestion to data curation tools or fine-tuning of a pre-trained model. 43 | 44 | For more information on the specific formats the data is saved to, check out [`data_aggregation.md`](./data_aggregation.md) 45 | 46 | ## Data Augmentation 47 | 48 | Once the data is collected and aggregated, the module offers the option to augment this dataset with variations of itself. Its purpose is to add variety to your dataset and generate potential edge-case data points without going back to the sim. 49 | 50 | If enabled, this sub-module reads the image and metadata off of your directory, manipulates and saves it back to that directory. For images, the augmented images follow the same naming convention as those from the sim ({index}.png) and their indexes start from where the sim images end. As for the metadata, currently the 2D bbox data for the augmented images is appended to the `csv` generated through the data augmentation step 51 | 52 | For more information about the types of available augmentations and configuring this sub-module through the config, checkout [config.md](./config.md#augmentation-spec) 53 | 54 | For the available augmentation API's, checkout [`api.md`](./api.md). [`datacollection_augmentation_apis.py`](../../client\python\example_user_scripts\datacollection\datacollection_augmentation_apis.py#L61) is also included in the `example_user_scripts/datacollection` folder to provide an example usage of these API's -------------------------------------------------------------------------------- /_sources/datacollection/randomizations.md.txt: -------------------------------------------------------------------------------- 1 | # Object-Level Randomizations 2 | 3 | The `Data Generation` module allows developers to introduce randomizations at the object level. That is, the assets being spawned in a scene can have a variety of their properties randomized. This allows for more variety in the collected data and leads to a more rounded dataset at the end. These randomizations can also be used to induce edge-case scenarios to the dataset; again for obtaining a better dataset. 4 | 5 | The following properties can be randomized through the module: 6 | * [Texture](#texture) 7 | * [Scale](#scale) 8 | * [Rotation](#rotation) 9 | * [Translation](#translation) 10 | * [Flip](#flip) 11 | 12 | An example for configuring these randomizations at an asset level can be found in [`datacollector_config.jsonc`](./../../client/python/example_user_scripts/datacollection/configs/datacollector_config.jsonc#L26) 13 | 14 | ## Texture 15 | Allows for the texture of the asset to be randomized. This feature can be configured using the following param: 16 | 17 | ````json 18 | "texture": [ // List of different textures to choose from. 19 | "default", 20 | "shiny_texture", 21 | "matte_texture" 22 | ] 23 | ```` 24 | ## Scale 25 | 26 | Allows for the scale of the asset to be randomized. Scale is a unit-less multiple that is applied to the `x`, `y` and, `z` dimensions of the asset. This feature can be configured using the following param: 27 | 28 | ````json 29 | "scale": { 30 | "amount": 2, // Number of variations to produce. 31 | "upper_bound": 100, // Upper bound of the scale factor. 32 | "lower_bound": 50 // Lower bound of the scale factor. 33 | } 34 | ```` 35 | 36 | ## Rotation 37 | 38 | Allows for the rotational-orientation of the asset to be randomized. This type of randomization can be applied to either of the rotational axes - `roll`, `pitch` or `yaw`. This feature can be configured using the following param: 39 | 40 | ````json 41 | "rotation": { 42 | "amount": 2, // Number of variations to produce. 43 | "upper_bound": 90.0, // Upper bound of rotation, in degrees. 44 | "lower_bound": -90.0, // Lower bound of rotation, in degrees. 45 | "axis": "roll" // Axis for rotation. 46 | } 47 | ```` 48 | 49 | ## Translation 50 | 51 | Allows for the position of the asset to be randomized. This type of randomization can be applied to either of the cartesian axes - `x`, `y` or `z`. This feature can be configured using the following param: 52 | 53 | ````json 54 | "rotation": { 55 | "amount": 2, // Number of variations to produce. 56 | "upper_bound": 90.0, // Upper bound of rotation, in degrees. 57 | "lower_bound": -90.0, // Lower bound of rotation, in degrees. 58 | "axis": "roll" // Axis for rotation. 59 | } 60 | ```` 61 | ## Flip 62 | 63 | Allows for randomized flipping of the asset along an axis. This type of randomization can be applied to either of the rotational axes - `roll`, `pitch` or `yaw`. This feature can be configured using the following param: 64 | 65 | ````json 66 | "flip": { 67 | "axis": "roll", // Axis for flipping. 68 | "initial_rpy": [ 69 | 20, 70 | 0, 71 | 0 72 | ] // Starting roll, pitch, yaw of the object. 73 | } 74 | ```` -------------------------------------------------------------------------------- /_sources/faq.md.txt: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions (FAQ) 2 | 3 | ## General 4 | 5 | ### What vehicle types are supported? 6 | 7 | Currently, only quadrotor, hexarotor, VTOL fixed-wing quad-x tailsitter, and VTOL fixed-wing quad tiltrotor aircraft are supported. 8 | 9 | ## Troubleshooting 10 | 11 | ### Something went wrong in my simulation. How do I get log files to help see what happened? 12 | 13 | The Python client saves a log file in the same folder as the client script that's run: 14 | 15 | `\projectairsim_client.log` 16 | 17 | To add log output lines in your script, use the `projectairsim_log()` logger: 18 | 19 | ```python 20 | from projectairsim.utils import projectairsim_log 21 | 22 | projectairsim_log().info(f"Message to log: {my_var}") 23 | projectairsim_log().error("Error to log with stack trace", exc_info=True) 24 | projectairsim_log().exception("Another way to log an error with stack trace") 25 | ``` 26 | 27 | For the simulation server, a log file is saved in the UE project folder: 28 | 29 | `<{UE project folder}>\projectairsim_server.log` 30 | 31 | For `DebugGame` and `Development` Unreal builds, the Unreal native log file will also be saved to a `Saved\Logs` subfolder: 32 | 33 | `DebugGame\WindowsNoEditor\Blocks\Saved\Logs\Blocks.log` 34 | 35 | On Linux, this file has the same contents as what is output to the stdout console. For Windows, if you want to see the log file contents on the stdout console as well, you can run the environment with the `-log` switch: 36 | 37 | `Blocks.exe -log` 38 | 39 | --- 40 | 41 | Copyright (C) Microsoft Corporation. All rights reserved. 42 | -------------------------------------------------------------------------------- /_sources/gis_scenes.md.txt: -------------------------------------------------------------------------------- 1 | # GIS Scenes 2 | If you are looking to use one of our geo-specific scenes, provided that you have the needed glb/glTF tiles, you only have to make two changes. 3 | 4 | In the **[Scene Configuration](config_scene.md)**, you will need to set the "scene-type" and "tiles-dir" parameters: 5 | 1. For GIS environments, **scene-type** should be set to **CustomGIS**. -------------------------------------------------------------------------------- /_sources/index.md.txt: -------------------------------------------------------------------------------- 1 | # Project AirSim 2 | 3 | ```{include} ../../README.md 4 | :relative-docs: docs_build/source 5 | :relative-images: docs_build/source/images 6 | ``` 7 | 8 | ```{toctree} 9 | :maxdepth: 2 10 | :caption: Introduction 11 | 12 | README.md 13 | ``` 14 | 15 | ```{toctree} 16 | :maxdepth: 2 17 | :caption: Getting Started 18 | 19 | internal/use_source.md 20 | internal/use_prebuilt.md 21 | internal/dev_setup_linux.md 22 | internal/dev_setup_win.md 23 | internal/vscode_user_settings.md 24 | internal/headless_cloud.md 25 | ``` 26 | 27 | ```{toctree} 28 | :maxdepth: 2 29 | :caption: ROS Integration 30 | 31 | ros/ros.md 32 | ros/ros2.md 33 | ros/ros_examples.md 34 | ros/example_build_map.md 35 | ros/example_navigate_map.md 36 | ``` 37 | 38 | ```{toctree} 39 | :maxdepth: 2 40 | :caption: Sensors 41 | 42 | sensors/camera_capture_settings.md 43 | sensors/camera_post_processing_with_nn.md 44 | sensors/camera_streaming.md 45 | sensors/segmentation.md 46 | sensors/lidar.md 47 | sensors/radar.md 48 | sensors/battery.md 49 | internal/sensors/display.md 50 | ``` 51 | 52 | ```{toctree} 53 | :maxdepth: 2 54 | :caption: Data Collection 55 | 56 | datacollection/config.md 57 | datacollection/randomizations.md 58 | datacollection/trajectory.md 59 | datacollection/data_generation.md 60 | datacollection/data_aggregation.md 61 | ``` 62 | 63 | ```{toctree} 64 | :maxdepth: 2 65 | :caption: Physics and Simulation 66 | 67 | physics/fast_physics.md 68 | physics/matlab_physics.md 69 | internal/physics/unreal_physics.md 70 | scene/sim_clock.md 71 | scene/weather_visual_effects.md 72 | internal/scene/sim_clock_internal.md 73 | ``` 74 | 75 | ```{toctree} 76 | :maxdepth: 2 77 | :caption: Code Structure 78 | 79 | code_structure.md 80 | ``` 81 | 82 | ```{toctree} 83 | :maxdepth: 2 84 | :caption: APIs and Programmatic Control 85 | 86 | apis.md 87 | ``` 88 | 89 | ```{toctree} 90 | :maxdepth: 2 91 | :caption: Settings 92 | 93 | ```{toctree} 94 | :maxdepth: 1 95 | :caption: Python API Reference 96 | 97 | api_docs/index 98 | 99 | settings.md 100 | ``` 101 | -------------------------------------------------------------------------------- /_sources/internal/dev_setup_win.md.txt: -------------------------------------------------------------------------------- 1 | # Developer Initial Setup for Windows 2 | {# include enable_internal_docs.tpp #} 3 | 4 | On Windows, Project AirSim can be developed with either Visual Studio 2019 or VS Code. VS Code is convenient because it provides a lighter-weight, cross-platform common experience between Windows and Linux. 5 | 6 | ## Setup 7 | 8 | 1. A) To develop with **VS Code**: 9 | 10 | First, install the **[VS 2022 C++ build tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)** with: 11 | 12 | - `Desktop development with C++` workload 13 | - `.NET Framework 4.8 SDK` individual component 14 | - (no)`.NET Core SDK` individual component 15 | 16 | Second, install **[VS Code](https://code.visualstudio.com/)** with the following extensions: 17 | 18 | *Note: If not manually installed, these extensions will be recommended for automatic install on opening the Project AirSim project workspace* 19 | 20 | - **[CMake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools)** 21 | - **[C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)** (includes clang-format functionality, use **Alt-Shift-F** to auto-format the current code file using the repo's .clang-format settings) 22 | - **[CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb)** 23 | - **[C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)** 24 | - **[Mono Debug](https://marketplace.visualstudio.com/items?itemName=ms-vscode.mono-debug)** 25 | - **[C++ TestMate](https://marketplace.visualstudio.com/items?itemName=matepek.vscode-catch2-test-adapter)** (also automatically installs **[Test Explorer UI](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-test-explorer)**) 26 | - **[Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)** 27 | - **[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)** 28 | 29 | Third, see **[Optional VS Code User Settings](vscode_user_settings.md)** for some example customized user settings that can help with Project AirSim development. 30 | 31 | B) To develop with **Visual Studio 2019**: 32 | 33 | Install **[Visual Studio 2019](https://visualstudio.microsoft.com/vs/)** with: 34 | 35 | - `Desktop development with C++` workload 36 | - `.NET Framework 4.8 SDK` individual component 37 | - `.NET Core SDK` individual component 38 | 39 | 2. Install the **[Epic Games Launcher](https://www.unrealengine.com/en-US/)** and install Unreal Engine 5.2 binary (requires Epic account log-in). While selecting the engine version to install, there is also an `Options` section where you can enable downloading `Editor symbols for debugging` (~30 GB) if desired. **Note**: Installing the engine can take a long time **(~1 hour)**. 40 | 41 | 3. Set a Windows environment variable for `UE_ROOT` to the installed folder, either through the Control Panel section `Edit environment variables for your account`, or by using the command line: 42 | 43 | ``` 44 | setx UE_ROOT "C:\Program Files\Epic Games\UE_5.2" 45 | 46 | 47 | ``` 48 | 49 | 4. Unreal Engine on Windows defaults to using DirectX 11 for rendering, so you may need to install the latest GPU driver and DirectX updates. However, if you want to use Vulkan for rendering instead, you may need to install the **[Vulkan SDK](https://www.lunarg.com/vulkan-sdk/)**. 50 | 51 | 5. Install **[Git for Windows](https://gitforwindows.org/)** (including Git Credential Manager). 52 | 53 | 6. Clone the Project AirSim repo (HTTPS authentication is recommended for using Git Credential Manager): 54 | 55 | `git clone https://github.com/microsoft/ProjectAirSim.git` 56 | 57 | 7. Do the **[Project AirSim Client Setup](../client_setup.md#setting-up-the-client-on-windows)**. 58 | 59 | Now you're ready to start **[Developing Project AirSim Sim Libs](use_source.md#developing-projectairsim-libs)** 60 | 61 | --- 62 | 63 | Copyright (C) Microsoft Corporation. All rights reserved. 64 | -------------------------------------------------------------------------------- /_sources/internal/headless_cloud.md.txt: -------------------------------------------------------------------------------- 1 | # Running Headless (Docker) 2 | {# include enable_internal_docs.tpp #} 3 | 4 | ## Using headless mode with VS Code Debugging 5 | 6 | To use the `-RenderOffScreen` or `-nullrhi` headless arguments for debugging in VS Code, edit the `launch.json` section for your debugging run target and add them to the `"args"` array: 7 | 8 | ``` 9 | { 10 | "name": "Blocks (DebugGame)", 11 | "request": "launch", 12 | ... 13 | "args": [ "-RenderOffScreen" ], 14 | ... 15 | }, 16 | ``` 17 | 18 | For an **Editor** target, you can also add the `-game` argument to automatically start the simulation Play on launch: 19 | 20 | ``` 21 | { 22 | "name": "BlocksEditor (DebugGame)", 23 | "request": "launch", 24 | ... 25 | "args": [ 26 | "C:\\dev\\projectairsim\\unreal\\Blocks\\Blocks.uproject", "-game", "-RenderOffScreen" 27 | ], 28 | ... 29 | }, 30 | ``` 31 | 32 | 33 | ## Using headless mode with Visual Studio 2019 Debugging 34 | 35 | To use the `-RenderOffScreen` or `-nullrhi` headless arguments for debugging in Visual Studio 2019, right-click on the Blocks project in the Solution Explorer and open the **Properties** window, then add the arguments to `Configuration Properties -> Debugging -> Command Arguments`: 36 | 37 | | DebugGame | | 38 | | ---------------- | ------------------ | 39 | | Command Arguments | `-RenderOffScreen` | 40 | 41 | For an **Editor** target, you can also add the `-game` argument to automatically start the simulation Play on launch: 42 | 43 | | DebugGame Editor | | 44 | | ----------------- | --------------------------------------------------------------------- | 45 | | Command Arguments | `"$(SolutionDir)Blocks.uproject" -skipcompile -game -RenderOffScreen` | 46 | 47 | This can also be done by directly modifying the `Blocks/Intermediate/ProjectFiles/Blocks.vcxproj.user` file to add the arguments: 48 | 49 | ``` 50 | 51 | WindowsLocalDebugger 52 | -RenderOffScreen 53 | 54 | ``` 55 | 56 | ``` 57 | 58 | "$(SolutionDir)Blocks.uproject" -skipcompile -game -RenderOffScreen 59 | WindowsLocalDebugger 60 | 61 | ``` 62 | 63 | --- 64 | 65 | Copyright (C) Microsoft Corporation. All rights reserved. 66 | -------------------------------------------------------------------------------- /_sources/internal/physics/unreal_physics.md.txt: -------------------------------------------------------------------------------- 1 | # Unreal Physics for Drones 2 | 3 | TODO: How to use Unreal's PhysX to control a drone's physics. 4 | 5 | --- 6 | 7 | Copyright (C) Microsoft Corporation. All rights reserved. 8 | -------------------------------------------------------------------------------- /_sources/internal/scene/sim_clock_internal.md.txt: -------------------------------------------------------------------------------- 1 | # Simulation Clock 2 | 3 | The simulation clock is a core component of the simulation scene configuration and execution. 4 | 5 | *Note: When using the Unreal Editor's play-in-editor mode, there are buttons to **Pause/Resume/SingleStep** the game, **but these buttons are NOT supported** by Project AirSim since they are linked directly to the internals of the Unreal Engine ticks. To perform sim clock control functions, please use the SimClock client API instead.* 6 | 7 | ## Sim clock config 8 | 9 | For details on the configuration options, see **[clock settings](../../config_scene.md#clock-settings)**. 10 | 11 | ## Sim clock API 12 | 13 | For details on the API, see **[Sim Clock API](../../api.md#sim-clock-api)**. 14 | 15 | ## Example usage scenarios 16 | 17 | #### #1 - Standard simulation with the option to pause/resume, do manual step control, scale faster/slower than real-time execution 18 | 19 | The `steppable` clock is recommended for most scenarios since it uses deterministic fixed-delta sim-time steps for each iteration of the simulation loop (set by `step-ns` in nanoseconds), and enables pause/resume and manual control of the clock via the SimClock APIs. 20 | 21 | `real-time-update-rate` sets the real-time period in nanoseconds between each iteration of the simulation loop. The simulation will advance faster or slower than real-time according to the ratio of `step-ns` to `real-time-update-rate`. If `step-ns` is larger than `real-time-update-rate`, then sim time will advance faster than real-time, and vice-versa. 22 | 23 | *Note: When using physics that are external to Unreal, such as FastPhysics for drones, the rendering loop runs separately from the sim loop (as fast as the GPU can handle, but generally at a slower rate) so that the simulation can advance with higher fidelity time steps without requiring a rendered image for every step.* 24 | 25 | ```json 26 | "clock": { 27 | "type": "steppable", 28 | "step-ns": 3000000, 29 | "real-time-update-rate": 3000000, 30 | "pause-on-start": true|false 31 | } 32 | ``` 33 | 34 | #### #2 - Full manual clock step control by client API calls only 35 | 36 | When you want the simulation to advance only when commanded to do so via a call to the SimClock API, set `step-ns` to zero so that sim-time will not advance automatically (whether paused or unpaused.) This "lock-step" behavior is useful, for example, when using Project AirSim in a perception-action loop. 37 | 38 | ```json 39 | "clock": { 40 | "type": "steppable", 41 | "step-ns": 0, 42 | "real-time-update-rate": 3000000, 43 | "pause-on-start": false 44 | } 45 | ``` 46 | 47 | #### #3 - Use Unreal Physics with the option to pause/resume, do manual step control (but can't scale with real-time) 48 | 49 | If any robot actors in a scene are configured to use the **[Unreal's Physics](../physics/unreal_physics.md)** system, the physics update will be done in step with rendering the scene and each iteration of the simulation loop (and each advance of sim-time) will take longer. 50 | 51 | The **same `steppable` clock settings can be used** as in non-Unreal Physics scenarios, but if `step-ns` is left set to a very small time step, such as 3 ms, the simulation will advance much slower than real-time due to the rendering occuring at each 3 ms sim-time step. 52 | 53 | Generally, if Unreal Physics is used, **setting a larger `step-ns` such as 20 ms (=50 FPS)** will allow the simulation to advance closer to real-time on a typical GPU, but at the cost of lower fidelity physics and larger control time steps. 54 | 55 | `real-time-update-rate` can still remain small for a fast update rate, such as 3 ms, because the sim update loop will just be checking for the next physics/rendering calculation on each loop and will not actually advance the sim-time until physics/rendering has completed its step. 56 | 57 | ```json 58 | "clock": { 59 | "type": "steppable", 60 | "step-ns": 20000000, 61 | "real-time-update-rate": 3000000, 62 | "pause-on-start": true|false 63 | } 64 | ``` 65 | 66 | #### #4 - Real-time simulation to run everything in actual time (can't pause/resume/scale), such as for non-physics mode 67 | 68 | For running the simulation in a non-deterministic way where the sim clock is stepped by the amount of actual time passed between each execution loop, use the `real-time` clock type. 69 | 70 | This is useful, for example, when running in a **non-physics "computer vision" mode** where the robot is moved arbitrarily around the scene with no physical meaning to sim-time except as a timestamp on sensor data. Another example would be where a human operator or hardware component is interacting with the simulation just like they would with a physical robot in the real world. 71 | 72 | ```json 73 | "clock": { 74 | "type": "real-time", 75 | "real-time-update-rate": 3000000, 76 | } 77 | ``` 78 | 79 | --- 80 | 81 | Copyright (C) Microsoft Corporation. All rights reserved. 82 | -------------------------------------------------------------------------------- /_sources/internal/sensors/display.md.txt: -------------------------------------------------------------------------------- 1 | # Sensor data visualization/display 2 | 3 | ## Choosing the display backend 4 | 5 | Matplotlib is used to plot and display the sensor data. Image-specific display utility functions are implemented in [client/python/projectairsim/src/projectairsim/image_utils.py](../../../client/python/projectairsim/src/projectairsim/image_utils.py). 6 | The backend is strictly enforced to be `TkAgg` for consistency and reliability. Other backends may work but GTK has been reported to cause issues. 7 | 8 | The backend used for rendering the plot can be configured by changing the MPL backend value offered by Matplotlib. 9 | The list of supported backends can be found here: https://matplotlib.org/stable/tutorials/introductory/usage.html#the-builtin-backends 10 | 11 | Relevant details about how to choose the backend with Matplotlib is reproduced below: 12 | 13 | There are three ways to configure your backend: 14 | 15 | 1. The `backend` parameter in your `matplotlibrc` file 16 | 2. The `MPLBACKEND` environment variable 17 | 3. The function `matplotlib.use` 18 | 19 | Below is a more detailed description. 20 | 21 | If there is more than one configuration present, the last one from the 22 | list takes precedence; e.g. calling `matplotlib.use()` will override 23 | the setting in your `matplotlibrc`. 24 | 25 | Without a backend explicitly set, Matplotlib automatically detects a usable 26 | backend based on what is available on your system and on whether a GUI event 27 | loop is already running. On Linux, if the environment variable 28 | `DISPLAY` is unset, the "event loop" is identified as "headless", 29 | which causes a fallback to a noninteractive backend (agg); in all other 30 | cases, an interactive backend is preferred (usually, at least tkagg will be 31 | available). 32 | 33 | Here is a detailed description of the configuration methods: 34 | 35 | ### 1. Setting `backend` in your `matplotlibrc` file:: 36 | 37 | ```bash 38 | backend : qt5agg # use pyqt5 with antigrain (agg) rendering. 39 | ``` 40 | ### 2. Setting the `MPLBACKEND` environment variable: 41 | 42 | You can set the environment variable either for your current shell or for 43 | a single script. 44 | 45 | On Unix: 46 | 47 | ```python 48 | > export MPLBACKEND=qt5agg 49 | > python simple_plot.py 50 | 51 | > MPLBACKEND=qt5agg python sensor_data_plot.py 52 | ``` 53 | 54 | On Windows, only the former is possible: 55 | 56 | ```python 57 | > set MPLBACKEND=qt5agg 58 | > python sensor_data_plot.py 59 | ``` 60 | 61 | Setting this environment variable will override the ``backend`` parameter 62 | in *any* `matplotlibrc`, even if there is a `matplotlibrc` in 63 | your current working directory. Therefore, setting `MPLBACKEND` 64 | globally, e.g. in your `.bashrc` or `.profile`, is discouraged 65 | as it might lead to counter-intuitive behavior. 66 | 67 | ### 3. If your script depends on a specific backend you can use the function 68 | `matplotlib.use` 69 | 70 | ```python 71 | import matplotlib 72 | matplotlib.use('qt5agg') 73 | ``` 74 | 75 | This should be done before any figure is created, otherwise Matplotlib may 76 | fail to switch the backend and raise an ImportError. 77 | 78 | Using `~matplotlib.use` will require changes in your code if users want to 79 | use a different backend. Therefore, you should avoid explicitly calling 80 | `~matplotlib.use` unless absolutely necessary. 81 | 82 | --- 83 | 84 | Copyright (C) Microsoft Corporation. All rights reserved. 85 | -------------------------------------------------------------------------------- /_sources/internal/use_prebuilt.md.txt: -------------------------------------------------------------------------------- 1 | # Using Pre-built Binary Environments 2 | {# include enable_internal_docs.tpp #} 3 | 4 | The quickest way to jump in and see what Project AirSim can do is to download and run a pre-built binary environment. 5 | 6 | ## Package contents 7 | 8 | Here is an example of the SoccerField environment package contents: 9 | 10 | ``` 11 | SoccerField_{Win64|Linux64} 12 | └─ {WindowsNoEditor|LinuxNoEditor} 13 | └─ Engine 14 | └─ SoccerField 15 | │ └─ Binaries 16 | │ └─ Content 17 | │ └─ ProjectAirSimConfig 18 | | | scene_basic_drone.jsonc 19 | | | robot_quadrotor_fastphysics.jsonc 20 | │ │ ... 21 | │ └─ Saved 22 | └─ SoccerField{.exe|.sh} 23 | ``` 24 | 25 | The two key areas in the package are: 26 | 1. The executable file to launch the environment (ex. `SoccerField.sh`) 27 | 2. The `ProjectAirSimConfig` folder that contains the JSON simulator config files 28 | 29 | ## How to launch the environment 30 | 31 | To run the environment, just launch the `.exe` file for Windows or run the `.sh` script for Linux. 32 | 33 | *Note: If you see a blue Windows SmartScreen Filter prompt on launch with a big **Don't run** button, click the **More info** text link to expose the **Run anyway** button to allow the executable to launch.* 34 | 35 | ![Windows SmartScreen filter](images/windows_smartscreen.jpg) 36 | 37 | The simulation will start with an empty Blocks environment without any vehicles. 38 | 39 | To configure the environment and add vehicles to the simulation, a client must connect to Project AirSim and create a world by passing a description of the world as a string of JSON-formatted data. For example, the sample Python client script `projectairsim_client\ProjectAirSim_Example_User_Scripts\hello_drone.py` does the following: 40 | 41 | ``` Python 42 | from projectairsim import ProjectAirSimClient, World 43 | ... 44 | client = ProjectAirSimClient() 45 | world = World(client, "scene_basic_drone.jsonc") 46 | ``` 47 | 48 | The Project AirSim Python client API library loads the JSONC (JSON with Comments) string from the scene configuration file `projectairsim_client\ProjectAirSim_Example_User_Scripts\sim_config\scene_basic_drone.jsonc`. The scene configuration file specifies a single robot with a reference to the robot configuration file `robot_quadrotor_fastphysics.json` which resides in the same directory as the scene configuration file. The contents of the files are assembled into a single string of JSON-formatted data and sent to Project AirSim. Project AirSim then constructs the specified environment and robot(s). 49 | 50 | A set of example JSONC configuration files are provided so that the simulation can be launched out-of-the-box. If you wish to customize the configuration, please see **[Configuration Settings](../config.md)** for more details. 51 | 52 | ![Drone spawned in the center of SoccerField](images/soccer_field_spawn_center.jpg) 53 | 54 | > How can I move the spawn location? 55 | 56 | The robot can be spawned in another place by simply changing the `origin`: `xyz` coordinate in `scene_basic_drone.json`. For example, changing it to the values below will spawn the drone over by the soccer goal 18 m forward and 22 m to the right: 57 | 58 | ``` json 59 | "origin": { 60 | "xyz": "18.0 22.0 -10.0", 61 | "rpy-deg": "0 0 0" 62 | }, 63 | ``` 64 | 65 | ![Drone spawned by the goal in SoccerField](images/soccer_field_spawn_goal.jpg) 66 | 67 | ## How to interact with the drone 68 | 69 | *To manually fly the drone, keyboard input commands will be added in the future.* 70 | 71 | To send control commands or get sensor data from the drone, a Python client is provided. 72 | 73 | To set up the Python client, see **[Project AirSim Client Setup](../client_setup.md)**. 74 | 75 | There are some example client scripts already provided, so to start you can just run: 76 | ``` 77 | python hello_drone.py 78 | ``` 79 | 80 | This script will connect to the simulation and send commands for the `Drone1` quadrotor to take off and then land. During the flight, the client should receive downward-facing **RGB camera images** and **depth camera images** as OpenCV image pop-up windows. 81 | 82 | After the script ends, the drone will continue to wait for further client connections. To end the simulation, just close the the environment application window. 83 | 84 | ## How to add multiple drones 85 | 86 | You can also add more drones to the scene. See **[Multiple Robots in a Simulation](../multiple_robots.md)** for more details. 87 | 88 | ## How to modify the drone 89 | 90 | There are many parameters of the drone's configuration that can be modified in the **[Robot Configuration Settings](../config_robot.md)** so the physical behavior of the drone can be customized at run-time even for a pre-built binary environment. 91 | 92 | However, the visual meshes used for the robot links can only be chosen based on content that was included during the environment packaging. 93 | 94 | To be able to use new meshes and fully customize the drone and environment, see **[Using Project AirSim Plugin in Custom Environments](../use_plugin.md)**. 95 | 96 | --- 97 | 98 | Copyright (C) Microsoft Corporation. All rights reserved. 99 | -------------------------------------------------------------------------------- /_sources/internal/vscode_user_settings.md.txt: -------------------------------------------------------------------------------- 1 | # Optional VS Code User Settings 2 | {# include enable_internal_docs.tpp #} 3 | 4 | Some required VS Code settings for the Project AirSim project are already included in the repo's `.vscode` folders, but there are many additional user settings that can help with development. 5 | 6 | Here are some example optional User settings: 7 | 8 | ``` 9 | { 10 | "editor.tabSize": 2, 11 | "editor.showFoldingControls": "always", 12 | "editor.minimap.showSlider": "always", 13 | "editor.rulers": [ 14 | 80 15 | ], 16 | "files.trimTrailingWhitespace": true, 17 | "files.exclude": { 18 | "**/Intermediate": false, 19 | "**/Binaries": true, 20 | "**/Saved": true, 21 | "**/Content": true, 22 | "**/.pytest_cache": true, 23 | "**/__pycache__": true, 24 | "**/Plugins/ProjectAirSim/SimLibs": true 25 | }, 26 | "debug.onTaskErrors": "abort", 27 | "debug.toolBarLocation": "docked", 28 | "debug.showBreakpointsInOverviewRuler": true, 29 | "terminal.integrated.scrollback": 1000000, 30 | "cmake.configureOnOpen": false, 31 | "cmake.autoSelectActiveFolder": false, 32 | "C_Cpp.intelliSenseEngineFallback": "Enabled", 33 | "C_Cpp.vcpkg.enabled": false, 34 | "[cpp]": { 35 | "editor.defaultFormatter": "ms-vscode.cpptools" 36 | }, 37 | "testMate.cpp.test.executables": "build/**/Debug/**/*test*", 38 | "python.linting.enabled": true, 39 | "python.linting.pylintEnabled": false, 40 | "python.linting.flake8Enabled": true, 41 | "python.linting.flake8CategorySeverity.E": "Information", 42 | "python.linting.flake8Args": [ 43 | "--max-line-length=88" 44 | ], 45 | "[python]": { 46 | "editor.defaultFormatter": "ms-python.python", 47 | "editor.rulers": [ 48 | 88 49 | ], 50 | }, 51 | "python.formatting.provider": "black", 52 | "python.formatting.blackArgs": [ 53 | "--line-length", 54 | "88" 55 | ] 56 | } 57 | ``` 58 | 59 | --- 60 | 61 | Copyright (C) Microsoft Corporation. All rights reserved. 62 | -------------------------------------------------------------------------------- /_sources/license.md.txt: -------------------------------------------------------------------------------- 1 | # License 2 | 3 | Please refer to the Early Access Program (EAP) Agreement for the terms and conditions for using this product. 4 | 5 | --- 6 | 7 | Copyright (C) Microsoft Corporation. All rights reserved. 8 | 9 | -------------------------------------------------------------------------------- /_sources/modify_drone_physical.md.txt: -------------------------------------------------------------------------------- 1 | # How to Modify a Drone's Physical Geometry 2 | 3 | The physical geometry of the drone can be modified through the **[Robot Configuration Settings](config_robot.md)**. 4 | 5 | For example, to move the `robot_quadrotor_fastphysics.jsonc` propellers to be farther away from the frame at x = 0.5 m and y = 0.5 m, you can adjust the propeller link origins for the link's `inertial` component to change the physics representation, and again for the link's `visual` component to change the rendered position of the propeller mesh: 6 | 7 | ``` json 8 | { 9 | "name": "Prop_FL", 10 | "inertial": { 11 | "origin": { 12 | "xyz": "0.50 -0.50 -0.01", 13 | "rpy-deg": "0 0 0" 14 | }, 15 | "mass": 0.055, 16 | "inertia": {...}, 17 | "aerodynamics": {...} 18 | }, 19 | "visual": { 20 | "origin": { 21 | "xyz": "0.50 -0.50 -0.01", 22 | "rpy-deg": "0 0 0" 23 | }, 24 | "geometry": { 25 | "type": "unreal_mesh", 26 | "name": "/Drone/Propeller" 27 | } 28 | } 29 | }, 30 | ``` 31 | 32 | Although the physical configuration can be modified to affect the physics and positioning of the components, the meshes may not visually align any more so the visual appearance may also need to be modified as described in **[How to Modify a Drone's Visual Appearance](modify_drone_visual.md)**. 33 | 34 | --- 35 | 36 | Copyright (C) Microsoft Corporation. All rights reserved. 37 | -------------------------------------------------------------------------------- /_sources/modify_drone_visual.md.txt: -------------------------------------------------------------------------------- 1 | # How to Modify a Drone's Visual Appearance 2 | 3 | A drone's appearance can be easily changed by modifying the `visual`: `geometry`: `name` reference in the `Frame` link of its **[robot config](config_robot.md)** to any mesh path that is included in the Unreal environment. This can be any custom mesh that has been imported into the environment, or a standard Unreal Engine primitive mesh such as a cone shown below: 4 | 5 | ``` json 6 | "links": [ 7 | { 8 | "name": "Frame", 9 | "inertial": {...}, 10 | "collision": {...}, 11 | "visual": { 12 | "geometry": { 13 | "type": "unreal_mesh", 14 | "name": "/Engine/BasicShapes/Cone" 15 | } 16 | } 17 | }, 18 | ... 19 | ] 20 | ``` 21 | 22 | ![Drone as a cone](images/projectairsim_plugin_spawn_cone.jpg) 23 | 24 | ## How to import a custom mesh 25 | 26 | To use a custom mesh, it first needs to be **[imported into Unreal](https://docs.unrealengine.com/en-US/Engine/Content/Types/StaticMeshes/HowTo/Importing/index.html)**. 27 | 28 | Once the asset is available in the environment's Content Browser, its content path can be found by hovering over the asset and combining the asset's listed Unreal `Path` with the mesh's name. For example, the `Quadrotor1` mesh in the `Drone` plugin has Unreal Path = `/Drone` so the full path is `/Drone/Quadrotor1`. This full path can then be used as a `visual`: `geometry`: `name` string to be loaded for the robot's `Frame` link when the simulation starts. 29 | 30 | If the mesh size needs to be visually adjusted, you can use the `scale` setting to modify the scale on its "X Y Z" axes. 31 | 32 | **Note:** Any link's scaling will be inherited by its child links in the tree, so the child links may need to also be adjusted to compensate. 33 | 34 | Example of uniform 2x mesh scaling: 35 | 36 | ``` json 37 | "geometry": { 38 | "type": "unreal_mesh", 39 | "name": "/Drone/Quadrotor1", 40 | "scale": "2.0 2.0 2.0" 41 | } 42 | ``` 43 | 44 | --- 45 | 46 | Copyright (C) Microsoft Corporation. All rights reserved. 47 | -------------------------------------------------------------------------------- /_sources/multiple_robots.md.txt: -------------------------------------------------------------------------------- 1 | # Multiple Robots in a Simulation 2 | 3 | Project AirSim supports multiple robots in the same simulation, including multiple robots of the same or different types. 4 | 5 | Each robot can also have it's own physics type that will run on the common simulation clock and interact with the same common environment, but the robots can not interact with each other except for basic collision detection. Also, multiple physics types for a single robot is not supported. 6 | 7 | ## How to use multiple robots 8 | 9 | You can simply add another actor block in the **[Scene Configuration Settings](config_scene.md)** and give it a new name identifier. The client can interact with each drone based on their names. 10 | 11 | ``` json 12 | "actors": [ 13 | { 14 | "type": "robot", 15 | "name": "Drone1", 16 | "origin": { 17 | "xyz": "0.0 0.0 -10.0", 18 | "rpy-deg": "0 0 0" 19 | }, 20 | "ref": "robot_quadrotor_fastphysics.jsonc" 21 | }, 22 | { 23 | "type": "robot", 24 | "name": "Drone2", 25 | "origin": { 26 | "xyz": "0.0 2.0 -10.0", 27 | "rpy-deg": "0 0 0" 28 | }, 29 | "ref": "robot_quadrotor_fastphysics.jsonc" 30 | } 31 | ], 32 | ``` 33 | 34 | --- 35 | 36 | Copyright (C) Microsoft Corporation. All rights reserved. 37 | -------------------------------------------------------------------------------- /_sources/physics/fast_physics.md.txt: -------------------------------------------------------------------------------- 1 | # Fast Physics for Drones 2 | 3 | Fast Physics calculates rigid body motion for the drone modelled as a cuboid body frame with attached rotors treated as point masses. 4 | 5 | Aerodynamic drag is calculated for the cuboid body faces and the cylindrical drag faces of the rotors. 6 | 7 | Simple collision responses are handled based on collision detection by Unreal for the robot's body frame mesh. 8 | 9 | --- 10 | 11 | Copyright (C) Microsoft Corporation. All rights reserved. 12 | -------------------------------------------------------------------------------- /_sources/physics/matlab_physics.md.txt: -------------------------------------------------------------------------------- 1 | # Matlab Physics for Drones 2 | 3 | Project AirSim allows users to import their existing Simulink physics models as an alternative to the built-in Fast Physics. The AirSim server transmits information about the applied vehicular forces and the environmental state which the Simulink model processes to compute the vehicle's kinematic state, all through TCP. 4 | 5 | ## Prerequisites 6 | 7 | Download and install Matlab + Simulink 2022a with the Aerospace Blockset add-on. 8 | 9 | ## Install Matlab Engine API for Python 10 | 11 | In order to connect to Matlab from the Python client, the Matlab Engine API for Python must be installed. More information can be found on the MathWorks [documentation](https://www.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html) but the general installation steps are prescribed below: 12 | 1. Run a command prompt as Administrator 13 | 1. Activate a Python virtual environment and navigate to the directory where the Matlab API Python library is installed: `cd "C:\Program Files\MATLAB\R2022a\extern\engines\python"` 14 | 1. Install the Matlab API Python library: `python setup.py install` 15 | 16 | ## Example Scripts with Simulink Physics 17 | 18 | The example Python client scripts and configuration files can be found in `client/python/example_user_scripts/` and the corresponding Matlab model files can be found in `client/python/example_user_scripts/simulink/`. There are currently two user scripts - `simulink_quadrotor_standardized_model.py` and `simulink_quadtiltrotor_standardized_model.py` - both of which utilize the same Simulink model but with different parameter values for each airframe. The AirSim Simulink interface currently supports up to eight rotors and eight control surfaces. 19 | 20 | ### Directory Information 21 | - Scripts beginning with `simulink_` in their name utilize Simulink physics. Each script references a scene configuration file. 22 | - The `sim_config/` folder contains both scene configuration files and robot configuration files. Note the former contains a `physics-connection` parameter to connect to Matlab and references the latter in the `robot-config` parameter. The robot configuration file has its `physics-type` parameter set to `matlab-physics`. 23 | - The `simulink/` folder contains the Matlab model loader m-file scripts, the Simulink models, and the S-function mex file. Each Matlab script loads the vehicle parameters, opens the Simulink model, and configures the Matlab Engine for the client script to use Python APIs to control. The Simulink model contains the drone and fixed-wing physics for the vehicle, and references the vehicle parameters loaded via the Matlab script. 24 | 25 | ### Running the Scripts 26 | 1. Open Matlab 2022a. 27 | 1. Navigate the Matlab file explorer to the `client/python/example_user_scripts/simulink/` folder. 28 | 1. Run the model loader m-file from the **Matlab console**: 29 | 1. ex. `>> load_quadrotor_simulink_physics_model` 30 | 1. Launch and run the simulation server. 31 | 1. In an activated Python environment, navigate to `client/python/example_user_scripts/` and run the corresponding client script: 32 | 1. ex. `python simulink_quadrotor_standardized_model.py` 33 | 1. After the simulation scene has started, it will automatically start the Simulink model through the Matlab Python API. 34 | 1. Once the script completes, it will automatically stop the Simulink model through the Matlab Python API. To restart the script, just run it again. To stop the simulation while the it is in progress, press Ctrl-C from the Python script console output to stop the in-progress flight command, stop Simulink, and disconnect the client. The simulation can be started again by simply running the script again. 35 | 36 | --- 37 | 38 | Copyright (C) Microsoft Corporation. All rights reserved. 39 | -------------------------------------------------------------------------------- /_sources/ros/example_build_map.md.txt: -------------------------------------------------------------------------------- 1 | # Project AirSim ROS Bridge Examples: build_map 2 | 3 | `build_map` demonstrates using the Project AirSim with the ROS MoveIt! motion package and the RViz visualizer to create a 3D occupancy map. This map indicates the parts of the world that are already occupied so no part of the robot may also occupy those areas. MoveIt's 3D occupancy map uses the ROS OctoMap library which stores voxels in a 3D manner using a eight-way tree structure (an "octree".) 4 | 5 | In this example, the Project AirSim robot is configured with a LIDAR sensor and the 3D point cloud from the sensor is fed to MoveIt!'s Depth Image Octomap Updater plug-in to update the OctoMap in real time. 6 | 7 | The robot is moved automatically using a "mission script". At the end of the movements, the occupancy map is retrieved from MoveIt! and saved to a file. 8 | 9 | ## Requirements 10 | The `build_map` example requires the following: 11 | 12 | * A version of Python supported by the [Project AirSim Client API](../client_setup.md#python-client). 13 | * The following Python packages in addition to those required by the Project AirSim ROS Bridge: [moveit](http://wiki.ros.org/moveit) and[moveit_msgs](http://wiki.ros.org/moveit_msgs). 14 | 15 | ## Setup 16 | See the [setup for the Project AirSim ROS Bridge Examples](ros_examples.md#setup). 17 | 18 | ## Building 19 | See the [building the Project AirSim ROS Bridge Examples](ros_examples.md#building). 20 | 21 | ## Running 22 | 1. Activate the [Python virtual environment for Project AirSim](../client_setup.md). 23 | 2. Run Project AirSim. 24 | 3. Run the example with: 25 | ``` bash 26 | roslaunch projectairsim_ros_examples build_map.launch 27 | ``` 28 | 4. RViz will run to show the robot and the OctoMap as it is created. The robot will automatically launch, fly a path, return, and land. The example will then save the OctoMap to a file exit. 29 | 30 | ## ROS parameters 31 | The main launch file, `build_map.launch`, accepts several ROS arguments to help run the example in your environment. To pass an argument from the command-line, use the syntax "argument:=value" in the `roslaunch` command. For instance, to specify the IP address where AirSim is running: 32 | ``` bash 33 | roslaunch projectairsim_ros_examples build_map.launch airsim_ip_address:=192.168.0.1 34 | ``` 35 | 36 | 37 | | Argument | Value | Default | Description | 38 | | ---------- | ------| --------| ----------- | 39 | | airsim_ip_address | string | 127.0.0.1 | The IP address of the host running Project AirSim (e.g., airsim_ip_address:=127.0.0.1). | 40 | | sim_config_path | string | (`projectairsim_ros_examples` package dir)../../../client/python/example_user_scripts/sim_config | The path to the directory containing the Project AirSim config files. | 41 | 42 | ## Technical description 43 | This example uses MoveIt!'s Depth Image Octomap Updater plug-in to build the 3D occupancy map. 44 | 45 | The `build_map.py` script creates the Project AirSim ROS Bridge node and loads the scene config file "scene_drone_sensors.jsonc" which configures the robot with multiple sensors including LIDAR. The script also runs a "mission script" to fly the robot around and exits when the drone returns to its launch point. 46 | 47 | The configuration file `config/sensors_lidar.yaml` adds the PointCloud Octomap Updater plug-in to the MoveIt! group and points the plug-in to the robot's LIDAR sensor data topic published by the Project AirSim ROS Bridge. This topic publishes PointCloud2 messages supported by the Octomap Updater plug-in. As the robot flies around, the Updater plug-in processes the LIDAR data and marks voxels in the occupancy map as occupied wherever a LIDAR point is within 100 meters of the vehicle. 48 | 49 | For performance reasons the occupany map is configured with a resolution of 1.0 meter per voxel in `sensor_manager.launch.xml`. 50 | 51 | In the meanwhile, RViz is running with the MoveIt! MotionPlanning plugin to display the drone and the occupancy map as it is updated. 52 | 53 | When `build_map.py` is done flying the vehicle, it uses the OctoHandler class in `common/octomap_handler.py` to retrieve the occupancy map from MoveIt! and save it to a file. It does this by subscribing to the `/move_group/monitored_planning_scene` topic for one update. When the update message is received, it serializes the octomap in the message using the Python pickle module and saves it to a file. 54 | 55 | The `build_map.py` node is marked "required" in the primary ROS launch file `build_map.launch`. When `build_map.py` completes the mission script and exits, `roslaunch` automatically shuts down the rest of the nodes. 56 | 57 | ## 3rd party attributions 58 | 59 | `example_externals/moveit_simple_controller_manager` and `example_externals/action_controller` are derived from work by Benoit Courty, Alessio Tonioni, and Wel Selby. The original work may be found at https://github.com/benoit-cty/ROS-Autonomous-Quadcopter-Flight, and https://github.com/wilselby/ROS_quadrotor_simulator. 60 | 61 | --- 62 | 63 | Copyright (C) Microsoft Corporation. All rights reserved. 64 | -------------------------------------------------------------------------------- /_sources/ros/ros2.md.txt: -------------------------------------------------------------------------------- 1 | # ROS2 Setup for developers 2 | 3 | Project AirSim can join a ROS2 network using the Project AirSim ROS2 Bridge. The bridge is a pure Python ROS2 node that connects to Project AirSim using the Client API. It is provided as a Python package and can be run as a ROS2 node or directly with the Python interpreter. This bridge is compatible with the Pixel Streaming infrastructure and supports camera, lidar, radar, and pose topics. 4 | 5 | ### 1. Setup python client(venv) 6 | 7 | [Setup python client](../client_setup.md) 8 | 9 | ### 2. Install ROS(humble) 10 | How to install [ros_humble](https://docs.ros.org/en/humble/Installation.html) 11 | ... 12 | 13 | Install [radar_msgs](http://wiki.ros.org/radar_msgs) 14 | ``` 15 | sudo apt-get install ros-humble-radar-msgs 16 | ``` 17 | ... 18 | Build and activate projectairsim-interfaces(custom message/service types) 19 | ``` 20 | cd ./ros/node 21 | colcon build 22 | . install/setup.bash 23 | ``` 24 | 25 | 26 | ### 3. Install bridge 27 | In a virtual environment, install `projectairsim-rosbridge` and `projectairsim-ros2` 28 | 29 | ``` 30 | cd ./ros/node/ 31 | pip install -e projectairsim-rosbridge 32 | pip install -e projectairsim-ros2 33 | ``` 34 | 35 | ### 4. Activate node 36 | Executing `projectairsim_bridge_ros2.py` will initialize the ros2 node that will start listening and broadcasting topics. 37 | In a virtual environment, 38 | ``` 39 | python ./scripts/ros2/projectairsim_bridge_ros2.py --simconfigpath PATH_TO_SIM_CONFIGS --address 40 | ``` 41 | 42 | ### 5. Publish topic messages 43 | 44 | In a separate terminal window: 45 | ``` 46 | source /opt/ros/humble/setup.bash 47 | ``` 48 | 49 | #### To get a list of available topics: 50 | ``` 51 | ros2 topic list 52 | ``` 53 | 54 | #### To load a new scene config 55 | This will make available new topics, relevant to scene. 56 | ``` 57 | ros2 service call /airsim_node/load_scene projectairsim_ros/srv/LoadScene "{scene_file: 'scene_basic_drone.jsonc', is_primary_client: 1}" 58 | ``` 59 | NODENAME changes. You can find NODENAME in the topic list. 60 | 61 | ### 6. Activate video streaming node 62 | 63 | Executing 'webrtc_node.py' will initialize the ros2 node that will connect with pixel streaming video server. 64 | 65 | ``` 66 | ros2 run projectairsim_ros webrtc_node.py 67 | ``` 68 | 69 | ### ROS2 Topics and TF Frames 70 | 71 | #### Subscribed Topics 72 | - `/airsim_node//cmd_vel` ([geometry_msgs/Twist](http://docs.ros.org/en/api/geometry_msgs/html/msg/Twist.html)) 73 | - `/airsim_node//desired_pose` ([geometry_msgs/PoseStamped](http://docs.ros.org/en/api/geometry_msgs/html/msg/PoseStamped.html)) 74 | - `/airsim_node///desired_pose` ([geometry_msgs/PoseStamped](http://docs.ros.org/en/api/geometry_msgs/html/msg/PoseStamped.html)) 75 | - `/airsim_node/load_scene` ([projectairsim_ros/srv/LoadScene]) 76 | 77 | #### Published Topics 78 | - `/airsim_node//actual_pose` ([geometry_msgs/PoseStamped]) 79 | - `/airsim_node////image` ([sensor_msgs/Image]) 80 | - `/airsim_node////camera_info` ([sensor_msgs/CameraInfo]) 81 | - `/airsim_node///lidar` ([sensor_msgs/PointCloud2]) 82 | - `/airsim_node///radar_detections` ([radar_msgs/RadarScan]) 83 | - `/airsim_node///radar_tracks` ([radar_msgs/RadarTracks]) 84 | - `/airsim_streaming_camera/image_raw` (H.264 stream forwarding) 85 | 86 | #### TF Broadcasted Frames 87 | - `airsim_node/`: robot base frame from `map` 88 | - `airsim_node///`: camera image frame from `map` 89 | 90 | #### Image Types Mapping 91 | | image_type ID | Name | 92 | |---------------|--------------------------| 93 | | 0 | scene_camera | 94 | | 1 | depth_planar_camera | 95 | | 2 | depth_camera | 96 | | 3 | segmentation_camera | 97 | | 4 | depth_vis_camera | 98 | | 5 | disparity_normalized_camera | 99 | | 6 | surface_normals | 100 | -------------------------------------------------------------------------------- /_sources/scene/sim_clock.md.txt: -------------------------------------------------------------------------------- 1 | # Simulation Clock 2 | 3 | The simulation clock is a core component of the simulation scene configuration and execution. 4 | 5 | *Note: When using the Unreal Editor's play-in-editor mode, there are buttons to **Pause/Resume/SingleStep** the game, **but these buttons are NOT supported** by Project AirSim since they are linked directly to the internals of the Unreal engine ticks. To perform sim clock control functions, please use the SimClock client API instead.* 6 | 7 | ## Sim Clock Config 8 | 9 | For details on the configuration options, see **[clock settings](../config_scene.md#clock-settings)**. 10 | 11 | ## Sim Clock API 12 | 13 | For details on the API, see **[Sim Clock API](../api.md#sim-clock-api)**. 14 | 15 | ## Example Usage Scenarios 16 | 17 | #### #1 - Standard simulation with the option to pause/resume, do manual step control, scale faster/slower than real-time execution 18 | 19 | For most scenarios, the `steppable` clock would be used since it gives deterministic fixed delta sim time steps for each execution loop set by `step-ns`, and also allows usage of the SimClock APIs to pause/resume and do manual step controls. 20 | 21 | The `real-time-update-rate` sets the actual real-time period between each execution loop, so the simulation advancement can be scaled faster/slower than real-time be the ratio between `step-ns` and `real-time-update-rate`. If `step-ns` is larger than `real-time-update-rate`, then sim time will advance faster than real-time, and vice-versa. 22 | 23 | *Note: When using physics that are external from Unreal, such as FastPhysics for drones, the rendering loop runs separately from the sim loop (as fast as the GPU can handle, but generally at a slower rate) so that the simulation can advance with higher fidelity time steps without requiring a rendered image for every step.* 24 | 25 | ```json 26 | "clock": { 27 | "type": "steppable", 28 | "step-ns": 3000000, 29 | "real-time-update-rate": 3000000, 30 | "pause-on-start": true|false 31 | } 32 | ``` 33 | #### #2 - Real-time simulation to run everything by actual time (can't pause/resume/scale), such as for non-physics mode 34 | 35 | For running the simulation in a non-deterministic way where the sim clock is just stepped by the amount of actual time that passed between each execution loop, the `real-time` clock type can be used. 36 | 37 | This is useful, for example, when running **non-physics "computer vision" mode** where the robot is moved arbitrarily around the scene and there is no physical meaning to the sim time except to be a timestamp on sensor data. Another example could be a scenario where a human operator or hardware component is interacting with the simulation as it runs just like they would with an actual version of the robot in the real-world. 38 | 39 | ```json 40 | "clock": { 41 | "type": "real-time", 42 | "real-time-update-rate": 3000000, 43 | } 44 | ``` 45 | 46 | --- 47 | 48 | Copyright (C) Microsoft Corporation. All rights reserved. 49 | -------------------------------------------------------------------------------- /_sources/scene/weather_visual_effects.md.txt: -------------------------------------------------------------------------------- 1 | # Weather Visual Effects 2 | 3 | For details on using weather visual effects through the client API, see **[Weather Visual Effects API](../api.md#weather-visual-effects)**. 4 | 5 | If running the sim locally with the game viewport (stand-alone game or in Editor), a GUI for setting weather visual effects can be activated by pressing the F10 key. 6 | 7 | --- 8 | 9 | Copyright (C) Microsoft Corporation. All rights reserved. 10 | -------------------------------------------------------------------------------- /_sources/sensors/battery.md.txt: -------------------------------------------------------------------------------- 1 | # Battery sensor 2 | 3 | The battery sensor is implemented as a collection of APIs to help plan and execute mission planning and perception loops through estimation of state of charge and flight times. It is not meant to help with battery modeling. 4 | 5 | ## Battery usage 6 | 7 | Battery information is available through the Pub/Sub channel. The following information is published as a part 8 | of this channel. 9 | 10 | 1. Timestamp with simtime 11 | 2. Battery remaining (percentage from 0-100) 12 | 3. Estimated time remaining (expected battery time in seconds to empty) 13 | 4. Battery charge state (specifies if battery is ok, low, critical or unhealthy) 14 | 15 | 16 | Example info published on the Pub/Sub channel 17 | ``` 18 | { 19 | 'time_stamp': 39000000, 20 | 'battery_pct_remaining': 83.33333587646484, 21 | 'estimated_time_remaining': 7500, 22 | 'battery_charge_state': 'BATTERY_CHARGE_STATE_OK' 23 | } 24 | ``` 25 | 26 | ## Battery Simulation Modes 27 | There are two different modes in the battery sensor each with its specific use cases. 28 | 29 | 1. Simple Discharge Mode: 30 | - Configurable maximum capacity through JSON 31 | - Configurable charge level at start of flight/simulation 32 | - Charge level depletes at the rate specified through discharge rate. 33 | - Discharge rate adjustable through API calls and config. 34 | 35 | This is useful for those who want complete control over the discharge rate. It is possible to set an intitial charge and adjust the discharge for various segments of flight. i.e. start with 0 discharge rate, increase to high for takeoff/landing, set it to a medium rate for landing. 36 | 37 | Or you can simply set the discharge rate to the average of your observed value and let it deplete until you hit your minimum acceptable charge level. 38 | 39 | ### Sample Config for Simple Discharge Mode 40 | 41 | ```json 42 | { 43 | "sensors": [ 44 | { 45 | "id": "Battery", 46 | "type": "battery", 47 | "enabled": true, 48 | "parent-link": "Frame", 49 | 50 | "battery-mode":"simple-discharge-mode", 51 | 52 | "total-battery-capacity": 36000, 53 | "battery-capacity-on-start": 30000, 54 | // The drain rate can be adjusted at runtime using client api calls. 55 | "battery-drain-rate-on-start": 1 56 | } 57 | ] 58 | } 59 | ``` 60 | 61 | 2. Energy Consumption Model: 62 | 63 | - Configurable max and initial capacity like the simple discharge mode. 64 | - Estimates discharge rate through a physics model for energy consumption of brushless motors onboard. 65 | - Discharge rate adjustable to a linear scaling factor. 66 | 67 | This model uses a simplified energy equation to estimate energy consumption of brushless motors. It depletes power proportional to number of rotors x torque x angular_velocity. 68 | 69 | ``` 70 | Power Consumed = rotor-power-coefficient x number_of_rotors x torque x ang_vel + constant 71 | ``` 72 | This can be scaled using a linear coefficient in the config referred to as "rotor-power-coefficient" to match real usage. The constant accounts for any other onboard sensor/compute power usage. This can be used as a tool to estimate energy efficient routes during mission planning. 73 | 74 | 75 | ### Sample config for Energy Consumption Mode 76 | ```json 77 | { 78 | "sensors": [ 79 | { 80 | "id": "Battery", 81 | "type": "battery", 82 | "enabled": true, 83 | "parent-link": "Frame", 84 | 85 | "battery-mode": "rotor-power-discharge-mode", 86 | 87 | // Use joules as unit for capacity. 88 | // 1 Amp hour = 3600 * Joules, 1 milli Amp hour = 3.6 Joules 89 | "total-battery-capacity": 36000, 90 | "battery-capacity-on-start": 30000, 91 | // Use this to scale linearly 92 | "rotor-power-coefficient": 1 93 | } 94 | ] 95 | } 96 | ``` 97 | 98 | # Battery sensor settings 99 | 100 | | Parameter | Value | Description | 101 | | --------- | ----- | ----------- | 102 | | `id` | string | Name of battery sensor. | 103 | | `type` | `battery` | Sensor type specifying this as a battery sensor. | 104 | | `enabled` | bool | Whether sensor is enabled. | 105 | | `parent-link` | string | Name of the link that the sensor is attached to. | 106 | | `battery-mode` | string | Mode of battery simulator. "rotor-power-discharge-mode" or "simple-discharge-mode" | 107 | | `total-battery-capacity` | float | Total capacity of the battery aka Max charge it can hold. For rotor power discharge, the units need to be in joules.| 108 | |`battery-capacity-on-start`| float | Capacity/charge of the battery at the beginning of flight/simulation.Needs to the same unit as total capacity | 109 | |`battery-drain-rate-on-start`| float | Required for simple-discharge-mode. The rate at which the battery depletes per second at the beginning of flight. Units needs to match with capacity. Modifiable during runtime.| 110 | | `rotor-power-coefficient`| float| Required for rotor-power-discharge-mode. Used to scale the rotor-power estimates by a constant, default is one.| 111 | 112 | --- 113 | Copyright (C) Microsoft Corporation. All rights reserved. 114 | -------------------------------------------------------------------------------- /_sources/sensors/camera_post_processing_with_nn.md.txt: -------------------------------------------------------------------------------- 1 | # Camera Images Post processing using Neural Network models 2 | We are adding support to execute different Neural Networks models natively on the Sim itself to postprocess the scene images from Camera. 3 | Right now, this is aimed at running a pretrained a model to extract information like object recognition, semantic segmentation etc... 4 | 5 | ## Pre-Requisites 6 | Currently, we support execution on the following inferencing runtimes. 7 | 1. CUDA (See CUDA requirements for details.) 8 | 2. Plain CPU 9 | 10 | You can enable or disable CUDA support from the config option. See sample config for an example. TensorRT is not supported right but will be added in the future versions. 11 | 12 | ### Model Format 13 | Only ONNX models are currently supported. 14 | 15 | ### Neural Network Input and Output structures 16 | Currently, we only publish uint8 as our output with Pub/Sub model. So output data is expected to be uint8/int. 17 | 1. The input layer: 18 | - Float 19 | - Dimensions of the same size as the scene camera - by default this is 400x225x3. 20 | 2. The output layer: 21 | - uint8/int 22 | - Output will be packaged a simple vector and published. 23 | 24 | ### CUDA Requirements 25 | To enable CUDA, you need to have the following installed on your machine locally. 26 | 1. CUDA 11.0 or greater 27 | 2. CUDNN associated with the CUDA version of your choice. 28 | 29 | ### TensorRT Requirments 30 | 1. CUDA 11.0 or greater 31 | 2. CUDNN associated with CUDA above. (Required as a fallback for when TensorRT does not support some of the operations.) 32 | 2. TensorRT library associated with the CUDA version of your choice. 33 | 3. TensorRT needs the neural network model to contain shape inference information in the onnx file. See here https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html#shape-inference-for-tensorrt-subgraphs 34 | 35 | # Image post processing settings 36 | 37 | ## Sample config: DownCamera Sensor configured with post processing model 38 | Scroll down to see post-process-model-settings since they are at the bottom. 39 | 40 | { 41 | "id": "DownCamera", 42 | "type": "camera", 43 | "enabled": true, 44 | "parent-link": "Frame", 45 | "capture-interval": 0.001, 46 | "capture-settings": [ 47 | { 48 | "image-type": 0, 49 | "width": 400, 50 | "height": 225, 51 | "fov-degrees": 90, 52 | "capture-enabled": true, 53 | "streaming-enabled": false, 54 | "pixels-as-float": false, 55 | "compress": false, 56 | "target-gamma": 2.5 57 | }, 58 | { 59 | "image-type": 1, 60 | "width": 400, 61 | "height": 225, 62 | "fov-degrees": 90, 63 | "capture-enabled": false, 64 | "streaming-enabled": false, 65 | "pixels-as-float": false, 66 | "compress": false 67 | }, 68 | { 69 | "image-type": 2, 70 | "width": 400, 71 | "height": 225, 72 | "fov-degrees": 90, 73 | "capture-enabled": true, 74 | "streaming-enabled": false, 75 | "pixels-as-float": false, 76 | "compress": false 77 | }, 78 | { 79 | "image-type": 3, 80 | "width": 400, 81 | "height": 225, 82 | "fov-degrees": 90, 83 | "capture-enabled": true, 84 | "streaming-enabled": false, 85 | "pixels-as-float": false, 86 | "compress": false 87 | } 88 | ], 89 | "noise-settings": [ 90 | { 91 | "enabled": false, 92 | "image-type": 1, 93 | "rand-contrib": 0.2, 94 | "rand-speed": 100000.0, 95 | "rand-size": 500.0, 96 | "rand-density": 2, 97 | "horz-wave-contrib": 0.03, 98 | "horz-wave-strength": 0.08, 99 | "horz-wave-vert-size": 1.0, 100 | "horz-wave-screen-size": 1.0, 101 | "horz-noise-lines-contrib": 1.0, 102 | "horz-noise-lines-density-y": 0.01, 103 | "horz-noise-lines-density-xy": 0.5, 104 | "horz-distortion-contrib": 1.0, 105 | "horz-distortion-strength": 0.002 106 | } 107 | ], 108 | "origin": { 109 | "xyz": "1.1 2.2 -3.3", 110 | "rpy-deg": "0.0 -85.94 0.0" 111 | }, 112 | "post-process-model-settings": { 113 | "enabled": true, 114 | "model-filepath": "C:/repos/models/fcn-resnet50-12-int8.onnx", 115 | "execution-provider": "cpu" 116 | } 117 | }, 118 | 119 | 120 | # Post processing model settings 121 | 122 | Only the post processing settings are documented here. For other general camera settings, see other camera pages. 123 | 124 | | Parameter | Value | Description | 125 | | --------- | ----- | ----------- | 126 | | `enabled` | bool | Whether post processing is enabled. | 127 | | `execution-provider` | string | Default is "cpu". Use "cuda" or "tensorrt" to execute using CUDA/TensorRT execution provider. This might speed up the execution process. See pre-reqs for enabling CUDA or TensorRT. | 128 | | `model-filepath` | string | Absolute path to the model file to execute on the sim. Currently needs to be an ONNX model. | 129 | 130 | 131 | -------------------------------------------------------------------------------- /_sources/support.md.txt: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | Please reach out to your Microsoft contact representative for any issues. 4 | 5 | **DO NOT** post any issues related to Project AirSim on AirSim OSS GitHub site. 6 | 7 | --- 8 | 9 | Copyright (C) Microsoft Corporation. All rights reserved. -------------------------------------------------------------------------------- /_sources/system_specs.md.txt: -------------------------------------------------------------------------------- 1 | # System Specifications 2 | 3 | ## Basic system specifications 4 | 5 | Since Project AirSim uses Unreal Engine for rendering, the system specifications are mainly driven by Unreal's **[Hardware and Software Specifications](https://docs.unrealengine.com/en-US/GettingStarted/RecommendedSpecifications/index.html)**. 6 | 7 | ## Installing system prerequisites 8 | 9 | ### Windows prerequisites 10 | 11 | Unreal binaries/projects require some system prerequisites such as DirectX End-user Runtime and Visual C++ libraries. 12 | 13 | If you are using Unreal Editor to work with the simulation projects, installing the Unreal Engine itself will automatically install the required system prerequisites. 14 | 15 | If you are just running packaged Unreal binaries, you can install the prerequisites using an installer program that should be included in the package folders at: 16 | 17 | `{Binary Package Root Folder}\DebugGame\Windows\Engine\Extras\Redist\en-us\UEPrereqSetup_x64.exe` 18 | 19 | ### Linux prerequisites 20 | 21 | For GPU rendering, Unreal requires: 22 | 23 | 1. GPU drivers that support the Vulkan interface 24 | 2. Vulkan run-time libraries 25 | 26 | For Nvidia GPU drivers, you can confirm that they are working correctly by running: 27 | 28 | ``` 29 | nvidia-smi 30 | ``` 31 | 32 | For Ubuntu, the Vulkan libraries also need to be installed by running: 33 | 34 | ``` 35 | sudo apt update 36 | sudo apt install libvulkan1 vulkan-utils 37 | sudo reboot 38 | ``` 39 | 40 | If official/proprietary GPU drivers from Nvidia (or AMD) are not installed, OR if you want to use open source GPU drivers (like Nouveau on Linux), OR use an integrated GPU (like Intel), you may need to install the Mesa Vulkan driver package by running: 41 | 42 | ``` 43 | sudo apt install mesa-vulkan-drivers 44 | ``` 45 | 46 | To confirm that the Vulkan libraries are working correctly, you can run: 47 | ``` 48 | vullkaninfo 49 | ``` 50 | 51 | ## Performance improvement tips 52 | 53 | Some options to consider to help improve performance are: 54 | 55 | - Reduce the rendering resolution 56 | - Reduce visual quality (Low/Medium/High/Epic) using **[Scalability settings](https://docs.unrealengine.com/en-US/Engine/Performance/Scalability/ScalabilityReference/index.html)** 57 | - Render offscreen 58 | - Disable unused cameras/sensors in the config JSON files 59 | - **[Optimize the Unreal environment](https://docs.unrealengine.com/en-US/Engine/Performance/index.html)** 60 | - Disable Vsync (warning: may result in image tearing) 61 | 62 | See **[Command Line Switches](command_line_switches.md)** for details about how to enable some of these options at runtime. 63 | 64 | --- 65 | 66 | Copyright (C) Microsoft Corporation. All rights reserved. 67 | -------------------------------------------------------------------------------- /_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} -------------------------------------------------------------------------------- /_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Base JavaScript utilities for all Sphinx HTML documentation. 3 | */ 4 | "use strict"; 5 | 6 | const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ 7 | "TEXTAREA", 8 | "INPUT", 9 | "SELECT", 10 | "BUTTON", 11 | ]); 12 | 13 | const _ready = (callback) => { 14 | if (document.readyState !== "loading") { 15 | callback(); 16 | } else { 17 | document.addEventListener("DOMContentLoaded", callback); 18 | } 19 | }; 20 | 21 | /** 22 | * Small JavaScript module for the documentation. 23 | */ 24 | const Documentation = { 25 | init: () => { 26 | Documentation.initDomainIndexTable(); 27 | Documentation.initOnKeyListeners(); 28 | }, 29 | 30 | /** 31 | * i18n support 32 | */ 33 | TRANSLATIONS: {}, 34 | PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), 35 | LOCALE: "unknown", 36 | 37 | // gettext and ngettext don't access this so that the functions 38 | // can safely bound to a different name (_ = Documentation.gettext) 39 | gettext: (string) => { 40 | const translated = Documentation.TRANSLATIONS[string]; 41 | switch (typeof translated) { 42 | case "undefined": 43 | return string; // no translation 44 | case "string": 45 | return translated; // translation exists 46 | default: 47 | return translated[0]; // (singular, plural) translation tuple exists 48 | } 49 | }, 50 | 51 | ngettext: (singular, plural, n) => { 52 | const translated = Documentation.TRANSLATIONS[singular]; 53 | if (typeof translated !== "undefined") 54 | return translated[Documentation.PLURAL_EXPR(n)]; 55 | return n === 1 ? singular : plural; 56 | }, 57 | 58 | addTranslations: (catalog) => { 59 | Object.assign(Documentation.TRANSLATIONS, catalog.messages); 60 | Documentation.PLURAL_EXPR = new Function( 61 | "n", 62 | `return (${catalog.plural_expr})` 63 | ); 64 | Documentation.LOCALE = catalog.locale; 65 | }, 66 | 67 | /** 68 | * helper function to focus on search bar 69 | */ 70 | focusSearchBar: () => { 71 | document.querySelectorAll("input[name=q]")[0]?.focus(); 72 | }, 73 | 74 | /** 75 | * Initialise the domain index toggle buttons 76 | */ 77 | initDomainIndexTable: () => { 78 | const toggler = (el) => { 79 | const idNumber = el.id.substr(7); 80 | const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); 81 | if (el.src.substr(-9) === "minus.png") { 82 | el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; 83 | toggledRows.forEach((el) => (el.style.display = "none")); 84 | } else { 85 | el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; 86 | toggledRows.forEach((el) => (el.style.display = "")); 87 | } 88 | }; 89 | 90 | const togglerElements = document.querySelectorAll("img.toggler"); 91 | togglerElements.forEach((el) => 92 | el.addEventListener("click", (event) => toggler(event.currentTarget)) 93 | ); 94 | togglerElements.forEach((el) => (el.style.display = "")); 95 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); 96 | }, 97 | 98 | initOnKeyListeners: () => { 99 | // only install a listener if it is really needed 100 | if ( 101 | !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && 102 | !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS 103 | ) 104 | return; 105 | 106 | document.addEventListener("keydown", (event) => { 107 | // bail for input elements 108 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 109 | // bail with special keys 110 | if (event.altKey || event.ctrlKey || event.metaKey) return; 111 | 112 | if (!event.shiftKey) { 113 | switch (event.key) { 114 | case "ArrowLeft": 115 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 116 | 117 | const prevLink = document.querySelector('link[rel="prev"]'); 118 | if (prevLink && prevLink.href) { 119 | window.location.href = prevLink.href; 120 | event.preventDefault(); 121 | } 122 | break; 123 | case "ArrowRight": 124 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 125 | 126 | const nextLink = document.querySelector('link[rel="next"]'); 127 | if (nextLink && nextLink.href) { 128 | window.location.href = nextLink.href; 129 | event.preventDefault(); 130 | } 131 | break; 132 | } 133 | } 134 | 135 | // some keyboard layouts may need Shift to get / 136 | switch (event.key) { 137 | case "/": 138 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; 139 | Documentation.focusSearchBar(); 140 | event.preventDefault(); 141 | } 142 | }); 143 | }, 144 | }; 145 | 146 | // quick alias for translations 147 | const _ = Documentation.gettext; 148 | 149 | _ready(Documentation.init); 150 | -------------------------------------------------------------------------------- /_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | const DOCUMENTATION_OPTIONS = { 2 | VERSION: '0.1', 3 | LANGUAGE: 'en', 4 | COLLAPSE_INDEX: false, 5 | BUILDER: 'html', 6 | FILE_SUFFIX: '.html', 7 | LINK_SUFFIX: '.html', 8 | HAS_SOURCE: true, 9 | SOURCELINK_SUFFIX: '.txt', 10 | NAVIGATION_WITH_KEYS: false, 11 | SHOW_SEARCH_SUMMARY: true, 12 | ENABLE_SEARCH_SHORTCUTS: true, 13 | }; -------------------------------------------------------------------------------- /_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/file.png -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bold.eot -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bold.ttf -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bold.woff -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bold.woff2 -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-bolditalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-bolditalic.woff2 -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-italic.eot -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-italic.ttf -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-italic.woff -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-italic.woff2 -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-regular.eot -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-regular.ttf -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-regular.woff -------------------------------------------------------------------------------- /_static/fonts/Lato/lato-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/Lato/lato-regular.woff2 -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff -------------------------------------------------------------------------------- /_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 -------------------------------------------------------------------------------- /_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /_static/js/theme.js: -------------------------------------------------------------------------------- 1 | !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 56 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 57 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 58 | var s_v = "^(" + C + ")?" + v; // vowel in stem 59 | 60 | this.stemWord = function (w) { 61 | var stem; 62 | var suffix; 63 | var firstch; 64 | var origword = w; 65 | 66 | if (w.length < 3) 67 | return w; 68 | 69 | var re; 70 | var re2; 71 | var re3; 72 | var re4; 73 | 74 | firstch = w.substr(0,1); 75 | if (firstch == "y") 76 | w = firstch.toUpperCase() + w.substr(1); 77 | 78 | // Step 1a 79 | re = /^(.+?)(ss|i)es$/; 80 | re2 = /^(.+?)([^s])s$/; 81 | 82 | if (re.test(w)) 83 | w = w.replace(re,"$1$2"); 84 | else if (re2.test(w)) 85 | w = w.replace(re2,"$1$2"); 86 | 87 | // Step 1b 88 | re = /^(.+?)eed$/; 89 | re2 = /^(.+?)(ed|ing)$/; 90 | if (re.test(w)) { 91 | var fp = re.exec(w); 92 | re = new RegExp(mgr0); 93 | if (re.test(fp[1])) { 94 | re = /.$/; 95 | w = w.replace(re,""); 96 | } 97 | } 98 | else if (re2.test(w)) { 99 | var fp = re2.exec(w); 100 | stem = fp[1]; 101 | re2 = new RegExp(s_v); 102 | if (re2.test(stem)) { 103 | w = stem; 104 | re2 = /(at|bl|iz)$/; 105 | re3 = new RegExp("([^aeiouylsz])\\1$"); 106 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 107 | if (re2.test(w)) 108 | w = w + "e"; 109 | else if (re3.test(w)) { 110 | re = /.$/; 111 | w = w.replace(re,""); 112 | } 113 | else if (re4.test(w)) 114 | w = w + "e"; 115 | } 116 | } 117 | 118 | // Step 1c 119 | re = /^(.+?)y$/; 120 | if (re.test(w)) { 121 | var fp = re.exec(w); 122 | stem = fp[1]; 123 | re = new RegExp(s_v); 124 | if (re.test(stem)) 125 | w = stem + "i"; 126 | } 127 | 128 | // Step 2 129 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 130 | if (re.test(w)) { 131 | var fp = re.exec(w); 132 | stem = fp[1]; 133 | suffix = fp[2]; 134 | re = new RegExp(mgr0); 135 | if (re.test(stem)) 136 | w = stem + step2list[suffix]; 137 | } 138 | 139 | // Step 3 140 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 141 | if (re.test(w)) { 142 | var fp = re.exec(w); 143 | stem = fp[1]; 144 | suffix = fp[2]; 145 | re = new RegExp(mgr0); 146 | if (re.test(stem)) 147 | w = stem + step3list[suffix]; 148 | } 149 | 150 | // Step 4 151 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 152 | re2 = /^(.+?)(s|t)(ion)$/; 153 | if (re.test(w)) { 154 | var fp = re.exec(w); 155 | stem = fp[1]; 156 | re = new RegExp(mgr1); 157 | if (re.test(stem)) 158 | w = stem; 159 | } 160 | else if (re2.test(w)) { 161 | var fp = re2.exec(w); 162 | stem = fp[1] + fp[2]; 163 | re2 = new RegExp(mgr1); 164 | if (re2.test(stem)) 165 | w = stem; 166 | } 167 | 168 | // Step 5 169 | re = /^(.+?)e$/; 170 | if (re.test(w)) { 171 | var fp = re.exec(w); 172 | stem = fp[1]; 173 | re = new RegExp(mgr1); 174 | re2 = new RegExp(meq1); 175 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 176 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 177 | w = stem; 178 | } 179 | re = /ll$/; 180 | re2 = new RegExp(mgr1); 181 | if (re.test(w) && re2.test(w)) { 182 | re = /.$/; 183 | w = w.replace(re,""); 184 | } 185 | 186 | // and turn initial Y back to y 187 | if (firstch == "y") 188 | w = firstch.toLowerCase() + w.substr(1); 189 | return w; 190 | } 191 | } 192 | 193 | -------------------------------------------------------------------------------- /_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/minus.png -------------------------------------------------------------------------------- /_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/_static/plus.png -------------------------------------------------------------------------------- /_static/pygments.css: -------------------------------------------------------------------------------- 1 | pre { line-height: 125%; } 2 | td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 3 | span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 4 | td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 5 | span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 6 | .highlight .hll { background-color: #ffffcc } 7 | .highlight { background: #f8f8f8; } 8 | .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ 9 | .highlight .err { border: 1px solid #F00 } /* Error */ 10 | .highlight .k { color: #008000; font-weight: bold } /* Keyword */ 11 | .highlight .o { color: #666 } /* Operator */ 12 | .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ 13 | .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ 14 | .highlight .cp { color: #9C6500 } /* Comment.Preproc */ 15 | .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ 16 | .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ 17 | .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ 18 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 19 | .highlight .ge { font-style: italic } /* Generic.Emph */ 20 | .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ 21 | .highlight .gr { color: #E40000 } /* Generic.Error */ 22 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 23 | .highlight .gi { color: #008400 } /* Generic.Inserted */ 24 | .highlight .go { color: #717171 } /* Generic.Output */ 25 | .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 26 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 27 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 28 | .highlight .gt { color: #04D } /* Generic.Traceback */ 29 | .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 30 | .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 31 | .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 32 | .highlight .kp { color: #008000 } /* Keyword.Pseudo */ 33 | .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 34 | .highlight .kt { color: #B00040 } /* Keyword.Type */ 35 | .highlight .m { color: #666 } /* Literal.Number */ 36 | .highlight .s { color: #BA2121 } /* Literal.String */ 37 | .highlight .na { color: #687822 } /* Name.Attribute */ 38 | .highlight .nb { color: #008000 } /* Name.Builtin */ 39 | .highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ 40 | .highlight .no { color: #800 } /* Name.Constant */ 41 | .highlight .nd { color: #A2F } /* Name.Decorator */ 42 | .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ 43 | .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ 44 | .highlight .nf { color: #00F } /* Name.Function */ 45 | .highlight .nl { color: #767600 } /* Name.Label */ 46 | .highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ 47 | .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 48 | .highlight .nv { color: #19177C } /* Name.Variable */ 49 | .highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ 50 | .highlight .w { color: #BBB } /* Text.Whitespace */ 51 | .highlight .mb { color: #666 } /* Literal.Number.Bin */ 52 | .highlight .mf { color: #666 } /* Literal.Number.Float */ 53 | .highlight .mh { color: #666 } /* Literal.Number.Hex */ 54 | .highlight .mi { color: #666 } /* Literal.Number.Integer */ 55 | .highlight .mo { color: #666 } /* Literal.Number.Oct */ 56 | .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ 57 | .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 58 | .highlight .sc { color: #BA2121 } /* Literal.String.Char */ 59 | .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ 60 | .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 61 | .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 62 | .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ 63 | .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 64 | .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ 65 | .highlight .sx { color: #008000 } /* Literal.String.Other */ 66 | .highlight .sr { color: #A45A77 } /* Literal.String.Regex */ 67 | .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 68 | .highlight .ss { color: #19177C } /* Literal.String.Symbol */ 69 | .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 70 | .highlight .fm { color: #00F } /* Name.Function.Magic */ 71 | .highlight .vc { color: #19177C } /* Name.Variable.Class */ 72 | .highlight .vg { color: #19177C } /* Name.Variable.Global */ 73 | .highlight .vi { color: #19177C } /* Name.Variable.Instance */ 74 | .highlight .vm { color: #19177C } /* Name.Variable.Magic */ 75 | .highlight .il { color: #666 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /_static/sphinx_highlight.js: -------------------------------------------------------------------------------- 1 | /* Highlighting utilities for Sphinx HTML documentation. */ 2 | "use strict"; 3 | 4 | const SPHINX_HIGHLIGHT_ENABLED = true 5 | 6 | /** 7 | * highlight a given string on a node by wrapping it in 8 | * span elements with the given class name. 9 | */ 10 | const _highlight = (node, addItems, text, className) => { 11 | if (node.nodeType === Node.TEXT_NODE) { 12 | const val = node.nodeValue; 13 | const parent = node.parentNode; 14 | const pos = val.toLowerCase().indexOf(text); 15 | if ( 16 | pos >= 0 && 17 | !parent.classList.contains(className) && 18 | !parent.classList.contains("nohighlight") 19 | ) { 20 | let span; 21 | 22 | const closestNode = parent.closest("body, svg, foreignObject"); 23 | const isInSVG = closestNode && closestNode.matches("svg"); 24 | if (isInSVG) { 25 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 26 | } else { 27 | span = document.createElement("span"); 28 | span.classList.add(className); 29 | } 30 | 31 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 32 | const rest = document.createTextNode(val.substr(pos + text.length)); 33 | parent.insertBefore( 34 | span, 35 | parent.insertBefore( 36 | rest, 37 | node.nextSibling 38 | ) 39 | ); 40 | node.nodeValue = val.substr(0, pos); 41 | /* There may be more occurrences of search term in this node. So call this 42 | * function recursively on the remaining fragment. 43 | */ 44 | _highlight(rest, addItems, text, className); 45 | 46 | if (isInSVG) { 47 | const rect = document.createElementNS( 48 | "http://www.w3.org/2000/svg", 49 | "rect" 50 | ); 51 | const bbox = parent.getBBox(); 52 | rect.x.baseVal.value = bbox.x; 53 | rect.y.baseVal.value = bbox.y; 54 | rect.width.baseVal.value = bbox.width; 55 | rect.height.baseVal.value = bbox.height; 56 | rect.setAttribute("class", className); 57 | addItems.push({ parent: parent, target: rect }); 58 | } 59 | } 60 | } else if (node.matches && !node.matches("button, select, textarea")) { 61 | node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); 62 | } 63 | }; 64 | const _highlightText = (thisNode, text, className) => { 65 | let addItems = []; 66 | _highlight(thisNode, addItems, text, className); 67 | addItems.forEach((obj) => 68 | obj.parent.insertAdjacentElement("beforebegin", obj.target) 69 | ); 70 | }; 71 | 72 | /** 73 | * Small JavaScript module for the documentation. 74 | */ 75 | const SphinxHighlight = { 76 | 77 | /** 78 | * highlight the search words provided in localstorage in the text 79 | */ 80 | highlightSearchWords: () => { 81 | if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight 82 | 83 | // get and clear terms from localstorage 84 | const url = new URL(window.location); 85 | const highlight = 86 | localStorage.getItem("sphinx_highlight_terms") 87 | || url.searchParams.get("highlight") 88 | || ""; 89 | localStorage.removeItem("sphinx_highlight_terms") 90 | url.searchParams.delete("highlight"); 91 | window.history.replaceState({}, "", url); 92 | 93 | // get individual terms from highlight string 94 | const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); 95 | if (terms.length === 0) return; // nothing to do 96 | 97 | // There should never be more than one element matching "div.body" 98 | const divBody = document.querySelectorAll("div.body"); 99 | const body = divBody.length ? divBody[0] : document.querySelector("body"); 100 | window.setTimeout(() => { 101 | terms.forEach((term) => _highlightText(body, term, "highlighted")); 102 | }, 10); 103 | 104 | const searchBox = document.getElementById("searchbox"); 105 | if (searchBox === null) return; 106 | searchBox.appendChild( 107 | document 108 | .createRange() 109 | .createContextualFragment( 110 | '" 114 | ) 115 | ); 116 | }, 117 | 118 | /** 119 | * helper function to hide the search marks again 120 | */ 121 | hideSearchWords: () => { 122 | document 123 | .querySelectorAll("#searchbox .highlight-link") 124 | .forEach((el) => el.remove()); 125 | document 126 | .querySelectorAll("span.highlighted") 127 | .forEach((el) => el.classList.remove("highlighted")); 128 | localStorage.removeItem("sphinx_highlight_terms") 129 | }, 130 | 131 | initEscapeListener: () => { 132 | // only install a listener if it is really needed 133 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; 134 | 135 | document.addEventListener("keydown", (event) => { 136 | // bail for input elements 137 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 138 | // bail with special keys 139 | if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; 140 | if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { 141 | SphinxHighlight.hideSearchWords(); 142 | event.preventDefault(); 143 | } 144 | }); 145 | }, 146 | }; 147 | 148 | _ready(() => { 149 | /* Do not call highlightSearchWords() when we are on the search page. 150 | * It will highlight words from the *previous* search query. 151 | */ 152 | if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); 153 | SphinxHighlight.initEscapeListener(); 154 | }); 155 | -------------------------------------------------------------------------------- /api_docs/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | .. Project AirSim documentation master file 2 | 3 | Client Documentation 4 | ============================================================= 5 | 6 | .. contents:: 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | :caption: Contents: 11 | 12 | 13 | Client 14 | ====== 15 | .. autoclass:: projectairsim.ProjectAirSimClient 16 | :members: 17 | 18 | 19 | World 20 | ===== 21 | .. autoclass:: projectairsim.World 22 | :members: 23 | 24 | 25 | Drone 26 | ====== 27 | .. autoclass:: projectairsim.Drone 28 | :members: 29 | 30 | 31 | Types 32 | ===== 33 | .. automodule:: projectairsim.types 34 | :members: 35 | 36 | 37 | Utils 38 | ===== 39 | .. automodule:: projectairsim.utils 40 | :members: 41 | 42 | 43 | Indices and tables 44 | ================== 45 | 46 | * :ref:`genindex` 47 | * :ref:`modindex` 48 | * :ref:`search` 49 | -------------------------------------------------------------------------------- /api_docs/_static/_sphinx_javascript_frameworks_compat.js: -------------------------------------------------------------------------------- 1 | /* Compatability shim for jQuery and underscores.js. 2 | * 3 | * Copyright Sphinx contributors 4 | * Released under the two clause BSD licence 5 | */ 6 | 7 | /** 8 | * small helper function to urldecode strings 9 | * 10 | * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL 11 | */ 12 | jQuery.urldecode = function(x) { 13 | if (!x) { 14 | return x 15 | } 16 | return decodeURIComponent(x.replace(/\+/g, ' ')); 17 | }; 18 | 19 | /** 20 | * small helper function to urlencode strings 21 | */ 22 | jQuery.urlencode = encodeURIComponent; 23 | 24 | /** 25 | * This function returns the parsed url parameters of the 26 | * current request. Multiple values per key are supported, 27 | * it will always return arrays of strings for the value parts. 28 | */ 29 | jQuery.getQueryParameters = function(s) { 30 | if (typeof s === 'undefined') 31 | s = document.location.search; 32 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 33 | var result = {}; 34 | for (var i = 0; i < parts.length; i++) { 35 | var tmp = parts[i].split('=', 2); 36 | var key = jQuery.urldecode(tmp[0]); 37 | var value = jQuery.urldecode(tmp[1]); 38 | if (key in result) 39 | result[key].push(value); 40 | else 41 | result[key] = [value]; 42 | } 43 | return result; 44 | }; 45 | 46 | /** 47 | * highlight a given string on a jquery object by wrapping it in 48 | * span elements with the given class name. 49 | */ 50 | jQuery.fn.highlightText = function(text, className) { 51 | function highlight(node, addItems) { 52 | if (node.nodeType === 3) { 53 | var val = node.nodeValue; 54 | var pos = val.toLowerCase().indexOf(text); 55 | if (pos >= 0 && 56 | !jQuery(node.parentNode).hasClass(className) && 57 | !jQuery(node.parentNode).hasClass("nohighlight")) { 58 | var span; 59 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 60 | if (isInSVG) { 61 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 62 | } else { 63 | span = document.createElement("span"); 64 | span.className = className; 65 | } 66 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 67 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 68 | document.createTextNode(val.substr(pos + text.length)), 69 | node.nextSibling)); 70 | node.nodeValue = val.substr(0, pos); 71 | if (isInSVG) { 72 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 73 | var bbox = node.parentElement.getBBox(); 74 | rect.x.baseVal.value = bbox.x; 75 | rect.y.baseVal.value = bbox.y; 76 | rect.width.baseVal.value = bbox.width; 77 | rect.height.baseVal.value = bbox.height; 78 | rect.setAttribute('class', className); 79 | addItems.push({ 80 | "parent": node.parentNode, 81 | "target": rect}); 82 | } 83 | } 84 | } 85 | else if (!jQuery(node).is("button, select, textarea")) { 86 | jQuery.each(node.childNodes, function() { 87 | highlight(this, addItems); 88 | }); 89 | } 90 | } 91 | var addItems = []; 92 | var result = this.each(function() { 93 | highlight(this, addItems); 94 | }); 95 | for (var i = 0; i < addItems.length; ++i) { 96 | jQuery(addItems[i].parent).before(addItems[i].target); 97 | } 98 | return result; 99 | }; 100 | 101 | /* 102 | * backward compatibility for jQuery.browser 103 | * This will be supported until firefox bug is fixed. 104 | */ 105 | if (!jQuery.browser) { 106 | jQuery.uaMatch = function(ua) { 107 | ua = ua.toLowerCase(); 108 | 109 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 110 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 111 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 112 | /(msie) ([\w.]+)/.exec(ua) || 113 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 114 | []; 115 | 116 | return { 117 | browser: match[ 1 ] || "", 118 | version: match[ 2 ] || "0" 119 | }; 120 | }; 121 | jQuery.browser = {}; 122 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 123 | } 124 | -------------------------------------------------------------------------------- /api_docs/_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /api_docs/_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /api_docs/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Base JavaScript utilities for all Sphinx HTML documentation. 3 | */ 4 | "use strict"; 5 | 6 | const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ 7 | "TEXTAREA", 8 | "INPUT", 9 | "SELECT", 10 | "BUTTON", 11 | ]); 12 | 13 | const _ready = (callback) => { 14 | if (document.readyState !== "loading") { 15 | callback(); 16 | } else { 17 | document.addEventListener("DOMContentLoaded", callback); 18 | } 19 | }; 20 | 21 | /** 22 | * Small JavaScript module for the documentation. 23 | */ 24 | const Documentation = { 25 | init: () => { 26 | Documentation.initDomainIndexTable(); 27 | Documentation.initOnKeyListeners(); 28 | }, 29 | 30 | /** 31 | * i18n support 32 | */ 33 | TRANSLATIONS: {}, 34 | PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), 35 | LOCALE: "unknown", 36 | 37 | // gettext and ngettext don't access this so that the functions 38 | // can safely bound to a different name (_ = Documentation.gettext) 39 | gettext: (string) => { 40 | const translated = Documentation.TRANSLATIONS[string]; 41 | switch (typeof translated) { 42 | case "undefined": 43 | return string; // no translation 44 | case "string": 45 | return translated; // translation exists 46 | default: 47 | return translated[0]; // (singular, plural) translation tuple exists 48 | } 49 | }, 50 | 51 | ngettext: (singular, plural, n) => { 52 | const translated = Documentation.TRANSLATIONS[singular]; 53 | if (typeof translated !== "undefined") 54 | return translated[Documentation.PLURAL_EXPR(n)]; 55 | return n === 1 ? singular : plural; 56 | }, 57 | 58 | addTranslations: (catalog) => { 59 | Object.assign(Documentation.TRANSLATIONS, catalog.messages); 60 | Documentation.PLURAL_EXPR = new Function( 61 | "n", 62 | `return (${catalog.plural_expr})` 63 | ); 64 | Documentation.LOCALE = catalog.locale; 65 | }, 66 | 67 | /** 68 | * helper function to focus on search bar 69 | */ 70 | focusSearchBar: () => { 71 | document.querySelectorAll("input[name=q]")[0]?.focus(); 72 | }, 73 | 74 | /** 75 | * Initialise the domain index toggle buttons 76 | */ 77 | initDomainIndexTable: () => { 78 | const toggler = (el) => { 79 | const idNumber = el.id.substr(7); 80 | const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); 81 | if (el.src.substr(-9) === "minus.png") { 82 | el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; 83 | toggledRows.forEach((el) => (el.style.display = "none")); 84 | } else { 85 | el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; 86 | toggledRows.forEach((el) => (el.style.display = "")); 87 | } 88 | }; 89 | 90 | const togglerElements = document.querySelectorAll("img.toggler"); 91 | togglerElements.forEach((el) => 92 | el.addEventListener("click", (event) => toggler(event.currentTarget)) 93 | ); 94 | togglerElements.forEach((el) => (el.style.display = "")); 95 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); 96 | }, 97 | 98 | initOnKeyListeners: () => { 99 | // only install a listener if it is really needed 100 | if ( 101 | !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && 102 | !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS 103 | ) 104 | return; 105 | 106 | document.addEventListener("keydown", (event) => { 107 | // bail for input elements 108 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 109 | // bail with special keys 110 | if (event.altKey || event.ctrlKey || event.metaKey) return; 111 | 112 | if (!event.shiftKey) { 113 | switch (event.key) { 114 | case "ArrowLeft": 115 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 116 | 117 | const prevLink = document.querySelector('link[rel="prev"]'); 118 | if (prevLink && prevLink.href) { 119 | window.location.href = prevLink.href; 120 | event.preventDefault(); 121 | } 122 | break; 123 | case "ArrowRight": 124 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 125 | 126 | const nextLink = document.querySelector('link[rel="next"]'); 127 | if (nextLink && nextLink.href) { 128 | window.location.href = nextLink.href; 129 | event.preventDefault(); 130 | } 131 | break; 132 | } 133 | } 134 | 135 | // some keyboard layouts may need Shift to get / 136 | switch (event.key) { 137 | case "/": 138 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; 139 | Documentation.focusSearchBar(); 140 | event.preventDefault(); 141 | } 142 | }); 143 | }, 144 | }; 145 | 146 | // quick alias for translations 147 | const _ = Documentation.gettext; 148 | 149 | _ready(Documentation.init); 150 | -------------------------------------------------------------------------------- /api_docs/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | const DOCUMENTATION_OPTIONS = { 2 | VERSION: '', 3 | LANGUAGE: 'en', 4 | COLLAPSE_INDEX: false, 5 | BUILDER: 'html', 6 | FILE_SUFFIX: '.html', 7 | LINK_SUFFIX: '.html', 8 | HAS_SOURCE: true, 9 | SOURCELINK_SUFFIX: '.txt', 10 | NAVIGATION_WITH_KEYS: false, 11 | SHOW_SEARCH_SUMMARY: true, 12 | ENABLE_SEARCH_SHORTCUTS: true, 13 | }; -------------------------------------------------------------------------------- /api_docs/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/file.png -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bold.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bold.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bold.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bold.woff2 -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-bolditalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-bolditalic.woff2 -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-italic.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-italic.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-italic.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-italic.woff2 -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-regular.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-regular.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-regular.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/Lato/lato-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/Lato/lato-regular.woff2 -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff -------------------------------------------------------------------------------- /api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 -------------------------------------------------------------------------------- /api_docs/_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /api_docs/_static/js/theme.js: -------------------------------------------------------------------------------- 1 | !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 56 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 57 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 58 | var s_v = "^(" + C + ")?" + v; // vowel in stem 59 | 60 | this.stemWord = function (w) { 61 | var stem; 62 | var suffix; 63 | var firstch; 64 | var origword = w; 65 | 66 | if (w.length < 3) 67 | return w; 68 | 69 | var re; 70 | var re2; 71 | var re3; 72 | var re4; 73 | 74 | firstch = w.substr(0,1); 75 | if (firstch == "y") 76 | w = firstch.toUpperCase() + w.substr(1); 77 | 78 | // Step 1a 79 | re = /^(.+?)(ss|i)es$/; 80 | re2 = /^(.+?)([^s])s$/; 81 | 82 | if (re.test(w)) 83 | w = w.replace(re,"$1$2"); 84 | else if (re2.test(w)) 85 | w = w.replace(re2,"$1$2"); 86 | 87 | // Step 1b 88 | re = /^(.+?)eed$/; 89 | re2 = /^(.+?)(ed|ing)$/; 90 | if (re.test(w)) { 91 | var fp = re.exec(w); 92 | re = new RegExp(mgr0); 93 | if (re.test(fp[1])) { 94 | re = /.$/; 95 | w = w.replace(re,""); 96 | } 97 | } 98 | else if (re2.test(w)) { 99 | var fp = re2.exec(w); 100 | stem = fp[1]; 101 | re2 = new RegExp(s_v); 102 | if (re2.test(stem)) { 103 | w = stem; 104 | re2 = /(at|bl|iz)$/; 105 | re3 = new RegExp("([^aeiouylsz])\\1$"); 106 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 107 | if (re2.test(w)) 108 | w = w + "e"; 109 | else if (re3.test(w)) { 110 | re = /.$/; 111 | w = w.replace(re,""); 112 | } 113 | else if (re4.test(w)) 114 | w = w + "e"; 115 | } 116 | } 117 | 118 | // Step 1c 119 | re = /^(.+?)y$/; 120 | if (re.test(w)) { 121 | var fp = re.exec(w); 122 | stem = fp[1]; 123 | re = new RegExp(s_v); 124 | if (re.test(stem)) 125 | w = stem + "i"; 126 | } 127 | 128 | // Step 2 129 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 130 | if (re.test(w)) { 131 | var fp = re.exec(w); 132 | stem = fp[1]; 133 | suffix = fp[2]; 134 | re = new RegExp(mgr0); 135 | if (re.test(stem)) 136 | w = stem + step2list[suffix]; 137 | } 138 | 139 | // Step 3 140 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 141 | if (re.test(w)) { 142 | var fp = re.exec(w); 143 | stem = fp[1]; 144 | suffix = fp[2]; 145 | re = new RegExp(mgr0); 146 | if (re.test(stem)) 147 | w = stem + step3list[suffix]; 148 | } 149 | 150 | // Step 4 151 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 152 | re2 = /^(.+?)(s|t)(ion)$/; 153 | if (re.test(w)) { 154 | var fp = re.exec(w); 155 | stem = fp[1]; 156 | re = new RegExp(mgr1); 157 | if (re.test(stem)) 158 | w = stem; 159 | } 160 | else if (re2.test(w)) { 161 | var fp = re2.exec(w); 162 | stem = fp[1] + fp[2]; 163 | re2 = new RegExp(mgr1); 164 | if (re2.test(stem)) 165 | w = stem; 166 | } 167 | 168 | // Step 5 169 | re = /^(.+?)e$/; 170 | if (re.test(w)) { 171 | var fp = re.exec(w); 172 | stem = fp[1]; 173 | re = new RegExp(mgr1); 174 | re2 = new RegExp(meq1); 175 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 176 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 177 | w = stem; 178 | } 179 | re = /ll$/; 180 | re2 = new RegExp(mgr1); 181 | if (re.test(w) && re2.test(w)) { 182 | re = /.$/; 183 | w = w.replace(re,""); 184 | } 185 | 186 | // and turn initial Y back to y 187 | if (firstch == "y") 188 | w = firstch.toLowerCase() + w.substr(1); 189 | return w; 190 | } 191 | } 192 | 193 | -------------------------------------------------------------------------------- /api_docs/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/minus.png -------------------------------------------------------------------------------- /api_docs/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/_static/plus.png -------------------------------------------------------------------------------- /api_docs/_static/pygments.css: -------------------------------------------------------------------------------- 1 | pre { line-height: 125%; } 2 | td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 3 | span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 4 | td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 5 | span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 6 | .highlight .hll { background-color: #ffffcc } 7 | .highlight { background: #f8f8f8; } 8 | .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ 9 | .highlight .err { border: 1px solid #F00 } /* Error */ 10 | .highlight .k { color: #008000; font-weight: bold } /* Keyword */ 11 | .highlight .o { color: #666 } /* Operator */ 12 | .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ 13 | .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ 14 | .highlight .cp { color: #9C6500 } /* Comment.Preproc */ 15 | .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ 16 | .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ 17 | .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ 18 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 19 | .highlight .ge { font-style: italic } /* Generic.Emph */ 20 | .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ 21 | .highlight .gr { color: #E40000 } /* Generic.Error */ 22 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 23 | .highlight .gi { color: #008400 } /* Generic.Inserted */ 24 | .highlight .go { color: #717171 } /* Generic.Output */ 25 | .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 26 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 27 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 28 | .highlight .gt { color: #04D } /* Generic.Traceback */ 29 | .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 30 | .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 31 | .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 32 | .highlight .kp { color: #008000 } /* Keyword.Pseudo */ 33 | .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 34 | .highlight .kt { color: #B00040 } /* Keyword.Type */ 35 | .highlight .m { color: #666 } /* Literal.Number */ 36 | .highlight .s { color: #BA2121 } /* Literal.String */ 37 | .highlight .na { color: #687822 } /* Name.Attribute */ 38 | .highlight .nb { color: #008000 } /* Name.Builtin */ 39 | .highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ 40 | .highlight .no { color: #800 } /* Name.Constant */ 41 | .highlight .nd { color: #A2F } /* Name.Decorator */ 42 | .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ 43 | .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ 44 | .highlight .nf { color: #00F } /* Name.Function */ 45 | .highlight .nl { color: #767600 } /* Name.Label */ 46 | .highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ 47 | .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 48 | .highlight .nv { color: #19177C } /* Name.Variable */ 49 | .highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ 50 | .highlight .w { color: #BBB } /* Text.Whitespace */ 51 | .highlight .mb { color: #666 } /* Literal.Number.Bin */ 52 | .highlight .mf { color: #666 } /* Literal.Number.Float */ 53 | .highlight .mh { color: #666 } /* Literal.Number.Hex */ 54 | .highlight .mi { color: #666 } /* Literal.Number.Integer */ 55 | .highlight .mo { color: #666 } /* Literal.Number.Oct */ 56 | .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ 57 | .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 58 | .highlight .sc { color: #BA2121 } /* Literal.String.Char */ 59 | .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ 60 | .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 61 | .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 62 | .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ 63 | .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 64 | .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ 65 | .highlight .sx { color: #008000 } /* Literal.String.Other */ 66 | .highlight .sr { color: #A45A77 } /* Literal.String.Regex */ 67 | .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 68 | .highlight .ss { color: #19177C } /* Literal.String.Symbol */ 69 | .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 70 | .highlight .fm { color: #00F } /* Name.Function.Magic */ 71 | .highlight .vc { color: #19177C } /* Name.Variable.Class */ 72 | .highlight .vg { color: #19177C } /* Name.Variable.Global */ 73 | .highlight .vi { color: #19177C } /* Name.Variable.Instance */ 74 | .highlight .vm { color: #19177C } /* Name.Variable.Magic */ 75 | .highlight .il { color: #666 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /api_docs/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/api_docs/objects.inv -------------------------------------------------------------------------------- /api_docs/py-modindex.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Python Module Index — Project AirSim documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 50 | 51 |
55 | 56 |
57 |
58 |
59 |
    60 |
  • 61 | 62 |
  • 63 |
  • 64 |
65 |
66 |
67 |
68 |
69 | 70 | 71 |

Python Module Index

72 | 73 |
74 | p 75 |
76 | 77 | 78 | 79 | 81 | 82 | 84 | 87 | 88 | 89 | 92 | 93 | 94 | 97 |
 
80 | p
85 | projectairsim 86 |
    90 | projectairsim.types 91 |
    95 | projectairsim.utils 96 |
98 | 99 | 100 |
101 |
102 |
103 | 104 |
105 | 106 |
107 |

© Copyright 2025, IAMAI Consulting Corp..

108 |
109 | 110 | Built with Sphinx using a 111 | theme 112 | provided by Read the Docs. 113 | 114 | 115 |
116 |
117 |
118 |
119 |
120 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /api_docs/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Search — Project AirSim documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 50 | 51 |
55 | 56 |
57 |
58 |
59 |
    60 |
  • 61 | 62 |
  • 63 |
  • 64 |
65 |
66 |
67 |
68 |
69 | 70 | 77 | 78 | 79 |
80 | 81 |
82 | 83 |
84 |
85 |
86 | 87 |
88 | 89 |
90 |

© Copyright 2025, IAMAI Consulting Corp..

91 |
92 | 93 | Built with Sphinx using a 94 | theme 95 | provided by Read the Docs. 96 | 97 | 98 |
99 |
100 |
101 |
102 |
103 | 108 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamaisim/ProjectAirSim/bf77b59d5a82f7920e49201517c7d711c851831a/objects.inv --------------------------------------------------------------------------------