bluer-ugv 7.340.1__py3-none-any.whl → 7.359.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.
@@ -25,5 +25,11 @@ items = ImageItems(
25
25
  f"{arzhang_assets2}/20251005_112332.jpg": "",
26
26
  f"{arzhang_assets2}/20251005_112530.jpg": "",
27
27
  f"{arzhang_assets2}/20251018_213230.jpg": "",
28
+ f"{swallow_assets2}/20251117_112301.jpg": "",
29
+ f"{swallow_assets2}/20251117_120134.jpg": "",
30
+ f"{swallow_assets2}/20251117_125503.jpg": "",
31
+ f"{swallow_assets2}/20251117_125515.jpg": "",
32
+ f"{swallow_assets2}/20251117_125544.jpg": "",
33
+ f"{swallow_assets2}/20251117_160851.jpg": "",
28
34
  }
29
35
  )
bluer_ugv/README/build.py CHANGED
@@ -12,12 +12,12 @@ from bluer_ugv.README import (
12
12
  fire,
13
13
  ravin,
14
14
  root,
15
- shield,
16
15
  arzhang,
17
16
  rangin,
18
17
  releases,
19
18
  swallow,
20
19
  )
20
+ from bluer_ugv.README.shield import docs as shield
21
21
  from bluer_ugv.README.ugvs import docs as ugvs
22
22
  from bluer_ugv.README.ugvs.comparison.build import build as build_comparison
23
23
 
File without changes
@@ -0,0 +1,25 @@
1
+ from bluer_objects.README.items import ImageItems
2
+
3
+ from bluer_ugv.README.swallow.consts import (
4
+ swallow_assets2,
5
+ swallow_electrical_designs,
6
+ )
7
+
8
+ items = ImageItems(
9
+ {
10
+ f"{swallow_electrical_designs}/nuts-bolts-spacers.png": f"{swallow_electrical_designs}/nuts-bolts-spacers.svg",
11
+ f"{swallow_assets2}/20251018_133202.jpg": "",
12
+ f"{swallow_assets2}/20251018_133349.jpg": "",
13
+ f"{swallow_assets2}/20251008_114557.jpg": "",
14
+ f"{swallow_assets2}/20251008_133418.jpg": "",
15
+ f"{swallow_assets2}/20251008_124129.jpg": "",
16
+ f"{swallow_assets2}/20251008_124932.jpg": "",
17
+ }
18
+ )
19
+
20
+ docs = [
21
+ {
22
+ "path": "../docs/swallow/digital/design/shield/box.md",
23
+ "items": items,
24
+ }
25
+ ]
@@ -0,0 +1,17 @@
1
+ from bluer_ugv.README.shield import box, pcb, schematics, testing
2
+
3
+
4
+ docs = (
5
+ [
6
+ {
7
+ "path": "../docs/swallow/digital/design/shield",
8
+ },
9
+ {
10
+ "path": "../docs/swallow/digital/design/shield/connectors-v1.md",
11
+ },
12
+ ]
13
+ + box.docs
14
+ + pcb.docs
15
+ + schematics.docs
16
+ + testing.docs
17
+ )
@@ -0,0 +1,49 @@
1
+ from bluer_objects.README.items import ImageItems
2
+
3
+ from bluer_ugv.README.swallow.consts import swallow_assets2, swallow_designs
4
+
5
+
6
+ items = ImageItems(
7
+ {
8
+ f"{swallow_designs}/kicad/swallow/exports/swallow.png": f"{swallow_designs}/kicad/swallow/exports/swallow.pdf",
9
+ f"{swallow_designs}/kicad/swallow/exports/swallow-3d.png": "",
10
+ f"{swallow_designs}/kicad/swallow/exports/swallow-3d-back.png": "",
11
+ f"{swallow_designs}/kicad/swallow/exports/swallow-pcb.png": "",
12
+ f"{swallow_assets2}/20251112_085331.jpg": "",
13
+ f"{swallow_assets2}/20251112_181047.jpg": "",
14
+ f"{swallow_assets2}/20251112_181053.jpg": "",
15
+ }
16
+ )
17
+
18
+ v1_items = ImageItems(
19
+ {
20
+ f"{swallow_assets2}/20250614_102301.jpg": "",
21
+ }
22
+ )
23
+
24
+ v2_items = ImageItems(
25
+ {
26
+ f"{swallow_assets2}/20250703_153834.jpg": "",
27
+ f"{swallow_assets2}/20250925_213013.jpg": "",
28
+ f"{swallow_assets2}/20250925_214017.jpg": "",
29
+ f"{swallow_assets2}/20250928_160425.jpg": "",
30
+ f"{swallow_assets2}/20250928_160449.jpg": "",
31
+ f"{swallow_assets2}/20251002_103712.jpg": "",
32
+ f"{swallow_assets2}/20251002_103720.jpg": "",
33
+ }
34
+ )
35
+
36
+ docs = [
37
+ {
38
+ "path": "../docs/swallow/digital/design/shield/pcb.md",
39
+ "items": items,
40
+ },
41
+ {
42
+ "path": "../docs/swallow/digital/design/shield/v1.md",
43
+ "items": v1_items,
44
+ },
45
+ {
46
+ "path": "../docs/swallow/digital/design/shield/v2.md",
47
+ "items": v2_items,
48
+ },
49
+ ]
@@ -0,0 +1,17 @@
1
+ from bluer_objects.README.items import ImageItems
2
+
3
+ from bluer_ugv.README.swallow.consts import swallow_electrical_designs
4
+
5
+
6
+ items = ImageItems(
7
+ {
8
+ f"{swallow_electrical_designs}/digital.png": f"{swallow_electrical_designs}/digital.svg",
9
+ }
10
+ )
11
+
12
+ docs = [
13
+ {
14
+ "path": "../docs/swallow/digital/design/shield/schematics.md",
15
+ "items": items,
16
+ },
17
+ ]
@@ -0,0 +1,18 @@
1
+ from bluer_objects.README.items import ImageItems
2
+
3
+ from bluer_ugv.README.swallow.consts import swallow_assets2
4
+
5
+ items = ImageItems(
6
+ {
7
+ f"{swallow_assets2}/20251113_205142.jpg": "",
8
+ f"{swallow_assets2}/20251113_210730.jpg": "",
9
+ f"{swallow_assets2}/20251113_210706.jpg": "",
10
+ },
11
+ )
12
+
13
+ docs = [
14
+ {
15
+ "path": "../docs/swallow/digital/design/shield/testing.md",
16
+ "items": items,
17
+ },
18
+ ]
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.340.1"
7
+ VERSION = "7.359.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
bluer_ugv/config.env CHANGED
@@ -18,7 +18,7 @@ BLUER_UGV_SWALLOW_YOLO_MODEL=coco128-model-2025-09-16-meb4if
18
18
 
