bluer-ugv 7.824.1__py3-none-any.whl → 7.835.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.
@@ -0,0 +1,22 @@
1
+ from typing import Tuple
2
+
3
+ from bluer_ugv.README.ugvs.db import dict_of_ugvs
4
+ from bluer_ugv.logger import logger
5
+
6
+
7
+ def get_location(
8
+ hostname: str,
9
+ log: bool = True,
10
+ ) -> Tuple[bool, str]:
11
+ for info in dict_of_ugvs.values():
12
+ dict_of_computers = info.get("computers", {})
13
+ assert isinstance(dict_of_computers, dict)
14
+
15
+ for location, hostname_ in dict_of_computers.items():
16
+ if hostname == hostname_:
17
+ if log:
18
+ logger.info(f"{hostname}.location={location}")
19
+ return True, location
20
+
21
+ logger.error(f"{hostname}.location not found.")
22
+ return False, ""
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.824.1"
7
+ VERSION = "7.835.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
@@ -47,6 +47,3 @@ class ClassicalEthernet:
47
47
 
48
48
  while self.running:
49
49
  self.client.process()
50
-
51
- def update(self):
52
- return not self.client.stop_received
@@ -6,8 +6,6 @@ import struct
6
6
  import threading
7
7
  import time
8
8
 
9
- from bluer_sbc.session.functions import reply_to_bash
10
-
11
9
  from bluer_ugv.logger import logger
12
10
  from bluer_ugv.swallow.session.classical.ethernet.command import EthernetCommand
13
11
  from bluer_ugv.logger import logger
@@ -21,14 +19,13 @@ class EthernetClient:
21
19
  is_server: bool = False,
22
20
  reconnect_sec: float = 1.0,
23
21
  ):
24
- self.stop_received: bool = False
25
-
26
22
  self.host = host
27
23
  self.port = port
28
24
  self.is_server = is_server
29
25
  self.reconnect_sec = reconnect_sec
30
26
 
31
27
  self._send_queue: SimpleQueue[EthernetCommand] = SimpleQueue()
28
+ self._receive_queue: SimpleQueue[EthernetCommand] = SimpleQueue()
32
29
 
33
30
  self._lock = threading.Lock()
34
31
  self._sock: Optional[socket.socket] = None
@@ -250,10 +247,7 @@ class EthernetClient:
250
247
  )
251
248
  )
252
249
 
253
- if command.action == "keyboard":
254
- reply_to_bash(command.data.get("event", "unknown"))
255
- self.stop_received = True
256
- logger.info("stop received.")
250
+ self._receive_queue.put(command)
257
251
 
258
252
  # 2) drain outbound queue
259
253
  self._drain_send_queue()
@@ -2,3 +2,4 @@ from bluer_ugv.swallow.session.classical.motor.left import ClassicalLeftMotor
2
2
  from bluer_ugv.swallow.session.classical.motor.right import ClassicalRightMotor
3
3
  from bluer_ugv.swallow.session.classical.motor.rear import ClassicalRearMotors
4
4
  from bluer_ugv.swallow.session.classical.motor.steering import ClassicalSteeringMotor
5
+ from bluer_ugv.swallow.session.classical.motor.void import ClassicalVoidMotor
@@ -0,0 +1,20 @@
1
+ from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
2
+ from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
3
+
4
+
5
+ class ClassicalVoidMotor:
6
+ def __init__(
7
+ self,
8
+ setpoint: ClassicalSetPoint,
9
+ leds: ClassicalLeds,
10
+ ):
11
+ pass
12
+
13
+ def cleanup(self):
14
+ pass
15
+
16
+ def initialize(self) -> bool:
17
+ return True
18
+
19
+ def update(self) -> bool:
20
+ return True
@@ -1,11 +1,15 @@
1
1
  from RPi import GPIO # type: ignore
2
+ from queue import Empty
2
3
 
3
4
  from bluer_options import string
5
+ from bluer_options.env import abcli_hostname
4
6
  from bluer_options.timing.classes import Timing
5
7
  from bluer_objects.env import abcli_object_name
6
8
  from bluer_objects.metadata import post_to_object
7
9
  from bluer_sbc.env import BLUER_SBC_CAMERA_KIND, BLUER_SBC_SWALLOW_HAS_STEERING
10
+ from bluer_sbc.session.functions import reply_to_bash
8
11
 
12
+ from bluer_ugv.README.ugvs.location import get_location
9
13
  from bluer_ugv.swallow.session.classical.ethernet.classes import ClassicalEthernet
