bluer-ugv 7.713.1__py3-none-any.whl → 7.771.1__py3-none-any.whl

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.

Potentially problematic release.


This version of bluer-ugv might be problematic. Click here for more details.

Files changed (36) hide show
  1. bluer_ugv/.abcli/tests/help.sh +3 -1
  2. bluer_ugv/.abcli/tests/ugv_get.sh +20 -0
  3. bluer_ugv/.abcli/ugv/get.sh +9 -0
  4. bluer_ugv/.abcli/ugv/ssh.sh +21 -0
  5. bluer_ugv/.abcli/ugv/watch.sh +21 -0
  6. bluer_ugv/README/arzhang/__init__.py +0 -16
  7. bluer_ugv/README/arzhang/consts.py +5 -0
  8. bluer_ugv/README/arzhang/docs.py +16 -0
  9. bluer_ugv/README/build.py +2 -26
  10. bluer_ugv/README/computer/box.py +1 -0
  11. bluer_ugv/README/computer/shield/docs.py +2 -1
  12. bluer_ugv/README/computer/shield/parts.py +22 -0
  13. bluer_ugv/README/docs.py +31 -0
  14. bluer_ugv/README/eagle/__init__.py +0 -26
  15. bluer_ugv/README/eagle/docs.py +26 -0
  16. bluer_ugv/README/fire/__init__.py +0 -26
  17. bluer_ugv/README/fire/docs.py +26 -0
  18. bluer_ugv/README/rangin/__init__.py +0 -19
  19. bluer_ugv/README/rangin/docs.py +19 -0
  20. bluer_ugv/README/ravin/__init__.py +0 -13
  21. bluer_ugv/README/ravin/docs.py +14 -0
  22. bluer_ugv/README/ugvs/__main__.py +47 -0
  23. bluer_ugv/README/ugvs/db.py +52 -1
  24. bluer_ugv/README/ugvs/docs.py +47 -3
  25. bluer_ugv/README/ugvs/get.py +23 -0
  26. bluer_ugv/__init__.py +1 -1
  27. bluer_ugv/designs/rangin/parts.py +9 -7
  28. bluer_ugv/help/functions.py +6 -0
  29. bluer_ugv/help/get.py +24 -0
  30. bluer_ugv/help/ssh.py +19 -0
  31. bluer_ugv/help/watch.py +19 -0
  32. {bluer_ugv-7.713.1.dist-info → bluer_ugv-7.771.1.dist-info}/METADATA +3 -3
  33. {bluer_ugv-7.713.1.dist-info → bluer_ugv-7.771.1.dist-info}/RECORD +36 -20
  34. {bluer_ugv-7.713.1.dist-info → bluer_ugv-7.771.1.dist-info}/WHEEL +1 -1
  35. {bluer_ugv-7.713.1.dist-info → bluer_ugv-7.771.1.dist-info}/licenses/LICENSE +0 -0
  36. {bluer_ugv-7.713.1.dist-info → bluer_ugv-7.771.1.dist-info}/top_level.txt +0 -0
