bluer-ugv 7.201.1__py3-none-any.whl → 7.211.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.
bluer_ugv/README/items.py CHANGED
@@ -24,7 +24,7 @@ items = README.Items(
24
24
  },
25
25
  {
26
26
  "name": "rangin",
27
- "marquee": f"{rangin_assets2}/rangin.png",
27
+ "marquee": f"{rangin_assets2}/concepts/11.png",
28
28
  "description": "[swallow](./bluer_ugv/docs/swallow)'s ad robot.",
29
29
  "url": "./bluer_ugv/docs/rangin",
30
30
  },
@@ -5,6 +5,7 @@ from bluer_ugv.README.rangin.consts import rangin_assets2
5
5
 
6
6
  items = ImageItems(
7
7
  {
8
- f"{rangin_assets2}/rangin.png": "",
8
+ f"{rangin_assets2}/concepts/11.png": "",
9
+ f"{rangin_assets2}/concepts/12.png": "",
9
10
  }
10
11
  )
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.201.1"
7
+ VERSION = "7.211.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
@@ -1,14 +1,15 @@
1
1
  from blueness import module
2
2
  import numpy as np
3
3
  import cv2
4
- from typing import List
4
+ from typing import List, Dict
5
5
 
6
6
  from bluer_options import string
7
7
  from bluer_objects import file
8
8
  from bluer_objects import objects
9
+ from bluer_objects.logger.stitch import stitch_images
9
10
  from bluer_objects.graphics.gif import generate_animated_gif
10
- from bluer_algo.socket.classes import SocketComm
11
- from bluer_algo.tracker.classes.target import Target
11
+ from bluer_algo.socket.connection import SocketConnection
12
+ from bluer_algo.socket.message import SocketMessage
12
13
 
13
14
  from bluer_ugv import NAME
14
15
  from bluer_ugv.logger import logger
@@ -31,14 +32,17 @@ def debug(
31
32
  )
32
33
  )
33
34
 
34
- socket = SocketComm.listen_on()
35
+ socket = SocketConnection.listen_on()
35
36
 
36
37
  title = "debug..."
37
38
 
38
39
  cv2.namedWindow(title)
39
40
  logger.info("Ctrl+C to exit...")
40
41
 
41
- image = np.zeros((480, 640, 3), np.uint8)
42
+ blank_image = np.zeros((480, 640, 3), np.uint8)
43
+
44
+ image = blank_image.copy()
45
+ dict_of_images: Dict[str, np.ndarray] = {}
42
46
 
43
47
  list_of_images: List[str] = []
44
48
  try:
@@ -46,10 +50,24 @@ def debug(
46
50
  cv2.imshow(title, np.flip(image, axis=2))
47
51
  cv2.waitKey(1)
48
52
 
49
- success, image = socket.receive_data(np.ndarray)
53
+ success, message = socket.receive_data(SocketMessage)
50
54
  if not success:
51
55
  break
52
56
 
57
+ assert isinstance(message, SocketMessage)
58
+
59
+ logger.info(f"message from {message.hostname}.")
60
+
61
+ if "image" not in message.payload:
62
+ logger.warning("no image.")
63
+ continue
64
+
65
+ dict_of_images[message.hostname] = message.payload["image"]
66
+
67
+ image = stitch_images(
68
+ [image for _, image in sorted(dict_of_images.items())]
69
+ )
70
+
53
71
  if save_images:
54
72
  filename = objects.path_of(
55
73
  filename="{}.png".format(string.timestamp()),
@@ -1,6 +1,6 @@
1
1
  from typing import Any
2
2
 
3
- from bluer_algo.socket.classes import SocketComm, DEV_HOST
3
+ from bluer_algo.socket.connection import SocketConnection, DEV_HOST
4
4
  from bluer_sbc.imager.camera import instance as camera
5
5
  from bluer_sbc.env import BLUER_SBC_ENV
6
6
 
@@ -33,7 +33,7 @@ class ClassicalCamera:
33
33
  camera.close(log=True)
34
34
 
35
35
  def send_debug_data(self, data: Any) -> bool:
36
- socket = SocketComm.connect_to(DEV_HOST)
36
+ socket = SocketConnection.connect_to(DEV_HOST)
37
37
  return socket.send_data(data)
38
38
 
39
39
  # multi-threaded support
@@ -10,6 +10,7 @@ from bluer_sbc.imager.camera import instance as camera
10
10
  from bluer_sbc.env import BLUER_SBC_CAMERA_WIDTH
11
11
  from bluer_algo.yolo.dataset.classes import YoloDataset
12
12
  from bluer_algo.yolo.model.predictor import YoloPredictor
13
+ from bluer_algo.socket.message import SocketMessage
13
14
 
14
15
  from bluer_ugv import env
15
16
  from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
@@ -145,7 +146,13 @@ class ClassicalYoloCamera(ClassicalCamera):
145
146
  return success
146
147
 
147
148
  if debug_mode:
148
- if not self.send_debug_data(metadata["annotated_image"]):
149
+ if not self.send_debug_data(
150
+ SocketMessage(
151
+ {
152
+ "image": metadata["annotated_image"],
153
+ }
154
+ )
155
+ ):
149
156
  logger.warning("failed to send debug data.")
150
157
 
151
158
  if not metadata["detections"]:
@@ -3,7 +3,7 @@ import threading
3
3
  from typing import Any, Dict
4
4
 
5
5
  from bluer_sbc.session.functions import reply_to_bash
6
- from bluer_algo.socket.classes import DEV_HOST
6
+ from bluer_algo.socket.connection import DEV_HOST
7
7
 
8
8
  from bluer_ugv.swallow.session.classical.keyboard.keys import ControlKeys
9
9
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
@@ -9,14 +9,17 @@ class ControlKeys:
9
9
  def __init__(
10
10
  self,
11
11
  is_numpad: bool = BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD == 0,
12
+ log: bool = True,
12
13
  ):
13
14
  self.is_numpad = is_numpad
14
- logger.info(
15
- "{}: {}".format(
16
- self.__class__.__name__,
17
- "numpad" if self.is_numpad else "full",
15
+
16
+ if log:
17
+ logger.info(
18
+ "{}: {}".format(
19
+ self.__class__.__name__,
20
+ "numpad" if self.is_numpad else "full",
21
+ )
18
22
  )
19
- )
20
23
 
21
24
  self._keys: Dict[str, Tuple[str, str]] = {
22
25
  "ultrasonic off": ("n", "-"),
@@ -36,7 +39,7 @@ class ControlKeys:
36
39
 
37
40
  @staticmethod
38
41
  def as_table():
39
- keys = ControlKeys()
42
+ keys = ControlKeys(log=False)
40
43
  table = keys._keys.copy() # pylint: disable=protected-access
41
44
 
42
45
  for is_numpad in [False, True]:
@@ -2,7 +2,7 @@ from blueness import module
2
2
  import numpy as np
3
3
 
4
4
  from bluer_options.terminal import hr
5
- from bluer_algo.socket.classes import SocketComm
5
+ from bluer_algo.socket.connection import SocketConnection
6
6
  from bluer_algo.tracker.classes.target import Target
7
7
 
8
8
  from bluer_ugv import NAME
@@ -26,7 +26,7 @@ def select_target(
26
26
 
27
27
  try:
28
28
  while loop:
29
- socket = SocketComm.listen_on()
29
+ socket = SocketConnection.listen_on()
30
30
  success, image = socket.receive_data(np.ndarray)
31
31
  if not success:
32
32
  return success
@@ -38,7 +38,7 @@ def select_target(
38
38
  if not success:
39
39
  return success
40
40
 
41
- socket = SocketComm.connect_to(host)
41
+ socket = SocketConnection.connect_to(host)
42
42
  if not socket.send_data(track_window):
43
43
  return False
44
44
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.201.1
3
+ Version: 7.211.1
4
4
  Summary: 🐬 AI x UGV.
5
5
  Home-page: https://github.com/kamangir/bluer-ugv
6
6
  Author: Arash Abadpour (Kamangir)
@@ -39,7 +39,7 @@ pip install bluer_ugv
39
39
 
40
40
  | | | |
41
41
  | --- | --- | --- |
42
- | [`swallow`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250913_203635~2_1.gif?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow) based on power wheels. | [`arzhang`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang) [![image](https://github.com/kamangir/assets2/raw/main/arzhang/VID-20250905-WA0014_1.gif?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang) [swallow](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow)'s little sister. | [`rangin`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/rangin) [![image](https://github.com/kamangir/assets2/raw/main/rangin/rangin.png)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/rangin) [swallow](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow)'s ad robot. |
42
+ | [`swallow`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow) [![image](https://github.com/kamangir/assets2/raw/main/swallow/20250913_203635~2_1.gif?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow) based on power wheels. | [`arzhang`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang) [![image](https://github.com/kamangir/assets2/raw/main/arzhang/VID-20250905-WA0014_1.gif?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/arzhang) [swallow](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow)'s little sister. | [`rangin`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/rangin) [![image](https://github.com/kamangir/assets2/raw/main/rangin/concepts/11.png)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/rangin) [swallow](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow)'s ad robot. |
43
43
  | [`ravin`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/ravin) [![image](https://github.com/kamangir/assets2/raw/main/ravin/20250723_095155~2_1.gif?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/ravin) remote control car kit for teenagers. | [`eagle`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/eagle) [![image](https://github.com/kamangir/assets2/raw/main/eagle/file_0000000007986246b45343b0c06325dd.png?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/eagle) a remotely controlled ballon. | [`fire`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/fire) [![image](https://github.com/kamangir/assets/raw/main/bluer-ugv/fire.png?raw=true)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/fire) based on a used car. |
44
44
  | [`beast`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/beast) [![image](https://github.com/waveshareteam/ugv_rpi/raw/main/media/UGV-Rover-details-23.jpg)](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/beast) based on [UGV Beast PI ROS2](https://www.waveshare.com/wiki/UGV_Beast_PI_ROS2). | | |
45
45
 
@@ -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.201.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.211.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,4 +1,4 @@
1
- bluer_ugv/__init__.py,sha256=6mZLYNkJkIkqUuAuz9olWLBZsvIlzqmf3n-bT6KLWMs,288
1
+ bluer_ugv/__init__.py,sha256=59rUoO45VDJnxJHApZKC9c1SzCZ5sN233fBvFCP_ONM,288
2
2
  bluer_ugv/__main__.py,sha256=77TquqyMca7qHk0XtCixGVyzfW3_9ywnl5oXEPERlls,374
3
3
  bluer_ugv/config.env,sha256=psiLmasSe300nOPkLqMurFalZTvNE43zAsBQLEEDp-k,949
4
4
  bluer_ugv/env.py,sha256=asv-2OByZzf1c4ta3CHMZQDEcY8cd2WDUOa-_OCNYvU,1757
@@ -47,7 +47,7 @@ bluer_ugv/README/alias.py,sha256=MdTRUMg3rLbWS_AQz1WXwbkEjKEjBx5uM_fDwYmMGFY,173
47
47
  bluer_ugv/README/beast.py,sha256=6sOpm4vNXxNtNMZszgiuqqJaBBWG02WaSgKfbdt7J4E,57
48
48
  bluer_ugv/README/build.py,sha256=1mvmd2bIN-M4HC5gv7_HeXHlG1acHdRe3KGZovg_JkU,1139
49
49
  bluer_ugv/README/consts.py,sha256=bQ98yk28E8-EBh2wUgMNr-sZ90IC3q7BmTzJe5XCS3g,257
50
- bluer_ugv/README/items.py,sha256=bzPklsIH-TtyxpwX3V_qWkMxwyrW338zwyc1zZXyENI,2216
50
+ bluer_ugv/README/items.py,sha256=NVnBa-H9XqVnQR75kbrWvdKZHlgITYYS0DTqdvjgMvc,2221
51
51
  bluer_ugv/README/root.py,sha256=h1piDAmlkdfbKZeZTW3HWzsW4VpKG6L776oYK7hC-J0,296
52
52
  bluer_ugv/README/shield.py,sha256=WjQxSNtb6n4quKJBVMPkby_b83jg2AoPVW0XDJEcj00,2013
53
53
  bluer_ugv/README/shortcuts.py,sha256=PO0NNEMOsH8OoUiDMOzmNF0wEQQm7dliAxWH7UVqf7s,1330
@@ -65,7 +65,7 @@ bluer_ugv/README/fire/consts.py,sha256=xM3UXPvQlyuxbqjhs3wrqAH7rMgebpW1KabBZJ3I-
65
65
  bluer_ugv/README/fire/items.py,sha256=1r7sUjj0SrrPfHCadFEBORw3x0l6mXwk1T9Eu-QDzZk,74
66
66
  bluer_ugv/README/rangin/__init__.py,sha256=Dc6GcHvskGNemP-7UuFV1pnXxMRcsxQs3avs8IGRD2I,1915
67
67
  bluer_ugv/README/rangin/consts.py,sha256=z8YLAwyWZoKsSsRvr0E5D88YHmK874TVfKWmbFCiYRU,196
68
- bluer_ugv/README/rangin/items.py,sha256=2d_dxJndB59BxBqMFscycnLahR6jSdkYQgizlcm3OaQ,189
68
+ bluer_ugv/README/rangin/items.py,sha256=PZST5IQl4fTHG5RIe3gJGa2dqiH4tXa0WXPGkhwKbgw,243
69
69
  bluer_ugv/README/ravin/__init__.py,sha256=T_JGY6XXeiutQ80JRCaxSIx-lkovRoXj6Vl_g1eXtq0,243
70
70
  bluer_ugv/README/ravin/consts.py,sha256=ofmtRHvct6qYK-MAc5clBI9sGFEIVhITx3PAxra61JA,54
71
71
  bluer_ugv/README/ravin/items.py,sha256=bTi0qAiY53fGmkO_uwGwstDzgARmcHxSc2a6Z0Zj9wo,583
@@ -107,8 +107,8 @@ bluer_ugv/help/swallow/select_target.py,sha256=s1-v2IyT6thAncIzo4wKnU8hFJ-rDyi-I
107
107
  bluer_ugv/help/swallow/ultrasonic_sensor.py,sha256=rhxHQWDU7orCvqC_TeJWMCJFrm4qyJyHdiUIUIpZmhU,1223
108
108
  bluer_ugv/swallow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  bluer_ugv/swallow/__main__.py,sha256=eQPKYwnIG5Brr39-mhyuLSW5ghj91FAhqwrO4kLLKi0,1199
110
- bluer_ugv/swallow/debug.py,sha256=C7e1RJW2hvn8RQdgjjPXM5juUlO5wUQLtNhzd4Zp-LI,1905
111
- bluer_ugv/swallow/targeting.py,sha256=kXggctWDCrbrmI49fE0TrgJac4Gb4KJsbOzjEx4mkPg,1285
110
+ bluer_ugv/swallow/debug.py,sha256=0M-XjKqTnm-sNGaHWeuaM6tlkSSEQNqaLpmozNHALw0,2497
111
+ bluer_ugv/swallow/targeting.py,sha256=UTT88rZ4TRuxymNpk7DdjolQqLeYrzAnmcvaYlTg4nk,1306
112
112
  bluer_ugv/swallow/dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
113
  bluer_ugv/swallow/dataset/__main__.py,sha256=X_dDss9zJgSmNQg0EtXbxenVdXkN-dZg3XVaVentOL0,1584
114
114
  bluer_ugv/swallow/dataset/combination.py,sha256=FcfTpR-xwPR7Tcu_5lwBL1dkjZ3IBw72sDv1XlLpca0,3902
@@ -122,14 +122,14 @@ bluer_ugv/swallow/session/classical/mousepad.py,sha256=LI7yvmtrZZaGUgPGpxNU7zcPk
122
122
  bluer_ugv/swallow/session/classical/push_button.py,sha256=s8sPart_dECjLK-gfsJi0UorRYcFYf3ofLqjmG8PoA8,2397
123
123
  bluer_ugv/swallow/session/classical/session.py,sha256=mkWG1FfbU_lVAAf0MQRdOboMkg_jCozU_21BVex0Q2c,5184
124
124
  bluer_ugv/swallow/session/classical/camera/__init__.py,sha256=KOehn6qHKj3EMbV5uGXKIfN_v4D5-E2xH9aCWqbNlAI,375
125
- bluer_ugv/swallow/session/classical/camera/generic.py,sha256=9xTXisNYoiNVtT0-2wW9DvD6viIPpRR7rIyAwnbyvWs,1201
125
+ bluer_ugv/swallow/session/classical/camera/generic.py,sha256=xmztClNYkosYo2TcIS2Ax4Bessc8lx4hlt9LnMcobfU,1216
126
126
  bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=HoeTlifGEfnedb6o8P-O0TcP1bNDRJ0M7vWupQh1pL4,6790
127
127
  bluer_ugv/swallow/session/classical/camera/tracking.py,sha256=fXDCA7UCQT0I6_djk16AgRdulySVEjJSKOgD8bDpQng,3651
128
- bluer_ugv/swallow/session/classical/camera/yolo.py,sha256=jKn3M_FKUIMVSvhwgQ6kaWxLCi-l_490Zbaytjwj5_I,6219
128
+ bluer_ugv/swallow/session/classical/camera/yolo.py,sha256=i-lEsLpqlmm1v3sa5azQYk7LCgU9Me5y28-LSPurc7g,6412
129
129
  bluer_ugv/swallow/session/classical/keyboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
130
  bluer_ugv/swallow/session/classical/keyboard/__main__.py,sha256=tdX-a8MC9ix6aQ9isZXfnIqa9SuiYGr73Yy05RwvdCs,603
131
- bluer_ugv/swallow/session/classical/keyboard/classes.py,sha256=8_uLhtbgLcFge1pfenzwunJjLqBK_z6-j6lf4ztIE5A,4570
132
- bluer_ugv/swallow/session/classical/keyboard/keys.py,sha256=p1VkrQs_oq4NkZfmNM4HMlf4FcDz8k7eQneJIvaM7_c,2272
131
+ bluer_ugv/swallow/session/classical/keyboard/classes.py,sha256=6uN_aZqu6AcNibwi9rimkDRlTm5-LWuzVGzvy5YUpIY,4573
132
+ bluer_ugv/swallow/session/classical/keyboard/keys.py,sha256=Z27XTC2agwC_uYmzBgRKP3hNy58KWnWUxHXeOChuooc,2348
133
133
  bluer_ugv/swallow/session/classical/keyboard/testing.py,sha256=GFh-6-HkT1sYlGt-Y2traBFD8lle3C-HcvVrdzsITEo,511
134
134
  bluer_ugv/swallow/session/classical/motor/__init__.py,sha256=Ja9pVS6h5wnZiDvJ2IaibLcleQl3inIF_YRJg9VGKlw,323
135
135
  bluer_ugv/swallow/session/classical/motor/generic.py,sha256=VzCEqkuil-7ncyv2TxI7NMofIiLhuZGl61Ck3Yog55s,2860
@@ -150,8 +150,8 @@ bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=vMvmay2Gxg8
150
150
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
151
151
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
152
152
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=RIMHXmLXe1zXLvCNU163ymLI8XM6te9LXuCMnLuulbA,1515
153
- bluer_ugv-7.201.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
154
- bluer_ugv-7.201.1.dist-info/METADATA,sha256=7TlGt-XXdn8lf38RpIVXbKOPmkw_bSM164hHZDJueBE,5596
155
- bluer_ugv-7.201.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
156
- bluer_ugv-7.201.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
157
- bluer_ugv-7.201.1.dist-info/RECORD,,
153
+ bluer_ugv-7.211.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
154
+ bluer_ugv-7.211.1.dist-info/METADATA,sha256=cb-isom5fQBg6b3X2r8FJOCLTMdyvhL9D9u9xjS5lB8,5601
155
+ bluer_ugv-7.211.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
156
+ bluer_ugv-7.211.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
157
+ bluer_ugv-7.211.1.dist-info/RECORD,,