19
19
  BLUER_UGV_SWALLOW_YOLO_DATASET_LIST=swallow-yolo-dataset-list-v1
20
20
 
21
- BLUER_UGV_ULTRASONIC_SENSOR_TEST_OBJECT=ultrasonic-test-2025-09-30-17-54-43-96l9ps
21
+ BLUER_UGV_ULTRASONIC_SENSOR_TEST_OBJECT=ultrasonic-test-2025-11-18-12-38-22-j4t7wl
22
22
 
23
23
  BLUER_UGV_ULTRASONIC_SENSOR_WARNING_THRESHOLD=400
24
24
  BLUER_UGV_ULTRASONIC_SENSOR_DANGER_THRESHOLD=200
@@ -0,0 +1,11 @@
1
+ from bluer_options.host.functions import is_headless
2
+
3
+ from bluer_ugv.logger import logger
4
+
5
+
6
+ class ClassicalScreen:
7
+ def __init__(self):
8
+ if is_headless():
9
+ return
10
+
11
+ logger.info(f"{self.__class__.__name__} created.")
@@ -24,6 +24,7 @@ from bluer_ugv.swallow.session.classical.motor import (
24
24
  )
25
25
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
26
26
  from bluer_ugv.swallow.session.classical.position import ClassicalPosition
27
+ from bluer_ugv.swallow.session.classical.screen import ClassicalScreen
27
28
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.classes import (
28
29
  ClassicalUltrasonicSensor,
29
30
  )
