bluer-ugv 7.235.1__tar.gz → 7.286.1__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 (195) hide show
  1. {bluer_ugv-7.235.1/bluer_ugv.egg-info → bluer_ugv-7.286.1}/PKG-INFO +3 -3
  2. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/README.md +2 -2
  3. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/__init__.py +1 -1
  4. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/consts.py +3 -0
  5. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/items.py +1 -1
  6. bluer_ugv-7.286.1/bluer_ugv/README/build.py +57 -0
  7. bluer_ugv-7.286.1/bluer_ugv/README/releases.py +8 -0
  8. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/shortcuts.py +2 -2
  9. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/build.py +135 -0
  10. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/DYI.py +8 -0
  11. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/classes.py +138 -0
  12. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/concealment.py +8 -0
  13. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/control.py +30 -0
  14. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/cost.py +30 -0
  15. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/db.py +36 -0
  16. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/payload.py +21 -0
  17. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/ps.py +8 -0
  18. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/range.py +14 -0
  19. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +8 -0
  20. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/size.py +32 -0
  21. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/speed.py +10 -0
  22. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/swarm.py +8 -0
  23. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +8 -0
  24. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/references/__init__.py +1 -0
  25. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/references/classes.py +27 -0
  26. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/references/db.py +344 -0
  27. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/ugvs/classes.py +118 -0
  28. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/ugvs/db.py +411 -0
  29. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/db.py +32 -0
  30. bluer_ugv-7.286.1/bluer_ugv/README/ugvs/docs.py +30 -0
  31. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/__init__.py +1 -1
  32. bluer_ugv-7.286.1/bluer_ugv/assets/comparison.html +33 -0
  33. bluer_ugv-7.286.1/bluer_ugv/swallow/session/classical/__init__.py +0 -0
  34. bluer_ugv-7.286.1/bluer_ugv/swallow/session/classical/keyboard/__init__.py +0 -0
  35. bluer_ugv-7.286.1/bluer_ugv/swallow/session/classical/setpoint/__init__.py +0 -0
  36. bluer_ugv-7.286.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py +0 -0
  37. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1/bluer_ugv.egg-info}/PKG-INFO +3 -3
  38. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv.egg-info/SOURCES.txt +28 -1
  39. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/setup.py +6 -0
  40. bluer_ugv-7.235.1/bluer_ugv/README/UGVs.py +0 -46
  41. bluer_ugv-7.235.1/bluer_ugv/README/build.py +0 -51
  42. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/LICENSE +0 -0
  43. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/MANIFEST.in +0 -0
  44. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/abcli.sh +0 -0
  45. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/actions.sh +0 -0
  46. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/aka.sh +0 -0
  47. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/alias.sh +0 -0
  48. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
  49. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
  50. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
  51. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
  52. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
  53. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
  54. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/dataset.sh +0 -0
  55. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
  56. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
  57. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
  58. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/env/set.sh +0 -0
  59. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
  60. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/keyboard/test.sh +0 -0
  61. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/keyboard.sh +0 -0
  62. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
  63. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
  64. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
  65. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
  66. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
  67. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/swallow.sh +0 -0
  68. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
  69. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/help.sh +0 -0
  70. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
  71. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
  72. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
  73. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
  74. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
  75. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
  76. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
  77. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
  78. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
  79. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/__init__.py +0 -0
  80. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/alias.py +0 -0
  81. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/algo.py +0 -0
  82. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/design.py +0 -0
  83. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/arzhang/flag.py +0 -0
  84. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/beast.py +0 -0
  85. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/consts.py +0 -0
  86. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/eagle/__init__.py +0 -0
  87. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/eagle/consts.py +0 -0
  88. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/eagle/items.py +0 -0
  89. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/fire/__init__.py +0 -0
  90. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/fire/consts.py +0 -0
  91. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/fire/items.py +0 -0
  92. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/items.py +0 -0
  93. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/rangin/__init__.py +0 -0
  94. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/rangin/consts.py +0 -0
  95. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/rangin/items.py +0 -0
  96. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/ravin/__init__.py +0 -0
  97. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/ravin/consts.py +0 -0
  98. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/ravin/items.py +0 -0
  99. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/root.py +0 -0
  100. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/shield.py +0 -0
  101. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/__init__.py +0 -0
  102. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/analog.py +0 -0
  103. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/consts.py +0 -0
  104. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
  105. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
  106. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
  107. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
  108. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/design/__init__.py +0 -0
  109. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
  110. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
  111. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/README/swallow/items.py +0 -0
  112. {bluer_ugv-7.235.1/bluer_ugv/designs → bluer_ugv-7.286.1/bluer_ugv/README/ugvs}/__init__.py +0 -0
  113. {bluer_ugv-7.235.1/bluer_ugv/designs/arzhang → bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison}/__init__.py +0 -0
  114. {bluer_ugv-7.235.1/bluer_ugv/designs/eagle → bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/features}/__init__.py +0 -0
  115. {bluer_ugv-7.235.1/bluer_ugv/designs/fire → bluer_ugv-7.286.1/bluer_ugv/README/ugvs/comparison/ugvs}/__init__.py +0 -0
  116. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/__main__.py +0 -0
  117. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/config.env +0 -0
  118. {bluer_ugv-7.235.1/bluer_ugv/designs/rangin → bluer_ugv-7.286.1/bluer_ugv/designs}/__init__.py +0 -0
  119. {bluer_ugv-7.235.1/bluer_ugv/designs/ravin → bluer_ugv-7.286.1/bluer_ugv/designs/arzhang}/__init__.py +0 -0
  120. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/arzhang/parts.py +0 -0
  121. {bluer_ugv-7.235.1/bluer_ugv/designs/ravin/ravin3 → bluer_ugv-7.286.1/bluer_ugv/designs/eagle}/__init__.py +0 -0
  122. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/eagle/parts.py +0 -0
  123. {bluer_ugv-7.235.1/bluer_ugv/designs/ravin/ravin4 → bluer_ugv-7.286.1/bluer_ugv/designs/fire}/__init__.py +0 -0
  124. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/fire/parts.py +0 -0
  125. {bluer_ugv-7.235.1/bluer_ugv/swallow → bluer_ugv-7.286.1/bluer_ugv/designs/rangin}/__init__.py +0 -0
  126. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/rangin/parts.py +0 -0
  127. {bluer_ugv-7.235.1/bluer_ugv/swallow/dataset → bluer_ugv-7.286.1/bluer_ugv/designs/ravin}/__init__.py +0 -0
  128. {bluer_ugv-7.235.1/bluer_ugv/swallow/session → bluer_ugv-7.286.1/bluer_ugv/designs/ravin/ravin3}/__init__.py +0 -0
  129. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/ravin/ravin3/parts.py +0 -0
  130. {bluer_ugv-7.235.1/bluer_ugv/swallow/session/classical → bluer_ugv-7.286.1/bluer_ugv/designs/ravin/ravin4}/__init__.py +0 -0
  131. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
  132. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/env.py +0 -0
  133. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/__init__.py +0 -0
  134. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/__main__.py +0 -0
  135. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/functions.py +0 -0
  136. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/git.py +0 -0
  137. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/__init__.py +0 -0
  138. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/dataset.py +0 -0
  139. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/debug.py +0 -0
  140. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/env.py +0 -0
  141. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/keyboard.py +0 -0
  142. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/select_target.py +0 -0
  143. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
  144. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/host.py +0 -0
  145. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/logger.py +0 -0
  146. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/sample.env +0 -0
  147. {bluer_ugv-7.235.1/bluer_ugv/swallow/session/classical/keyboard → bluer_ugv-7.286.1/bluer_ugv/swallow}/__init__.py +0 -0
  148. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/__main__.py +0 -0
  149. {bluer_ugv-7.235.1/bluer_ugv/swallow/session/classical/setpoint → bluer_ugv-7.286.1/bluer_ugv/swallow/dataset}/__init__.py +0 -0
  150. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
  151. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
  152. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/debug.py +0 -0
  153. {bluer_ugv-7.235.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor → bluer_ugv-7.286.1/bluer_ugv/swallow/session}/__init__.py +0 -0
  154. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/__main__.py +0 -0
  155. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
  156. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/camera/generic.py +0 -0
  157. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +0 -0
  158. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +0 -0
  159. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +0 -0
  160. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/keyboard/__main__.py +0 -0
  161. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/keyboard/classes.py +0 -0
  162. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/keyboard/keys.py +0 -0
  163. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/keyboard/testing.py +0 -0
  164. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
  165. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
  166. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
  167. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
  168. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
  169. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
  170. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
  171. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
  172. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
  173. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/position.py +0 -0
  174. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
  175. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/session.py +0 -0
  176. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
  177. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
  178. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
  179. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +0 -0
  180. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
  181. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
  182. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +0 -0
  183. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +0 -0
  184. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
  185. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
  186. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +0 -0
  187. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/session/functions.py +0 -0
  188. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/swallow/targeting.py +0 -0
  189. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv/urls.py +0 -0
  190. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
  191. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv.egg-info/requires.txt +0 -0
  192. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/bluer_ugv.egg-info/top_level.txt +0 -0
  193. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/pyproject.toml +0 -0
  194. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/requirements.txt +0 -0
  195. {bluer_ugv-7.235.1 → bluer_ugv-7.286.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.235.1
3
+ Version: 7.286.1
4
4
  Summary: 🐬 AI x UGV.
5
5
  Home-page: https://github.com/kamangir/bluer-ugv
6
6
  Author: Arash Abadpour (Kamangir)
@@ -48,7 +48,7 @@ pip install bluer_ugv
48
48
  | | |
49
49
  | --- | --- |
50
50
  | [`shield`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/shield.md) [![image](https://github.com/kamangir/bluer-designs//blob/main/swallow/electrical/digital.png?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/shield.md) | [`UGVs`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/UGVs) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250912_211652.jpg?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/UGVs) |
51
- | [`terraform`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/terraform.md) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250611_100917.jpg?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/terraform.md) | [`arzhang validations`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang/validation) [![image](https://github.com/kamangir/assets/raw/main/swallow-debug-2025-09-25-13-16-59-rnm7jd/swallow-debug-2025-09-25-13-16-59-rnm7jd.gif)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang/validation) |
51
+ | [`terraform`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/terraform.md) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250611_100917.jpg?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/terraform.md) | [`validations`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/validations) [![image](https://github.com/kamangir/assets/raw/main/swallow-debug-2025-09-25-13-16-59-rnm7jd/swallow-debug-2025-09-25-13-16-59-rnm7jd.gif)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/validations) |
52
52
 
53
53
  ## aliases
54
54
 
@@ -64,7 +64,7 @@ pip install bluer_ugv
64
64
 
65
65
  [![pylint](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-ugv.svg)](https://pypi.org/project/bluer-ugv/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-ugv)](https://pypistats.org/packages/bluer-ugv)
66
66
 
67
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.235.1`](https://github.com/kamangir/bluer-ugv).
67
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.286.1`](https://github.com/kamangir/bluer-ugv).
68
68
 
69
69
 
70
70
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -19,7 +19,7 @@ pip install bluer_ugv
19
19
  | | |
20
20
  | --- | --- |
21
21
  | [`shield`](./bluer_ugv/docs/swallow/digital/design/shield.md) [![image](https://github.com/kamangir/bluer-designs//blob/main/swallow/electrical/digital.png?raw=true)](./bluer_ugv/docs/swallow/digital/design/shield.md) | [`UGVs`](./bluer_ugv/docs/UGVs) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250912_211652.jpg?raw=true)](./bluer_ugv/docs/UGVs) |
22
- | [`terraform`](./bluer_ugv/docs/swallow/digital/design/terraform.md) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250611_100917.jpg?raw=true)](./bluer_ugv/docs/swallow/digital/design/terraform.md) | [`arzhang validations`](./bluer_ugv/docs/arzhang/validation) [![image](https://github.com/kamangir/assets/raw/main/swallow-debug-2025-09-25-13-16-59-rnm7jd/swallow-debug-2025-09-25-13-16-59-rnm7jd.gif)](./bluer_ugv/docs/arzhang/validation) |
22
+ | [`terraform`](./bluer_ugv/docs/swallow/digital/design/terraform.md) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250611_100917.jpg?raw=true)](./bluer_ugv/docs/swallow/digital/design/terraform.md) | [`validations`](./bluer_ugv/docs/validations) [![image](https://github.com/kamangir/assets/raw/main/swallow-debug-2025-09-25-13-16-59-rnm7jd/swallow-debug-2025-09-25-13-16-59-rnm7jd.gif)](./bluer_ugv/docs/validations) |
23
23
 
24
24
  ## aliases
25
25
 
@@ -35,5 +35,5 @@ pip install bluer_ugv
35
35
 
36
36
  [![pylint](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-ugv.svg)](https://pypi.org/project/bluer-ugv/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-ugv)](https://pypistats.org/packages/bluer-ugv)
37
37
 
38
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.235.1`](https://github.com/kamangir/bluer-ugv).
38
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.286.1`](https://github.com/kamangir/bluer-ugv).
39
39
 
@@ -1,6 +1,6 @@
1
1
  from bluer_ugv.README.arzhang.items import items
2
2
  from bluer_ugv.README.arzhang import design, algo, flag
3
- from bluer_ugv.README.arzhang.validations import docs as validations
3
+ from bluer_ugv.README.validations import docs as validations
4
4
 
5
5
  docs = (
6
6
  [
@@ -1,5 +1,8 @@
1
1
  from bluer_objects.README.consts import assets_url, designs_url
2
2
 
3
+ arzhang_assets = assets_url(
4
+ suffix="arzhang",
5
+ )
3
6
 
4
7
  arzhang_assets2 = assets_url(
5
8
  suffix="arzhang",
@@ -16,7 +16,7 @@ items = ImageItems(
16
16
  f"{arzhang_assets2}/VID-20250830-WA0000~3_1.gif": "",
17
17
  f"{arzhang_assets2}/20250901_105247.jpg": "",
18
18
  f"{arzhang_assets2}/20250905_120625.jpg": "",
19
- f"{arzhang_assets2}/VID-20250905-WA0014_1.gif": "./validation/village-1.md",
19
+ f"{arzhang_assets2}/VID-20250905-WA0014_1.gif": "../validations/village-1.md",
20
20
  f"{swallow_assets2}/20251001_185852.jpg": "",
21
21
  f"{swallow_assets2}/20251003_113240-2.jpg": "",
22
22
  f"{swallow_assets2}/20251003_121114-2.jpg": "",
@@ -0,0 +1,57 @@
1
+ import os
2
+
3
+ from bluer_options.help.functions import get_help
4
+ from bluer_objects import file, README
5
+
6
+ from bluer_ugv import NAME, VERSION, ICON, REPO_NAME
7
+ from bluer_ugv.help.functions import help_functions
8
+ from bluer_ugv.README import (
9
+ alias,
10
+ beast,
11
+ eagle,
12
+ fire,
13
+ ravin,
14
+ root,
15
+ shield,
16
+ arzhang,
17
+ rangin,
18
+ releases,
19
+ swallow,
20
+ )
21
+ from bluer_ugv.README.ugvs import docs as ugvs
22
+ from bluer_ugv.README.ugvs.comparison.build import build as build_comparison
23
+
24
+
25
+ def build() -> bool:
26
+ return (
27
+ all(
28
+ README.build(
29
+ items=readme.get("items", []),
30
+ path=os.path.join(file.path(__file__), readme["path"]),
31
+ cols=readme.get("cols", 3),
32
+ ICON=ICON,
33
+ NAME=NAME,
34
+ VERSION=VERSION,
35
+ REPO_NAME=REPO_NAME,
36
+ help_function=lambda tokens: get_help(
37
+ tokens,
38
+ help_functions,
39
+ mono=True,
40
+ ),
41
+ macros=readme.get("macros", {}),
42
+ )
43
+ for readme in root.docs
44
+ + alias.docs
45
+ + arzhang.docs
46
+ + beast.docs
47
+ + eagle.docs
48
+ + fire.docs
49
+ + rangin.docs
50
+ + ravin.docs
51
+ + releases.docs
52
+ + shield.docs
53
+ + ugvs.docs
54
+ + swallow.docs
55
+ )
56
+ and build_comparison()
57
+ )
@@ -0,0 +1,8 @@
1
+ docs = [
2
+ {
3
+ "path": "../docs/releases",
4
+ },
5
+ {
6
+ "path": "../docs/releases/one.md",
7
+ },
8
+ ]
@@ -26,8 +26,8 @@ items = markdown.generate_table(
26
26
  "marquee": f"{swallow_assets2}/20250611_100917.jpg?raw=true",
27
27
  },
28
28
  {
29
- "name": "arzhang validations",
30
- "url": "./bluer_ugv/docs/arzhang/validation",
29
+ "name": "validations",
30
+ "url": "./bluer_ugv/docs/validations",
31
31
  "marquee": assets_url(
32
32
  suffix="{object_name}/{object_name}.gif".format(
33
33
  object_name="swallow-debug-2025-09-25-13-16-59-rnm7jd"
@@ -0,0 +1,135 @@
1
+ import os
2
+ from typing import List, Union
3
+ from functools import reduce
4
+
5
+ from blueness import module
6
+ from bluer_objects import file
7
+
8
+ from bluer_ugv import NAME
9
+ from bluer_ugv.README.ugvs.comparison.ugvs.db import list_of_ugvs
10
+ from bluer_ugv.README.ugvs.comparison.references.db import list_of_references
11
+ from bluer_ugv.logger import logger
12
+
13
+
14
+ NAME = module.name(__file__, NAME)
15
+
16
+
17
+ def build(
18
+ log: bool = True,
19
+ reference_ugv_name: str = "arzhang",
20
+ ) -> bool:
21
+ reference_ugv = list_of_ugvs.get(reference_ugv_name)
22
+ if reference_ugv is None:
23
+ logger.error(f"{reference_ugv_name}: reference ugv not found.")
24
+ return False
25
+
26
+ logger.info(f"{NAME}.build")
27
+
28
+ success, contents = file.load_text(
29
+ file.absolute(
30
+ "../../../assets/comparison.html",
31
+ reference_path=file.path(__file__),
32
+ ),
33
+ log=log,
34
+ )
35
+ if not success:
36
+ return success
37
+
38
+ try:
39
+ content_index = [line.strip() for line in contents].index("contents:::")
40
+ except Exception as e:
41
+ logger.error(f"contents::: not found: {e}")
42
+ return False
43
+
44
+ contents = (
45
+ contents[:content_index]
46
+ + row_of(
47
+ [
48
+ "رديف",
49
+ "نام محصول مشابه",
50
+ "مشابهت و تفاوت ها محصول شما با آنها ",
51
+ ],
52
+ header=True,
53
+ )
54
+ + reduce(
55
+ lambda x, y: x + y,
56
+ [
57
+ row_of(
58
+ [
59
+ str(index + 1),
60
+ ugv.description,
61
+ reference_ugv.compare(ugv),
62
+ ]
63
+ )
64
+ for index, ugv in enumerate(
65
+ [
66
+ ugv_
67
+ for ugv_ in reversed(
68
+ sorted(
69
+ list_of_ugvs.db,
70
+ key=lambda ugv: ugv.name,
71
+ )
72
+ )
73
+ if ugv_.nickname not in [reference_ugv_name, "template"]
74
+ ]
75
+ )
76
+ ],
77
+ [],
78
+ )
79
+ + contents[content_index + 1 :]
80
+ + ['<ol dir="rtl" style="text-align:right;">']
81
+ + [
82
+ '<li dir="rtl" style="text-align:{};"><a href="{}">{} - {}</a></li>'.format(
83
+ "right" if reference.is_in_farsi else "left",
84
+ reference.url,
85
+ reference.title,
86
+ reference.url,
87
+ )
88
+ for reference in reversed(
89
+ sorted(
90
+ list_of_references.db,
91
+ key=lambda reference: reference.title,
92
+ )
93
+ )
94
+ if reference.title != "template"
95
+ ]
96
+ + ['</ol dir="rtl" style="text-align:right;">']
97
+ )
98
+
99
+ return file.save_text(
100
+ file.absolute(
101
+ "../../../docs/UGVs/comparison.html",
102
+ reference_path=file.path(__file__),
103
+ ),
104
+ contents,
105
+ log=log,
106
+ )
107
+
108
+
109
+ def row_of(
110
+ row: Union[List[str], List[List[str]]],
111
+ header: bool = False,
112
+ ) -> List[str]:
113
+ return (
114
+ ["{}<tr>".format(8 * "")]
115
+ + reduce(
116
+ lambda x, y: x + y,
117
+ [
118
+ [
119
+ "{}<{}>".format(
120
+ 12 * " ",
121
+ "th" if header else "td",
122
+ )
123
+ ]
124
+ + ([item] if isinstance(item, str) else list(item))
125
+ + [
126
+ "</{}>".format(
127
+ "th" if header else "td",
128
+ )
129
+ ]
130
+ for item in row
131
+ ],
132
+ [],
133
+ )
134
+ + ["{}</tr>".format(8 * "")]
135
+ )
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class DYIFeature(Feature):
5
+ nickname = "DYI"
6
+ long_name = "سادگی ساخت "
7
+
8
+ comparison_as_str = {}
@@ -0,0 +1,138 @@
1
+ from typing import List, Any, Union, Tuple, Dict
2
+ from enum import Enum, auto
3
+
4
+ from bluer_ugv.logger import logger
5
+
6
+
7
+ class Feature_Enum(Enum):
8
+ @property
9
+ def as_str(self):
10
+ return self.name
11
+
12
+
13
+ class Feature_Comparison(Feature_Enum):
14
+ SIMILAR = auto()
15
+ HIGHER = auto()
16
+ LOWER = auto()
17
+
18
+ UNKNOWN = auto()
19
+
20
+
21
+ class Feature:
22
+ nickname: str
23
+ long_name: str
24
+
25
+ comparison_as_str: Dict[Feature_Comparison, str] = {
26
+ Feature_Comparison.HIGHER: "بیشتر",
27
+ Feature_Comparison.LOWER: "کمتر",
28
+ Feature_Comparison.SIMILAR: "مشابه",
29
+ }
30
+
31
+ def __init__(
32
+ self,
33
+ score: Any,
34
+ ):
35
+ self.score = score
36
+
37
+ def compare(
38
+ self,
39
+ feature: Union["Feature", None],
40
+ ugv_name: str,
41
+ log: bool = False,
42
+ ) -> Tuple[Feature_Comparison, str]:
43
+ comparison: Feature_Comparison = Feature_Comparison.HIGHER
44
+ if feature is None:
45
+ if isinstance(self.score, bool):
46
+ comparison = (
47
+ Feature_Comparison.HIGHER
48
+ if self.score
49
+ else Feature_Comparison.LOWER
50
+ )
51
+ else:
52
+ comparison = Feature_Comparison.UNKNOWN
53
+ elif feature.score is Ellipsis:
54
+ comparison = Feature_Comparison.UNKNOWN
55
+ elif self.score_index == feature.score_index:
56
+ comparison = Feature_Comparison.SIMILAR
57
+ elif self.score_index < feature.score_index:
58
+ comparison = Feature_Comparison.LOWER
59
+
60
+ if log:
61
+ logger.info(
62
+ "{}: {} ({}) vs. {} ({}): {}".format(
63
+ self.__class__.__name__,
64
+ self.score,
65
+ self.score_index,
66
+ "-" if feature is None else feature.score,
67
+ "-" if feature is None else feature.score_index,
68
+ comparison.name,
69
+ )
70
+ )
71
+
72
+ return comparison, self.describe_status(
73
+ comparison,
74
+ ugv_name,
75
+ )
76
+
77
+ def describe_status(
78
+ self,
79
+ comparison: Feature_Comparison,
80
+ ugv_name: str,
81
+ ) -> str:
82
+ return "{} {}{}{}".format(
83
+ self.long_name,
84
+ self.__class__.comparison_as_str.get(comparison, ""),
85
+ (
86
+ " در {} ".format(ugv_name)
87
+ if comparison != Feature_Comparison.SIMILAR
88
+ else ""
89
+ ),
90
+ (lambda info: f" ({info})" if info else "")(self.score_as_str()),
91
+ )
92
+
93
+ @property
94
+ def description(self) -> str:
95
+ return "{} {}".format(
96
+ self.long_name,
97
+ self.score_as_str(force=True),
98
+ )
99
+
100
+ def score_as_str(
101
+ self,
102
+ force: bool = False,
103
+ ) -> str:
104
+ return (
105
+ self.score.as_str
106
+ if isinstance(self.score, Feature_Enum) and force
107
+ else self.score_as_str_
108
+ )
109
+
110
+ @property
111
+ def score_as_str_(self) -> str:
112
+ return ""
113
+
114
+ @property
115
+ def score_index(self):
116
+ return (
117
+ int(self.score)
118
+ if isinstance(self.score, bool)
119
+ else self.score.value if isinstance(self.score, Enum) else self.score
120
+ )
121
+
122
+
123
+ class FeatureList:
124
+ def __init__(self):
125
+ self.db: List[Feature] = []
126
+
127
+ def add(self, feature: Feature):
128
+ self.db.append(feature)
129
+
130
+ def get(
131
+ self,
132
+ feature_name: str,
133
+ ) -> Union[Feature, None]:
134
+ for feature in self.db:
135
+ if feature_name == feature.nickname:
136
+ return feature
137
+
138
+ return None
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class ConcealmentFeature(Feature):
5
+ nickname = "concealment"
6
+ long_name = "قابلیت استتار و کمین درازمدت"
7
+
8
+ comparison_as_str = {}
@@ -0,0 +1,30 @@
1
+ from enum import Enum
2
+
3
+ from bluer_ugv.README.ugvs.comparison.features.classes import (
4
+ Feature,
5
+ Feature_Enum,
6
+ Feature_Comparison,
7
+ )
8
+
9
+
10
+ class UGV_Control(Feature_Enum):
11
+ AI = 2
12
+ RC = 1
13
+
14
+ @property
15
+ def as_str(self):
16
+ return {
17
+ UGV_Control.AI: "هوش مصنوعی",
18
+ UGV_Control.RC: "رادیویی",
19
+ }[self]
20
+
21
+
22
+ class ControlFeature(Feature):
23
+ nickname = "control"
24
+ long_name = "سامانه‌ی کنترلی"
25
+
26
+ comparison_as_str = {
27
+ Feature_Comparison.HIGHER: "هوش مصنوعی",
28
+ Feature_Comparison.LOWER: "رادیویی",
29
+ Feature_Comparison.SIMILAR: "مشابه",
30
+ }
@@ -0,0 +1,30 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import (
2
+ Feature,
3
+ Feature_Comparison,
4
+ Feature_Enum,
5
+ )
6
+
7
+
8
+ class UGV_Cost(Feature_Enum):
9
+ LOW = 100 # < 100 mT ~= $100
10
+ MEDIUM = 10 # < 1 MT ~= $10k
11
+ HIGH = 1 #
12
+
13
+ @property
14
+ def as_str(self):
15
+ return {
16
+ UGV_Cost.LOW: "کم",
17
+ UGV_Cost.MEDIUM: "متوسط",
18
+ UGV_Cost.HIGH: "زیاد",
19
+ }[self]
20
+
21
+
22
+ class CostFeature(Feature):
23
+ nickname = "cost"
24
+ long_name = "هزینه"
25
+
26
+ comparison_as_str = {
27
+ Feature_Comparison.HIGHER: "پایین‌تر",
28
+ Feature_Comparison.LOWER: "بالاتر",
29
+ Feature_Comparison.SIMILAR: "مشابه",
30
+ }
@@ -0,0 +1,36 @@
1
+ from typing import Dict, Type, List
2
+
3
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
4
+ from bluer_ugv.README.ugvs.comparison.features.concealment import ConcealmentFeature
5
+ from bluer_ugv.README.ugvs.comparison.features.control import ControlFeature
6
+ from bluer_ugv.README.ugvs.comparison.features.cost import CostFeature
7
+ from bluer_ugv.README.ugvs.comparison.features.DYI import DYIFeature
8
+ from bluer_ugv.README.ugvs.comparison.features.payload import PayloadFeature
9
+ from bluer_ugv.README.ugvs.comparison.features.ps import PSFeature
10
+ from bluer_ugv.README.ugvs.comparison.features.range import RangeFeature
11
+ from bluer_ugv.README.ugvs.comparison.features.sanction_proof import (
12
+ SanctionProofFeature,
13
+ )
14
+ from bluer_ugv.README.ugvs.comparison.features.size import SizeFeature
15
+ from bluer_ugv.README.ugvs.comparison.features.speed import SpeedFeature
16
+ from bluer_ugv.README.ugvs.comparison.features.swarm import SwarmFeature
17
+ from bluer_ugv.README.ugvs.comparison.features.uv_delivery import UVDeliveryFeature
18
+
19
+ list_of_feature_classes: List[Type[Feature]] = [
20
+ ConcealmentFeature,
21
+ ControlFeature,
22
+ CostFeature,
23
+ DYIFeature,
24
+ PayloadFeature,
25
+ PSFeature,
26
+ RangeFeature,
27
+ SanctionProofFeature,
28
+ SizeFeature,
29
+ SpeedFeature,
30
+ SwarmFeature,
31
+ UVDeliveryFeature,
32
+ ]
33
+
34
+ dict_of_feature_classes: Dict[str, Type[Feature]] = {
35
+ feature_class.nickname: feature_class for feature_class in list_of_feature_classes
36
+ }
@@ -0,0 +1,21 @@
1
+ from typing import Any
2
+
3
+ from bluer_ugv.README.ugvs.comparison.features.classes import (
4
+ Feature,
5
+ Feature_Comparison,
6
+ )
7
+
8
+
9
+ class PayloadFeature(Feature):
10
+ nickname = "payload"
11
+ long_name = "توان حمل بار"
12
+
13
+ comparison_as_str = {
14
+ Feature_Comparison.HIGHER: "بیشتر",
15
+ Feature_Comparison.LOWER: "کمتر",
16
+ Feature_Comparison.SIMILAR: "مشابه",
17
+ }
18
+
19
+ @property
20
+ def score_as_str_(self) -> str:
21
+ return f"{self.score} کیلوگرم"
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class PSFeature(Feature):
5
+ nickname = "ps"
6
+ long_name = "سامانه‌ی مکان‌یابی محلی"
7
+
8
+ comparison_as_str = {}
@@ -0,0 +1,14 @@
1
+ from typing import Any
2
+
3
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
4
+
5
+ unlimited_range: int = 999
6
+
7
+
8
+ class RangeFeature(Feature):
9
+ nickname = "range"
10
+ long_name = "شعاع عملکرد عملیاتی"
11
+
12
+ @property
13
+ def score_as_str_(self) -> str:
14
+ return f"{self.score} کیلومتر" if self.score != unlimited_range else "نامحدود"
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class SanctionProofFeature(Feature):
5
+ nickname = "sanction_proof"
6
+ long_name = "تحریم گریزی"
7
+
8
+ comparison_as_str = {}
@@ -0,0 +1,32 @@
1
+ from enum import Enum
2
+
3
+ from bluer_ugv.README.ugvs.comparison.features.classes import (
4
+ Feature,
5
+ Feature_Comparison,
6
+ Feature_Enum,
7
+ )
8
+
9
+
10
+ class UGV_Size(Feature_Enum):
11
+ SMALL = 100 # < 5 kg
12
+ MEDIUM = 10 # < 50 kg
13
+ LARGE = 1
14
+
15
+ @property
16
+ def as_str(self):
17
+ return {
18
+ UGV_Size.SMALL: "کوچک",
19
+ UGV_Size.MEDIUM: "متوسط",
20
+ UGV_Size.LARGE: "بزرگ",
21
+ }[self]
22
+
23
+
24
+ class SizeFeature(Feature):
25
+ nickname = "size"
26
+ long_name = "اندازه"
27
+
28
+ comparison_as_str = {
29
+ Feature_Comparison.HIGHER: "کوچکتر",
30
+ Feature_Comparison.LOWER: "بزرگتر",
31
+ Feature_Comparison.SIMILAR: "مشابه",
32
+ }
@@ -0,0 +1,10 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class SpeedFeature(Feature):
5
+ nickname = "speed"
6
+ long_name = "سرعت"
7
+
8
+ @property
9
+ def score_as_str_(self) -> str:
10
+ return f"{self.score} کیلومتر بر ساعت"
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class SwarmFeature(Feature):
5
+ nickname = "swarm"
6
+ long_name = "فعالیت گروهی "
7
+
8
+ comparison_as_str = {}
@@ -0,0 +1,8 @@
1
+ from bluer_ugv.README.ugvs.comparison.features.classes import Feature
2
+
3
+
4
+ class UVDeliveryFeature(Feature):
5
+ nickname = "uv_delivery"
6
+ long_name = "حمل پهپاد و رهپاد"
7
+
8
+ comparison_as_str = {}