bluer-ugv 7.713.1__tar.gz → 7.780.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 (251) hide show
  1. {bluer_ugv-7.713.1/bluer_ugv.egg-info → bluer_ugv-7.780.1}/PKG-INFO +3 -3
  2. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/README.md +2 -2
  3. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/help.sh +3 -1
  4. bluer_ugv-7.780.1/bluer_ugv/.abcli/tests/ugv_get.sh +20 -0
  5. bluer_ugv-7.780.1/bluer_ugv/.abcli/ugv/get.sh +9 -0
  6. bluer_ugv-7.780.1/bluer_ugv/.abcli/ugv/ssh.sh +21 -0
  7. bluer_ugv-7.780.1/bluer_ugv/.abcli/ugv/watch.sh +21 -0
  8. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/arzhang/consts.py +5 -0
  9. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/build.py +2 -26
  10. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/box.py +1 -0
  11. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/shield/docs.py +2 -1
  12. bluer_ugv-7.780.1/bluer_ugv/README/computer/shield/parts.py +22 -0
  13. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/testing.py +2 -0
  14. bluer_ugv-7.780.1/bluer_ugv/README/docs.py +31 -0
  15. bluer_ugv-7.713.1/bluer_ugv/README/ravin/__init__.py → bluer_ugv-7.780.1/bluer_ugv/README/ravin/docs.py +4 -3
  16. bluer_ugv-7.780.1/bluer_ugv/README/ugvs/__main__.py +47 -0
  17. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/db.py +55 -1
  18. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/docs.py +47 -3
  19. bluer_ugv-7.780.1/bluer_ugv/README/ugvs/get.py +23 -0
  20. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/__init__.py +1 -1
  21. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/designs/rangin/parts.py +9 -7
  22. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/designs/ravin/ravin3/parts.py +1 -1
  23. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/functions.py +6 -0
  24. bluer_ugv-7.780.1/bluer_ugv/help/get.py +24 -0
  25. bluer_ugv-7.780.1/bluer_ugv/help/ssh.py +19 -0
  26. bluer_ugv-7.780.1/bluer_ugv/help/watch.py +19 -0
  27. bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical/keyboard/__init__.py +0 -0
  28. bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical/screen/__init__.py +0 -0
  29. bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical/screen/video/__init__.py +0 -0
  30. bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical/setpoint/__init__.py +0 -0
  31. bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py +0 -0
  32. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1/bluer_ugv.egg-info}/PKG-INFO +3 -3
  33. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv.egg-info/SOURCES.txt +16 -0
  34. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/LICENSE +0 -0
  35. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/MANIFEST.in +0 -0
  36. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/abcli.sh +0 -0
  37. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/actions.sh +0 -0
  38. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/aka.sh +0 -0
  39. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/alias.sh +0 -0
  40. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
  41. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
  42. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
  43. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
  44. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
  45. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
  46. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/dataset.sh +0 -0
  47. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
  48. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
  49. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
  50. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/env/set.sh +0 -0
  51. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
  52. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/git/rm_keys.sh +0 -0
  53. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/git.sh +0 -0
  54. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/keyboard/test.sh +0 -0
  55. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/keyboard.sh +0 -0
  56. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
  57. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
  58. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
  59. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
  60. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
  61. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/play.sh +0 -0
  62. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/playlist/cat.sh +0 -0
  63. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/playlist/download.sh +0 -0
  64. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/playlist/edit.sh +0 -0
  65. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/playlist/upload.sh +0 -0
  66. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video/playlist.sh +0 -0
  67. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow/video.sh +0 -0
  68. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/swallow.sh +0 -0
  69. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
  70. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
  71. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
  72. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
  73. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
  74. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
  75. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
  76. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_video_play.sh +0 -0
  77. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/swallow_video_playlist.sh +0 -0
  78. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
  79. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
  80. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
  81. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/__init__.py +0 -0
  82. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/alias.py +0 -0
  83. {bluer_ugv-7.713.1/bluer_ugv/README/computer → bluer_ugv-7.780.1/bluer_ugv/README/arzhang}/__init__.py +0 -0
  84. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/arzhang/algo.py +0 -0
  85. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/arzhang/design.py +0 -0
  86. /bluer_ugv-7.713.1/bluer_ugv/README/arzhang/__init__.py → /bluer_ugv-7.780.1/bluer_ugv/README/arzhang/docs.py +0 -0
  87. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/arzhang/flag.py +0 -0
  88. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/arzhang/items.py +0 -0
  89. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/beast.py +0 -0
  90. {bluer_ugv-7.713.1/bluer_ugv/README/computer/shield → bluer_ugv-7.780.1/bluer_ugv/README/computer}/__init__.py +0 -0
  91. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/docs.py +0 -0
  92. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/power.py +0 -0
  93. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/schematics.py +0 -0
  94. {bluer_ugv-7.713.1/bluer_ugv/README/ugvs → bluer_ugv-7.780.1/bluer_ugv/README/computer/shield}/__init__.py +0 -0
  95. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/shield/testing.py +0 -0
  96. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/shield/v1.py +0 -0
  97. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/computer/shield/v2.py +0 -0
  98. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/consts.py +0 -0
  99. {bluer_ugv-7.713.1/bluer_ugv/README/ugvs/comparison → bluer_ugv-7.780.1/bluer_ugv/README/eagle}/__init__.py +0 -0
  100. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/eagle/consts.py +0 -0
  101. /bluer_ugv-7.713.1/bluer_ugv/README/eagle/__init__.py → /bluer_ugv-7.780.1/bluer_ugv/README/eagle/docs.py +0 -0
  102. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/eagle/items.py +0 -0
  103. {bluer_ugv-7.713.1/bluer_ugv/README/ugvs/comparison/features → bluer_ugv-7.780.1/bluer_ugv/README/fire}/__init__.py +0 -0
  104. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/fire/consts.py +0 -0
  105. /bluer_ugv-7.713.1/bluer_ugv/README/fire/__init__.py → /bluer_ugv-7.780.1/bluer_ugv/README/fire/docs.py +0 -0
  106. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/fire/items.py +0 -0
  107. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/items.py +0 -0
  108. {bluer_ugv-7.713.1/bluer_ugv/README/ugvs/comparison/ugvs → bluer_ugv-7.780.1/bluer_ugv/README/rangin}/__init__.py +0 -0
  109. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/consts.py +0 -0
  110. /bluer_ugv-7.713.1/bluer_ugv/README/rangin/__init__.py → /bluer_ugv-7.780.1/bluer_ugv/README/rangin/docs.py +0 -0
  111. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/items.py +0 -0
  112. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/mechanical.py +0 -0
  113. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/parts.py +0 -0
  114. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/power.py +0 -0
  115. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/root.py +0 -0
  116. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/schematics.py +0 -0
  117. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/specs.py +0 -0
  118. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/rangin/terraform.py +0 -0
  119. {bluer_ugv-7.713.1/bluer_ugv/designs → bluer_ugv-7.780.1/bluer_ugv/README/ravin}/__init__.py +0 -0
  120. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ravin/consts.py +0 -0
  121. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ravin/items.py +0 -0
  122. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/releases.py +0 -0
  123. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/root.py +0 -0
  124. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/shortcuts.py +0 -0
  125. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/__init__.py +0 -0
  126. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/analog.py +0 -0
  127. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/consts.py +0 -0
  128. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
  129. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
  130. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/algo/driving.py +0 -0
  131. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
  132. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/algo/tracking.py +0 -0
  133. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
  134. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/design/__init__.py +0 -0
  135. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
  136. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/design/parts.py +0 -0
  137. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
  138. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/swallow/items.py +0 -0
  139. {bluer_ugv-7.713.1/bluer_ugv/designs/eagle → bluer_ugv-7.780.1/bluer_ugv/README/ugvs}/__init__.py +0 -0
  140. {bluer_ugv-7.713.1/bluer_ugv/designs/fire → bluer_ugv-7.780.1/bluer_ugv/README/ugvs/comparison}/__init__.py +0 -0
  141. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/build.py +0 -0
  142. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/DYI.py +0 -0
  143. {bluer_ugv-7.713.1/bluer_ugv/designs/rangin → bluer_ugv-7.780.1/bluer_ugv/README/ugvs/comparison/features}/__init__.py +0 -0
  144. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/classes.py +0 -0
  145. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/concealment.py +0 -0
  146. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/control.py +0 -0
  147. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/cost.py +0 -0
  148. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/db.py +0 -0
  149. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/payload.py +0 -0
  150. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/ps.py +0 -0
  151. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/range.py +0 -0
  152. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +0 -0
  153. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/size.py +0 -0
  154. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/speed.py +0 -0
  155. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/swarm.py +0 -0
  156. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +0 -0
  157. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/references/__init__.py +0 -0
  158. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/references/classes.py +0 -0
  159. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/references/db.py +0 -0
  160. {bluer_ugv-7.713.1/bluer_ugv/designs/ravin → bluer_ugv-7.780.1/bluer_ugv/README/ugvs/comparison/ugvs}/__init__.py +0 -0
  161. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/ugvs/classes.py +0 -0
  162. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/README/ugvs/comparison/ugvs/db.py +0 -0
  163. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/__main__.py +0 -0
  164. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/assets/comparison.html +0 -0
  165. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/config.env +0 -0
  166. {bluer_ugv-7.713.1/bluer_ugv/designs/ravin/ravin3 → bluer_ugv-7.780.1/bluer_ugv/designs}/__init__.py +0 -0
  167. {bluer_ugv-7.713.1/bluer_ugv/designs/ravin/ravin4 → bluer_ugv-7.780.1/bluer_ugv/designs/eagle}/__init__.py +0 -0
  168. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/designs/eagle/parts.py +0 -0
  169. {bluer_ugv-7.713.1/bluer_ugv/help/swallow/video → bluer_ugv-7.780.1/bluer_ugv/designs/fire}/__init__.py +0 -0
  170. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/designs/fire/parts.py +0 -0
  171. {bluer_ugv-7.713.1/bluer_ugv/swallow → bluer_ugv-7.780.1/bluer_ugv/designs/rangin}/__init__.py +0 -0
  172. {bluer_ugv-7.713.1/bluer_ugv/swallow/dataset → bluer_ugv-7.780.1/bluer_ugv/designs/ravin}/__init__.py +0 -0
  173. {bluer_ugv-7.713.1/bluer_ugv/swallow/session → bluer_ugv-7.780.1/bluer_ugv/designs/ravin/ravin3}/__init__.py +0 -0
  174. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical → bluer_ugv-7.780.1/bluer_ugv/designs/ravin/ravin4}/__init__.py +0 -0
  175. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
  176. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/env.py +0 -0
  177. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/__init__.py +0 -0
  178. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/__main__.py +0 -0
  179. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/git.py +0 -0
  180. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/__init__.py +0 -0
  181. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/dataset.py +0 -0
  182. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/debug.py +0 -0
  183. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/env.py +0 -0
  184. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/git.py +0 -0
  185. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/keyboard.py +0 -0
  186. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/select_target.py +0 -0
  187. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
  188. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical/keyboard → bluer_ugv-7.780.1/bluer_ugv/help/swallow/video}/__init__.py +0 -0
  189. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/video/functions.py +0 -0
  190. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/help/swallow/video/playlist.py +0 -0
  191. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/host.py +0 -0
  192. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/logger.py +0 -0
  193. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/sample.env +0 -0
  194. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical/screen → bluer_ugv-7.780.1/bluer_ugv/swallow}/__init__.py +0 -0
  195. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/__main__.py +0 -0
  196. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical/screen/video → bluer_ugv-7.780.1/bluer_ugv/swallow/dataset}/__init__.py +0 -0
  197. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
  198. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
  199. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/debug.py +0 -0
  200. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical/setpoint → bluer_ugv-7.780.1/bluer_ugv/swallow/session}/__init__.py +0 -0
  201. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/__main__.py +0 -0
  202. {bluer_ugv-7.713.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor → bluer_ugv-7.780.1/bluer_ugv/swallow/session/classical}/__init__.py +0 -0
  203. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
  204. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/generic.py +0 -0
  205. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +0 -0
  206. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +0 -0
  207. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/void.py +0 -0
  208. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +0 -0
  209. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/keyboard/__main__.py +0 -0
  210. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/keyboard/classes.py +0 -0
  211. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/keyboard/keys.py +0 -0
  212. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/keyboard/testing.py +0 -0
  213. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
  214. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
  215. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
  216. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
  217. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
  218. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
  219. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
  220. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
  221. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
  222. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/position.py +0 -0
  223. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
  224. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/screen/classes.py +0 -0
  225. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/screen/video/__main__.py +0 -0
  226. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/screen/video/engine.py +0 -0
  227. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/screen/video/player.py +0 -0
  228. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/screen/video/playlist.py +0 -0
  229. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/session.py +0 -0
  230. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
  231. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
  232. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
  233. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +0 -0
  234. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
  235. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
  236. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection_list.py +0 -0
  237. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +0 -0
  238. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +0 -0
  239. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
  240. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
  241. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +0 -0
  242. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/session/functions.py +0 -0
  243. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/swallow/targeting.py +0 -0
  244. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv/urls.py +0 -0
  245. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
  246. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv.egg-info/requires.txt +0 -0
  247. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/bluer_ugv.egg-info/top_level.txt +0 -0
  248. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/pyproject.toml +0 -0
  249. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/requirements.txt +0 -0
  250. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/setup.cfg +0 -0
  251. {bluer_ugv-7.713.1 → bluer_ugv-7.780.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.713.1
3
+ Version: 7.780.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
  | --- | --- |
51
- | [`computer`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/computer) [![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/computer) | [`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
+ | [`computer`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/computer) [![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/computer) | [`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) |
52
52
  | [`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) |
53
53
 
54
54
  ## aliases
@@ -66,7 +66,7 @@ pip install bluer_ugv
66
66
 
67
67
  [![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)
68
68
 
69
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.713.1`](https://github.com/kamangir/bluer-ugv).
69
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.780.1`](https://github.com/kamangir/bluer-ugv).
70
70
 
71
71
 
72
72
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -18,7 +18,7 @@ pip install bluer_ugv
18
18
 
19
19
  | | |
20
20
  | --- | --- |
21
- | [`computer`](./bluer_ugv/docs/swallow/digital/design/computer) [![image](https://github.com/kamangir/bluer-designs//blob/main/swallow/electrical/digital.png?raw=true)](./bluer_ugv/docs/swallow/digital/design/computer) | [`UGVs`](./bluer_ugv/docs/UGVs) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250912_211652.jpg?raw=true)](./bluer_ugv/docs/UGVs) |
21
+ | [`computer`](./bluer_ugv/docs/swallow/digital/design/computer) [![image](https://github.com/kamangir/bluer-designs/blob/main/swallow/electrical/digital.png?raw=true)](./bluer_ugv/docs/swallow/digital/design/computer) | [`UGVs`](./bluer_ugv/docs/UGVs) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250912_211652.jpg?raw=true)](./bluer_ugv/docs/UGVs) |
22
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
@@ -36,5 +36,5 @@ pip install bluer_ugv
36
36
 
37
37
  [![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)
38
38
 
39
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.713.1`](https://github.com/kamangir/bluer-ugv).
39
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.780.1`](https://github.com/kamangir/bluer-ugv).
40
40
 
@@ -41,8 +41,10 @@ function test_bluer_ugv_help() {
41
41
  "@swallow video playlist upload" \
42
42
  \
43
43
  "@ugv" \
44
- \
44
+ "@ugv get" \
45
45
  "@ugv git" \
46
+ "@ugv ssh" \
47
+ "@ugv watch" \
46
48
  \
47
49
  "@ugv pypi" \
48
50
  "@ugv pypi browse" \
@@ -0,0 +1,20 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function test_bluer_ugv_get() {
4
+ bluer_ai_assert $(bluer_ugv_get) not-found
5
+ [[ $? -ne 0 ]] && return 1
6
+
7
+ bluer_ai_hr
8
+
9
+ bluer_ai_assert $(bluer_ugv_get arzhang) not-found
10
+ [[ $? -ne 0 ]] && return 1
11
+
12
+ bluer_ai_hr
13
+
14
+ bluer_ai_assert $(bluer_ugv_get arzhang computer.front) not-found
15
+ [[ $? -ne 0 ]] && return 1
16
+
17
+ bluer_ai_hr
18
+
19
+ bluer_ai_assert $(bluer_ugv_get swallow computers.front) swallow2
20
+ }
@@ -0,0 +1,9 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_get() {
4
+ python3 -m bluer_ugv.README.ugvs \
5
+ get \
6
+ --ugv_name "$1" \
7
+ --what "$2" \
8
+ "${@:3}"
9
+ }
@@ -0,0 +1,21 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_ssh() {
4
+ local ugv_name=$1
5
+ if [[ -z "$ugv_name" ]]; then
6
+ bluer_ai_log_error "ugv name not found."
7
+ return 1
8
+ fi
9
+
10
+ local node=${2:-front}
11
+
12
+ local computer_name=$(bluer_ugv_get "$ugv_name" computers.$node)
13
+ if [[ "$computer_name" == "not-found" ]]; then
14
+ bluer_ai_log_error "$ugv_name.$node not found."
15
+ return 1
16
+ fi
17
+
18
+ bluer_ai_log "ssh $ugv_name.$node ($computer_name)..."
19
+
20
+ bluer_ai_ssh rpi $computer_name
21
+ }
@@ -0,0 +1,21 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_watch() {
4
+ local ugv_name=$1
5
+ if [[ -z "$ugv_name" ]]; then
6
+ bluer_ai_log_error "ugv name not found."
7
+ return 1
8
+ fi
9
+
10
+ local node=${2:-front}
11
+
12
+ local computer_name=$(bluer_ugv_get "$ugv_name" computers.$node)
13
+ if [[ "$computer_name" == "not-found" ]]; then
14
+ bluer_ai_log_error "$ugv_name.$node not found."
15
+ return 1
16
+ fi
17
+
18
+ bluer_ai_log "ssh $ugv_name.$node ($computer_name)..."
19
+
20
+ bluer_ai_log watch rpi $computer_name
21
+ }
@@ -9,4 +9,9 @@ arzhang_assets2 = assets_url(
9
9
  volume=2,
10
10
  )
11
11
 
12
+ arzhang2_assets2 = assets_url(
13
+ suffix="arzhang2",
14
+ volume=2,
15
+ )
16
+
12
17
  arzhang_mechanical_design = designs_url("arzhang")
@@ -5,21 +5,8 @@ from bluer_objects import file, README
5
5
 
6
6
  from bluer_ugv import NAME, VERSION, ICON, REPO_NAME
7
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
- arzhang,
16
- rangin,
17
- releases,
18
- swallow,
19
- )
20
- from bluer_ugv.README.computer import docs as computer
21
- from bluer_ugv.README.ugvs import docs as ugvs
22
8
  from bluer_ugv.README.ugvs.comparison.build import build as build_comparison
9
+ from bluer_ugv.README.docs import docs
23
10
 
24
11
 
25
12
  def build() -> bool:
@@ -40,18 +27,7 @@ def build() -> bool:
40
27
  ),
41
28
  macros=readme.get("macros", {}),
42
29
  )
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
- + computer.docs
53
- + ugvs.docs
54
- + swallow.docs
30
+ for readme in docs
55
31
  )
56
32
  and build_comparison()
57
33
  )
@@ -14,6 +14,7 @@ items = ImageItems(
14
14
  f"{swallow_assets2}/20251008_133418.jpg": "",
15
15
  f"{swallow_assets2}/20251008_124129.jpg": "",
16
16
  f"{swallow_assets2}/20251008_124932.jpg": "",
17
+ f"{swallow_assets2}/20260113_172208.jpg": "",
17
18
  }
18
19
  )
19
20
 
@@ -1,7 +1,7 @@
1
1
  from bluer_objects.README.items import ImageItems
2
2
 
3
3
  from bluer_ugv.README.swallow.consts import swallow_assets2, swallow_designs
4
- from bluer_ugv.README.computer.shield import testing, v1, v2
4
+ from bluer_ugv.README.computer.shield import parts, testing, v1, v2
5
5
 
6
6
  items = ImageItems(
7
7
  {
@@ -24,6 +24,7 @@ docs = (
24
24
  "items": items,
25
25
  },
26
26
  ]
27
+ + parts.docs
27
28
  + testing.docs
28
29
  + v1.docs
29
30
  + v2.docs
@@ -0,0 +1,22 @@
1
+ from bluer_sbc.README.design import design_doc_parts
2
+
3
+ parts = {
4
+ "470-mF": "",
5
+ "green-terminal": "2 x",
6
+ "LED": "green + red + yellow + 4 x blue",
7
+ "pin-headers": "1 x (female, 2 x 40) -> 2 x 20 + 2 x (male, 1 x 40) -> 4 x 1 + 2 x 20 + 1 x (male, 2 x 40) -> 2 x 2 x 6",
8
+ "Polyfuse": "optional",
9
+ "pushbutton": "",
10
+ "resistor": "7 x 330-470 Ω + 4 x 2.2 kΩ + 4 x 3.3 kΩ",
11
+ "TVS-diode": "",
12
+ }
13
+
14
+ docs = [
15
+ {
16
+ "path": "../docs/swallow/digital/design/computer/shield/parts.md",
17
+ "macros": design_doc_parts(
18
+ dict_of_parts=parts,
19
+ parts_reference="https://github.com/kamangir/bluer-sbc/tree/main/bluer_sbc/docs/parts",
20
+ ),
21
+ }
22
+ ]
@@ -9,6 +9,8 @@ items = ImageItems(
9
9
  f"{swallow_assets2}/20251116_151611.jpg": "",
10
10
  f"{swallow_assets2}/20251116_152801.jpg": "",
11
11
  f"{swallow_assets2}/20251116_152832_1.gif": "",
12
+ f"{swallow_assets2}/2026-01-25-12-21.jpg": "",
13
+ f"{swallow_assets2}/2026-01-25-12-16.jpg": "",
12
14
  }
13
15
  )
14
16
 
@@ -0,0 +1,31 @@
1
+ from bluer_ugv.README.arzhang import docs as arzhang_docs
2
+ from bluer_ugv.README.eagle import docs as eagle_docs
3
+ from bluer_ugv.README.fire import docs as fire_docs
4
+ from bluer_ugv.README.rangin import docs as rangin_docs
5
+ from bluer_ugv.README.ravin import docs as ravin_docs
6
+ from bluer_ugv.README import (
7
+ alias,
8
+ beast,
9
+ root,
10
+ releases,
11
+ swallow,
12
+ )
13
+ from bluer_ugv.README.computer import docs as computer
14
+ from bluer_ugv.README.ugvs import docs as ugvs
15
+ from bluer_ugv.README.validations import docs as validations
16
+
17
+ docs = (
18
+ root.docs
19
+ + alias.docs
20
+ + arzhang_docs.docs
21
+ + beast.docs
22
+ + eagle_docs.docs
23
+ + fire_docs.docs
24
+ + rangin_docs.docs
25
+ + ravin_docs.docs
26
+ + releases.docs
27
+ + computer.docs
28
+ + ugvs.docs
29
+ + swallow.docs
30
+ + validations.docs
31
+ )
@@ -1,5 +1,6 @@
1
- from bluer_ugv.README.ravin import ravin3, ravin4
1
+ from bluer_ugv.README.ravin.ravin3 import docs
2
2
  from bluer_ugv.README.ravin.items import items
3
+ from bluer_ugv.README.ravin.ravin4 import docs
3
4
 
4
5
  docs = (
5
6
  [
@@ -8,6 +9,6 @@ docs = (
8
9
  "path": "../docs/ravin",
9
10
  },
10
11
  ]
11
- + ravin3.docs
12
- + ravin4.docs
12
+ + docs.docs
13
+ + docs.docs
13
14
  )
@@ -0,0 +1,47 @@
1
+ import argparse
2
+
3
+ from blueness import module
4
+ from blueness.argparse.generic import sys_exit
5
+
6
+ from bluer_ugv import NAME
7
+ from bluer_ugv.README.ugvs.get import get
8
+ from bluer_ugv.logger import logger
9
+
10
+ NAME = module.name(__file__, NAME)
11
+
12
+ parser = argparse.ArgumentParser(NAME)
13
+ parser.add_argument(
14
+ "task",
15
+ type=str,
16
+ help="get",
17
+ )
18
+ parser.add_argument(
19
+ "--ugv_name",
20
+ type=str,
21
+ )
22
+ parser.add_argument(
23
+ "--what",
24
+ type=str,
25
+ )
26
+ parser.add_argument(
27
+ "--include_comments",
28
+ type=int,
29
+ default=0,
30
+ help="0 | 1",
31
+ )
32
+ args = parser.parse_args()
33
+
34
+ success = False
35
+ if args.task == "get":
36
+ success = True
37
+ print(
38
+ get(
39
+ ugv_name=args.ugv_name,
40
+ what=args.what,
41
+ include_comments=args.include_comments == 1,
42
+ )
43
+ )
44
+ else:
45
+ success = None
46
+
47
+ sys_exit(logger, NAME, args.task, success)
@@ -1,6 +1,10 @@
1
1
  from bluer_ugv.README.consts import assets_url
2
2
  from bluer_ugv.README.swallow.consts import swallow_assets2
3
- from bluer_ugv.README.arzhang.consts import arzhang_assets, arzhang_assets2
3
+ from bluer_ugv.README.arzhang.consts import (
4
+ arzhang_assets,
5
+ arzhang_assets2,
6
+ arzhang2_assets2,
7
+ )
4
8
  from bluer_ugv.README.rangin.consts import rangin_assets2, rangin_mechanical_design
5
9
 
6
10
  dict_of_ugvs = {
@@ -12,18 +16,39 @@ dict_of_ugvs = {
12
16
  f"{swallow_assets2}/20250913_203635~2_1.gif",
13
17
  f"{swallow_assets2}/20251216_205015.jpg",
14
18
  ],
19
+ "tagline": "the first one.",
20
+ "class": "swallow",
21
+ "computers": {
22
+ "front": "swallow2 (`swallow` was used for Ubuntu experiments)",
23
+ },
15
24
  },
16
25
  "arzhang": {
17
26
  "order": 2,
18
27
  "items": [
19
28
  f"{arzhang_assets2}/20251209_111322.jpg",
20
29
  ],
30
+ "tagline": "the first [arzhang](../arzhang).",
31
+ "class": "arzhang",
32
+ "computers": {
33
+ "front": "sparrow",
34
+ },
35
+ "comments": [
36
+ "disassembled 🛑",
37
+ ],
21
38
  },
22
39
  "arzhang2": {
23
40
  "order": 3,
24
41
  "items": [
25
42
  f"{arzhang_assets2}/20251210_154513.jpg",
43
+ f"{arzhang2_assets2}/20260108_175635.jpg",
44
+ f"{arzhang2_assets2}/20260109_133216.jpg",
26
45
  ],
46
+ "tagline": "an [arzhang](../arzhang) with updated body design.",
47
+ "class": "arzhang",
48
+ "computers": {
49
+ "front": "sparrow2",
50
+ "back": "sparrow3-back",
51
+ },
27
52
  },
28
53
  "arzhang3": {
29
54
  "order": 4,
@@ -41,6 +66,15 @@ dict_of_ugvs = {
41
66
  f"{arzhang_assets2}/20251210_154654.jpg",
42
67
  ]
43
68
  ),
69
+ "tagline": "the first [arzhang](../arzhang) with two computers.",
70
+ "class": "arzhang",
71
+ "computers": {
72
+ "front": "arzhang3-front",
73
+ "back": "sparrow3-back",
74
+ },
75
+ "comments": [
76
+ "-> [rangin](./rangin.md) 🛑",
77
+ ],
44
78
  },
45
79
  "rangin": {
46
80
  "order": 5,
@@ -68,6 +102,18 @@ dict_of_ugvs = {
68
102
  f"{rangin_assets2}/20251231_111815.jpg",
69
103
  f"{rangin_assets2}/20251231_111923.jpg",
70
104
  f"{rangin_assets2}/20251231_112447.jpg",
105
+ f"{rangin_assets2}/2026-01-26-d1.jpg",
106
+ f"{rangin_assets2}/2026-01-26-d2.jpg",
107
+ f"{rangin_assets2}/2026-01-26-d3.jpg",
108
+ ],
109
+ "tagline": "an ad robot.",
110
+ "class": "rangin",
111
+ "computers": {
112
+ "front": "arzhang3-front",
113
+ "top": "rangin-top2",
114
+ },
115
+ "comments": [
116
+ "built on [arzhang3](./arzhang3.md).",
71
117
  ],
72
118
  },
73
119
  "arzhang4": {
@@ -78,5 +124,13 @@ dict_of_ugvs = {
78
124
  volume=2,
79
125
  ),
80
126
  ],
127
+ "tagline": "the first [arzhang](../arzhang) with [external motors](https://github.com/kamangir/bluer-sbc/blob/main/bluer_sbc/docs/parts/DC-gearboxed-motor-12V-120RPM.md).",
128
+ "class": [
129
+ "arzhang",
130
+ "with external motors.",
131
+ ],
132
+ "comments": [
133
+ "build is ongoing. 🔥",
134
+ ],
81
135
  },
82
136
  }
@@ -7,8 +7,52 @@ docs = [
7
7
  {
8
8
  "path": f"../docs/UGVs/{ugv_name}.md",
9
9
  "cols": info.get("cols", 3),
10
- "items": ImageItems({item: "" for item in info.get("items", [])}),
10
+ "items": ImageItems(
11
+ {
12
+ item: ""
13
+ for item in info.get(
14
+ "items",
15
+ [],
16
+ )
17
+ }
18
+ ),
11
19
  "macros": {
20
+ "class:::": "[{class_name}](../{class_name}){info}".format(
21
+ class_name=(
22
+ info["class"][0]
23
+ if isinstance(info["class"], list)
24
+ else info["class"]
25
+ ),
26
+ info=(
27
+ " ".join([""] + info["class"][1:])
28
+ if isinstance(info["class"], list)
29
+ else ""
30
+ ),
31
+ ),
32
+ "computers:::": (
33
+ (
34
+ [
35
+ "- computer(s):",
36
+ ]
37
+ + [
38
+ " - {}: `{}`".format(
39
+ location,
40
+ computer_name,
41
+ )
42
+ for location, computer_name in info["computers"].items()
43
+ ]
44
+ )
45
+ if "computers" in info
46
+ else []
47
+ ),
48
+ "comments:::": [
49
+ f"- {comment}"
50
+ for comment in info.get(
51
+ "comments",
52
+ [],
53
+ )
54
+ ],
55
+ "tagline:::": info.get("tagline", ""),
12
56
  "validations:::": [
13
57
  (lambda thing: f"validations: {thing}" if thing else "")(
14
58
  ", ".join(
@@ -24,7 +68,7 @@ docs = [
24
68
  )
25
69
  )
26
70
  ),
27
- ]
71
+ ],
28
72
  },
29
73
  }
30
74
  for ugv_name, info in dict_of_ugvs.items()
@@ -50,7 +94,7 @@ docs = [
50
94
  ]
51
95
  ),
52
96
  "macros": {
53
- "list": [
97
+ "list:::": [
54
98
  f"- [{ugv_name}](./{ugv_name}.md)"
55
99
  for ugv_name in sorted(
56
100
  dict_of_ugvs.keys(),
@@ -0,0 +1,23 @@
1
+ from bluer_ugv.README.ugvs.db import dict_of_ugvs
2
+
3
+
4
+ def get(
5
+ ugv_name: str,
6
+ what: str,
7
+ include_comments: bool = False,
8
+ ) -> str:
9
+ list_of_what = what.split(".")
10
+ info = dict_of_ugvs.get(ugv_name, {})
11
+ for what_ in list_of_what:
12
+ info = info.get(what_, {})
13
+
14
+ if isinstance(info, dict) and not info:
15
+ info = ""
16
+
17
+ if not info:
18
+ info = "not-found"
19
+
20
+ if not include_comments and info:
21
+ info = info.split(" ")[0]
22
+
23
+ return str(info)
@@ -4,7 +4,7 @@ ICON = "🐬"
4
4
 
5
5
  DESCRIPTION = f"{ICON} AI x UGV."
6
6
 
7
- VERSION = "7.713.1"
7
+ VERSION = "7.780.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
@@ -1,13 +1,15 @@
1
1
  dict_of_parts = {
2
- "SLA-Battery": "12 V, 42 Ah, 185 mm x 150 mm x 175 mm",
2
+ "ac-volt-meter": "220 V, 5 A",
3
3
  "dc-circuit-breaker": "40 A",
4
- "TV": "2 x 40 inch",
5
- "power-inverter": "continuous output ≥ 400-500 W, surge output ≥ 800 W",
6
- "power-adapter": "12V DC, 10 A",
7
- "TV-bracket": "2 x",
8
4
  "dsn-vc288": "with 50 A shunt",
5
+ "hdmi-cable": "",
9
6
  "mcb": "2 - 3 A @ 220 V AC",
10
- "ac-volt-meter": "220 V, 5 A",
11
- "safety-fuse": "30 mA trip",
7
+ "micro-hdmi-adapter": "",
8
+ "power-adapter": "12V DC, 10 A",
9
+ "power-inverter": "continuous output ≥ 400-500 W, surge output ≥ 800 W",
12
10
  "relay": "12 V DC, 25 A",
11
+ "safety-fuse": "30 mA trip",
12
+ "SLA-Battery": "12 V, 42 Ah, 185 mm x 150 mm x 175 mm",
13
+ "TV-bracket": "2 x",
14
+ "TV": "2 x 40 inch",
13
15
  }
@@ -6,7 +6,7 @@ dict_of_parts = {
6
6
  "yellow-wheels": "x 2",
7
7
  "L-1x2": "x 4",
8
8
  "shaft-10cm": "",
9
- "M3": "",
9
+ "nuts-bolts-spacers": "M3 x 🔥",
10
10
  "front-connector": "",
11
11
  "front-wheels": "x 2",
12
12
  }
@@ -1,15 +1,21 @@
1
1
  from bluer_ai.help.generic import help_functions as generic_help_functions
2
2
 
3
3
  from bluer_ugv import ALIAS
4
+ from bluer_ugv.help.get import help_get
4
5
  from bluer_ugv.help.git import help_git
6
+ from bluer_ugv.help.ssh import help_ssh
5
7
  from bluer_ugv.help.swallow import help_functions as help_swallow
8
+ from bluer_ugv.help.watch import help_watch
6
9
 
7
10
 
8
11
  help_functions = generic_help_functions(plugin_name=ALIAS)
9
12
 
10
13
  help_functions.update(
11
14
  {
15
+ "get": help_get,
12
16
  "git": help_git,
17
+ "ssh": help_ssh,
13
18
  "swallow": help_swallow,
19
+ "watch": help_watch,
14
20
  }
15
21
  )
@@ -0,0 +1,24 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage
4
+
5
+
6
+ def help_get(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ args = [
11
+ "[--include_comments 1]",
12
+ ]
13
+
14
+ return show_usage(
15
+ [
16
+ "@ugv",
17
+ "get",
18
+ "<ugv-name>",
19
+ "computers.back | computers.front | computers.top | <what>",
20
+ ]
21
+ + args,
22
+ "get ugv info.",
23
+ mono=mono,
24
+ )
@@ -0,0 +1,19 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage
4
+
5
+
6
+ def help_ssh(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ return show_usage(
11
+ [
12
+ "@ugv",
13
+ "ssh",
14
+ "<ugv-name>",
15
+ "[back | front | top | <node>]",
16
+ ],
17
+ "ssh to <ugv-name>.<node>",
18
+ mono=mono,
19
+ )