@@ -10,6 +10,9 @@ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.pack import (
10
10
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import (
11
11
  DetectionState,
12
12
  )
13
+ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection_list import (
14
+ DetectionList,
15
+ )
13
16
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.log import (
14
17
  UltrasonicSensorDetectionLog,
15
18
  )
@@ -42,6 +45,8 @@ class ClassicalUltrasonicSensor:
42
45
  self.setpoint = setpoint
43
46
  self.keyboard = keyboard
44
47
 
48
+ self.detection_list = DetectionList()
49
+
45
50
  self.pack = None
46
51
  self.log = None
47
52
  self.running = False
@@ -85,30 +90,22 @@ class ClassicalUltrasonicSensor:
85
90
  time.sleep(0.01)
86
91
  continue
87
92
 
88
- success, detections = self.pack.detect(
89
- log=env.BLUER_UGV_ULTRASONIC_SENSOR_LOG == 1
93
+ success, self.detection_list = self.pack.detect(
94
+ log=env.BLUER_UGV_ULTRASONIC_SENSOR_LOG == 1,
90
95
  )
91
96
  if not success:
92
97
  raise NameError("failed to detect ultrasonic sensor.")
93
98
 
94
99
  if self.log is not None:
95
- self.log.append(detections)
100
+ self.log.append(self.detection_list)
96
101
 
97
102
  log_detections: bool = False
98
103
  speed = self.setpoint.get(what="speed")
99
- if any(
100
- detection.state == DetectionState.DANGER for detection in detections
101
- ):
104
+ if self.detection_list.state == DetectionState.DANGER:
102
105
  self.setpoint.stop()
103
106
  log_detections = True
104
107
  logger.info("⛔️ danger detected, stopping.")
105
- elif (
106
- any(
107
- detection.state == DetectionState.WARNING
108
- for detection in detections
109
- )
110
- and speed > 0
111
- ):
108
+ elif self.detection_list.state == DetectionState.WARNING and speed > 0:
112
109
  self.setpoint.put(
113
110
  what="speed",
114
111
  value=speed // 2,
@@ -123,8 +120,6 @@ class ClassicalUltrasonicSensor:
123
120
  logger.info(
124
121
  "{}: {}".format(
125
122
  self.__class__.__name__,
126
- ", ".join(
127
- [detection.as_str(short=True) for detection in detections]
128
- ),
123
+ ", ".join(self.detection_list.as_str(short=True)),
129
124
  )
130
125
  )
@@ -0,0 +1,45 @@
1
+ from typing import List, Iterable, Iterator
2
+ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import (
3
+ Detection,
4
+ DetectionState,
5
+ )
6
+
7
+
8
+ class DetectionList:
9
+ def __init__(
10
+ self,
11
+ list_of_detections: Iterable[Detection] | None = None,
12
+ ):
13
+ self._content: List[Detection] = (
14
+ list(list_of_detections) if list_of_detections else []
15
+ )
16
+
17
+ def __iter__(self) -> Iterator[Detection]:
18
+ return iter(self._content)
19
+
20
+ def __len__(self) -> int:
21
+ return len(self._content)
22
+
23
+ def __getitem__(self, index: int) -> Detection:
24
+ return self._content[index]
25
+
26
+ def append(self, detection: Detection) -> None:
27
+ self._content.append(detection)
28
+
29
+ def as_str(
30
+ self,
31
+ short: bool = False,
32
+ ) -> List[str]:
33
+ return [detection.as_str(short=short) for detection in self._content]
34
+
35
+ @property
36
+ def state(self) -> DetectionState:
37
+ if any(detection.state == DetectionState.DANGER for detection in self._content):
38
+ return DetectionState.DANGER
39
+
40
+ if any(
41
+ detection.state == DetectionState.WARNING for detection in self._content
42
+ ):
43
+ return DetectionState.WARNING
44
+
45
+ return DetectionState.CLEAR
@@ -12,16 +12,19 @@ from bluer_objects.graphics.signature import add_signature
12
12
 
13
13
  from bluer_ugv import env
14
14
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import Detection
15
+ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection_list import (
16
+ DetectionList,
17
+ )
15
18
  from bluer_ugv.host import signature
16
19
  from bluer_ugv.logger import logger
17
20
 
18
21
 
19
22
  class UltrasonicSensorDetectionLog:
20
23
  def __init__(self):
21
- self.log: List[List[Detection]] = []
24
+ self.log: List[DetectionList] = []
22
25
 
23
- def append(self, detection: List[Detection]):
24
- self.log.append(detection)
26
+ def append(self, detection_list: DetectionList):
27
+ self.log.append(detection_list)
25
28
 
26
29
  def export(
27
30
  self,
@@ -72,12 +75,12 @@ class UltrasonicSensorDetectionLog:
72
75
  )
73
76
 
74
77
  plt.plot(
75
- [func(list_of_detections[0]) for list_of_detections in self.log],
78
+ [func(detection_list[0]) for detection_list in self.log],
76
79
  color="green",
77
80
  label="left sensor",
78
81
  )
79
82
  plt.plot(
80
- [func(list_of_detections[1]) for list_of_detections in self.log],
83
+ [func(detection_list[1]) for detection_list in self.log],
81
84
  color="blue",
82
85
  label="right sensor",
83
86
  )
@@ -150,8 +153,8 @@ class UltrasonicSensorDetectionLog:
150
153
  ) -> bool:
151
154
  image = np.zeros((len(self.log[0]), len(self.log), 3), dtype=np.uint8)
152
155
 
153
- for detection_index, list_of_detections in enumerate(self.log):
154
- for sensor_index, detection in enumerate(list_of_detections):
156
+ for detection_index, detection_list in enumerate(self.log):
157
+ for sensor_index, detection in enumerate(detection_list):
155
158
  assert isinstance(detection, Detection)
156
159
 
157
160
  for channel in range(3):
@@ -213,12 +216,12 @@ class UltrasonicSensorDetectionLog:
213
216
  if not path.create(temp_folder):
214
217
  return False
215
218
 
216
- for index, detections in tqdm(enumerate(self.log)):
219
+ for index, detection_list in tqdm(enumerate(self.log)):
217
220
  if frame_count != -1 and len(image_list) >= frame_count:
218
221
  rm_blank_count += 1
219
222
  break
220
223
 
221
- if rm_blank and all(detection.is_blank for detection in detections):
224
+ if rm_blank and all(detection.is_blank for detection in detection_list):
222
225
  continue
223
226
 
224
227
  filename = objects.path_of(
@@ -230,12 +233,12 @@ class UltrasonicSensorDetectionLog:
230
233
  [
231
234
  detection.as_image(
232
235
  height=height,
233
- width=int(width / len(detections)),
236
+ width=int(width / len(detection_list)),
234
237
  max_m=max_m,
235
- line_width=int(line_width / len(detections)),
238
+ line_width=int(line_width / len(detection_list)),
236
239
  sign=False,
237
240
  )
238
- for detection in detections
241
+ for detection in detection_list
239
242
  ],
240
243
  axis=1,
241
244
  )
@@ -254,14 +257,14 @@ class UltrasonicSensorDetectionLog:
254
257
  env.BLUER_UGV_ULTRASONIC_SENSOR_DANGER_THRESHOLD
255
258
  ),
256
259
  ]
