{"id":27784518,"url":"https://github.com/muhkartal/flightai-simulator","last_synced_at":"2026-05-07T11:31:29.537Z","repository":{"id":290315334,"uuid":"973992428","full_name":"muhkartal/flightAI-simulator","owner":"muhkartal","description":"A C++20 framework for training autonomous drone flight controllers using deep reinforcement learning. Combines PPO optimization with a high-performance gRPC bridge to Microsoft AirSim for real-time quadrotor simulation and monitoring.","archived":false,"fork":false,"pushed_at":"2025-04-28T07:39:06.000Z","size":213,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-30T14:28:14.312Z","etag":null,"topics":["airsim","autonomous","cpp","ppo","reinforcement-learning","robotics"],"latest_commit_sha":null,"homepage":"https://kartal.dev/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muhkartal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-28T05:15:08.000Z","updated_at":"2025-04-28T21:47:21.000Z","dependencies_parsed_at":"2025-04-30T14:28:17.458Z","dependency_job_id":null,"html_url":"https://github.com/muhkartal/flightAI-simulator","commit_stats":null,"previous_names":["muhkartal/flightai-simulator"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhkartal%2FflightAI-simulator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhkartal%2FflightAI-simulator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhkartal%2FflightAI-simulator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhkartal%2FflightAI-simulator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muhkartal","download_url":"https://codeload.github.com/muhkartal/flightAI-simulator/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251721160,"owners_count":21632774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airsim","autonomous","cpp","ppo","reinforcement-learning","robotics"],"created_at":"2025-04-30T14:28:13.455Z","updated_at":"2026-05-07T11:31:29.496Z","avatar_url":"https://github.com/muhkartal.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RL-DroneSim\n\n\u003cdiv align=\"center\"\u003e\n\n\u003c!-- \u003cimg src=\"docs/logo.png\" alt=\"RL-DroneSim Logo\" width=\"200\"/\u003e --\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![C++](https://img.shields.io/badge/C++-20-blue.svg)](https://en.cppreference.com/w/cpp/20)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/muhkartal/RL-DroneSim/ci.yml?branch=main)](https://github.com/muhkartal/RL-DroneSim/actions)\n[![LibTorch](https://img.shields.io/badge/LibTorch-2.0-orange.svg)](https://pytorch.org/cppdocs/)\n[![AirSim](https://img.shields.io/badge/AirSim-2022-brightgreen.svg)](https://microsoft.github.io/AirSim/)\n\n**Deep Reinforcement Learning for Autonomous Drone Control**\n\n[Overview](#overview) • [Features](#key-features) • [Quick Start](#quick-start) • [Usage Guide](#usage-guide) • [Results](#experimental-results) • [Architecture](#algorithm-implementation-details) • [References](#theoretical-background)\n\n\u003c/div\u003e\n\n## Overview\n\nRL-DroneSim is a comprehensive framework for training autonomous drone flight controllers using deep reinforcement learning techniques. Implementing the Proximal Policy Optimization (PPO) algorithm with LibTorch and Microsoft AirSim, this project achieves sample-efficient learning for quadrotor control in complex 3D environments.\n\nThe system features a high-performance gRPC bridge enabling real-time communication at 120Hz, multi-threaded environment sampling, and sophisticated monitoring infrastructure for deep analysis of the training process.\n\n\u003c!-- \u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/architecture.png\" alt=\"System Architecture\" width=\"90%\"/\u003e\n\u003c/div\u003e --\u003e\n\n## Key Features\n\n\u003ctable\u003e\n\u003ctr\u003e\n  \u003ctd width=\"33%\"\u003e\n    \u003ch3\u003eOptimized PPO Implementation\u003c/h3\u003e\n    \u003cul\u003e\n      \u003cli\u003eGeneralized Advantage Estimation\u003c/li\u003e\n      \u003cli\u003ePolicy clipping mechanism\u003c/li\u003e\n      \u003cli\u003eEntropy regularization\u003c/li\u003e\n      \u003cli\u003eOrthogonal weight initialization\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/td\u003e\n  \u003ctd width=\"33%\"\u003e\n    \u003ch3\u003eHigh-Performance Infrastructure\u003c/h3\u003e\n    \u003cul\u003e\n      \u003cli\u003eZero-copy gRPC architecture\u003c/li\u003e\n      \u003cli\u003e120Hz bidirectional communication\u003c/li\u003e\n      \u003cli\u003eMulti-threaded environment sampling\u003c/li\u003e\n      \u003cli\u003eSynchronous experience collection\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/td\u003e\n  \u003ctd width=\"33%\"\u003e\n    \u003ch3\u003eProduction-Quality Design\u003c/h3\u003e\n    \u003cul\u003e\n      \u003cli\u003eNeural architecture optimized for drone control\u003c/li\u003e\n      \u003cli\u003ePrometheus metrics integration\u003c/li\u003e\n      \u003cli\u003eModular C++20 code organization\u003c/li\u003e\n      \u003cli\u003eComprehensive testing suite\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Quick Start\n\n```bash\n# Clone with submodules\ngit clone --recursive https://github.com/muhkartal/RL-DroneSim.git\ncd RL-DroneSim\n\n# Install dependencies (using vcpkg)\n./scripts/install_dependencies.sh\n\n# Build the project\ncmake -B build -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake\ncmake --build build --config Release -j$(nproc)\n\n# Start the training\n./build/rldronesim train --config configs/training_config.yaml\n\n# Start monitoring dashboard (optional)\ndocker-compose up -d\n```\n\nAccess the training dashboard at [http://localhost:3000](http://localhost:3000)\n\n## Requirements\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSoftware Dependencies\u003c/strong\u003e\u003c/summary\u003e\n\n-  CMake 3.16+\n-  C++20 compatible compiler (GCC 10+/Clang 10+/MSVC 19.27+)\n-  vcpkg package manager\n-  Microsoft AirSim (2022 version or later)\n-  Docker \u0026 docker-compose (for monitoring infrastructure)\n\nRequired packages (automatically installed via vcpkg):\n\n-  LibTorch (C++ API for PyTorch)\n-  gRPC and Protocol Buffers\n-  Prometheus C++ client\n-  Eigen3 matrix library\n-  yaml-cpp configuration parser\n-  spdlog logging library\n-  CLI11 command-line parser\n-  GoogleTest testing framework\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHardware Recommendations\u003c/strong\u003e\u003c/summary\u003e\n\n-  CUDA-compatible GPU (NVIDIA GTX 1080 or better)\n-  16GB+ RAM\n-  4+ CPU cores\n\nFor optimal performance:\n\n-  NVIDIA RTX 3080 or better\n-  32GB+ RAM\n-  8+ CPU cores (preferably modern AMD Ryzen or Intel i7/i9)\n-  NVMe SSD for model checkpoints and dataset storage\n\u003c/details\u003e\n\n## Build Instructions\n\n```bash\n# Clone the repository with submodules\ngit clone --recursive https://github.com/muhkartal/RL-DroneSim.git\ncd RL-DroneSim\n\n# Install dependencies with vcpkg\nvcpkg install torch:x64-linux libtorch:x64-linux grpc:x64-linux protobuf:x64-linux \\\n  prometheus-cpp:x64-linux eigen3:x64-linux yaml-cpp:x64-linux \\\n  gtest:x64-linux spdlog:x64-linux cli11:x64-linux\n\n# Configure with CMake\ncmake -B build -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \\\n  -DCMAKE_BUILD_TYPE=Release\n\n# Build the project\ncmake --build build --config Release -j$(nproc)\n\n# Run tests (optional but recommended)\ncd build \u0026\u0026 ctest -V\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eProject Structure\u003c/strong\u003e\u003c/summary\u003e\n\n```\nRL-DroneSim/\n├── include/                   # Header files\n│   ├── agent.h                # PPO agent implementation\n│   ├── environment.h          # Environment abstraction\n│   ├── grpc_client.h          # AirSim communication client\n│   ├── grpc_server.h          # AirSim communication server\n│   ├── metrics.h              # Prometheus metrics integration\n│   ├── models.h               # Neural network architecture\n│   ├── ppo.h                  # PPO algorithm implementation\n│   └── utils.h                # Utility functions\n├── src/                       # Implementation files\n├── proto/                     # gRPC protocol definitions\n│   └── airsim_bridge.proto    # Observation and action messages\n├── configs/                   # Configuration files\n│   └── training_config.yaml   # Training hyperparameters\n├── monitoring/                # Metrics visualization\n│   ├── dashboard.json         # Grafana dashboard\n│   ├── datasources.yaml       # Grafana data sources\n│   └── prometheus.yml         # Prometheus configuration\n├── test/                      # Unit and integration tests\n│   ├── test_advantage.cpp     # GAE calculation tests\n│   ├── test_grpc.cpp          # Communication tests\n│   └── test_ppo.cpp           # Algorithm tests\n├── docs/                      # Documentation\n├── .github/                   # CI/CD configuration\n├── CMakeLists.txt             # Build configuration\n├── Dockerfile                 # Container definition\n├── docker-compose.yml         # Service orchestration\n└── README.md                  # Project documentation\n```\n\n\u003c/details\u003e\n\n## Usage Guide\n\n### Training a Policy\n\n```bash\n# Start a training run with default hyperparameters\n./rldronesim train --config configs/training_config.yaml\n\n# Custom training with modified parameters\n./rldronesim train --config configs/training_config.yaml --epochs 500\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eExample Training Output\u003c/strong\u003e\u003c/summary\u003e\n\n```\n[2025-04-27 14:23:15.425] [info] RL-DroneSim starting up\n[2025-04-27 14:23:15.632] [info] Using device: CUDA\n[2025-04-27 14:23:16.103] [info] Starting training for 200 epochs\n[2025-04-27 14:23:36.872] [info] Epoch 1 completed in 20.77s (98.6 steps/s)\n[2025-04-27 14:23:36.872] [info] Episode reward: -23.4, Policy loss: 0.0428, Value loss: 0.312\n...\n[2025-04-27 18:06:45.892] [info] Epoch 200 completed in 18.94s (108.1 steps/s)\n[2025-04-27 18:06:45.893] [info] Episode reward: 342.7, Policy loss: 0.0108, Value loss: 0.053\n[2025-04-27 18:06:46.234] [info] Saved checkpoint to ./checkpoints/checkpoint_200.pt\n[2025-04-27 18:06:47.891] [info] Exported model to ./models/final_model.onnx\n```\n\n\u003c/details\u003e\n\n### Analyzing Training Progress\n\nThe system includes comprehensive real-time monitoring capabilities:\n\n```bash\n# Start monitoring stack\ndocker-compose up -d\n\n# Access the Grafana dashboard\nxdg-open http://localhost:3000  # Linux\nopen http://localhost:3000      # macOS\nstart http://localhost:3000     # Windows\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"images/dashboard.png\" alt=\"Training Dashboard\" width=\"90%\"/\u003e\n\u003c/div\u003e\n\n### Evaluating Trained Models\n\n```bash\n# Run evaluation on a trained model\n./rldronesim eval --checkpoint checkpoints/checkpoint_200.pt --episodes 10\n\n# Record a video during evaluation\n./rldronesim eval --checkpoint checkpoints/checkpoint_200.pt --episodes 5 --record\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eExample Evaluation Output\u003c/strong\u003e\u003c/summary\u003e\n\n```\n[2025-04-27 18:10:24.104] [info] Evaluating for 10 episodes\n[2025-04-27 18:10:32.872] [info] Episode 1 reward: 356.4\n...\n[2025-04-27 18:11:44.679] [info] Average reward over 10 episodes: 357.25\n[2025-04-27 18:11:44.680] [info] Success rate: 90%\n[2025-04-27 18:11:44.681] [info] Average distance to target: 1.3m\n```\n\n\u003c/details\u003e\n\n### Interactive Mode\n\n```bash\n# Manual control mode\n./rldronesim play\n\n# Using a trained policy as assistance\n./rldronesim play --checkpoint checkpoints/checkpoint_200.pt\n```\n\n## Experimental Results\n\n\u003cdiv align=\"center\"\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eTraining Phase\u003c/th\u003e\n    \u003cth\u003eEpisodes\u003c/th\u003e\n    \u003cth\u003eAvg. Reward\u003c/th\u003e\n    \u003cth\u003eSuccess Rate\u003c/th\u003e\n    \u003cth\u003eAvg. Distance to Target\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eEarly Training\u003c/td\u003e\n    \u003ctd\u003e1-50\u003c/td\u003e\n    \u003ctd\u003e-18.4 ± 32.1\u003c/td\u003e\n    \u003ctd\u003e12.5%\u003c/td\u003e\n    \u003ctd\u003e14.7m\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eMid Training\u003c/td\u003e\n    \u003ctd\u003e51-150\u003c/td\u003e\n    \u003ctd\u003e142.6 ± 58.3\u003c/td\u003e\n    \u003ctd\u003e63.2%\u003c/td\u003e\n    \u003ctd\u003e4.8m\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eLate Training\u003c/td\u003e\n    \u003ctd\u003e151-200\u003c/td\u003e\n    \u003ctd\u003e338.2 ± 21.7\u003c/td\u003e\n    \u003ctd\u003e92.6%\u003c/td\u003e\n    \u003ctd\u003e1.3m\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\nThe learning process demonstrated three distinct phases:\n\n1. **Exploration Phase** (episodes 1-50): Initial learning of basic controls with unstable performance\n2. **Skill Acquisition Phase** (episodes 51-150): Rapid improvement as the agent learned flight dynamics\n3. **Policy Refinement Phase** (episodes 151-200): Fine-tuning of control precision with high success rates\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"images/learning_rate.png\" alt=\"Learning Curve\" width=\"80%\"/\u003e\n\u003c/div\u003e\n\nAnalysis of the training metrics revealed that policy entropy steadily decreased from 1.42 at the beginning of training to 0.48 by the end, indicating proper convergence without premature exploitation.\n\n## Algorithm Implementation Details\n\n### Neural Network Architecture\n\n\u003c!-- \u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/network_architecture.png\" alt=\"Neural Network Architecture\" width=\"90%\"/\u003e\n\u003c/div\u003e --\u003e\n\n```\nInput (84x84x3 RGB image)\n  ↓\nConvolutional Backbone\n  - Conv2D(3→32, 8x8, stride=4, padding=2) → ReLU → BatchNorm\n  - Conv2D(32→64, 4x4, stride=2, padding=1) → ReLU → BatchNorm\n  - Conv2D(64→64, 3x3, stride=1, padding=1) → ReLU → BatchNorm\n  - Flatten\n  ↓\nSplit into Policy and Value Heads\n  ↓                                  ↓\nPolicy Network                   Value Network\n  - FC(flatten→512) → ReLU         - FC(flatten→512) → ReLU\n  - FC(512→256) → ReLU             - FC(512→256) → ReLU\n  - FC(256→action_dim)             - FC(256→1)\n  - Learnable log_std\n  ↓                                  ↓\nAction Distribution                Value Estimate\n```\n\n### PPO Update Algorithm\n\nThe core algorithm implements:\n\n1. **Advantage Estimation**:\n\n   -  Generalized Advantage Estimation (GAE) with γ=0.99, λ=0.95\n   -  Normalized advantages for training stability\n\n2. **Policy Optimization**:\n\n   -  Clipped surrogate objective with ε=0.2\n   -  Multiple optimization epochs (4) on each batch of experience\n   -  Mini-batch training (4 mini-batches per update)\n\n3. **Auxiliary Objectives**:\n   -  Value function loss coefficient: 0.5\n   -  Entropy bonus coefficient: 0.01 (decaying schedule)\n   -  Gradient clipping at 0.5\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eKey Implementation Code\u003c/strong\u003e\u003c/summary\u003e\n\n```cpp\n// Proximal Policy Optimization update\nvoid PPOAgent::update(const ExperienceBatch\u0026 batch) {\n    // Calculate advantages using GAE\n    auto advantages = compute_advantages(batch.rewards, batch.values,\n                                         batch.dones, gamma_, lambda_);\n\n    // Normalize advantages\n    auto adv_mean = advantages.mean();\n    auto adv_std = advantages.std() + 1e-8;\n    advantages = (advantages - adv_mean) / adv_std;\n\n    // Track metrics\n    metrics_.record(\"advantage_mean\", adv_mean.item\u003cfloat\u003e());\n    metrics_.record(\"advantage_std\", adv_std.item\u003cfloat\u003e());\n\n    // Multiple PPO epochs\n    for (int epoch = 0; epoch \u003c ppo_epochs_; ++epoch) {\n        // Generate random mini-batch indices\n        auto indices = torch::randperm(batch.states.size(0),\n                                      torch::TensorOptions().device(device_));\n\n        // Mini-batch updates\n        for (int i = 0; i \u003c mini_batches_; ++i) {\n            auto mb_indices = indices.slice(0, i * batch_size_,\n                                          (i + 1) * batch_size_);\n\n            // Get mini-batch data\n            auto mb_states = batch.states.index_select(0, mb_indices);\n            auto mb_actions = batch.actions.index_select(0, mb_indices);\n            auto mb_log_probs_old = batch.log_probs.index_select(0, mb_indices);\n            auto mb_advantages = advantages.index_select(0, mb_indices);\n            auto mb_returns = batch.returns.index_select(0, mb_indices);\n\n            // Forward pass\n            auto [dist, value] = policy_-\u003eforward(mb_states);\n            auto log_probs = dist.log_prob(mb_actions);\n            auto entropy = dist.entropy().mean();\n\n            // Ratio for PPO clipping\n            auto ratio = (log_probs - mb_log_probs_old).exp();\n\n            // Policy loss with clipping\n            auto policy_loss1 = -mb_advantages * ratio;\n            auto policy_loss2 = -mb_advantages *\n                               torch::clamp(ratio, 1.0f - clip_eps_, 1.0f + clip_eps_);\n            auto policy_loss = torch::max(policy_loss1, policy_loss2).mean();\n\n            // Value function loss\n            auto value_loss = vf_coef_ * torch::mse_loss(value, mb_returns);\n\n            // Entropy bonus\n            auto entropy_loss = -entropy_coef_ * entropy;\n\n            // Total loss\n            auto loss = policy_loss + value_loss + entropy_loss;\n\n            // Optimization step\n            optimizer_-\u003ezero_grad();\n            loss.backward();\n            torch::nn::utils::clip_grad_norm_(policy_-\u003eparameters(), max_grad_norm_);\n            optimizer_-\u003estep();\n\n            // Record metrics\n            metrics_.record(\"policy_loss\", policy_loss.item\u003cfloat\u003e());\n            metrics_.record(\"value_loss\", value_loss.item\u003cfloat\u003e());\n            metrics_.record(\"entropy\", entropy.item\u003cfloat\u003e());\n            metrics_.record(\"approx_kl\", 0.5f *\n                          torch::mean(torch::pow(mb_log_probs_old - log_probs, 2)).item\u003cfloat\u003e());\n        }\n    }\n}\n```\n\n\u003c/details\u003e\n\n## Theoretical Background\n\nThis implementation is based on recent advances in reinforcement learning research:\n\n1. **PPO Algorithm**: Schulman, J., Wolski, F., Dhariwal, P., Radford, A., \u0026 Klimov, O. (2017). [_Proximal Policy Optimization Algorithms_](https://arxiv.org/abs/1707.06347). arXiv preprint arXiv:1707.06347.\n\n2. **GAE**: Schulman, J., Moritz, P., Levine, S., Jordan, M., \u0026 Abbeel, P. (2015). [_High-dimensional continuous control using generalized advantage estimation_](https://arxiv.org/abs/1506.02438). arXiv preprint arXiv:1506.02438.\n\n3. **Drone Control with RL**: Koch, W., Mancuso, R., West, R., \u0026 Bestavros, A. (2019). [_Reinforcement learning for UAV attitude control_](https://dl.acm.org/doi/10.1145/3301273). ACM Transactions on Cyber-Physical Systems, 3(2), 1-21.\n\n## Contributing\n\nContributions are welcome! Please check the [Contributing Guidelines](CONTRIBUTING.md) for details on how to submit pull requests, report issues, and suggest improvements.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003e\n    \u003cstrong\u003eRL-DroneSim\u003c/strong\u003e - Advanced Reinforcement Learning for Drone Flight Control\n  \u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/muhkartal/RL-DroneSim\"\u003eGitHub\u003c/a\u003e •\n    \u003ca href=\"https://github.com/muhkartal/RL-DroneSim/issues\"\u003eIssues\u003c/a\u003e •\n    \u003ca href=\"https://kartal.dev\"\u003eDeveloper Website\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003eDeveloped by Muhammed Ibrahim Kartal | \u003ca href=\"https://kartal.dev\"\u003ehttps://kartal.dev\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhkartal%2Fflightai-simulator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuhkartal%2Fflightai-simulator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhkartal%2Fflightai-simulator/lists"}