10
14
  from bluer_ugv.swallow.session.classical.camera import (
11
15
  ClassicalCamera,
@@ -23,8 +27,12 @@ from bluer_ugv.swallow.session.classical.motor import (
23
27
  ClassicalRightMotor,
24
28
  ClassicalRearMotors,
25
29
  ClassicalSteeringMotor,
30
+ ClassicalVoidMotor,
26
31
  )
27
32
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
33
+ from bluer_ugv.swallow.session.classical.setpoint.ethernet import (
34
+ ClassicalEthernetSetPoint,
35
+ )
28
36
  from bluer_ugv.swallow.session.classical.position import ClassicalPosition
29
37
  from bluer_ugv.swallow.session.classical.screen.classes import ClassicalScreen
30
38
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.classes import (
@@ -42,6 +50,8 @@ class ClassicalSession:
42
50
  ):
43
51
  self.object_name = object_name
44
52
 
53
+ _, self.location = get_location(abcli_hostname)
54
+
45
55
  GPIO.setmode(GPIO.BCM)
46
56
 
47
57
  self.ethernet = ClassicalEthernet()
@@ -52,7 +62,10 @@ class ClassicalSession:
52
62
  leds=self.leds,
53
63
  )
54
64
 
55
- self.setpoint = ClassicalSetPoint(
65
+ self.setpoint = (
66
+ ClassicalSetPoint if self.location == "front" else ClassicalEthernetSetPoint
67
+ )(
68
+ ethernet=self.ethernet,
56
69
  leds=self.leds,
57
70
  )
58
71
 
@@ -81,27 +94,34 @@ class ClassicalSession:
81
94
  logger.info("has_steering: {}".format(self.has_steering))
82
95
 
83
96
  self.motor1 = (
84
- ClassicalSteeringMotor if self.has_steering else ClassicalRightMotor
97
+ ClassicalVoidMotor
98
+ if self.location != "front"
99
+ else ClassicalSteeringMotor if self.has_steering else ClassicalRightMotor
85
100
  )(
86
101
  setpoint=self.setpoint,
87
102
  leds=self.leds,
88
103
  )
89
104
 
90
105
  self.motor2 = (
91
- ClassicalRearMotors if self.has_steering else ClassicalLeftMotor
106
+ ClassicalVoidMotor
107
+ if self.location != "front"
108
+ else ClassicalRearMotors if self.has_steering else ClassicalLeftMotor
92
109
  )(
93
110
  setpoint=self.setpoint,
94
111
  leds=self.leds,
95
112
  )
96
113
 
97
- self.position = ClassicalPosition(object_name)
98
-
99
- logger.info(
100
- "wheel arrangement: {} + {}".format(
101
- self.motor1.role,
102
- self.motor2.role,
114
+ if self.location == "front":
115
+ logger.info(
116
+ "wheel arrangement: {} + {}".format(
117
+ self.motor1.role,
118
+ self.motor2.role,
119
+ )
103
120
  )
104
- )
121
+ else:
122
+ logger.info("no wheels.")
123
+
124
+ self.position = ClassicalPosition(object_name)
105
125
 
106
126
  camera_class = (
107
127
  ClassicalVoidCamera
@@ -199,7 +219,6 @@ class ClassicalSession:
199
219
  self.timing.start("session.update")
200
220
 
201
221
  for thing in [
202
- self.ethernet,
203
222
  self.keyboard,
204
223
  self.push_button,
205
224
  self.camera,
@@ -218,4 +237,30 @@ class ClassicalSession:
218
237
  self.timing.stop(thing.__class__.__name__)
219
238
 
220
239
  self.timing.stop("session.update")
240
+ if self.location != "front":
241
+ return True
242
+
243
+ while True:
244
+ try:
245
+ command = (
246
+ self.ethernet.client._receive_queue.get_nowait()
247
+ ) # pylint: disable=protected-access
248
+ except Empty:
249
+ break
250
+
251
+ if command.action == "keyboard":
252
+ reply_to_bash(command.data.get("event", "unknown"))
253
+ logger.info("stop received.")
254
+ return False
255
+
256
+ if command.action == "setpoint.put":
257
+ self.setpoint.put(
258
+ value=command.data.get("value", 0),
259
+ what=command.data.get("what", "void"),
260
+ log=True,
261
+ steering_expires_in=command.data.get("steering_expires_in", 0),
262
+ )
263
+ else:
264
+ logger.warning(f"unknown command: {command.as_str()}")
265
+
221
266
  return True
@@ -2,9 +2,11 @@ import threading
2
2
  from typing import Union, Dict
3
3
  import time
4
4
 
5
+
5
6
  from bluer_options import string
6
7
 
7
8
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
9
+ from bluer_ugv.swallow.session.classical.ethernet.classes import ClassicalEthernet
8
10
  from bluer_ugv.swallow.session.classical.setpoint.steering import (
9
11
  generate_left_and_right,
10
12
  )
@@ -14,6 +16,7 @@ from bluer_ugv.logger import logger
14
16
  class ClassicalSetPoint:
15
17
  def __init__(
16
18
  self,
19
+ ethernet: ClassicalEthernet,
17
20
  leds: ClassicalLeds,
18
21
  ):
19
22
  self.speed = 0
@@ -23,10 +26,13 @@ class ClassicalSetPoint:
23
26
 
24
27
  self.started = False
25
28
 
29
+ self.ethernet = ethernet
26
30
  self.leds = leds
27
31
 
28
32
  self._lock = threading.Lock()
29
33
 
34
+ logger.info(f"{self.__class__.__name__} created.")
35
+
30
36
  def get(
31
37
  self,
32
38
  what: str = "all",
@@ -0,0 +1,31 @@
1
+ from typing import Union, Dict
2
+
3
+ from bluer_ugv.swallow.session.classical.ethernet.command import EthernetCommand
4
+ from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
5
+
6
+
7
+ class ClassicalEthernetSetPoint(ClassicalSetPoint):
8
+ def put(
9
+ self,
10
+ value: Union[int, bool, Dict[str, Union[int, bool]]],
11
+ what: str = "all",
12
+ log: bool = True,
13
+ steering_expires_in: float = 0,
14
+ ):
15
+ super().put(
16
+ value=value,
17
+ what=what,
18
+ log=log,
19
+ steering_expires_in=steering_expires_in,
20
+ )
21
+
22
+ self.ethernet.client.send(
23
+ EthernetCommand(
24
+ action="setpoint.put",
25
+ data={
26
+ "value": value,
27
+ "what": what,
28
+ "steering_expires_in": steering_expires_in,
29
+ },
30
+ )
31
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.824.1
3
+ Version: 7.835.1
4
4
  Summary: 🐬 AI x UGV.
5
5
  Home-page: https://github.com/kamangir/bluer-ugv
6
6
  Author: Arash Abadpour (Kamangir)
@@ -65,7 +65,7 @@ pip install bluer_ugv
65
65
 
66
66
  [![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)
67
67
 
68
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.824.1`](https://github.com/kamangir/bluer-ugv).
68
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.835.1`](https://github.com/kamangir/bluer-ugv).
69
69
 
70
70
 
71
71
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -1,4 +1,4 @@
1
- bluer_ugv/__init__.py,sha256=neFQJReXJeVsk-81qoLMoqCJjTsV4jsHRQnLb0k5pzw,288
1
+ bluer_ugv/__init__.py,sha256=bbufNjLuKygZJkxyR29xYLqO41w4UQS64R69WIP6D8U,288
2
2
  bluer_ugv/__main__.py,sha256=77TquqyMca7qHk0XtCixGVyzfW3_9ywnl5oXEPERlls,374
3
3
  bluer_ugv/config.env,sha256=29E09ffL9mJQr3J9J_Xi5KoIiOxqDF1akquddhz4zrE,1237
4
4
  bluer_ugv/env.py,sha256=dxTqlES0xLLooYDWcJDM7oOEJsOBE9LScHNtVjInvWQ,2366
@@ -131,6 +131,7 @@ bluer_ugv/README/ugvs/db.py,sha256=z-w4RhSZjrC_mgzRStN2K2amGnrfJWWSajJ6q65WZQE,4
131
131
  bluer_ugv/README/ugvs/docs.py,sha256=q0I1ZPUJITg0G7dW5Lv8dnNm0JEL4rdMkcaD4qU3XRk,3420
132
132
  bluer_ugv/README/ugvs/ethernet.py,sha256=6MGGWW-RWbx8-59EJKrA0Ncmje72-lYC4PUawrRdAkI,1584
133
133
  bluer_ugv/README/ugvs/get.py,sha256=WMeSYKFA-XKY_rYL2zGo4TiN503Kg_w-CyLeD5NyFZM,378
134
+ bluer_ugv/README/ugvs/location.py,sha256=KHeFBO8dlGNxBC32ox69234TRgju9UAwIeD-nEa6lMM,644
134
135
  bluer_ugv/README/ugvs/comparison/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
136
  bluer_ugv/README/ugvs/comparison/build.py,sha256=Dj86jYV0gGHZQrTRH0wZ_Q8eh3yREBx5bgQ1Sw2bahA,4634
136
137
  bluer_ugv/README/ugvs/comparison/features/DYI.py,sha256=ED5Tlc4KcEFpLPHjwfSNGE47guKCeBG7Q84TS0BPJgE,187
@@ -202,7 +203,7 @@ bluer_ugv/swallow/session/classical/mode.py,sha256=6rFe1IIpfijuI7Xd-wcGKhYQ7EdQx
202
203
  bluer_ugv/swallow/session/classical/mousepad.py,sha256=LI7yvmtrZZaGUgPGpxNU7zcPkW8D5ykHlY_O-4H2STs,1871
203
204
  bluer_ugv/swallow/session/classical/position.py,sha256=gNeNzNpUG8zkDrcwibxaYStPNKUN1_DV5RjHu_pHMIg,913
204
205
  bluer_ugv/swallow/session/classical/push_button.py,sha256=s8sPart_dECjLK-gfsJi0UorRYcFYf3ofLqjmG8PoA8,2397
205
- bluer_ugv/swallow/session/classical/session.py,sha256=tF0yj3KlJb_aeUjLAS_taVmzQu6ILqjYfOSP7mfHXKQ,6257
206
+ bluer_ugv/swallow/session/classical/session.py,sha256=7HJIzfVgynh7aC2WKwuEqxULOSbL77Xj_8623xeLoHk,7884
206
207
  bluer_ugv/swallow/session/classical/camera/__init__.py,sha256=2GchuT19_Ns0uYRS5aUMz4pBwbK3y5XoFxoAlAnJKh8,464
207
208
  bluer_ugv/swallow/session/classical/camera/generic.py,sha256=tW7bQMzmBi9MV28cTlKlDhFdtnB-9mkpBzjaWzEJNec,1220
208
209
  bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=HoeTlifGEfnedb6o8P-O0TcP1bNDRJ0M7vWupQh1pL4,6790
@@ -211,8 +212,8 @@ bluer_ugv/swallow/session/classical/camera/void.py,sha256=IJkJQgTgVucTYagFIwKEch
211
212
  bluer_ugv/swallow/session/classical/camera/yolo.py,sha256=vStqH-cQbi0Rij1OqETv60QfMgSHz_9X9DaqKDPHNcI,6592
212
213
  bluer_ugv/swallow/session/classical/ethernet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
214
  bluer_ugv/swallow/session/classical/ethernet/__main__.py,sha256=7xSxV1qaxgOehQZn_lgVxemM43ZlJjKBmqPC-cQuXD4,846
214
- bluer_ugv/swallow/session/classical/ethernet/classes.py,sha256=v8u41aFlzbq6_SHpxCxRY6eBzwmTsTxQiNuXtTRz4oQ,1301
215
- bluer_ugv/swallow/session/classical/ethernet/client.py,sha256=jVf-JBrKt_r1k_GxhNOCYL-BjFVHASpKghLWglMQWBI,8593
215
+ bluer_ugv/swallow/session/classical/ethernet/classes.py,sha256=gUIBvZYiyH9bYvStsTCVsaiEMKsMxqknBxdPZ5Yeo8s,1233
216
+ bluer_ugv/swallow/session/classical/ethernet/client.py,sha256=G01PouwWLvd3-np1PQkFMfljoKOe8ZKbLk79or_KVQM,8414
216
217
  bluer_ugv/swallow/session/classical/ethernet/command.py,sha256=ppS4Tkks4yLNsycAKdmZX6EfUEMThaJ2Il42dwdF__c,597
217
218
  bluer_ugv/swallow/session/classical/ethernet/testing.py,sha256=SvLp12FqcJeph6z6jP1OR5h6cugcptTyP9t2AVHGTEs,1149
218
219
  bluer_ugv/swallow/session/classical/keyboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -220,12 +221,13 @@ bluer_ugv/swallow/session/classical/keyboard/__main__.py,sha256=tdX-a8MC9ix6aQ9i
220
221
  bluer_ugv/swallow/session/classical/keyboard/classes.py,sha256=l9kfV3sqBjlHNjoBsXDL0cOwHeNVD42KMzasoBUYd7w,5415
221
222
  bluer_ugv/swallow/session/classical/keyboard/keys.py,sha256=Z27XTC2agwC_uYmzBgRKP3hNy58KWnWUxHXeOChuooc,2348
222
223
  bluer_ugv/swallow/session/classical/keyboard/testing.py,sha256=GFh-6-HkT1sYlGt-Y2traBFD8lle3C-HcvVrdzsITEo,511
223
- bluer_ugv/swallow/session/classical/motor/__init__.py,sha256=Ja9pVS6h5wnZiDvJ2IaibLcleQl3inIF_YRJg9VGKlw,323
224
+ bluer_ugv/swallow/session/classical/motor/__init__.py,sha256=l7mSv4I1kLMGapINKX1va-OeYpqPAD_qRLNn9GbklcA,401
224
225
  bluer_ugv/swallow/session/classical/motor/generic.py,sha256=VzCEqkuil-7ncyv2TxI7NMofIiLhuZGl61Ck3Yog55s,2860
225
226
  bluer_ugv/swallow/session/classical/motor/left.py,sha256=eKyEI8CqQiUTTmpNlJrXro90x2_la5KejVLgj_pXkQM,537
226
227
  bluer_ugv/swallow/session/classical/motor/rear.py,sha256=mIBpUxBeiw1me5WY3jbtMyaG8SzyCA1_SzUu6ywdy50,539
227
228
  bluer_ugv/swallow/session/classical/motor/right.py,sha256=3BwCXA6VxxyRBG3rsnRXGviS5gIda14UCqaELGMOJNk,539
228
229
  bluer_ugv/swallow/session/classical/motor/steering.py,sha256=-_-6C9cGYFgt_WH3hwTSV8jL5I_qkxc2O45Ck8SlFCo,545
230
+ bluer_ugv/swallow/session/classical/motor/void.py,sha256=rJ3wsSd7EcF4_fX1hVHsiCLDWHrIYwwCvCGzN5LPGvc,439
229
231
  bluer_ugv/swallow/session/classical/screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
232
  bluer_ugv/swallow/session/classical/screen/classes.py,sha256=EzMJOcI5b153pHYAzTeNKU82CHc9AKyNS5ZfudoBvTo,1311
231
233
  bluer_ugv/swallow/session/classical/screen/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -234,7 +236,8 @@ bluer_ugv/swallow/session/classical/screen/video/engine.py,sha256=XDKGcR2SQyFM5F
234
236
  bluer_ugv/swallow/session/classical/screen/video/player.py,sha256=XLXYVHqseZKKD-CmyW2NXzuGarf91BJGSNP7t1nMJzM,3353
235
237
  bluer_ugv/swallow/session/classical/screen/video/playlist.py,sha256=OAqPz_eOlBdWKlYDmqtD3FaO9duAbA94kr02jSbSFIo,2934
236
238
  bluer_ugv/swallow/session/classical/setpoint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
- bluer_ugv/swallow/session/classical/setpoint/classes.py,sha256=a2ACbE4oEdguuOjtrP2bIyuEpl97TK_JCTGir05KZkg,5054
239
+ bluer_ugv/swallow/session/classical/setpoint/classes.py,sha256=3Hpub9s5t1GN25eGhSINuIlCrT-C3sRmZu8FxiAsTes,5268
240
+ bluer_ugv/swallow/session/classical/setpoint/ethernet.py,sha256=F-O62lHzZYBWywzk9z2ZC8YqvSDfVKvabRrv-ZDnuVI,896
238
241
  bluer_ugv/swallow/session/classical/setpoint/steering.py,sha256=yuhW3u9YgZ756h4wyMWJYW9914d8oYRKLga67rTW-Tw,288
239
242
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
243
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py,sha256=SHCwEk_K9L0BG1X7W1JnnhTnQBGJ--TiN-QuH2Je28E,1732
@@ -247,8 +250,8 @@ bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=bVcG8V0P6Sl
247
250
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
248
251
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
249
252
  bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=yj2MY_Jo1FzeXnR_JoFAXsb9eHEVhicDiHEsUa8z03U,1525
250
- bluer_ugv-7.824.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
251
- bluer_ugv-7.824.1.dist-info/METADATA,sha256=ROcyERcqAkfCYA-ZSLFUr5J_zG0dPK6kBhLqA-Fw-rs,5612
252
- bluer_ugv-7.824.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
253
- bluer_ugv-7.824.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
254
- bluer_ugv-7.824.1.dist-info/RECORD,,
253
+ bluer_ugv-7.835.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
254
+ bluer_ugv-7.835.1.dist-info/METADATA,sha256=mhe3kXAn59-0e-ju-aTlxeVDmqD3VAilbP37eOspYlY,5612
255
+ bluer_ugv-7.835.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
256
+ bluer_ugv-7.835.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
257
+ bluer_ugv-7.835.1.dist-info/RECORD,,