257
- + [detection.as_str(short=True) for detection in detections]
260
+ + detection_list.as_str(short=True)
258
261
  + objects.signature(
259
262
  "frame #{:04d}/{}".format(
260
263
  index,
261
264
  len(self.log),
262
265
  ),
263
266
  object_name,
264
- )
267
+ ),
265
268
  )
266
269
  ],
267
270
  footer=[" | ".join(signature())],
@@ -316,8 +319,8 @@ class UltrasonicSensorDetectionLog:
316
319
  ),
317
320
  {
318
321
  "detections": [
319
- [detection.as_dict() for detection in list_of_detections]
320
- for list_of_detections in self.log
322
+ [detection.as_dict() for detection in detection_list]
323
+ for detection_list in self.log
321
324
  ]
322
325
  },
323
326
  log=log,
@@ -4,7 +4,9 @@ from bluer_ugv import env
4
4
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.sensor import (
5
5
  lUltrasonicSensor,
6
6
  )
7
- from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import Detection
7
+ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection_list import (
8
+ DetectionList,
9
+ )
8
10
  from bluer_ugv.logger import logger
9
11
 
10
12
 
@@ -30,7 +32,7 @@ class UltrasonicSensorPack:
30
32
  def detect(
31
33
  self,
32
34
  log: bool = True,
33
- ) -> Tuple[bool, List[Detection]]:
35
+ ) -> Tuple[bool, DetectionList]:
34
36
  success_left, detection_left = self.left.detect(log=False)