@@ -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
+ }
@@ -1,16 +0,0 @@
1
- from bluer_ugv.README.arzhang.items import items
2
- from bluer_ugv.README.arzhang import design, algo, flag
3
- from bluer_ugv.README.validations import docs as validations
4
-
5
- docs = (
6
- [
7
- {
8
- "items": items,
9
- "path": "../docs/arzhang",
10
- }
11
- ]
12
- + algo.docs
13
- + design.docs
14
- + flag.docs
15
- + validations.docs
16
- )
@@ -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")
@@ -0,0 +1,16 @@
1
+ from bluer_ugv.README.arzhang.items import items
2
+ from bluer_ugv.README.arzhang import design, algo, flag
3
+ from bluer_ugv.README.validations import docs as validations
4
+
5
+ docs = (
6
+ [
7
+ {
8
+ "items": items,
9
+ "path": "../docs/arzhang",
10
+ }
11
+ ]
12
+ + algo.docs
13
+ + design.docs
14
+ + flag.docs
15
+ + validations.docs
16
+ )
bluer_ugv/README/build.py CHANGED
@@ -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
+ ]
@@ -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,26 +0,0 @@
1
- from bluer_sbc.parts.db import db_of_parts
2
- from bluer_sbc.parts.consts import parts_url_prefix
3
-
4
- from bluer_ugv.README.eagle.items import items
5
- from bluer_ugv.designs.eagle.parts import dict_of_parts
6
-
7
- docs = [
8
- {
9
- "items": items,
10
- "path": "../docs/eagle",
11
- },
12
- {
13
- "path": "../docs/eagle/parts.md",
14
- "items": db_of_parts.as_images(
15
- dict_of_parts,
16
- reference=parts_url_prefix,
17
- ),
18
- "macros": {
19
- "parts:::": db_of_parts.as_list(
20
- dict_of_parts,
21
- reference=parts_url_prefix,
22
- log=False,
23
- ),
24
- },
25
- },
26
- ]
@@ -0,0 +1,26 @@
1
+ from bluer_sbc.parts.db import db_of_parts
2
+ from bluer_sbc.parts.consts import parts_url_prefix
3
+
4
+ from bluer_ugv.README.eagle.items import items
5
+ from bluer_ugv.designs.eagle.parts import dict_of_parts
6
+
7
+ docs = [
8
+ {
9
+ "items": items,
10
+ "path": "../docs/eagle",
11
+ },
12
+ {
13
+ "path": "../docs/eagle/parts.md",
14
+ "items": db_of_parts.as_images(
15
+ dict_of_parts,
16
+ reference=parts_url_prefix,
17
+ ),
18
+ "macros": {
19
+ "parts:::": db_of_parts.as_list(
20
+ dict_of_parts,
21
+ reference=parts_url_prefix,
22
+ log=False,
23
+ ),
24
+ },
25
+ },
26
+ ]
@@ -1,26 +0,0 @@
1
- from bluer_sbc.parts.db import db_of_parts
2
- from bluer_sbc.parts.consts import parts_url_prefix
3
-
4
- from bluer_ugv.README.fire.items import items
5
- from bluer_ugv.designs.fire.parts import dict_of_parts
6
-
7
- docs = [
8
- {
9
- "path": "../docs/fire",
10
- "items": items,
11
- },
12
- {
13
- "path": "../docs/fire/parts.md",
14
- "items": db_of_parts.as_images(
15
- dict_of_parts,
16
- reference=parts_url_prefix,
17
- ),
18
- "macros": {
19
- "parts:::": db_of_parts.as_list(
20
- dict_of_parts,
21
- reference=parts_url_prefix,
22
- log=False,
23
- ),
24
- },
25
- },
26
- ]
@@ -0,0 +1,26 @@
1
+ from bluer_sbc.parts.db import db_of_parts
2
+ from bluer_sbc.parts.consts import parts_url_prefix
3
+
4
+ from bluer_ugv.README.fire.items import items
5
+ from bluer_ugv.designs.fire.parts import dict_of_parts
6
+
7
+ docs = [
8
+ {
9
+ "path": "../docs/fire",
10
+ "items": items,
11
+ },
12
+ {
13
+ "path": "../docs/fire/parts.md",
14
+ "items": db_of_parts.as_images(
15
+ dict_of_parts,
16
+ reference=parts_url_prefix,
17
+ ),
18
+ "macros": {
19
+ "parts:::": db_of_parts.as_list(
20
+ dict_of_parts,
21
+ reference=parts_url_prefix,
22
+ log=False,
23
+ ),
24
+ },
25
+ },
26
+ ]
@@ -1,19 +0,0 @@
1
- from bluer_ugv.README.rangin import (
2
- mechanical,
3
- parts,
4
- power,
5
- root,
6
- schematics,
7
- specs,
8
- terraform,
9
- )
10
-
11
- docs = (
12
- mechanical.docs
13
- + parts.docs
14
- + power.docs
15
- + root.docs
16
- + schematics.docs
17
- + specs.docs
18
- + terraform.docs
19
- )
@@ -0,0 +1,19 @@
1
+ from bluer_ugv.README.rangin import (
2
+ mechanical,
3
+ parts,
4
+ power,
5
+ root,
6
+ schematics,
7
+ specs,
8
+ terraform,
9
+ )
10
+
11
+ docs = (
12
+ mechanical.docs
13
+ + parts.docs
14
+ + power.docs
15
+ + root.docs
16
+ + schematics.docs
17
+ + specs.docs
18
+ + terraform.docs
19
+ )
@@ -1,13 +0,0 @@
1
- from bluer_ugv.README.ravin import ravin3, ravin4
2
- from bluer_ugv.README.ravin.items import items
3
-
4
- docs = (
5
- [
6
- {
7
- "items": items,
8
- "path": "../docs/ravin",
9
- },
10
- ]
11
- + ravin3.docs
12
- + ravin4.docs
13
- )
@@ -0,0 +1,14 @@
1
+ from bluer_ugv.README.ravin.ravin3 import docs
2
+ from bluer_ugv.README.ravin.items import items
3
+ from bluer_ugv.README.ravin.ravin4 import docs
4
+
5
+ docs = (
6
+ [
7
+ {
8
+ "items": items,
9
+ "path": "../docs/ravin",
10
+ },
11
+ ]
12
+ + docs.docs
13
+ + docs.docs
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,
@@ -69,6 +103,15 @@ dict_of_ugvs = {
69
103
  f"{rangin_assets2}/20251231_111923.jpg",
70
104
  f"{rangin_assets2}/20251231_112447.jpg",
71
105
  ],
106
+ "tagline": "an ad robot.",
107
+ "class": "rangin",
108
+ "computers": {
109
+ "front": "arzhang3-front",
110
+ "top": "rangin-top2",
111
+ },
112
+ "comments": [
113
+ "built on [arzhang3](./arzhang3.md).",
114
+ ],
72
115
  },
