flybots 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. flybots-1.0.0/.bandit +6 -0
  2. flybots-1.0.0/.gitattributes +13 -0
  3. flybots-1.0.0/.github/ISSUE_TEMPLATE/algorithm_request.yml +53 -0
  4. flybots-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +59 -0
  5. flybots-1.0.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. flybots-1.0.0/.github/ISSUE_TEMPLATE/docs.yml +22 -0
  7. flybots-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  8. flybots-1.0.0/.github/workflows/ci.yml +156 -0
  9. flybots-1.0.0/.github/workflows/pages.yml +69 -0
  10. flybots-1.0.0/.github/workflows/release.yml +97 -0
  11. flybots-1.0.0/.gitignore +59 -0
  12. flybots-1.0.0/.pre-commit-config.yaml +37 -0
  13. flybots-1.0.0/.python-version +1 -0
  14. flybots-1.0.0/CHANGELOG.md +461 -0
  15. flybots-1.0.0/CODE_OF_CONDUCT.md +61 -0
  16. flybots-1.0.0/CONTRIBUTING.md +132 -0
  17. flybots-1.0.0/LICENSE +21 -0
  18. flybots-1.0.0/PKG-INFO +222 -0
  19. flybots-1.0.0/README.md +189 -0
  20. flybots-1.0.0/SECURITY.md +52 -0
  21. flybots-1.0.0/conftest.py +48 -0
  22. flybots-1.0.0/docs/.gitignore +3 -0
  23. flybots-1.0.0/docs/.vitepress/config.ts +289 -0
  24. flybots-1.0.0/docs/.vitepress/theme/Layout.vue +22 -0
  25. flybots-1.0.0/docs/.vitepress/theme/components/AttitudeIndicator.vue +229 -0
  26. flybots-1.0.0/docs/.vitepress/theme/components/CardGrid.vue +28 -0
  27. flybots-1.0.0/docs/.vitepress/theme/components/StatBand.vue +21 -0
  28. flybots-1.0.0/docs/.vitepress/theme/custom.css +68 -0
  29. flybots-1.0.0/docs/.vitepress/theme/index.ts +20 -0
  30. flybots-1.0.0/docs/.vitepress/theme/style.css +469 -0
  31. flybots-1.0.0/docs/ROADMAP.md +314 -0
  32. flybots-1.0.0/docs/guide/architecture.md +142 -0
  33. flybots-1.0.0/docs/guide/cli.md +157 -0
  34. flybots-1.0.0/docs/guide/conventions.md +183 -0
  35. flybots-1.0.0/docs/guide/getting-started.md +143 -0
  36. flybots-1.0.0/docs/guide/installation.md +123 -0
  37. flybots-1.0.0/docs/index.md +186 -0
  38. flybots-1.0.0/docs/learning/design-notes.md +173 -0
  39. flybots-1.0.0/docs/learning/environments.md +203 -0
  40. flybots-1.0.0/docs/learning/index.md +119 -0
  41. flybots-1.0.0/docs/learning/training.md +244 -0
  42. flybots-1.0.0/docs/package-lock.json +3071 -0
  43. flybots-1.0.0/docs/package.json +22 -0
  44. flybots-1.0.0/docs/public/logo.svg +15 -0
  45. flybots-1.0.0/docs/public/media/promo-poster.png +0 -0
  46. flybots-1.0.0/docs/shot.mjs +19 -0
  47. flybots-1.0.0/docs/simulations/environment/costmap-navigation.md +50 -0
  48. flybots-1.0.0/docs/simulations/environment/index.md +20 -0
  49. flybots-1.0.0/docs/simulations/estimation/complementary-filter.md +57 -0
  50. flybots-1.0.0/docs/simulations/estimation/ekf.md +86 -0
  51. flybots-1.0.0/docs/simulations/estimation/gps-imu-fusion.md +78 -0
  52. flybots-1.0.0/docs/simulations/estimation/index.md +25 -0
  53. flybots-1.0.0/docs/simulations/estimation/particle-filter.md +83 -0
  54. flybots-1.0.0/docs/simulations/estimation/ukf.md +76 -0
  55. flybots-1.0.0/docs/simulations/index.md +130 -0
  56. flybots-1.0.0/docs/simulations/path-planning/astar-3d.md +42 -0
  57. flybots-1.0.0/docs/simulations/path-planning/coverage-planning.md +42 -0
  58. flybots-1.0.0/docs/simulations/path-planning/index.md +24 -0
  59. flybots-1.0.0/docs/simulations/path-planning/potential-field-3d.md +46 -0
  60. flybots-1.0.0/docs/simulations/path-planning/prm-3d.md +40 -0
  61. flybots-1.0.0/docs/simulations/path-planning/rrt-star-3d.md +43 -0
  62. flybots-1.0.0/docs/simulations/path-tracking/fixed-wing-mission.md +125 -0
  63. flybots-1.0.0/docs/simulations/path-tracking/flight-ops-demo.md +61 -0
  64. flybots-1.0.0/docs/simulations/path-tracking/geometric-control.md +98 -0
  65. flybots-1.0.0/docs/simulations/path-tracking/index.md +52 -0
  66. flybots-1.0.0/docs/simulations/path-tracking/lqr-hover.md +68 -0
  67. flybots-1.0.0/docs/simulations/path-tracking/lqr-tracking.md +87 -0
  68. flybots-1.0.0/docs/simulations/path-tracking/mpc-tracking.md +84 -0
  69. flybots-1.0.0/docs/simulations/path-tracking/path-smoothing.md +75 -0
  70. flybots-1.0.0/docs/simulations/path-tracking/pid-hover.md +62 -0
  71. flybots-1.0.0/docs/simulations/path-tracking/pure-pursuit.md +98 -0
  72. flybots-1.0.0/docs/simulations/perception/ekf-slam.md +50 -0
  73. flybots-1.0.0/docs/simulations/perception/index.md +24 -0
  74. flybots-1.0.0/docs/simulations/perception/occupancy-mapping.md +65 -0
  75. flybots-1.0.0/docs/simulations/perception/sensor-suite.md +51 -0
  76. flybots-1.0.0/docs/simulations/perception/visual-servoing.md +71 -0
  77. flybots-1.0.0/docs/simulations/sensors/gimbal-bbox-tracking.md +71 -0
  78. flybots-1.0.0/docs/simulations/sensors/gimbal-tracking.md +55 -0
  79. flybots-1.0.0/docs/simulations/sensors/index.md +21 -0
  80. flybots-1.0.0/docs/simulations/swarm/consensus-formation.md +42 -0
  81. flybots-1.0.0/docs/simulations/swarm/index.md +26 -0
  82. flybots-1.0.0/docs/simulations/swarm/leader-follower.md +58 -0
  83. flybots-1.0.0/docs/simulations/swarm/potential-swarm.md +56 -0
  84. flybots-1.0.0/docs/simulations/swarm/reynolds-flocking.md +58 -0
  85. flybots-1.0.0/docs/simulations/swarm/virtual-structure.md +57 -0
  86. flybots-1.0.0/docs/simulations/swarm/voronoi-coverage.md +55 -0
  87. flybots-1.0.0/docs/simulations/trajectory-planning/frenet-optimal.md +65 -0
  88. flybots-1.0.0/docs/simulations/trajectory-planning/index.md +24 -0
  89. flybots-1.0.0/docs/simulations/trajectory-planning/min-snap.md +72 -0
  90. flybots-1.0.0/docs/simulations/trajectory-planning/polynomial.md +56 -0
  91. flybots-1.0.0/docs/simulations/trajectory-planning/quintic.md +62 -0
  92. flybots-1.0.0/docs/simulations/trajectory-tracking/feedback-linearisation.md +62 -0
  93. flybots-1.0.0/docs/simulations/trajectory-tracking/index.md +23 -0
  94. flybots-1.0.0/docs/simulations/trajectory-tracking/mppi.md +74 -0
  95. flybots-1.0.0/docs/simulations/trajectory-tracking/nmpc.md +91 -0
  96. flybots-1.0.0/docs/simulations/vehicles/fixed-wing-flight.md +54 -0
  97. flybots-1.0.0/docs/simulations/vehicles/index.md +24 -0
  98. flybots-1.0.0/docs/simulations/vehicles/multirotor-mixer.md +68 -0
  99. flybots-1.0.0/docs/simulations/vehicles/quadrotor-dynamics.md +42 -0
  100. flybots-1.0.0/docs/simulations/vehicles/vtol-transition.md +50 -0
  101. flybots-1.0.0/docs/vehicles/autopilots.md +205 -0
  102. flybots-1.0.0/docs/vehicles/fixed-wing.md +197 -0
  103. flybots-1.0.0/docs/vehicles/index.md +121 -0
  104. flybots-1.0.0/docs/vehicles/mission-navigation.md +367 -0
  105. flybots-1.0.0/docs/vehicles/multirotor.md +246 -0
  106. flybots-1.0.0/docs/vehicles/presets.md +115 -0
  107. flybots-1.0.0/docs/vehicles/quadrotor.md +122 -0
  108. flybots-1.0.0/docs/vehicles/trim.md +185 -0
  109. flybots-1.0.0/docs/vehicles/vtol.md +225 -0
  110. flybots-1.0.0/policies/hover.npz +0 -0
  111. flybots-1.0.0/policies/hover_curve.npy +0 -0
  112. flybots-1.0.0/pyproject.toml +99 -0
  113. flybots-1.0.0/scripts/make_promo.py +1821 -0
  114. flybots-1.0.0/scripts/regen_all_gifs.json +7 -0
  115. flybots-1.0.0/scripts/regen_all_gifs.py +86 -0
  116. flybots-1.0.0/src/uav_sim/__init__.py +16 -0
  117. flybots-1.0.0/src/uav_sim/cli/__init__.py +6 -0
  118. flybots-1.0.0/src/uav_sim/cli/catalogue.py +156 -0
  119. flybots-1.0.0/src/uav_sim/cli/console.py +77 -0
  120. flybots-1.0.0/src/uav_sim/cli/main.py +565 -0
  121. flybots-1.0.0/src/uav_sim/control/__init__.py +27 -0
  122. flybots-1.0.0/src/uav_sim/control/attitude_controller.py +72 -0
  123. flybots-1.0.0/src/uav_sim/control/fixed_wing_autopilot.py +461 -0
  124. flybots-1.0.0/src/uav_sim/control/flight_controller.py +104 -0
  125. flybots-1.0.0/src/uav_sim/control/position_controller.py +58 -0
  126. flybots-1.0.0/src/uav_sim/control/rate_controller.py +52 -0
  127. flybots-1.0.0/src/uav_sim/control/state_machine.py +327 -0
  128. flybots-1.0.0/src/uav_sim/control/velocity_controller.py +78 -0
  129. flybots-1.0.0/src/uav_sim/control/vtol_controller.py +369 -0
  130. flybots-1.0.0/src/uav_sim/costmap/__init__.py +18 -0
  131. flybots-1.0.0/src/uav_sim/costmap/costmap.py +97 -0
  132. flybots-1.0.0/src/uav_sim/costmap/footprint_layer.py +58 -0
  133. flybots-1.0.0/src/uav_sim/costmap/inflation_layer.py +57 -0
  134. flybots-1.0.0/src/uav_sim/costmap/occupancy_grid.py +283 -0
  135. flybots-1.0.0/src/uav_sim/costmap/social_layer.py +71 -0
  136. flybots-1.0.0/src/uav_sim/costmap/velocity_layer.py +28 -0
  137. flybots-1.0.0/src/uav_sim/environment/__init__.py +31 -0
  138. flybots-1.0.0/src/uav_sim/environment/buildings.py +99 -0
  139. flybots-1.0.0/src/uav_sim/environment/default_world.py +136 -0
  140. flybots-1.0.0/src/uav_sim/environment/obstacles.py +95 -0
  141. flybots-1.0.0/src/uav_sim/environment/world.py +83 -0
  142. flybots-1.0.0/src/uav_sim/estimation/__init__.py +17 -0
  143. flybots-1.0.0/src/uav_sim/estimation/complementary_filter.py +67 -0
  144. flybots-1.0.0/src/uav_sim/estimation/ekf.py +101 -0
  145. flybots-1.0.0/src/uav_sim/estimation/particle_filter.py +122 -0
  146. flybots-1.0.0/src/uav_sim/estimation/process_noise.py +104 -0
  147. flybots-1.0.0/src/uav_sim/estimation/ukf.py +130 -0
  148. flybots-1.0.0/src/uav_sim/frames/__init__.py +35 -0
  149. flybots-1.0.0/src/uav_sim/frames/transforms.py +267 -0
  150. flybots-1.0.0/src/uav_sim/guidance/__init__.py +59 -0
  151. flybots-1.0.0/src/uav_sim/guidance/fixed_wing_mission.py +766 -0
  152. flybots-1.0.0/src/uav_sim/guidance/fixed_wing_paths.py +581 -0
  153. flybots-1.0.0/src/uav_sim/gym/__init__.py +77 -0
  154. flybots-1.0.0/src/uav_sim/gym/base.py +212 -0
  155. flybots-1.0.0/src/uav_sim/gym/fixed_wing_envs.py +321 -0
  156. flybots-1.0.0/src/uav_sim/gym/optimizers.py +216 -0
  157. flybots-1.0.0/src/uav_sim/gym/policy.py +196 -0
  158. flybots-1.0.0/src/uav_sim/gym/quadrotor_envs.py +411 -0
  159. flybots-1.0.0/src/uav_sim/gym/registry.py +214 -0
  160. flybots-1.0.0/src/uav_sim/gym/render.py +168 -0
  161. flybots-1.0.0/src/uav_sim/gym/spaces.py +86 -0
  162. flybots-1.0.0/src/uav_sim/gym/train.py +329 -0
  163. flybots-1.0.0/src/uav_sim/logging/__init__.py +5 -0
  164. flybots-1.0.0/src/uav_sim/logging/sim_logger.py +127 -0
  165. flybots-1.0.0/src/uav_sim/path_planning/__init__.py +19 -0
  166. flybots-1.0.0/src/uav_sim/path_planning/astar_3d.py +105 -0
  167. flybots-1.0.0/src/uav_sim/path_planning/coverage_planner.py +116 -0
  168. flybots-1.0.0/src/uav_sim/path_planning/plan_through_obstacles.py +70 -0
  169. flybots-1.0.0/src/uav_sim/path_planning/potential_field_3d.py +107 -0
  170. flybots-1.0.0/src/uav_sim/path_planning/prm_3d.py +174 -0
  171. flybots-1.0.0/src/uav_sim/path_planning/rrt_3d.py +225 -0
  172. flybots-1.0.0/src/uav_sim/path_tracking/__init__.py +21 -0
  173. flybots-1.0.0/src/uav_sim/path_tracking/flight_ops.py +282 -0
  174. flybots-1.0.0/src/uav_sim/path_tracking/geometric_controller.py +189 -0
  175. flybots-1.0.0/src/uav_sim/path_tracking/lqr_controller.py +135 -0
  176. flybots-1.0.0/src/uav_sim/path_tracking/lqr_path_tracker.py +112 -0
  177. flybots-1.0.0/src/uav_sim/path_tracking/mpc_controller.py +251 -0
  178. flybots-1.0.0/src/uav_sim/path_tracking/path_smoothing.py +141 -0
  179. flybots-1.0.0/src/uav_sim/path_tracking/pid_controller.py +219 -0
  180. flybots-1.0.0/src/uav_sim/path_tracking/pure_pursuit_3d.py +195 -0
  181. flybots-1.0.0/src/uav_sim/perception/__init__.py +28 -0
  182. flybots-1.0.0/src/uav_sim/perception/bbox_tracker.py +192 -0
  183. flybots-1.0.0/src/uav_sim/perception/obstacle_detection.py +45 -0
  184. flybots-1.0.0/src/uav_sim/perception/occupancy_mapping.py +82 -0
  185. flybots-1.0.0/src/uav_sim/perception/point_cloud.py +43 -0
  186. flybots-1.0.0/src/uav_sim/sensors/__init__.py +34 -0
  187. flybots-1.0.0/src/uav_sim/sensors/base.py +71 -0
  188. flybots-1.0.0/src/uav_sim/sensors/camera.py +119 -0
  189. flybots-1.0.0/src/uav_sim/sensors/gimbal.py +137 -0
  190. flybots-1.0.0/src/uav_sim/sensors/gimbal_controller.py +190 -0
  191. flybots-1.0.0/src/uav_sim/sensors/gps.py +34 -0
  192. flybots-1.0.0/src/uav_sim/sensors/imu.py +112 -0
  193. flybots-1.0.0/src/uav_sim/sensors/lidar.py +198 -0
  194. flybots-1.0.0/src/uav_sim/sensors/range_finder.py +33 -0
  195. flybots-1.0.0/src/uav_sim/simulations/__init__.py +39 -0
  196. flybots-1.0.0/src/uav_sim/simulations/api.py +89 -0
  197. flybots-1.0.0/src/uav_sim/simulations/common.py +131 -0
  198. flybots-1.0.0/src/uav_sim/simulations/contracts.py +84 -0
  199. flybots-1.0.0/src/uav_sim/simulations/environment/__init__.py +0 -0
  200. flybots-1.0.0/src/uav_sim/simulations/environment/costmap_navigation/README.md +32 -0
  201. flybots-1.0.0/src/uav_sim/simulations/environment/costmap_navigation/__init__.py +0 -0
  202. flybots-1.0.0/src/uav_sim/simulations/environment/costmap_navigation/__main__.py +3 -0
  203. flybots-1.0.0/src/uav_sim/simulations/environment/costmap_navigation/run.py +256 -0
  204. flybots-1.0.0/src/uav_sim/simulations/estimation/__init__.py +0 -0
  205. flybots-1.0.0/src/uav_sim/simulations/estimation/complementary_filter/README.md +21 -0
  206. flybots-1.0.0/src/uav_sim/simulations/estimation/complementary_filter/__init__.py +0 -0
  207. flybots-1.0.0/src/uav_sim/simulations/estimation/complementary_filter/__main__.py +3 -0
  208. flybots-1.0.0/src/uav_sim/simulations/estimation/complementary_filter/run.py +200 -0
  209. flybots-1.0.0/src/uav_sim/simulations/estimation/ekf/README.md +21 -0
  210. flybots-1.0.0/src/uav_sim/simulations/estimation/ekf/__init__.py +0 -0
  211. flybots-1.0.0/src/uav_sim/simulations/estimation/ekf/__main__.py +3 -0
  212. flybots-1.0.0/src/uav_sim/simulations/estimation/ekf/run.py +249 -0
  213. flybots-1.0.0/src/uav_sim/simulations/estimation/gps_imu_fusion/README.md +21 -0
  214. flybots-1.0.0/src/uav_sim/simulations/estimation/gps_imu_fusion/__init__.py +0 -0
  215. flybots-1.0.0/src/uav_sim/simulations/estimation/gps_imu_fusion/__main__.py +3 -0
  216. flybots-1.0.0/src/uav_sim/simulations/estimation/gps_imu_fusion/run.py +260 -0
  217. flybots-1.0.0/src/uav_sim/simulations/estimation/particle_filter/README.md +21 -0
  218. flybots-1.0.0/src/uav_sim/simulations/estimation/particle_filter/__init__.py +0 -0
  219. flybots-1.0.0/src/uav_sim/simulations/estimation/particle_filter/__main__.py +3 -0
  220. flybots-1.0.0/src/uav_sim/simulations/estimation/particle_filter/run.py +265 -0
  221. flybots-1.0.0/src/uav_sim/simulations/estimation/ukf/README.md +36 -0
  222. flybots-1.0.0/src/uav_sim/simulations/estimation/ukf/__init__.py +0 -0
  223. flybots-1.0.0/src/uav_sim/simulations/estimation/ukf/__main__.py +3 -0
  224. flybots-1.0.0/src/uav_sim/simulations/estimation/ukf/run.py +262 -0
  225. flybots-1.0.0/src/uav_sim/simulations/mission_runner.py +230 -0
  226. flybots-1.0.0/src/uav_sim/simulations/path_planning/__init__.py +0 -0
  227. flybots-1.0.0/src/uav_sim/simulations/path_planning/astar_3d/README.md +21 -0
  228. flybots-1.0.0/src/uav_sim/simulations/path_planning/astar_3d/__init__.py +0 -0
  229. flybots-1.0.0/src/uav_sim/simulations/path_planning/astar_3d/__main__.py +3 -0
  230. flybots-1.0.0/src/uav_sim/simulations/path_planning/astar_3d/run.py +235 -0
  231. flybots-1.0.0/src/uav_sim/simulations/path_planning/coverage_planning/README.md +21 -0
  232. flybots-1.0.0/src/uav_sim/simulations/path_planning/coverage_planning/__init__.py +0 -0
  233. flybots-1.0.0/src/uav_sim/simulations/path_planning/coverage_planning/__main__.py +3 -0
  234. flybots-1.0.0/src/uav_sim/simulations/path_planning/coverage_planning/run.py +177 -0
  235. flybots-1.0.0/src/uav_sim/simulations/path_planning/potential_field_3d/README.md +21 -0
  236. flybots-1.0.0/src/uav_sim/simulations/path_planning/potential_field_3d/__init__.py +0 -0
  237. flybots-1.0.0/src/uav_sim/simulations/path_planning/potential_field_3d/__main__.py +3 -0
  238. flybots-1.0.0/src/uav_sim/simulations/path_planning/potential_field_3d/run.py +193 -0
  239. flybots-1.0.0/src/uav_sim/simulations/path_planning/prm_3d/README.md +21 -0
  240. flybots-1.0.0/src/uav_sim/simulations/path_planning/prm_3d/__init__.py +0 -0
  241. flybots-1.0.0/src/uav_sim/simulations/path_planning/prm_3d/__main__.py +3 -0
  242. flybots-1.0.0/src/uav_sim/simulations/path_planning/prm_3d/run.py +248 -0
  243. flybots-1.0.0/src/uav_sim/simulations/path_planning/rrt_star_3d/README.md +21 -0
  244. flybots-1.0.0/src/uav_sim/simulations/path_planning/rrt_star_3d/__init__.py +0 -0
  245. flybots-1.0.0/src/uav_sim/simulations/path_planning/rrt_star_3d/__main__.py +3 -0
  246. flybots-1.0.0/src/uav_sim/simulations/path_planning/rrt_star_3d/run.py +212 -0
  247. flybots-1.0.0/src/uav_sim/simulations/path_tracking/__init__.py +0 -0
  248. flybots-1.0.0/src/uav_sim/simulations/path_tracking/fixed_wing_mission/README.md +60 -0
  249. flybots-1.0.0/src/uav_sim/simulations/path_tracking/fixed_wing_mission/__init__.py +0 -0
  250. flybots-1.0.0/src/uav_sim/simulations/path_tracking/fixed_wing_mission/__main__.py +3 -0
  251. flybots-1.0.0/src/uav_sim/simulations/path_tracking/fixed_wing_mission/run.py +343 -0
  252. flybots-1.0.0/src/uav_sim/simulations/path_tracking/flight_ops_demo/README.md +21 -0
  253. flybots-1.0.0/src/uav_sim/simulations/path_tracking/flight_ops_demo/__init__.py +0 -0
  254. flybots-1.0.0/src/uav_sim/simulations/path_tracking/flight_ops_demo/__main__.py +3 -0
  255. flybots-1.0.0/src/uav_sim/simulations/path_tracking/flight_ops_demo/run.py +138 -0
  256. flybots-1.0.0/src/uav_sim/simulations/path_tracking/geometric_control/README.md +21 -0
  257. flybots-1.0.0/src/uav_sim/simulations/path_tracking/geometric_control/__init__.py +0 -0
  258. flybots-1.0.0/src/uav_sim/simulations/path_tracking/geometric_control/__main__.py +3 -0
  259. flybots-1.0.0/src/uav_sim/simulations/path_tracking/geometric_control/run.py +136 -0
  260. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_hover/README.md +21 -0
  261. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_hover/__init__.py +0 -0
  262. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_hover/__main__.py +3 -0
  263. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_hover/run.py +123 -0
  264. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_tracking/README.md +21 -0
  265. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_tracking/__init__.py +0 -0
  266. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_tracking/__main__.py +3 -0
  267. flybots-1.0.0/src/uav_sim/simulations/path_tracking/lqr_tracking/run.py +142 -0
  268. flybots-1.0.0/src/uav_sim/simulations/path_tracking/mpc_tracking/README.md +21 -0
  269. flybots-1.0.0/src/uav_sim/simulations/path_tracking/mpc_tracking/__init__.py +0 -0
  270. flybots-1.0.0/src/uav_sim/simulations/path_tracking/mpc_tracking/__main__.py +3 -0
  271. flybots-1.0.0/src/uav_sim/simulations/path_tracking/mpc_tracking/run.py +145 -0
  272. flybots-1.0.0/src/uav_sim/simulations/path_tracking/path_smoothing_demo/README.md +21 -0
  273. flybots-1.0.0/src/uav_sim/simulations/path_tracking/path_smoothing_demo/__init__.py +0 -0
  274. flybots-1.0.0/src/uav_sim/simulations/path_tracking/path_smoothing_demo/__main__.py +3 -0
  275. flybots-1.0.0/src/uav_sim/simulations/path_tracking/path_smoothing_demo/run.py +197 -0
  276. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pid_hover/README.md +21 -0
  277. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pid_hover/__init__.py +0 -0
  278. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pid_hover/__main__.py +3 -0
  279. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pid_hover/run.py +112 -0
  280. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pure_pursuit/README.md +21 -0
  281. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pure_pursuit/__init__.py +0 -0
  282. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pure_pursuit/__main__.py +3 -0
  283. flybots-1.0.0/src/uav_sim/simulations/path_tracking/pure_pursuit/run.py +138 -0
  284. flybots-1.0.0/src/uav_sim/simulations/perception/__init__.py +0 -0
  285. flybots-1.0.0/src/uav_sim/simulations/perception/ekf_slam/README.md +21 -0
  286. flybots-1.0.0/src/uav_sim/simulations/perception/ekf_slam/__init__.py +0 -0
  287. flybots-1.0.0/src/uav_sim/simulations/perception/ekf_slam/__main__.py +3 -0
  288. flybots-1.0.0/src/uav_sim/simulations/perception/ekf_slam/run.py +373 -0
  289. flybots-1.0.0/src/uav_sim/simulations/perception/occupancy_mapping/README.md +21 -0
  290. flybots-1.0.0/src/uav_sim/simulations/perception/occupancy_mapping/__init__.py +0 -0
  291. flybots-1.0.0/src/uav_sim/simulations/perception/occupancy_mapping/__main__.py +3 -0
  292. flybots-1.0.0/src/uav_sim/simulations/perception/occupancy_mapping/run.py +290 -0
  293. flybots-1.0.0/src/uav_sim/simulations/perception/sensor_suite_demo/README.md +21 -0
  294. flybots-1.0.0/src/uav_sim/simulations/perception/sensor_suite_demo/__init__.py +0 -0
  295. flybots-1.0.0/src/uav_sim/simulations/perception/sensor_suite_demo/__main__.py +3 -0
  296. flybots-1.0.0/src/uav_sim/simulations/perception/sensor_suite_demo/run.py +282 -0
  297. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing/README.md +30 -0
  298. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing/__init__.py +0 -0
  299. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing/__main__.py +5 -0
  300. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing/_core.py +286 -0
  301. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing/run.py +24 -0
  302. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_fixed/README.md +42 -0
  303. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_fixed/__init__.py +0 -0
  304. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_fixed/__main__.py +5 -0
  305. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_fixed/run.py +19 -0
  306. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_gimbal/README.md +42 -0
  307. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_gimbal/__init__.py +0 -0
  308. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_gimbal/__main__.py +5 -0
  309. flybots-1.0.0/src/uav_sim/simulations/perception/visual_servoing_gimbal/run.py +19 -0
  310. flybots-1.0.0/src/uav_sim/simulations/plugins.py +55 -0
  311. flybots-1.0.0/src/uav_sim/simulations/sensors/__init__.py +0 -0
  312. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_bbox_tracking/README.md +30 -0
  313. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_bbox_tracking/__init__.py +0 -0
  314. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_bbox_tracking/__main__.py +5 -0
  315. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_bbox_tracking/run.py +302 -0
  316. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_tracking/README.md +21 -0
  317. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_tracking/__init__.py +0 -0
  318. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_tracking/__main__.py +3 -0
  319. flybots-1.0.0/src/uav_sim/simulations/sensors/gimbal_tracking/run.py +246 -0
  320. flybots-1.0.0/src/uav_sim/simulations/setup_helpers.py +86 -0
  321. flybots-1.0.0/src/uav_sim/simulations/standards.py +265 -0
  322. flybots-1.0.0/src/uav_sim/simulations/swarm/__init__.py +0 -0
  323. flybots-1.0.0/src/uav_sim/simulations/swarm/consensus_formation/README.md +21 -0
  324. flybots-1.0.0/src/uav_sim/simulations/swarm/consensus_formation/__init__.py +0 -0
  325. flybots-1.0.0/src/uav_sim/simulations/swarm/consensus_formation/__main__.py +3 -0
  326. flybots-1.0.0/src/uav_sim/simulations/swarm/consensus_formation/run.py +184 -0
  327. flybots-1.0.0/src/uav_sim/simulations/swarm/leader_follower/README.md +21 -0
  328. flybots-1.0.0/src/uav_sim/simulations/swarm/leader_follower/__init__.py +0 -0
  329. flybots-1.0.0/src/uav_sim/simulations/swarm/leader_follower/__main__.py +3 -0
  330. flybots-1.0.0/src/uav_sim/simulations/swarm/leader_follower/run.py +198 -0
  331. flybots-1.0.0/src/uav_sim/simulations/swarm/potential_swarm/README.md +21 -0
  332. flybots-1.0.0/src/uav_sim/simulations/swarm/potential_swarm/__init__.py +0 -0
  333. flybots-1.0.0/src/uav_sim/simulations/swarm/potential_swarm/__main__.py +3 -0
  334. flybots-1.0.0/src/uav_sim/simulations/swarm/potential_swarm/run.py +198 -0
  335. flybots-1.0.0/src/uav_sim/simulations/swarm/reynolds_flocking/README.md +21 -0
  336. flybots-1.0.0/src/uav_sim/simulations/swarm/reynolds_flocking/__init__.py +0 -0
  337. flybots-1.0.0/src/uav_sim/simulations/swarm/reynolds_flocking/__main__.py +3 -0
  338. flybots-1.0.0/src/uav_sim/simulations/swarm/reynolds_flocking/run.py +208 -0
  339. flybots-1.0.0/src/uav_sim/simulations/swarm/virtual_structure/README.md +21 -0
  340. flybots-1.0.0/src/uav_sim/simulations/swarm/virtual_structure/__init__.py +0 -0
  341. flybots-1.0.0/src/uav_sim/simulations/swarm/virtual_structure/__main__.py +3 -0
  342. flybots-1.0.0/src/uav_sim/simulations/swarm/virtual_structure/run.py +222 -0
  343. flybots-1.0.0/src/uav_sim/simulations/swarm/voronoi_coverage/README.md +21 -0
  344. flybots-1.0.0/src/uav_sim/simulations/swarm/voronoi_coverage/__init__.py +0 -0
  345. flybots-1.0.0/src/uav_sim/simulations/swarm/voronoi_coverage/__main__.py +3 -0
  346. flybots-1.0.0/src/uav_sim/simulations/swarm/voronoi_coverage/run.py +216 -0
  347. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/__init__.py +0 -0
  348. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/frenet_optimal/README.md +21 -0
  349. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/frenet_optimal/__init__.py +0 -0
  350. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/frenet_optimal/__main__.py +3 -0
  351. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/frenet_optimal/run.py +306 -0
  352. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/min_snap/README.md +21 -0
  353. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/min_snap/__init__.py +0 -0
  354. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/min_snap/__main__.py +3 -0
  355. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/min_snap/run.py +178 -0
  356. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/polynomial_trajectory/README.md +21 -0
  357. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/polynomial_trajectory/__init__.py +0 -0
  358. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/polynomial_trajectory/__main__.py +3 -0
  359. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/polynomial_trajectory/run.py +154 -0
  360. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/quintic_polynomial_demo/README.md +21 -0
  361. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/quintic_polynomial_demo/__init__.py +0 -0
  362. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/quintic_polynomial_demo/__main__.py +3 -0
  363. flybots-1.0.0/src/uav_sim/simulations/trajectory_planning/quintic_polynomial_demo/run.py +169 -0
  364. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/__init__.py +0 -0
  365. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/feedback_linearisation/README.md +21 -0
  366. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/feedback_linearisation/__init__.py +0 -0
  367. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/feedback_linearisation/__main__.py +3 -0
  368. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/feedback_linearisation/run.py +137 -0
  369. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/mppi/README.md +21 -0
  370. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/mppi/__init__.py +0 -0
  371. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/mppi/__main__.py +3 -0
  372. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/mppi/run.py +248 -0
  373. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/nmpc/README.md +21 -0
  374. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/nmpc/__init__.py +0 -0
  375. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/nmpc/__main__.py +3 -0
  376. flybots-1.0.0/src/uav_sim/simulations/trajectory_tracking/nmpc/run.py +165 -0
  377. flybots-1.0.0/src/uav_sim/simulations/vehicles/__init__.py +0 -0
  378. flybots-1.0.0/src/uav_sim/simulations/vehicles/fixed_wing_flight/README.md +21 -0
  379. flybots-1.0.0/src/uav_sim/simulations/vehicles/fixed_wing_flight/__init__.py +0 -0
  380. flybots-1.0.0/src/uav_sim/simulations/vehicles/fixed_wing_flight/__main__.py +3 -0
  381. flybots-1.0.0/src/uav_sim/simulations/vehicles/fixed_wing_flight/run.py +194 -0
  382. flybots-1.0.0/src/uav_sim/simulations/vehicles/multirotor_mixer/README.md +69 -0
  383. flybots-1.0.0/src/uav_sim/simulations/vehicles/multirotor_mixer/__init__.py +0 -0
  384. flybots-1.0.0/src/uav_sim/simulations/vehicles/multirotor_mixer/__main__.py +3 -0
  385. flybots-1.0.0/src/uav_sim/simulations/vehicles/multirotor_mixer/run.py +302 -0
  386. flybots-1.0.0/src/uav_sim/simulations/vehicles/vtol_transition/README.md +21 -0
  387. flybots-1.0.0/src/uav_sim/simulations/vehicles/vtol_transition/__init__.py +0 -0
  388. flybots-1.0.0/src/uav_sim/simulations/vehicles/vtol_transition/__main__.py +3 -0
  389. flybots-1.0.0/src/uav_sim/simulations/vehicles/vtol_transition/run.py +217 -0
  390. flybots-1.0.0/src/uav_sim/swarm/__init__.py +18 -0
  391. flybots-1.0.0/src/uav_sim/swarm/consensus_formation.py +54 -0
  392. flybots-1.0.0/src/uav_sim/swarm/coverage.py +111 -0
  393. flybots-1.0.0/src/uav_sim/swarm/leader_follower.py +60 -0
  394. flybots-1.0.0/src/uav_sim/swarm/potential_swarm.py +129 -0
  395. flybots-1.0.0/src/uav_sim/swarm/reynolds_flocking.py +138 -0
  396. flybots-1.0.0/src/uav_sim/swarm/virtual_structure.py +104 -0
  397. flybots-1.0.0/src/uav_sim/trajectory_planning/__init__.py +14 -0
  398. flybots-1.0.0/src/uav_sim/trajectory_planning/frenet_optimal.py +228 -0
  399. flybots-1.0.0/src/uav_sim/trajectory_planning/min_snap.py +190 -0
  400. flybots-1.0.0/src/uav_sim/trajectory_planning/polynomial_trajectory.py +122 -0
  401. flybots-1.0.0/src/uav_sim/trajectory_planning/quintic_polynomial.py +134 -0
  402. flybots-1.0.0/src/uav_sim/trajectory_tracking/__init__.py +10 -0
  403. flybots-1.0.0/src/uav_sim/trajectory_tracking/feedback_linearisation.py +119 -0
  404. flybots-1.0.0/src/uav_sim/trajectory_tracking/mppi.py +176 -0
  405. flybots-1.0.0/src/uav_sim/trajectory_tracking/nmpc.py +304 -0
  406. flybots-1.0.0/src/uav_sim/vehicles/__init__.py +55 -0
  407. flybots-1.0.0/src/uav_sim/vehicles/base.py +96 -0
  408. flybots-1.0.0/src/uav_sim/vehicles/components/__init__.py +2 -0
  409. flybots-1.0.0/src/uav_sim/vehicles/components/allocation.py +594 -0
  410. flybots-1.0.0/src/uav_sim/vehicles/components/mixer.py +78 -0
  411. flybots-1.0.0/src/uav_sim/vehicles/components/motor.py +85 -0
  412. flybots-1.0.0/src/uav_sim/vehicles/fixed_wing/__init__.py +31 -0
  413. flybots-1.0.0/src/uav_sim/vehicles/fixed_wing/aerodynamics.py +403 -0
  414. flybots-1.0.0/src/uav_sim/vehicles/fixed_wing/fixed_wing.py +356 -0
  415. flybots-1.0.0/src/uav_sim/vehicles/fixed_wing/presets.py +181 -0
  416. flybots-1.0.0/src/uav_sim/vehicles/fixed_wing/trim.py +192 -0
  417. flybots-1.0.0/src/uav_sim/vehicles/footprint.py +124 -0
  418. flybots-1.0.0/src/uav_sim/vehicles/multirotor/__init__.py +28 -0
  419. flybots-1.0.0/src/uav_sim/vehicles/multirotor/multirotor.py +393 -0
  420. flybots-1.0.0/src/uav_sim/vehicles/multirotor/quadrotor.py +125 -0
  421. flybots-1.0.0/src/uav_sim/vehicles/payloads/__init__.py +2 -0
  422. flybots-1.0.0/src/uav_sim/vehicles/payloads/gimbal.py +58 -0
  423. flybots-1.0.0/src/uav_sim/vehicles/presets.py +235 -0
  424. flybots-1.0.0/src/uav_sim/vehicles/vtol/__init__.py +6 -0
  425. flybots-1.0.0/src/uav_sim/vehicles/vtol/tiltrotor.py +346 -0
  426. flybots-1.0.0/src/uav_sim/visualization/__init__.py +84 -0
  427. flybots-1.0.0/src/uav_sim/visualization/animator.py +210 -0
  428. flybots-1.0.0/src/uav_sim/visualization/costmap_viz.py +171 -0
  429. flybots-1.0.0/src/uav_sim/visualization/data_panel.py +220 -0
  430. flybots-1.0.0/src/uav_sim/visualization/plotting.py +156 -0
  431. flybots-1.0.0/src/uav_sim/visualization/sensor_viz.py +438 -0
  432. flybots-1.0.0/src/uav_sim/visualization/three_panel.py +255 -0
  433. flybots-1.0.0/src/uav_sim/visualization/vehicle_artists.py +421 -0
  434. flybots-1.0.0/tests/__init__.py +0 -0
  435. flybots-1.0.0/tests/test_algorithm_regressions.py +596 -0
  436. flybots-1.0.0/tests/test_allocation.py +457 -0
  437. flybots-1.0.0/tests/test_bbox_tracker.py +50 -0
  438. flybots-1.0.0/tests/test_cli.py +213 -0
  439. flybots-1.0.0/tests/test_control_stack.py +185 -0
  440. flybots-1.0.0/tests/test_costmap.py +84 -0
  441. flybots-1.0.0/tests/test_coverage_planner.py +47 -0
  442. flybots-1.0.0/tests/test_data_panel.py +95 -0
  443. flybots-1.0.0/tests/test_env_presets.py +59 -0
  444. flybots-1.0.0/tests/test_environment.py +98 -0
  445. flybots-1.0.0/tests/test_estimation.py +231 -0
  446. flybots-1.0.0/tests/test_fixed_wing_aero.py +379 -0
  447. flybots-1.0.0/tests/test_fixed_wing_mission.py +1105 -0
  448. flybots-1.0.0/tests/test_footprint.py +55 -0
  449. flybots-1.0.0/tests/test_footprint_layer.py +33 -0
  450. flybots-1.0.0/tests/test_frames.py +110 -0
  451. flybots-1.0.0/tests/test_frenet.py +59 -0
  452. flybots-1.0.0/tests/test_geometric.py +49 -0
  453. flybots-1.0.0/tests/test_gimbal.py +72 -0
  454. flybots-1.0.0/tests/test_gimbal_controller.py +57 -0
  455. flybots-1.0.0/tests/test_gym.py +450 -0
  456. flybots-1.0.0/tests/test_integration_flight.py +221 -0
  457. flybots-1.0.0/tests/test_integration_subsystems.py +364 -0
  458. flybots-1.0.0/tests/test_lqr.py +61 -0
  459. flybots-1.0.0/tests/test_lqr_path_tracker.py +35 -0
  460. flybots-1.0.0/tests/test_min_snap.py +90 -0
  461. flybots-1.0.0/tests/test_mixer.py +72 -0
  462. flybots-1.0.0/tests/test_motor.py +93 -0
  463. flybots-1.0.0/tests/test_mpc_controller.py +38 -0
  464. flybots-1.0.0/tests/test_multirotor.py +419 -0
  465. flybots-1.0.0/tests/test_nmpc.py +51 -0
  466. flybots-1.0.0/tests/test_package.py +23 -0
  467. flybots-1.0.0/tests/test_path_smoothing.py +67 -0
  468. flybots-1.0.0/tests/test_perception.py +48 -0
  469. flybots-1.0.0/tests/test_pid.py +146 -0
  470. flybots-1.0.0/tests/test_planning.py +204 -0
  471. flybots-1.0.0/tests/test_presets.py +112 -0
  472. flybots-1.0.0/tests/test_prm.py +98 -0
  473. flybots-1.0.0/tests/test_pure_pursuit.py +70 -0
  474. flybots-1.0.0/tests/test_quadrotor_model.py +108 -0
  475. flybots-1.0.0/tests/test_quintic.py +51 -0
  476. flybots-1.0.0/tests/test_sensors.py +217 -0
  477. flybots-1.0.0/tests/test_state_machine.py +133 -0
  478. flybots-1.0.0/tests/test_swarm.py +160 -0
  479. flybots-1.0.0/tests/test_tracking.py +124 -0
  480. flybots-1.0.0/tests/test_vehicles.py +89 -0
  481. flybots-1.0.0/tests/test_viz_overhaul.py +82 -0
  482. flybots-1.0.0/tests/test_vtol_transition.py +278 -0
  483. flybots-1.0.0/uv.lock +997 -0
  484. flybots-1.0.0/vercel.json +5 -0