35
37
  success_right, detection_right = self.right.detect(log=False)
36
38
 
@@ -45,6 +47,16 @@ class UltrasonicSensorPack:
45
47
  )
46
48
 
47
49
  return (
48
- success_left and success_right,
49
- [detection_left, detection_right],
50
+ all(
51
+ [
52
+ success_left,
53
+ success_right,
54
+ ]
55
+ ),
56
+ DetectionList(
57
+ [
58
+ detection_left,
59
+ detection_right,
60
+ ],
61
+ ),
50
62
  )
@@ -32,12 +32,12 @@ def test(
32
32
  success = True
33
33
  try:
34
34
  while True:
35
- success, detection = ultrasonic_sensor_pack.detect(log=log)
35
+ success, detection_list = ultrasonic_sensor_pack.detect(log=log)
36
36
  if not success:
37
37
  break
38
38
 
39
39
  if export:
40
- detection_log.append(detection)
40
+ detection_log.append(detection_list)
41
41
  except KeyboardInterrupt:
42
42
  logger.info("^C detected.")
43
43
  finally:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.340.1
3
+ Version: 7.359.1
4
4
  Summary: 🐬 AI x UGV.
5
5
  Home-page: https://github.com/kamangir/bluer-ugv
6
6
  Author: Arash Abadpour (Kamangir)
@@ -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.340.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.359.1`](https://github.com/kamangir/bluer-ugv).
68
68
 
69
69
 
70
70
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -1,6 +1,6 @@
1
- bluer_ugv/__init__.py,sha256=xXtW9EsLvg-OFuzaJja7o1H7jzIpZJ_F-b9epaEqxvI,288
1
+ bluer_ugv/__init__.py,sha256=F_pqhqD98ev09BusRGLjekDPEOidSapK8Zmms3eqy94,288
2
2
  bluer_ugv/__main__.py,sha256=77TquqyMca7qHk0XtCixGVyzfW3_9ywnl5oXEPERlls,374
3
- bluer_ugv/config.env,sha256=psiLmasSe300nOPkLqMurFalZTvNE43zAsBQLEEDp-k,949
3
+ bluer_ugv/config.env,sha256=RjdP3rLG6pqIrilFsCbYpg8ieTDhzMfBrqvQkJYZ1Sk,949
4
4
  bluer_ugv/env.py,sha256=asv-2OByZzf1c4ta3CHMZQDEcY8cd2WDUOa-_OCNYvU,1757
5
5
  bluer_ugv/host.py,sha256=DpdJCvBpUfP9LkZgcH4BcdLGD-WZUvbTsjvMfPtS8uY,292
6
6
  bluer_ugv/logger.py,sha256=faY6GL6xfZAzlZ1aJ-MEHuPRJZNx8PYS4jMyY3xuxMw,98
@@ -44,19 +44,18 @@ bluer_ugv/.abcli/ugv/git.sh,sha256=U5p_5qrNwLw8O7HfHu7QZgLblbDc6Z6lIumgKwu3mzY,2
44
44
  bluer_ugv/README/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  bluer_ugv/README/alias.py,sha256=MdTRUMg3rLbWS_AQz1WXwbkEjKEjBx5uM_fDwYmMGFY,173
46
46
  bluer_ugv/README/beast.py,sha256=6sOpm4vNXxNtNMZszgiuqqJaBBWG02WaSgKfbdt7J4E,57
47
- bluer_ugv/README/build.py,sha256=4OLHq3042TsyeFl5ekl0842vZGVMKbws5hWqz6brHdE,1450
47
+ bluer_ugv/README/build.py,sha256=4Qntcb246SixgBCClLbitasEr5IAF_P1AXkSBdh4PTw,1489
48
48
  bluer_ugv/README/consts.py,sha256=bQ98yk28E8-EBh2wUgMNr-sZ90IC3q7BmTzJe5XCS3g,257
49
49
  bluer_ugv/README/items.py,sha256=esAHk5pAXAEV1XBaRjnCqmD_42HFcsvZwO9EljsmiZc,2221
50
50
  bluer_ugv/README/releases.py,sha256=0_nYEXDoCiIyzoVdl8DtKBWnN5aE9BsmEbeQ5ZySUg8,116
51
51
  bluer_ugv/README/root.py,sha256=h1piDAmlkdfbKZeZTW3HWzsW4VpKG6L776oYK7hC-J0,296
52
- bluer_ugv/README/shield.py,sha256=a--cVfLENeQmIY4517jNnYEmad71hiJF6Bg_ut4BhyM,2602
53
52
  bluer_ugv/README/shortcuts.py,sha256=2kcWvPIZIcnvMrD08FB2JWoxIT3xijKuhKtJSjmDk9A,1312
54
53
  bluer_ugv/README/arzhang/__init__.py,sha256=va9n90xUAEkO1-161yciOdmqOTJ2RaBOi-5yTA6IEPs,350
55
54
  bluer_ugv/README/arzhang/algo.py,sha256=om7gokRGJ5X_yMi40r9SgoNav3C4Pcd7S7TuQv58ccs,134
56
55
  bluer_ugv/README/arzhang/consts.py,sha256=o7IDyn7hCXFsHQuAX_qM196R1vEkTcxyC9K5TOaB4G4,239
57
56
  bluer_ugv/README/arzhang/design.py,sha256=1DtC1GQRKhM7wUWVSW2zsg6ww6y1RlcFr5iQYYOQwpo,1303
58
57
  bluer_ugv/README/arzhang/flag.py,sha256=aTSQXk_sK09Wj7UCtAFkqruA0jwTvySHycG5pMu6Kp0,553
59
- bluer_ugv/README/arzhang/items.py,sha256=roaCCdYqea6cwPxdn8ahyDilu8ePhGGOc2er1aCWM7k,1333
58
+ bluer_ugv/README/arzhang/items.py,sha256=kMbopWBiwSelO4wFB0hD65Ndty_XXqEJBpJVibRUawU,1657
60
59
  bluer_ugv/README/eagle/__init__.py,sha256=jDRkrWZL4ZNOS3jwTs3uHKAbrXQjbVimYSjC4ShX8ww,647
61
60
  bluer_ugv/README/eagle/consts.py,sha256=u92JMMAWnB8ayWxKNTiqz_leAAszv427m4nZjJYJq4Y,116
62
61
  bluer_ugv/README/eagle/items.py,sha256=ombp026VFK_w1oP7p9X6jcRskr4jTDOXqoxD0UB5Rvo,320
@@ -69,6 +68,12 @@ bluer_ugv/README/rangin/items.py,sha256=PZST5IQl4fTHG5RIe3gJGa2dqiH4tXa0WXPGkhwK
69
68
  bluer_ugv/README/ravin/__init__.py,sha256=T_JGY6XXeiutQ80JRCaxSIx-lkovRoXj6Vl_g1eXtq0,243
70
69
  bluer_ugv/README/ravin/consts.py,sha256=ofmtRHvct6qYK-MAc5clBI9sGFEIVhITx3PAxra61JA,54
71
70
  bluer_ugv/README/ravin/items.py,sha256=bTi0qAiY53fGmkO_uwGwstDzgARmcHxSc2a6Z0Zj9wo,583
71
+ bluer_ugv/README/shield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ bluer_ugv/README/shield/box.py,sha256=ZOxpxWzNf1wKNJAv_8nblRdB8wWy_0W66HS0EybxF1U,743
73
+ bluer_ugv/README/shield/docs.py,sha256=bJR5Pg_asfSAgrc0ydWH6GFnU3-EtPnLLt_6LxRILe0,343
74
+ bluer_ugv/README/shield/pcb.py,sha256=_RaSF_UzWtSNU57S_3aEMr3WEdu5YItcd8h9vq3HRhM,1492
75
+ bluer_ugv/README/shield/schematics.py,sha256=ZU7kZnuCNqE7yfESMxGCwAwfzSiKc1oFOTcL-SqOIJU,376
76
+ bluer_ugv/README/shield/testing.py,sha256=2Gi_BG8GBuSNJ_BjSPhhSIiwsO4XbKci8wwLQ3h71dY,426
72
77
  bluer_ugv/README/swallow/__init__.py,sha256=Xp3jXDG67omwp8pcVKerq-P6eZ853EDHIfhrxM9-Ew8,250
73
78
  bluer_ugv/README/swallow/analog.py,sha256=NmFEukeKepYRtIc0UT_F96uRKKukFM585UA6mlaW9ZM,360
74
79
  bluer_ugv/README/swallow/consts.py,sha256=VKu8qhDqLiGICErKpW-FMUtHGDM0P28teR8eKM8gFc4,376
@@ -146,7 +151,8 @@ bluer_ugv/swallow/session/classical/mode.py,sha256=6rFe1IIpfijuI7Xd-wcGKhYQ7EdQx
146
151
  bluer_ugv/swallow/session/classical/mousepad.py,sha256=LI7yvmtrZZaGUgPGpxNU7zcPkW8D5ykHlY_O-4H2STs,1871
147
152
  bluer_ugv/swallow/session/classical/position.py,sha256=gNeNzNpUG8zkDrcwibxaYStPNKUN1_DV5RjHu_pHMIg,913
148
153
  bluer_ugv/swallow/session/classical/push_button.py,sha256=s8sPart_dECjLK-gfsJi0UorRYcFYf3ofLqjmG8PoA8,2397
149
- bluer_ugv/swallow/session/classical/session.py,sha256=ak1rLQL85AtNfKRA9hoZjGTTuwrIHCcI2vvE9kZIeuw,5373
154
+ bluer_ugv/swallow/session/classical/screen.py,sha256=XzExo4l_FpQg151NsaL_KfXx_V0slY9aRCF7kXJnf5g,244
155
+ bluer_ugv/swallow/session/classical/session.py,sha256=lHchI7OB9S65K5QGvqPYfFu90q3SN8eNlXZiXSdcvVI,5444
150
156
  bluer_ugv/swallow/session/classical/camera/__init__.py,sha256=KOehn6qHKj3EMbV5uGXKIfN_v4D5-E2xH9aCWqbNlAI,375
151
157
  bluer_ugv/swallow/session/classical/camera/generic.py,sha256=xmztClNYkosYo2TcIS2Ax4Bessc8lx4hlt9LnMcobfU,1216
152
158
  bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=HoeTlifGEfnedb6o8P-O0TcP1bNDRJ0M7vWupQh1pL4,6790
@@ -168,16 +174,17 @@ bluer_ugv/swallow/session/classical/setpoint/classes.py,sha256=a2ACbE4oEdguuOjtr
168
174
  bluer_ugv/swallow/session/classical/setpoint/steering.py,sha256=yuhW3u9YgZ756h4wyMWJYW9914d8oYRKLga67rTW-Tw,288
169
175
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
176
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py,sha256=SHCwEk_K9L0BG1X7W1JnnhTnQBGJ--TiN-QuH2Je28E,1732
171
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py,sha256=MIwfvni7DVLo3whxHnfnKiftbcksLhsoQI61wCH_hoU,4086
177
+ bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py,sha256=glWK3p5lWBKJwaLxZf7toyW7i3mscn4n7JiFE_i8H5Q,4000
172
178
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py,sha256=eP5Kb6aGqOAcOBBlhGvSWbUL_hKJZ8w5ggwkndzKBqo,227
173
179
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py,sha256=v_yCBzg4uvnra4Yy_M3Ngaab80PBEbkp2SHfaWfXgb8,3720
174
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py,sha256=Ks_VqD6tV0Yw0lcSETOFcMwQaUedwLBwLlSblIrVs24,10202
175
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=vMvmay2Gxg8cL8I2nONkoP0SGcYFxzEdsS2f83pU_DU,1361
180
+ bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection_list.py,sha256=V4ChFybBrWdrjEGZyQ8z4dXEpzpYzJXdOGf-omvES8I,1268
181
+ bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py,sha256=pitEgK3Fh7EYpotoq_Ek35w_xuBnunhozUSUSahmONU,10276
182
+ bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=bVcG8V0P6SlJz18za6OvVEPrkdsiR_78CGiAxrpcPQ4,1575
176
183
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
177
184
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
178
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=RIMHXmLXe1zXLvCNU163ymLI8XM6te9LXuCMnLuulbA,1515
179
- bluer_ugv-7.340.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
180
- bluer_ugv-7.340.1.dist-info/METADATA,sha256=8X78ByT_dKK1UvmjPSD00wb01n2JPQq1nzWz9c3VQL8,5573
181
- bluer_ugv-7.340.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
182
- bluer_ugv-7.340.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
183
- bluer_ugv-7.340.1.dist-info/RECORD,,
185
+ bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=yj2MY_Jo1FzeXnR_JoFAXsb9eHEVhicDiHEsUa8z03U,1525
186
+ bluer_ugv-7.359.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
187
+ bluer_ugv-7.359.1.dist-info/METADATA,sha256=inKzOSENCNzh94pLL44tfprSakkIWG5DGP6Fk2T29ho,5573
188
+ bluer_ugv-7.359.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
189
+ bluer_ugv-7.359.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
190
+ bluer_ugv-7.359.1.dist-info/RECORD,,
@@ -1,62 +0,0 @@
1
- from bluer_objects.README.items import ImageItems
2
-
3
- from bluer_ugv.README.swallow.consts import (
4
- swallow_assets2,
5
- swallow_designs,
6
- swallow_electrical_designs,
7
- )
8
-
9
- items = ImageItems(
10
- {
11
- f"{swallow_electrical_designs}/digital.png": f"{swallow_electrical_designs}/digital.svg",
12
- f"{swallow_assets2}/20250609_164433.jpg": "",
13
- f"{swallow_assets2}/20250614_102301.jpg": "",
14
- f"{swallow_assets2}/20250614_114954.jpg": "",
15
- f"{swallow_assets2}/20250615_192339.jpg": "",
16
- f"{swallow_assets2}/20250703_153834.jpg": "",
17
- f"{swallow_assets2}/design/v2/01.jpg": "",
18
- f"{swallow_assets2}/design/v3/01.jpg": "",
19
- f"{swallow_assets2}/design/v4/01.jpg": "",
20
- f"{swallow_assets2}/20250925_213013.jpg": "",
21
- f"{swallow_assets2}/20250925_214017.jpg": "",
22
- f"{swallow_assets2}/20250928_160425.jpg": "",
23
- f"{swallow_assets2}/20250928_160449.jpg": "",
24
- f"{swallow_assets2}/design/head-v1/01.jpg": "",
25
- f"{swallow_assets2}/20251002_103712.jpg": "",
26
- f"{swallow_assets2}/20251002_103720.jpg": "",
27
- f"{swallow_assets2}/design/v5/01.jpg": "",
28
- f"{swallow_electrical_designs}/nuts-bolts-spacers.png": f"{swallow_electrical_designs}/nuts-bolts-spacers.svg",
29
- f"{swallow_assets2}/20251018_133202.jpg": "",
30
- f"{swallow_assets2}/20251018_133349.jpg": "",
31
- f"{swallow_assets2}/20251008_114557.jpg": "",
32
- f"{swallow_assets2}/20251008_133418.jpg": "",
33
- f"{swallow_assets2}/20251008_124129.jpg": "",
34
- f"{swallow_assets2}/20251008_124932.jpg": "",
35
- f"{swallow_designs}/kicad/swallow/exports/swallow.png": f"{swallow_designs}/kicad/swallow/exports/swallow.pdf",
36
- f"{swallow_designs}/kicad/swallow/exports/swallow-3d.png": "",
37
- f"{swallow_designs}/kicad/swallow/exports/swallow-3d-back.png": "",
38
- f"{swallow_designs}/kicad/swallow/exports/swallow-pcb.png": "",
39
- f"{swallow_assets2}/20250609_164433.jpg": "",
40
- f"{swallow_assets2}/20251112_085331.jpg": "",
41
- f"{swallow_assets2}/20251112_181047.jpg": "",
42
- f"{swallow_assets2}/20251112_181053.jpg": "",
43
- }
44
- )
45
-
46
-
47
- docs = [
48
- {
49
- "path": "../docs/swallow/digital/design/shield",
50
- "items": items,
51
- },
52
- {
53
- "path": "../docs/swallow/digital/design/shield/testing.md",
54
- "items": ImageItems(
55
- {
56
- f"{swallow_assets2}/20251113_205142.jpg": "",
57
- f"{swallow_assets2}/20251113_210730.jpg": "",
58
- f"{swallow_assets2}/20251113_210706.jpg": "",
59
- },
60
- ),
61
- },
62
- ]