73
116
  "arzhang4": {
74
117
  "order": 6,
@@ -78,5 +121,13 @@ dict_of_ugvs = {
78
121
  volume=2,
79
122
  ),
80
123
  ],
124
+ "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).",
125
+ "class": [
126
+ "arzhang",
127
+ "with external motors.",
128
+ ],
129
+ "comments": [
130
+ "build is ongoing. 🔥",
131
+ ],
81
132
  },
82
133
  }
@@ -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)
bluer_ugv/__init__.py CHANGED
@@ -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.771.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
  }
@@ -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
  )
bluer_ugv/help/get.py ADDED
@@ -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
+ )
bluer_ugv/help/ssh.py ADDED
@@ -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
+ )
@@ -0,0 +1,19 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage
4
+
5
+
6
+ def help_watch(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ return show_usage(
11
+ [
12
+ "@ugv",
13
+ "watch",
14
+ "<ugv-name>",
15
+ "[back | front | top | <node>]",
16
+ ],
17
+ "watch <ugv-name>.<node>.",
18
+ mono=mono,
19
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.713.1
3
+ Version: 7.771.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.771.1`](https://github.com/kamangir/bluer-ugv).
70
70
 
71
71
 
72
72
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -1,4 +1,4 @@
1
- bluer_ugv/__init__.py,sha256=s6Ava97YY5vcSGoj-Klau-AuK77f673ffd-spVKU9T0,288
1
+ bluer_ugv/__init__.py,sha256=X9rcQfZQmAg3Bg-wkrm71AoMpcdtQUvmr5B7qGluDDQ,288
2
2
  bluer_ugv/__main__.py,sha256=77TquqyMca7qHk0XtCixGVyzfW3_9ywnl5oXEPERlls,374
3
3
  bluer_ugv/config.env,sha256=TODRtdZqUAYbVudsJgwu24IIJzOdd78FkYB59xjQNSo,1164
4
4
  bluer_ugv/env.py,sha256=f5Wb4Fb6136bZBkUkZJGxnwtA9NIGyORZCsjV0I1hTg,2193
@@ -40,7 +40,7 @@ bluer_ugv/.abcli/swallow/video/playlist/download.sh,sha256=_HsWoW3rtLWMZpAxd2iem
40
40
  bluer_ugv/.abcli/swallow/video/playlist/edit.sh,sha256=_l-XpJOybxIkfcE797DBXwlcBcWSZqzTwIEGxk14-BY,403
41
41
  bluer_ugv/.abcli/swallow/video/playlist/upload.sh,sha256=8yGQtenNTNPQvifffED0FCP4Rjz0jHHvaDdcTv-vn9M,206
42
42
  bluer_ugv/.abcli/tests/README.sh,sha256=w1xjPWgCfWbLtON_LEn2cvSmPLulzm7kTBPEC3LJixs,142
43
- bluer_ugv/.abcli/tests/help.sh,sha256=_W98Uef-Yahu4WQD20AWnZKKo_xOSzHEFpIHjf0_V6I,1535
43
+ bluer_ugv/.abcli/tests/help.sh,sha256=uZ22au2-qHJMAIOLNT9ZYXNkjrJaCl9yxXM7BOJ98Bw,1590
44
44
  bluer_ugv/.abcli/tests/swallow_dataset_combine.sh,sha256=tXjZj5iOOmCz3ito9lBDYjaAvR2odNzs2LRXsrM6d6c,291
45
45
  bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh,sha256=Ff4V7fi-h1myRT9ajjaKXesNrpaxLZMGDidBT8G31Kw,360
46
46
  bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh,sha256=N3Iq-zJV2OfEoft44D1BBLOlrkAbUDN_Rp_sAmjCEVk,311
@@ -49,43 +49,53 @@ bluer_ugv/.abcli/tests/swallow_dataset_edit.sh,sha256=01wLHLd35pPTUmMxFT_ugkwLOA
49
49
  bluer_ugv/.abcli/tests/swallow_dataset_list.sh,sha256=DPjikrMLMl0oJTHBV4EyYmkMZnMjEmwosJRocLIJGz0,256
50
50
  bluer_ugv/.abcli/tests/swallow_video_play.sh,sha256=38AHfA0zw4NYrAYFi2ypVk4eZ65k91DnlyQ4vWp1jOs,180
51
51
  bluer_ugv/.abcli/tests/swallow_video_playlist.sh,sha256=SRJOtziqmh7Gnuaq1BQyyyqPoZDVq5-sy0tgWYnnfII,827
52
+ bluer_ugv/.abcli/tests/ugv_get.sh,sha256=MI-FO4z_cakBPKmYLwHLPCqy57GOzmKJpG7jPr1PH6o,445
52
53
  bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh,sha256=4LxfOGRAUJsZ5dnxrkwXCjWmkgQWSeqck-UYyza3aw8,243
53
54
  bluer_ugv/.abcli/tests/version.sh,sha256=7nVT4lERxIe-GkuDn86nfur9E_WGbvWtet_AJtr2S48,147
55
+ bluer_ugv/.abcli/ugv/get.sh,sha256=qTdryeNw6e95IaRBi4_GUjKmfK0UuSBYNtB6uuxJbqA,169
54
56
  bluer_ugv/.abcli/ugv/git.sh,sha256=U5p_5qrNwLw8O7HfHu7QZgLblbDc6Z6lIumgKwu3mzY,299
57
+ bluer_ugv/.abcli/ugv/ssh.sh,sha256=G-pTQtMBcLmEJMhSoFKOE6a06tdylTd8c4eyB-lrnHY,506
58
+ bluer_ugv/.abcli/ugv/watch.sh,sha256=5N7LEVAWOmmWfPGSiOThkqO9uYTXIrfm30nZjSfy72I,514
55
59
  bluer_ugv/README/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
60
  bluer_ugv/README/alias.py,sha256=jVRedHJRsoiauqcsN_APP1XgdXHsQhAsTQcMV4mHqEw,144
57
61
  bluer_ugv/README/beast.py,sha256=6sOpm4vNXxNtNMZszgiuqqJaBBWG02WaSgKfbdt7J4E,57
58
- bluer_ugv/README/build.py,sha256=ZMLb4cRdEo7jc_ZrVQaxR_20l8TxhVEw65uWizUz5Bo,1495
62
+ bluer_ugv/README/build.py,sha256=xxUHeDMamCHLA33ZyGyowNGL2gVO0OJzAkNhIA9kdug,994
59
63
  bluer_ugv/README/consts.py,sha256=bQ98yk28E8-EBh2wUgMNr-sZ90IC3q7BmTzJe5XCS3g,257
64
+ bluer_ugv/README/docs.py,sha256=kZKT5diLUFIzZqqP7do23v0ZA4hja1v5-L5LCL3UIxg,799
60
65
  bluer_ugv/README/items.py,sha256=-CZroToMKNHuqU9QugCfZXxH9DldPoVxdKasQ8Ywfvg,2229
61
66
  bluer_ugv/README/releases.py,sha256=T8SSJGq7kR902BspgcZlgEIlBa0tx3qNVfe9iRTcFOM,172
62
67
  bluer_ugv/README/root.py,sha256=h1piDAmlkdfbKZeZTW3HWzsW4VpKG6L776oYK7hC-J0,296
63
68
  bluer_ugv/README/shortcuts.py,sha256=vjE1QUdZg4omCoqy3BoTXQUbe6c5ERyq2Hjbl5TDw28,1316
64
- bluer_ugv/README/arzhang/__init__.py,sha256=va9n90xUAEkO1-161yciOdmqOTJ2RaBOi-5yTA6IEPs,350
69
+ bluer_ugv/README/arzhang/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
70
  bluer_ugv/README/arzhang/algo.py,sha256=om7gokRGJ5X_yMi40r9SgoNav3C4Pcd7S7TuQv58ccs,134
66
- bluer_ugv/README/arzhang/consts.py,sha256=o7IDyn7hCXFsHQuAX_qM196R1vEkTcxyC9K5TOaB4G4,239
71
+ bluer_ugv/README/arzhang/consts.py,sha256=MAS5OGe1O8AmoCxBfWgAmeByBWxdg_9UiQ5paCn_uGw,310
67
72
  bluer_ugv/README/arzhang/design.py,sha256=69P7xQ3Y1XfyIbnerilneuN_OJWzvsx_gw-9L4pyvT8,1705
73
+ bluer_ugv/README/arzhang/docs.py,sha256=va9n90xUAEkO1-161yciOdmqOTJ2RaBOi-5yTA6IEPs,350
68
74
  bluer_ugv/README/arzhang/flag.py,sha256=aTSQXk_sK09Wj7UCtAFkqruA0jwTvySHycG5pMu6Kp0,553
69
75
  bluer_ugv/README/arzhang/items.py,sha256=FRa_zAQr8ss3YXqZN3QyO9az_GmwNF4aZL7kMGx0cCw,1765
70
76
  bluer_ugv/README/computer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
- bluer_ugv/README/computer/box.py,sha256=d_VVOZYYRYWrUAZQjnfzXX_tmb_mKMONe7IVqJqifJI,745
77
+ bluer_ugv/README/computer/box.py,sha256=u9uJ3rChUWltd_ZuIzDd62sst278cZx7rcC5CHVoE6Q,799
72
78
  bluer_ugv/README/computer/docs.py,sha256=MKZ5xX-9J2jLncO3oL2W3KHbxE6--ZX32JaR-xfjNWk,883
73
79
  bluer_ugv/README/computer/power.py,sha256=NDr3vWM4TGARlvRJuWg7DhkWAitBxnCorxrV73Xxn28,390
74
80
  bluer_ugv/README/computer/schematics.py,sha256=1ZPKmuEBWwYb7_L1uzjK-14e-9qeBENpZCdgnbu6yeI,378
75
81
  bluer_ugv/README/computer/testing.py,sha256=WLr6UmjG9bGXBVSUsV77OJw3pqW8o45wKdKBavjRlFQ,537
76
82
  bluer_ugv/README/computer/shield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- bluer_ugv/README/computer/shield/docs.py,sha256=60GcoliNqUp0VKDFvf1fQ4hO45fUeH8GFXUbEyKFrds,970
83
+ bluer_ugv/README/computer/shield/docs.py,sha256=I2PqQzLRn3Gf04WOQkesEu9SUNQqEzJAZTI7eHWMvaY,994
84
+ bluer_ugv/README/computer/shield/parts.py,sha256=GhR_BoLwxsxWOy6aj5NkhKCxjsJQMqTNHSsAP6pMqBE,697
78
85
  bluer_ugv/README/computer/shield/testing.py,sha256=inXHfmNP4UYANpqFtaOCqgrrqZc-DuSySMPJ5MocSmM,443
79
86
  bluer_ugv/README/computer/shield/v1.py,sha256=bdvXYj4ZXSQ3hoPkLaY16gGDk4vQY70bGPGzLA7ceaI,329
80
87
  bluer_ugv/README/computer/shield/v2.py,sha256=5qIFnFbn_v-5wqnF7Itna4RIBZJryvxKPnWqOUf6pdE,653
81
- bluer_ugv/README/eagle/__init__.py,sha256=jDRkrWZL4ZNOS3jwTs3uHKAbrXQjbVimYSjC4ShX8ww,647
88
+ bluer_ugv/README/eagle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
89
  bluer_ugv/README/eagle/consts.py,sha256=u92JMMAWnB8ayWxKNTiqz_leAAszv427m4nZjJYJq4Y,116
90
+ bluer_ugv/README/eagle/docs.py,sha256=jDRkrWZL4ZNOS3jwTs3uHKAbrXQjbVimYSjC4ShX8ww,647
83
91
  bluer_ugv/README/eagle/items.py,sha256=ombp026VFK_w1oP7p9X6jcRskr4jTDOXqoxD0UB5Rvo,320
84
- bluer_ugv/README/fire/__init__.py,sha256=JZcj-UQvUpDFOOW-uPVf63dvseGnEKVBeydHrQwIpnU,643
92
+ bluer_ugv/README/fire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
93
  bluer_ugv/README/fire/consts.py,sha256=xM3UXPvQlyuxbqjhs3wrqAH7rMgebpW1KabBZJ3I-pI,114
94
+ bluer_ugv/README/fire/docs.py,sha256=JZcj-UQvUpDFOOW-uPVf63dvseGnEKVBeydHrQwIpnU,643
86
95
  bluer_ugv/README/fire/items.py,sha256=1r7sUjj0SrrPfHCadFEBORw3x0l6mXwk1T9Eu-QDzZk,74
87
- bluer_ugv/README/rangin/__init__.py,sha256=6SODAsT_Z2zgE1TzjIo6Xeqcswah2BgmhUWFV1ds10g,272
96
+ bluer_ugv/README/rangin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
97
  bluer_ugv/README/rangin/consts.py,sha256=QOtHe3TL9XoVQk3KD8bxBCdnXXjjnyCtobsYqYVPJ7s,270
98
+ bluer_ugv/README/rangin/docs.py,sha256=6SODAsT_Z2zgE1TzjIo6Xeqcswah2BgmhUWFV1ds10g,272
89
99
  bluer_ugv/README/rangin/items.py,sha256=15Yt6SR_vTy8JjLP6FdyiliN59kOejMIt0-wTcvI0Sk,387
90
100
  bluer_ugv/README/rangin/mechanical.py,sha256=N2R3vWQViszKPdwFASb8odYmvj-aWiNSMrtmLdTPt3M,1206
91
101
  bluer_ugv/README/rangin/parts.py,sha256=JZ_GPQEDxWnCiLHycLzddAz6Y_U4T5oFOXtZkjA12eA,532
@@ -94,8 +104,9 @@ bluer_ugv/README/rangin/root.py,sha256=WuUZaXZ4xoML5X6Rvmga758TLTUL4ZLadzdBERyWn
94
104
  bluer_ugv/README/rangin/schematics.py,sha256=iQHcP8aR5y1S9vtIWzRpumBTYyJjBJ2TYg7sAAZ-ISs,378
95
105
  bluer_ugv/README/rangin/specs.py,sha256=sIggtotyBzMxfJEBiGyCb_c4s2K5O3f0ngMsX-sBzSc,306
96
106
  bluer_ugv/README/rangin/terraform.py,sha256=xNdRfW4atsow1pb-hrSis2bHesYsqshWKco3k41Ilo0,71
97
- bluer_ugv/README/ravin/__init__.py,sha256=T_JGY6XXeiutQ80JRCaxSIx-lkovRoXj6Vl_g1eXtq0,243
107
+ bluer_ugv/README/ravin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
108
  bluer_ugv/README/ravin/consts.py,sha256=ofmtRHvct6qYK-MAc5clBI9sGFEIVhITx3PAxra61JA,54
109
+ bluer_ugv/README/ravin/docs.py,sha256=QaJ4ZFs7Spop1Y39MjVXG4F-eDUV_lLw-chTXSy6iNg,283
99
110
  bluer_ugv/README/ravin/items.py,sha256=bTi0qAiY53fGmkO_uwGwstDzgARmcHxSc2a6Z0Zj9wo,583
100
111
  bluer_ugv/README/swallow/__init__.py,sha256=X3GqLqS5VhbyUfw9sIT58MsTQ1aUnZqfRxI2sMQbYiQ,251
101
112
  bluer_ugv/README/swallow/analog.py,sha256=NmFEukeKepYRtIc0UT_F96uRKKukFM585UA6mlaW9ZM,360
@@ -112,8 +123,10 @@ bluer_ugv/README/swallow/digital/design/mechanical.py,sha256=OwgMrFIpRA-RR9CwurX
112
123
  bluer_ugv/README/swallow/digital/design/parts.py,sha256=R_CePkG5zF3qn1X4hvQyd8Iunc0u6yfWXyJJZi3fWBw,549
113
124
  bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py,sha256=VefIdTUXnsxVj3rmjsguV7N2BD9tPRiiaHjjRl84QUM,1517
114
125
  bluer_ugv/README/ugvs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- bluer_ugv/README/ugvs/db.py,sha256=oaJAB75K7U0zJKegDgWEHV6tL39QDMb0QZpidpfEYI0,2997
116
- bluer_ugv/README/ugvs/docs.py,sha256=6IGw9BtBo5X-xxCck_5cHdZ9uE1MEdjPoGHpfadhyjM,2089
126
+ bluer_ugv/README/ugvs/__main__.py,sha256=4eIr40fS4QD0BkAMk_vo6dGYOUlbPjDs_cN-uoHlILs,857
127
+ bluer_ugv/README/ugvs/db.py,sha256=LdcR33I1cBV19zRQmc3guM65SIHtrOnZmtnPTNuF1ZU,4623
128
+ bluer_ugv/README/ugvs/docs.py,sha256=q0I1ZPUJITg0G7dW5Lv8dnNm0JEL4rdMkcaD4qU3XRk,3420
129
+ bluer_ugv/README/ugvs/get.py,sha256=fxxPlvr-A38iw6o_1izXdd82N0C5W6y45R7eODK_ujk,487
117
130
  bluer_ugv/README/ugvs/comparison/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
131
  bluer_ugv/README/ugvs/comparison/build.py,sha256=Dj86jYV0gGHZQrTRH0wZ_Q8eh3yREBx5bgQ1Sw2bahA,4634
119
132
  bluer_ugv/README/ugvs/comparison/features/DYI.py,sha256=ED5Tlc4KcEFpLPHjwfSNGE47guKCeBG7Q84TS0BPJgE,187
@@ -144,7 +157,7 @@ bluer_ugv/designs/eagle/parts.py,sha256=ZnRBW7rNGVh-biRrgI-W9VwZB4-N_dTZpz-vd2Yu
144
157
  bluer_ugv/designs/fire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
158
  bluer_ugv/designs/fire/parts.py,sha256=vm7rLl2sFtVeueYXkkPYrVvAx8zWrg-QzUIDCxhDJsY,84
146
159
  bluer_ugv/designs/rangin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
- bluer_ugv/designs/rangin/parts.py,sha256=anZd99RpiJYW_ndfCDq4nG7AZozOBXvcQAXmUzTCXxc,449
160
+ bluer_ugv/designs/rangin/parts.py,sha256=9yP1bnI2vh9j3PHatimNjUoXx6w5J8_v5A6yJPBD4Wk,501
148
161
  bluer_ugv/designs/ravin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
162
  bluer_ugv/designs/ravin/ravin3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
163
  bluer_ugv/designs/ravin/ravin3/parts.py,sha256=pgauuSwQ3ZhL2yikvgZjJwMpTaNV3t-lK4Icu3P0anE,307
@@ -152,8 +165,11 @@ bluer_ugv/designs/ravin/ravin4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
152
165
  bluer_ugv/designs/ravin/ravin4/parts.py,sha256=Skgkut_OCRPUwtLX_gIe70A1n_r2-48aPW-f6K6zbmE,845
153
166
  bluer_ugv/help/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
154
167
  bluer_ugv/help/__main__.py,sha256=ww3p0cIRZm-SDODZ_fYAzPV_-nucxtidjK1IP2idW8g,229
155
- bluer_ugv/help/functions.py,sha256=_JcncL82A-6m9P9J6MX6Z_FtZ09k6HWuirozKl48xXY,367
168
+ bluer_ugv/help/functions.py,sha256=Bx8Qv1yZRi0SOadfUkcaZdLY3oPbJBSX3Iyr9UZ66To,570
169
+ bluer_ugv/help/get.py,sha256=vpvdU27VppybdhfFjXJ-CDpkCwb3j0jfZuY7dxBOqSs,437
156
170
  bluer_ugv/help/git.py,sha256=4CcaA8lHoplrrFgF5lolwVT79SLr3gE2iqXpAIfzH64,319
171
+ bluer_ugv/help/ssh.py,sha256=MpGHCgaCaOO_ALZ8UaFPlawg9CUngWe1rdA6xkcjbf0,351
172
+ bluer_ugv/help/watch.py,sha256=1Xjet_lR7q1deEee7I0DZIS58HBn7AUoVAUpsE0l1Ns,355
157
173
  bluer_ugv/help/swallow/__init__.py,sha256=13rjEuN0KXX6PpYlKzG8Pf3H3TKS3U8f9AZBhqacfSA,842
158
174
  bluer_ugv/help/swallow/dataset.py,sha256=59D5XLQG1PRWfPwfM73Jz1-f0qh_cO0q18qLtsxXtj0,2495
159
175
  bluer_ugv/help/swallow/debug.py,sha256=70krqg-YtjxPjPwWnx4J1Fxlvw46hHyAYq7pA7yPt50,481
@@ -220,8 +236,8 @@ bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=bVcG8V0P6Sl
220
236
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
221
237
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
222
238
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=yj2MY_Jo1FzeXnR_JoFAXsb9eHEVhicDiHEsUa8z03U,1525
223
- bluer_ugv-7.713.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
224
- bluer_ugv-7.713.1.dist-info/METADATA,sha256=i55doOVanEYg90K6rx7IFl81qrZkP2aagniro2U8N2Q,5708
225
- bluer_ugv-7.713.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
226
- bluer_ugv-7.713.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
227
- bluer_ugv-7.713.1.dist-info/RECORD,,
239
+ bluer_ugv-7.771.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
240
+ bluer_ugv-7.771.1.dist-info/METADATA,sha256=6twiUr9R3JKB19ZRS9-mWkiyfQD04rSZEtTiftA_wB8,5707
241
+ bluer_ugv-7.771.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
242
+ bluer_ugv-7.771.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
243
+ bluer_ugv-7.771.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5