flybots-1.0.0/.bandit ADDED
@@ -0,0 +1,6 @@
1
+ [bandit]
2
+ # S101 — assert_used. Pytest is built on assert; flagging it is noise.
3
+ # B404/B603 — subprocess use in scripts/make_promo.py. It invokes the
4
+ # ffmpeg binary shipped by imageio-ffmpeg with a fixed argument list and
5
+ # shell=False. No part of the command line comes from user input.
6
+ skips = S101,B404,B603
@@ -0,0 +1,13 @@
1
+ # The 44 simulation GIFs live in Git LFS. The docs and README link them
2
+ # through media.githubusercontent.com -- which is the LFS media endpoint --
3
+ # so neither the docs build nor CI ever has to check LFS out.
4
+ src/uav_sim/simulations/**/*.gif filter=lfs diff=lfs merge=lfs -text
5
+
6
+ # docs/public/ is deliberately NOT in LFS, and the rule above is scoped so it
7
+ # stays that way. VitePress bundles these files at build time, and the README
8
+ # links promo.gif through raw.githubusercontent.com, which serves an LFS file
9
+ # as its pointer text rather than as the image.
10
+
11
+ # Don't skew language statistics with generated or vendored content.
12
+ docs/package-lock.json linguist-generated=true
13
+ uv.lock linguist-generated=true
@@ -0,0 +1,53 @@
1
+ name: Algorithm request
2
+ description: Suggest an algorithm to implement
3
+ labels: [enhancement, algorithm]
4
+ body:
5
+ - type: input
6
+ id: algorithm
7
+ attributes:
8
+ label: Algorithm
9
+ placeholder: Informed RRT*
10
+ validations:
11
+ required: true
12
+
13
+ - type: dropdown
14
+ id: area
15
+ attributes:
16
+ label: Area
17
+ options:
18
+ - path planning
19
+ - trajectory planning
20
+ - path tracking
21
+ - trajectory tracking
22
+ - state estimation
23
+ - perception
24
+ - swarm
25
+ - vehicle model
26
+ - reinforcement learning
27
+ - other
28
+ validations:
29
+ required: true
30
+
31
+ - type: input
32
+ id: reference
33
+ attributes:
34
+ label: Reference
35
+ description: Author, title, venue, year. A DOI or arXiv link is ideal.
36
+ placeholder: Gammell et al., "Informed RRT*", IROS 2014
37
+ validations:
38
+ required: true
39
+
40
+ - type: textarea
41
+ id: rationale
42
+ attributes:
43
+ label: Why this one
44
+ description: What does it do that the existing implementations do not?
45
+ validations:
46
+ required: true
47
+
48
+ - type: checkboxes
49
+ id: contribution
50
+ attributes:
51
+ label: Contribution
52
+ options:
53
+ - label: I would like to implement this myself
@@ -0,0 +1,59 @@
1
+ name: Bug report
2
+ description: Something behaves incorrectly
3
+ labels: [bug]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Physics bugs are the interesting ones. The most useful report says
9
+ what you started from, what you applied, what happened, and what
10
+ should have happened.
11
+
12
+ - type: textarea
13
+ id: what-happened
14
+ attributes:
15
+ label: What happened
16
+ description: What did you observe?
17
+ placeholder: The fixed-wing climbs away instead of holding altitude.
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: expected
23
+ attributes:
24
+ label: What you expected
25
+ placeholder: Trimmed flight should hold altitude to within a metre.
26
+ validations:
27
+ required: true
28
+
29
+ - type: textarea
30
+ id: reproduction
31
+ attributes:
32
+ label: Reproduction
33
+ description: A short script beats a description. This is rendered as Python.
34
+ render: python
35
+ placeholder: |
36
+ from uav_sim.vehicles.fixed_wing import FixedWing
37
+
38
+ aircraft = FixedWing()
39
+ controls = aircraft.reset_trimmed(airspeed=35.0, altitude=200.0)
40
+ for _ in range(5000):
41
+ aircraft.step(controls, 0.002)
42
+ print(aircraft.state[2]) # expected ~200, got 812
43
+ validations:
44
+ required: true
45
+
46
+ - type: input
47
+ id: version
48
+ attributes:
49
+ label: Version
50
+ description: Output of `flybots --version`
51
+ validations:
52
+ required: true
53
+
54
+ - type: textarea
55
+ id: doctor
56
+ attributes:
57
+ label: Environment
58
+ description: Output of `flybots doctor`
59
+ render: shell
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question or idea
4
+ url: https://github.com/guilyx/flybots/discussions
5
+ about: Ask how something works, or propose an algorithm to add.
@@ -0,0 +1,22 @@
1
+ name: Documentation issue
2
+ description: Something in the docs is wrong, missing or unclear
3
+ labels: [documentation]
4
+ body:
5
+ - type: input
6
+ id: page
7
+ attributes:
8
+ label: Page
9
+ description: URL or file path
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: problem
15
+ attributes:
16
+ label: What is wrong
17
+ description: |
18
+ If something was hard to understand, say what you expected it to
19
+ say. "I could not tell which pitch sign convention applies" is more
20
+ actionable than "the docs are confusing".
21
+ validations:
22
+ required: true
@@ -0,0 +1,28 @@
1
+ ## What changed
2
+
3
+ <!-- One or two sentences. What does this PR do? -->
4
+
5
+ ## Why
6
+
7
+ <!-- What problem does this solve? If it fixes a bug, describe the
8
+ incorrect behaviour: what did it do, and what should it have done? -->
9
+
10
+ ## How it was verified
11
+
12
+ <!-- How do you know it works? Prefer evidence over assertion:
13
+ numbers, a failing-then-passing test, a before/after comparison. -->
14
+
15
+ - [ ] `uv run pytest` passes
16
+ - [ ] `pre-commit run --all-files` passes
17
+ - [ ] New behaviour is covered by tests that would fail without this change
18
+
19
+ ## For new algorithms
20
+
21
+ - [ ] Citation in the module docstring (author, title, venue, year)
22
+ - [ ] Runnable simulation exposing `main()`
23
+ - [ ] Docs page plus a sidebar entry in `docs/.vitepress/config.ts`
24
+ - [ ] Follows the frame conventions in CONTRIBUTING.md (world ENU, body FLU)
25
+
26
+ ## Notes for reviewers
27
+
28
+ <!-- Anything you are unsure about, or that deserves a closer look. -->
@@ -0,0 +1,156 @@
1
+ # Erwin Lejeune - 2026-02-18
2
+
3
+ name: CI
4
+
5
+ on:
6
+ push:
7
+ branches: [main, develop]
8
+ pull_request:
9
+ workflow_dispatch:
10
+
11
+ concurrency:
12
+ group: ci-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ env:
16
+ FORCE_COLOR: "1"
17
+
18
+ jobs:
19
+ lint:
20
+ name: Lint
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
24
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
25
+ with:
26
+ version: latest
27
+ enable-cache: true
28
+ - run: uv python install 3.12
29
+ - run: uv sync --all-groups
30
+ - name: Run pre-commit checks
31
+ uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
32
+
33
+ security:
34
+ name: Security scan
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
38
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
39
+ with:
40
+ version: latest
41
+ enable-cache: true
42
+ - run: uv python install 3.12
43
+
44
+ # Our own code. This gates the build: anything bandit flags here is
45
+ # something we wrote and can fix.
46
+ - name: Static analysis (bandit)
47
+ run: uvx bandit -q -r src scripts
48
+
49
+ # Producing the input gates, even though auditing it does not. An
50
+ # audit that cannot read its input reports nothing, which looks
51
+ # exactly like an audit that found nothing.
52
+ #
53
+ # --no-header matters: FORCE_COLOR is set for the whole workflow, so
54
+ # uv wraps its header comment in ANSI codes. The escape byte lands
55
+ # before the '#', pip-audit stops seeing a comment, and it rejects
56
+ # the entire file on line 1.
57
+ - name: Export the locked dependency set
58
+ run: |
59
+ uv export --all-groups --format requirements-txt \
60
+ --no-emit-project --no-hashes --no-header --no-annotate > deps.txt
61
+ test -s deps.txt
62
+ # Written as an `if`, not `! grep ...`: bash ignores errexit for a
63
+ # command whose status is inverted with `!`, so the negated form
64
+ # can never fail the step.
65
+ if grep -q $'\x1b' deps.txt; then
66
+ echo "deps.txt contains ANSI escapes; pip-audit will reject it" >&2
67
+ exit 1
68
+ fi
69
+
70
+ # Advisories appear against pinned versions with no warning and no fix
71
+ # available, so the audit itself reports rather than gates -- a red X
72
+ # nobody can clear teaches contributors to ignore CI.
73
+ - name: Python dependency audit
74
+ continue-on-error: true
75
+ run: uvx pip-audit -r deps.txt --desc
76
+
77
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
78
+ with:
79
+ node-version: 22
80
+ cache: npm
81
+ cache-dependency-path: docs/package-lock.json
82
+ - name: Docs dependency audit
83
+ working-directory: docs
84
+ run: |
85
+ # Print the full report. Two findings survive here, both in the
86
+ # vite range that VitePress 1.6.4 pins, both Windows-only and
87
+ # dev-server-only, and neither reaching the built site. See the
88
+ # `overrides` note in docs/package.json.
89
+ npm audit || true
90
+ # Gate on critical alone, so this step stays green until something
91
+ # lands that genuinely cannot wait for an upstream release.
92
+ npm audit --audit-level=critical
93
+
94
+ test:
95
+ name: Test (Python ${{ matrix.python }})
96
+ runs-on: ubuntu-latest
97
+ strategy:
98
+ fail-fast: false
99
+ matrix:
100
+ python: ["3.12", "3.13"]
101
+ steps:
102
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
103
+ with:
104
+ lfs: false
105
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
106
+ with:
107
+ version: latest
108
+ enable-cache: true
109
+ - run: uv python install ${{ matrix.python }}
110
+ - run: uv sync --all-groups
111
+ - name: Run tests
112
+ run: uv run pytest -q --cov=uav_sim --cov-report=xml --cov-report=term-missing
113
+ - name: Upload coverage
114
+ if: matrix.python == '3.12'
115
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
116
+ with:
117
+ name: coverage
118
+ path: coverage.xml
119
+ if-no-files-found: warn
120
+
121
+ smoke:
122
+ name: CLI smoke test
123
+ runs-on: ubuntu-latest
124
+ steps:
125
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
126
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
127
+ with:
128
+ version: latest
129
+ enable-cache: true
130
+ - run: uv python install 3.12
131
+ - run: uv sync --all-groups
132
+ - name: Physics self-check
133
+ run: uv run flybots doctor
134
+ - name: Catalogue is discoverable
135
+ run: |
136
+ uv run flybots list
137
+ uv run flybots envs
138
+ - name: Trim solver
139
+ run: uv run flybots trim skywalker_x8
140
+ - name: Training loop runs end to end
141
+ run: uv run flybots train hover --iterations 3 --directions 4 --eval-episodes 3
142
+
143
+ docs:
144
+ name: Docs build
145
+ runs-on: ubuntu-latest
146
+ steps:
147
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
148
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
149
+ with:
150
+ node-version: 22
151
+ cache: npm
152
+ cache-dependency-path: docs/package-lock.json
153
+ - run: npm ci
154
+ working-directory: docs
155
+ - run: npm run build
156
+ working-directory: docs
@@ -0,0 +1,69 @@
1
+ # Erwin Lejeune - 2026-02-18
2
+ #
3
+ # Builds the VitePress site and publishes it to GitHub Pages.
4
+
5
+ name: Deploy docs
6
+
7
+ on:
8
+ push:
9
+ branches: [main]
10
+ paths:
11
+ - "docs/**"
12
+ - ".github/workflows/pages.yml"
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ # Let a running deploy finish rather than cancelling it half-published.
21
+ concurrency:
22
+ group: pages
23
+ cancel-in-progress: false
24
+
25
+ jobs:
26
+ build:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
30
+ with:
31
+ # VitePress reads git history to show last-updated timestamps.
32
+ fetch-depth: 0
33
+ # No LFS. The simulation GIFs are the only LFS content, and the
34
+ # docs link them through media.githubusercontent.com rather than
35
+ # bundling them -- checking them out would spend LFS bandwidth on
36
+ # every deploy for files the build never opens. The promo video
37
+ # under docs/public/ is a normal git object precisely so that this
38
+ # stays true. CI's `Docs build` job proves it: same build, no LFS.
39
+ lfs: false
40
+
41
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
42
+ with:
43
+ node-version: 22
44
+ cache: npm
45
+ cache-dependency-path: docs/package-lock.json
46
+
47
+ - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
48
+
49
+ - name: Install dependencies
50
+ run: npm ci
51
+ working-directory: docs
52
+
53
+ - name: Build site
54
+ run: npm run build
55
+ working-directory: docs
56
+
57
+ - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
58
+ with:
59
+ path: docs/.vitepress/dist
60
+
61
+ deploy:
62
+ needs: build
63
+ runs-on: ubuntu-latest
64
+ environment:
65
+ name: github-pages
66
+ url: ${{ steps.deployment.outputs.page_url }}
67
+ steps:
68
+ - id: deployment
69
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
@@ -0,0 +1,97 @@
1
+ # Erwin Lejeune - 2026-08-18
2
+ #
3
+ # Builds the distribution and publishes it to PyPI as `flybots`.
4
+ #
5
+ # Publishing uses PyPI Trusted Publishing (OIDC), so there is no API token
6
+ # in the repository secrets. It needs a one-time setup on PyPI: on the
7
+ # project's "Publishing" page, add a GitHub publisher for
8
+ # guilyx/flybots, workflow `release.yml`, environment `pypi`.
9
+ # Until that exists the publish step fails with an OIDC error rather than
10
+ # silently uploading nothing.
11
+
12
+ name: Release
13
+
14
+ on:
15
+ push:
16
+ tags: ["v*"]
17
+ workflow_dispatch:
18
+ inputs:
19
+ dry-run:
20
+ description: "Build and check only, do not upload"
21
+ type: boolean
22
+ default: true
23
+
24
+ permissions:
25
+ contents: read
26
+
27
+ jobs:
28
+ build:
29
+ name: Build distributions
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
33
+ with:
34
+ # The sdist bundles the README, not the media it links to, so the
35
+ # 6 MB promo video is dead weight for this job.
36
+ lfs: false
37
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
38
+ with:
39
+ version: latest
40
+ enable-cache: true
41
+ - run: uv python install 3.12
42
+
43
+ # A tag that disagrees with pyproject uploads a version nobody can
44
+ # reproduce from the tag. Caught here, before anything is built.
45
+ - name: Tag matches the packaged version
46
+ if: startsWith(github.ref, 'refs/tags/v')
47
+ run: |
48
+ packaged=$(uv version --short)
49
+ tagged="${GITHUB_REF_NAME#v}"
50
+ echo "pyproject: $packaged, tag: $tagged"
51
+ test "$packaged" = "$tagged"
52
+
53
+ - run: uv build
54
+
55
+ # twine's check is what PyPI itself runs on the long description. A
56
+ # README it cannot render is rejected at upload time, which is a bad
57
+ # place to find out.
58
+ - name: Metadata is valid
59
+ run: uvx twine check dist/*
60
+
61
+ # Proves the wheel installs and that both console scripts resolve --
62
+ # `flybots` and the `uav-sim` alias kept for the rename.
63
+ - name: Wheel installs and the commands work
64
+ run: |
65
+ uv venv /tmp/release-check
66
+ VIRTUAL_ENV=/tmp/release-check uv pip install dist/*.whl
67
+ /tmp/release-check/bin/flybots --version
68
+ /tmp/release-check/bin/uav-sim --version
69
+
70
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
71
+ with:
72
+ name: dist
73
+ path: dist/
74
+ if-no-files-found: error
75
+
76
+ publish:
77
+ name: Publish to PyPI
78
+ needs: build
79
+ if: startsWith(github.ref, 'refs/tags/v') && !inputs.dry-run
80
+ runs-on: ubuntu-latest
81
+ environment:
82
+ name: pypi
83
+ url: https://pypi.org/project/flybots/
84
+ permissions:
85
+ # Mints the OIDC token Trusted Publishing exchanges for an upload
86
+ # token. Nothing else in this workflow needs it.
87
+ id-token: write
88
+ steps:
89
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
90
+ with:
91
+ name: dist
92
+ path: dist/
93
+ - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5
94
+ with:
95
+ version: latest
96
+ - name: Upload
97
+ run: uv publish --trusted-publishing always
@@ -0,0 +1,59 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ *.egg
9
+
10
+ # Virtual environments
11
+ .venv/
12
+ venv/
13
+ env/
14
+
15
+ # IDE
16
+ .idea/
17
+ .vscode/
18
+ *.swp
19
+ *.swo
20
+
21
+ # OS
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # Testing
26
+ .pytest_cache/
27
+ .coverage
28
+ htmlcov/
29
+
30
+ # Ruff
31
+ .ruff_cache/
32
+
33
+ *.log
34
+ *.log.gz
35
+ *.log.gz.part
36
+ *.log.gz.part.1
37
+ *.log.gz.part.2
38
+ *.log.gz.part.3
39
+ *.log.gz.part.4
40
+ *.log.gz.part.5
41
+ *.log.gz.part.6
42
+ *.log.gz.part.7
43
+ .env
44
+
45
+ # Generated simulation artifacts
46
+ src/uav_sim/simulations/**/*_log.json
47
+
48
+ # Trained policies, other than the checked-in reference ones.
49
+ # The learning curve belongs with the policy: `scripts/make_promo.py` only
50
+ # takes its reuse path when *both* files are present, so ignoring the curve
51
+ # made every promo render retrain from scratch -- an hour of CPU to change a
52
+ # line of on-screen copy.
53
+ policies/*
54
+ !policies/hover.npz
55
+ !policies/hover_curve.npy
56
+
57
+ # Docs build output
58
+ docs/.vitepress/dist/
59
+ docs/.vitepress/cache/
@@ -0,0 +1,37 @@
1
+ # See https://pre-commit.com for more information
2
+ # Run `pre-commit install` to install hooks, then `pre-commit run --all-files` to check
3
+ repos:
4
+ # Conventional commits: feat:, fix:, chore:, docs:, style:, refactor:, test:, etc.
5
+ - repo: https://github.com/commitizen-tools/commitizen
6
+ rev: v3.27.0
7
+ hooks:
8
+ # `stages` belongs on the hook, not the repo — pre-commit warns about
9
+ # it at the repo level and then ignores it.
10
+ - id: commitizen
11
+ stages: [commit-msg]
12
+ - repo: https://github.com/pre-commit/pre-commit-hooks
13
+ rev: v5.0.0
14
+ hooks:
15
+ - id: trailing-whitespace
16
+ - id: end-of-file-fixer
17
+ - id: check-yaml
18
+ - id: check-added-large-files
19
+ args: ["--maxkb=6000"]
20
+ # The promo video is the one binary deliberately committed outside
21
+ # LFS — it has to be a real file under docs/public/ for the site to
22
+ # bundle it. Exempting it by name keeps the limit meaningful for
23
+ # everything else, which is what the check is actually for.
24
+ exclude: ^docs/public/media/promo\.mp4$
25
+ - id: check-merge-conflict
26
+ - id: debug-statements
27
+
28
+ # Keep this in step with the ruff version in pyproject's dev group.
29
+ # A stale pin here is worse than no pin: ruff's formatter changes between
30
+ # releases, so the two versions fight over the same files and every CI run
31
+ # reformats what the last local run just formatted.
32
+ - repo: https://github.com/astral-sh/ruff-pre-commit
33
+ rev: v0.15.1
34
+ hooks:
35
+ - id: ruff
36
+ args: [--fix]
37
+ - id: ruff-format
@@ -0,0 +1 @@
1
+ 3.12