bluer-ugv 7.359.1__py3-none-any.whl → 7.432.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/.abcli/swallow/dataset.sh +1 -1
- bluer_ugv/.abcli/swallow/video/play.sh +7 -0
- bluer_ugv/.abcli/swallow/video/playlist/cat.sh +14 -0
- bluer_ugv/.abcli/swallow/video/playlist/download.sh +18 -0
- bluer_ugv/.abcli/swallow/video/playlist/edit.sh +14 -0
- bluer_ugv/.abcli/swallow/video/playlist/upload.sh +9 -0
- bluer_ugv/.abcli/swallow/video/playlist.sh +15 -0
- bluer_ugv/.abcli/swallow/video.sh +15 -0
- bluer_ugv/.abcli/swallow.sh +1 -1
- bluer_ugv/.abcli/tests/help.sh +8 -0
- bluer_ugv/.abcli/tests/swallow_video_play.sh +11 -0
- bluer_ugv/.abcli/tests/swallow_video_playlist.sh +45 -0
- bluer_ugv/README/build.py +2 -2
- bluer_ugv/README/{shield → computer}/box.py +1 -1
- bluer_ugv/README/computer/docs.py +21 -0
- bluer_ugv/README/{shield → computer}/pcb.py +3 -3
- bluer_ugv/README/computer/power.py +19 -0
- bluer_ugv/README/{shield → computer}/schematics.py +1 -1
- bluer_ugv/README/{shield → computer}/testing.py +1 -1
- bluer_ugv/README/rangin/__init__.py +0 -3
- bluer_ugv/README/shortcuts.py +2 -2
- bluer_ugv/README/swallow/digital/design/__init__.py +4 -4
- bluer_ugv/__init__.py +1 -1
- bluer_ugv/config.env +3 -1
- bluer_ugv/env.py +2 -0
- bluer_ugv/help/swallow/__init__.py +2 -0
- bluer_ugv/help/swallow/video/__init__.py +0 -0
- bluer_ugv/help/swallow/video/functions.py +41 -0
- bluer_ugv/help/swallow/video/playlist.py +89 -0
- bluer_ugv/swallow/session/classical/screen/__init__.py +0 -0
- bluer_ugv/swallow/session/classical/screen/classes.py +42 -0
- bluer_ugv/swallow/session/classical/screen/video/__init__.py +0 -0
- bluer_ugv/swallow/session/classical/screen/video/__main__.py +99 -0
- bluer_ugv/swallow/session/classical/screen/video/engine.py +125 -0
- bluer_ugv/swallow/session/classical/screen/video/player.py +117 -0
- bluer_ugv/swallow/session/classical/screen/video/playlist.py +116 -0
- bluer_ugv/swallow/session/classical/session.py +11 -7
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +3 -0
- {bluer_ugv-7.359.1.dist-info → bluer_ugv-7.432.1.dist-info}/METADATA +3 -3
- {bluer_ugv-7.359.1.dist-info → bluer_ugv-7.432.1.dist-info}/RECORD +44 -25
- bluer_ugv/README/shield/docs.py +0 -17
- bluer_ugv/swallow/session/classical/screen.py +0 -11
- /bluer_ugv/README/{shield → computer}/__init__.py +0 -0
- {bluer_ugv-7.359.1.dist-info → bluer_ugv-7.432.1.dist-info}/WHEEL +0 -0
- {bluer_ugv-7.359.1.dist-info → bluer_ugv-7.432.1.dist-info}/licenses/LICENSE +0 -0
- {bluer_ugv-7.359.1.dist-info → bluer_ugv-7.432.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import shlex
|
|
2
|
+
from enum import Enum, auto
|
|
3
|
+
import subprocess
|
|
4
|
+
import time
|
|
5
|
+
import socket
|
|
6
|
+
|
|
7
|
+
from bluer_objects.graphics.screen import get_size
|
|
8
|
+
from bluer_ugv.logger import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoEngine(Enum):
|
|
12
|
+
MPV = auto()
|
|
13
|
+
VLC = auto()
|
|
14
|
+
|
|
15
|
+
def pause(self, process: subprocess.Popen):
|
|
16
|
+
# MPV: use stdin
|
|
17
|
+
if self == VideoEngine.MPV:
|
|
18
|
+
try:
|
|
19
|
+
if not process.stdin:
|
|
20
|
+
logger.error("mpv pause failed: no stdin")
|
|
21
|
+
return False
|
|
22
|
+
process.stdin.write(b"p")
|
|
23
|
+
process.stdin.flush()
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.error(f"mpv pause exception: {e}")
|
|
26
|
+
return False
|
|
27
|
+
return True
|
|
28
|
+
|
|
29
|
+
# VLC: use RC TCP
|
|
30
|
+
if self == VideoEngine.VLC:
|
|
31
|
+
try:
|
|
32
|
+
s = socket.create_connection(("127.0.0.1", 41940), 0.5)
|
|
33
|
+
s.sendall(b"pause\n")
|
|
34
|
+
s.close()
|
|
35
|
+
return True
|
|
36
|
+
except Exception as e:
|
|
37
|
+
logger.error(f"vlc pause failed: {e}")
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
logger.error(f"{self}: unknown video engine.")
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
def play_command(
|
|
44
|
+
self,
|
|
45
|
+
filename: str,
|
|
46
|
+
fullscreen: bool = True,
|
|
47
|
+
loop: bool = False,
|
|
48
|
+
audio: bool = False,
|
|
49
|
+
) -> str:
|
|
50
|
+
screen_height, screen_width = get_size()
|
|
51
|
+
logger.info("screen size: {}x{}".format(screen_height, screen_width))
|
|
52
|
+
|
|
53
|
+
if self == VideoEngine.MPV:
|
|
54
|
+
logger.info('press "q" to quit mpv.')
|
|
55
|
+
|
|
56
|
+
return " ".join(
|
|
57
|
+
[
|
|
58
|
+
"mpv",
|
|
59
|
+
"--no-border",
|
|
60
|
+
"--background=black", # FIXED
|
|
61
|
+
"--keepaspect=yes",
|
|
62
|
+
"--no-keepaspect-window",
|
|
63
|
+
"--geometry=0:0",
|
|
64
|
+
(f"--autofit={screen_width}x{screen_height}" if fullscreen else ""),
|
|
65
|
+
"--loop" if loop else "",
|
|
66
|
+
"--no-audio" if not audio else "",
|
|
67
|
+
shlex.quote(filename),
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if self == VideoEngine.VLC:
|
|
72
|
+
logger.info('press "Enter" to quit vlc.')
|
|
73
|
+
|
|
74
|
+
return " ".join(
|
|
75
|
+
[
|
|
76
|
+
"sudo -u pi",
|
|
77
|
+
"cvlc",
|
|
78
|
+
"--fullscreen",
|
|
79
|
+
"--no-video-title-show",
|
|
80
|
+
"--video-on-top",
|
|
81
|
+
"--no-osd",
|
|
82
|
+
"--loop" if loop else "",
|
|
83
|
+
"--no-audio" if not audio else "",
|
|
84
|
+
"--extraintf",
|
|
85
|
+
"rc",
|
|
86
|
+
"--rc-host=127.0.0.1:41940",
|
|
87
|
+
shlex.quote(filename),
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return "this-should-not-happen"
|
|
92
|
+
|
|
93
|
+
def stop(
|
|
94
|
+
self,
|
|
95
|
+
process: subprocess.Popen,
|
|
96
|
+
) -> bool:
|
|
97
|
+
if self == VideoEngine.MPV:
|
|
98
|
+
try:
|
|
99
|
+
if process.stdin:
|
|
100
|
+
process.stdin.write(b"q")
|
|
101
|
+
process.stdin.flush()
|
|
102
|
+
except Exception as e:
|
|
103
|
+
logger.error(f"mpv quit failed: {e}")
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
if self == VideoEngine.VLC:
|
|
107
|
+
try:
|
|
108
|
+
s = socket.create_connection(("127.0.0.1", 41940), 0.5)
|
|
109
|
+
s.sendall(b"quit\n")
|
|
110
|
+
s.close()
|
|
111
|
+
logger.info("vlc: sent 'quit' via TCP RC.")
|
|
112
|
+
except Exception as e:
|
|
113
|
+
logger.error(f"vlc rc quit failed: {e}")
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
time.sleep(0.3)
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
if process.poll() is None:
|
|
120
|
+
process.kill()
|
|
121
|
+
except Exception as e:
|
|
122
|
+
logger.warning(f"process.kill failed: {e}")
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
return True
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
import subprocess
|
|
3
|
+
import shlex
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
from bluer_options.logger import crash_report
|
|
7
|
+
from bluer_options.logger.config import log_list
|
|
8
|
+
from bluer_objects import file
|
|
9
|
+
|
|
10
|
+
from bluer_ugv.swallow.session.classical.screen.video.engine import VideoEngine
|
|
11
|
+
from bluer_ugv.logger import logger
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class VideoPlayer:
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
dryrun: bool = False,
|
|
18
|
+
engine: VideoEngine = VideoEngine.VLC,
|
|
19
|
+
):
|
|
20
|
+
self.process: Optional[subprocess.Popen] = None
|
|
21
|
+
self.current_file: Optional[str] = None
|
|
22
|
+
|
|
23
|
+
self.paused = False
|
|
24
|
+
self.dryrun = dryrun
|
|
25
|
+
assert isinstance(engine, VideoEngine)
|
|
26
|
+
self.engine: VideoEngine = engine
|
|
27
|
+
|
|
28
|
+
logger.info(
|
|
29
|
+
"{} created on {}{}.".format(
|
|
30
|
+
self.__class__.__name__,
|
|
31
|
+
self.engine.name.lower(),
|
|
32
|
+
" [dryrun]" if dryrun else "",
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def pause(self) -> bool:
|
|
37
|
+
if not self.dryrun:
|
|
38
|
+
if self.process and self.process.poll() is None:
|
|
39
|
+
if not self.engine.pause(self.process):
|
|
40
|
+
return False
|
|
41
|
+
|
|
42
|
+
logger.info(
|
|
43
|
+
"{}.{}".format(
|
|
44
|
+
self.__class__.__name__,
|
|
45
|
+
"resume" if self.paused else "pause",
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
self.paused = not self.paused
|
|
49
|
+
|
|
50
|
+
return True
|
|
51
|
+
|
|
52
|
+
def play(
|
|
53
|
+
self,
|
|
54
|
+
filename: str,
|
|
55
|
+
loop: bool = False,
|
|
56
|
+
audio: bool = False,
|
|
57
|
+
fullscreen: bool = True,
|
|
58
|
+
verbose: bool = True,
|
|
59
|
+
) -> bool:
|
|
60
|
+
if not file.exists(filename):
|
|
61
|
+
logger.error(f"file not found: {filename}")
|
|
62
|
+
return False
|
|
63
|
+
|
|
64
|
+
self.stop()
|
|
65
|
+
|
|
66
|
+
command = self.engine.play_command(
|
|
67
|
+
filename=filename,
|
|
68
|
+
fullscreen=fullscreen,
|
|
69
|
+
loop=loop,
|
|
70
|
+
audio=audio,
|
|
71
|
+
)
|
|
72
|
+
logger.info(f"running on {self.engine.name.lower()}: {command}")
|
|
73
|
+
|
|
74
|
+
if not self.dryrun:
|
|
75
|
+
try:
|
|
76
|
+
# pylint: disable=consider-using-with
|
|
77
|
+
self.process = subprocess.Popen(
|
|
78
|
+
shlex.split(command),
|
|
79
|
+
stdin=subprocess.PIPE if self.engine == VideoEngine.MPV else None,
|
|
80
|
+
stdout=None if verbose else subprocess.DEVNULL,
|
|
81
|
+
stderr=None if verbose else subprocess.DEVNULL,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
logger.info(
|
|
85
|
+
f"pid={self.process.pid}, "
|
|
86
|
+
f"stdin={self.process.stdin}, returncode={self.process.returncode}"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
except Exception as e:
|
|
90
|
+
crash_report(f"failed to run: {e}")
|
|
91
|
+
self.process = None
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
if not self.process:
|
|
95
|
+
logger.error("process is None.")
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
self.current_file = filename
|
|
99
|
+
|
|
100
|
+
logger.info(
|
|
101
|
+
"{}.play({}{})".format(
|
|
102
|
+
self.__class__.__name__,
|
|
103
|
+
"loop: " if loop else "",
|
|
104
|
+
filename,
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
return True
|
|
109
|
+
|
|
110
|
+
def stop(self) -> bool:
|
|
111
|
+
if not self.dryrun and self.process and self.process.poll() is None:
|
|
112
|
+
if not self.engine.stop(self.process):
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
self.process = None
|
|
116
|
+
logger.info(f"{self.__class__.__name__}.stop")
|
|
117
|
+
return True
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from typing import Dict, List
|
|
2
|
+
|
|
3
|
+
from bluer_options.logger.config import log_dict, log_list
|
|
4
|
+
from bluer_objects.metadata import get_from_object
|
|
5
|
+
from bluer_objects import storage, objects
|
|
6
|
+
from bluer_objects.storage.policies import DownloadPolicy
|
|
7
|
+
|
|
8
|
+
from bluer_ugv.logger import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PlayList:
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
object_name: str,
|
|
15
|
+
download: bool = True,
|
|
16
|
+
):
|
|
17
|
+
self.index: int = -1
|
|
18
|
+
|
|
19
|
+
self.object_name = object_name
|
|
20
|
+
self.download = download
|
|
21
|
+
|
|
22
|
+
if self.download:
|
|
23
|
+
storage.download(
|
|
24
|
+
self.object_name,
|
|
25
|
+
filename="metadata.yaml",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
self.messages: Dict[str, str] = get_from_object(
|
|
29
|
+
self.object_name,
|
|
30
|
+
"messages",
|
|
31
|
+
default={},
|
|
32
|
+
)
|
|
33
|
+
log_dict(
|
|
34
|
+
logger,
|
|
35
|
+
"loaded",
|
|
36
|
+
self.messages,
|
|
37
|
+
"message(s)",
|
|
38
|
+
max_count=-1,
|
|
39
|
+
max_length=-1,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
self.playlist: List[Dict[str, str]] = get_from_object(
|
|
43
|
+
self.object_name,
|
|
44
|
+
"playlist",
|
|
45
|
+
default=[],
|
|
46
|
+
)
|
|
47
|
+
log_list(
|
|
48
|
+
logger,
|
|
49
|
+
"loaded",
|
|
50
|
+
self.playlist,
|
|
51
|
+
"playlist item(s)",
|
|
52
|
+
max_count=-1,
|
|
53
|
+
max_length=-1,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
logger.info(
|
|
57
|
+
"{} created from {}.".format(
|
|
58
|
+
self.__class__.__name__,
|
|
59
|
+
self.object_name,
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def get(
|
|
64
|
+
self,
|
|
65
|
+
keyword: int | str = "loading",
|
|
66
|
+
what: str = "filename",
|
|
67
|
+
) -> str:
|
|
68
|
+
filename = f"{keyword.__class__.__name__}-not-supported"
|
|
69
|
+
|
|
70
|
+
if isinstance(keyword, int):
|
|
71
|
+
filename = "bad-index-{}-from-{}".format(
|
|
72
|
+
keyword,
|
|
73
|
+
len(self.playlist),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if 0 <= keyword < len(self.playlist):
|
|
77
|
+
filename = self.playlist[keyword].get(
|
|
78
|
+
what,
|
|
79
|
+
f"{what}-not-found",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if isinstance(keyword, str):
|
|
83
|
+
filename = f"{keyword}-not-found"
|
|
84
|
+
|
|
85
|
+
if keyword.isnumeric():
|
|
86
|
+
return self.get(int(keyword), what=what)
|
|
87
|
+
|
|
88
|
+
if keyword in self.messages:
|
|
89
|
+
filename = self.messages[keyword].get(
|
|
90
|
+
what,
|
|
91
|
+
f"{what}-not-found",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if self.download:
|
|
95
|
+
storage.download(
|
|
96
|
+
self.object_name,
|
|
97
|
+
filename=filename,
|
|
98
|
+
policy=DownloadPolicy.DOESNT_EXIST,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
return objects.path_of(
|
|
102
|
+
filename=filename,
|
|
103
|
+
object_name=self.object_name,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def next(self):
|
|
107
|
+
self.index += 1
|
|
108
|
+
if self.index >= len(self.playlist):
|
|
109
|
+
self.index = 0
|
|
110
|
+
|
|
111
|
+
logger.info(
|
|
112
|
+
"{}: video #{}".format(
|
|
113
|
+
self.__class__.__name__,
|
|
114
|
+
self.index,
|
|
115
|
+
)
|
|
116
|
+
)
|
|
@@ -24,7 +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
|
+
from bluer_ugv.swallow.session.classical.screen.classes import ClassicalScreen
|
|
28
28
|
from bluer_ugv.swallow.session.classical.ultrasonic_sensor.classes import (
|
|
29
29
|
ClassicalUltrasonicSensor,
|
|
30
30
|
)
|
|
@@ -114,6 +114,8 @@ class ClassicalSession:
|
|
|
114
114
|
object_name=self.object_name,
|
|
115
115
|
)
|
|
116
116
|
|
|
117
|
+
self.screen = ClassicalScreen()
|
|
118
|
+
|
|
117
119
|
logger.info(
|
|
118
120
|
"{}: created for {}".format(
|
|
119
121
|
self.__class__.__name__,
|
|
@@ -127,12 +129,10 @@ class ClassicalSession:
|
|
|
127
129
|
self.ultrasonic_sensor.stop()
|
|
128
130
|
self.camera.stop()
|
|
129
131
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
]:
|
|
135
|
-
thing.cleanup()
|
|
132
|
+
self.motor1.cleanup()
|
|
133
|
+
self.motor2.cleanup()
|
|
134
|
+
|
|
135
|
+
self.camera.cleanup()
|
|
136
136
|
|
|
137
137
|
GPIO.cleanup()
|
|
138
138
|
|
|
@@ -156,12 +156,15 @@ class ClassicalSession:
|
|
|
156
156
|
loop_frequency,
|
|
157
157
|
)
|
|
158
158
|
|
|
159
|
+
self.screen.cleanup()
|
|
160
|
+
|
|
159
161
|
logger.info(f"{self.__class__.__name__}.cleanup")
|
|
160
162
|
|
|
161
163
|
def initialize(self) -> bool:
|
|
162
164
|
return all(
|
|
163
165
|
thing.initialize()
|
|
164
166
|
for thing in [
|
|
167
|
+
self.screen,
|
|
165
168
|
self.push_button,
|
|
166
169
|
self.leds,
|
|
167
170
|
self.motor1,
|
|
@@ -183,6 +186,7 @@ class ClassicalSession:
|
|
|
183
186
|
self.motor1,
|
|
184
187
|
self.motor2,
|
|
185
188
|
self.leds,
|
|
189
|
+
self.screen,
|
|
186
190
|
]:
|
|
187
191
|
self.timing.start(thing.__class__.__name__)
|
|
188
192
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bluer_ugv
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.432.1
|
|
4
4
|
Summary: 🐬 AI x UGV.
|
|
5
5
|
Home-page: https://github.com/kamangir/bluer-ugv
|
|
6
6
|
Author: Arash Abadpour (Kamangir)
|
|
@@ -47,7 +47,7 @@ pip install bluer_ugv
|
|
|
47
47
|
|
|
48
48
|
| | |
|
|
49
49
|
| --- | --- |
|
|
50
|
-
| [`
|
|
50
|
+
| [`computer`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/computer) [](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) [](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/UGVs) |
|
|
51
51
|
| [`terraform`](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/swallow/digital/design/terraform.md) [](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) [](https://github.com/kamangir/bluer-ugv/blob/main/bluer_ugv/docs/validations) |
|
|
52
52
|
|
|
53
53
|
## aliases
|
|
@@ -64,7 +64,7 @@ pip install bluer_ugv
|
|
|
64
64
|
|
|
65
65
|
[](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [](https://pypi.org/project/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.
|
|
67
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.432.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,7 +1,7 @@
|
|
|
1
|
-
bluer_ugv/__init__.py,sha256=
|
|
1
|
+
bluer_ugv/__init__.py,sha256=GkG_nlKhoHSaY6GEHQ6nNgyJ19rpC9aW_3R4U-1aBeY,288
|
|
2
2
|
bluer_ugv/__main__.py,sha256=77TquqyMca7qHk0XtCixGVyzfW3_9ywnl5oXEPERlls,374
|
|
3
|
-
bluer_ugv/config.env,sha256=
|
|
4
|
-
bluer_ugv/env.py,sha256=
|
|
3
|
+
bluer_ugv/config.env,sha256=DvOq_s3WEo2qC0PF9jcrx_6NM17zggxBapxgCEg5nZ0,995
|
|
4
|
+
bluer_ugv/env.py,sha256=wep0iD09RRfpIb-ZGlP9kt8UATVLAjM9WytMGB8IyMo,1821
|
|
5
5
|
bluer_ugv/host.py,sha256=DpdJCvBpUfP9LkZgcH4BcdLGD-WZUvbTsjvMfPtS8uY,292
|
|
6
6
|
bluer_ugv/logger.py,sha256=faY6GL6xfZAzlZ1aJ-MEHuPRJZNx8PYS4jMyY3xuxMw,98
|
|
7
7
|
bluer_ugv/sample.env,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -11,14 +11,15 @@ bluer_ugv/.abcli/actions.sh,sha256=SqOmx12IOMopT2PgiHgAu5BwLgIi92I98LZ64dZSsXw,2
|
|
|
11
11
|
bluer_ugv/.abcli/aka.sh,sha256=RHDU_JbEEL2B0vvvRJ3NVSsRSEjSu09jNY85n7DLe-k,21
|
|
12
12
|
bluer_ugv/.abcli/alias.sh,sha256=WgSjjtC6rCqs7kChT-89dILSmp4f79R9iY3wYkRPSkY,77
|
|
13
13
|
bluer_ugv/.abcli/bluer_UGV.sh,sha256=d1R6TQgIQugKeUK3RZbxgm-6d9QqkJwwoPCQKOC8Xb0,250
|
|
14
|
-
bluer_ugv/.abcli/swallow.sh,sha256=
|
|
15
|
-
bluer_ugv/.abcli/swallow/dataset.sh,sha256=
|
|
14
|
+
bluer_ugv/.abcli/swallow.sh,sha256=b3LpA-OSCa7ykRtLnWDQYrqmOvMfoP15al90krLmb2I,319
|
|
15
|
+
bluer_ugv/.abcli/swallow/dataset.sh,sha256=rHRTCShdP3Uls5ZmTKhRzQHX6a5bZvi8Cj1QDpO4tH4,343
|
|
16
16
|
bluer_ugv/.abcli/swallow/debug.sh,sha256=JVjExhotePW3gZG2MUS6IzbXVQwMAefKYJiSP88wqlk,559
|
|
17
17
|
bluer_ugv/.abcli/swallow/env.sh,sha256=5rKCdZhrQa_9Lr96j1h7XrWBcf0YEeV3w3o0vLWGd0M,360
|
|
18
18
|
bluer_ugv/.abcli/swallow/keyboard.sh,sha256=RYR5vgV0C1SATqekQ_F6Lr6Ums0IAkH9THX2ZPcitoY,402
|
|
19
19
|
bluer_ugv/.abcli/swallow/select_target.sh,sha256=fwHmKbVcn_OEW4q-cjNc8Eyi6hOi1pMAb6x5tW8_lb0,183
|
|
20
20
|
bluer_ugv/.abcli/swallow/session.sh,sha256=sgshMG8KOeSePa9CELbf9eRD5lCXUXCU-oqASx0NAQ4,1558
|
|
21
21
|
bluer_ugv/.abcli/swallow/ultrasonic.sh,sha256=GqnVn4u-FFC8SVsCYHiwABBDkgALe4mgRMloitlfeP8,380
|
|
22
|
+
bluer_ugv/.abcli/swallow/video.sh,sha256=gEFF3YfKWFkfg8gYkwynQW8U_89YP6z0giZfDEYjsPY,360
|
|
22
23
|
bluer_ugv/.abcli/swallow/dataset/combine.sh,sha256=OYS-9ONRhXuP41Z0z1A5-ay6bqLLSsLmVOUZNvwRnrk,965
|
|
23
24
|
bluer_ugv/.abcli/swallow/dataset/download.sh,sha256=4Br0hYqENIEYm15yTJGJeHFNfVNFozQf1qg6US8KYlY,587
|
|
24
25
|
bluer_ugv/.abcli/swallow/dataset/edit.sh,sha256=ujhKhv3XIpkqcahnp01JkL4WXaOgRp9gNu7eZpZSYaA,595
|
|
@@ -30,50 +31,59 @@ bluer_ugv/.abcli/swallow/env/set.sh,sha256=hMl5qO_nsV_C3Yvn4KDpw2lY7QD8aESzPsIH0
|
|
|
30
31
|
bluer_ugv/.abcli/swallow/keyboard/test.sh,sha256=B04AO-Er3_utzULPziyKD0aybuN2bry7h9wrQBEJ0tA,218
|
|
31
32
|
bluer_ugv/.abcli/swallow/ultrasonic/review.sh,sha256=XoKwUliTcH-yTHrIo1cc9RSxL3tYQsBfWf1XOJ6YtOI,717
|
|
32
33
|
bluer_ugv/.abcli/swallow/ultrasonic/test.sh,sha256=WRq4jnm2lv6q7fAw-_6Xg7DD8kgki48t8ilwXA-SsBM,582
|
|
34
|
+
bluer_ugv/.abcli/swallow/video/play.sh,sha256=Y4HN9hNbqPYKhm2jWUAXFl3tJg-B3nvftH9fkGr0TS8,160
|
|
35
|
+
bluer_ugv/.abcli/swallow/video/playlist.sh,sha256=ZL1qO1zKm7zO-PVdl2F67lIPpy_W4I_q_SFmAU_Egjc,381
|
|
36
|
+
bluer_ugv/.abcli/swallow/video/playlist/cat.sh,sha256=JiYq9R3lmw5pxVYvnA79LheiHuP1edQQu_AxlFdq7wk,401
|
|
37
|
+
bluer_ugv/.abcli/swallow/video/playlist/download.sh,sha256=_HsWoW3rtLWMZpAxd2iemgTsYYiy3GPHvC5LHSu-vdw,457
|
|
38
|
+
bluer_ugv/.abcli/swallow/video/playlist/edit.sh,sha256=_l-XpJOybxIkfcE797DBXwlcBcWSZqzTwIEGxk14-BY,403
|
|
39
|
+
bluer_ugv/.abcli/swallow/video/playlist/upload.sh,sha256=8yGQtenNTNPQvifffED0FCP4Rjz0jHHvaDdcTv-vn9M,206
|
|
33
40
|
bluer_ugv/.abcli/tests/README.sh,sha256=w1xjPWgCfWbLtON_LEn2cvSmPLulzm7kTBPEC3LJixs,142
|
|
34
|
-
bluer_ugv/.abcli/tests/help.sh,sha256=
|
|
41
|
+
bluer_ugv/.abcli/tests/help.sh,sha256=A8xHFj01T1y1iQ8HvwKbuEacvaC4Xo9uIr_cX9qocfY,1467
|
|
35
42
|
bluer_ugv/.abcli/tests/swallow_dataset_combine.sh,sha256=tXjZj5iOOmCz3ito9lBDYjaAvR2odNzs2LRXsrM6d6c,291
|
|
36
43
|
bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh,sha256=Ff4V7fi-h1myRT9ajjaKXesNrpaxLZMGDidBT8G31Kw,360
|
|
37
44
|
bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh,sha256=N3Iq-zJV2OfEoft44D1BBLOlrkAbUDN_Rp_sAmjCEVk,311
|
|
38
45
|
bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh,sha256=IPWm1El6fyQl66AgwF2v-j2ALW9cfmAfsPRg5Xygk2U,354
|
|
39
46
|
bluer_ugv/.abcli/tests/swallow_dataset_edit.sh,sha256=01wLHLd35pPTUmMxFT_ugkwLOAFAYF_3CJijq5RLxBY,221
|
|
40
47
|
bluer_ugv/.abcli/tests/swallow_dataset_list.sh,sha256=DPjikrMLMl0oJTHBV4EyYmkMZnMjEmwosJRocLIJGz0,256
|
|
48
|
+
bluer_ugv/.abcli/tests/swallow_video_play.sh,sha256=38AHfA0zw4NYrAYFi2ypVk4eZ65k91DnlyQ4vWp1jOs,180
|
|
49
|
+
bluer_ugv/.abcli/tests/swallow_video_playlist.sh,sha256=SRJOtziqmh7Gnuaq1BQyyyqPoZDVq5-sy0tgWYnnfII,827
|
|
41
50
|
bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh,sha256=4LxfOGRAUJsZ5dnxrkwXCjWmkgQWSeqck-UYyza3aw8,243
|
|
42
51
|
bluer_ugv/.abcli/tests/version.sh,sha256=7nVT4lERxIe-GkuDn86nfur9E_WGbvWtet_AJtr2S48,147
|
|
43
52
|
bluer_ugv/.abcli/ugv/git.sh,sha256=U5p_5qrNwLw8O7HfHu7QZgLblbDc6Z6lIumgKwu3mzY,299
|
|
44
53
|
bluer_ugv/README/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
54
|
bluer_ugv/README/alias.py,sha256=MdTRUMg3rLbWS_AQz1WXwbkEjKEjBx5uM_fDwYmMGFY,173
|
|
46
55
|
bluer_ugv/README/beast.py,sha256=6sOpm4vNXxNtNMZszgiuqqJaBBWG02WaSgKfbdt7J4E,57
|
|
47
|
-
bluer_ugv/README/build.py,sha256=
|
|
56
|
+
bluer_ugv/README/build.py,sha256=ZMLb4cRdEo7jc_ZrVQaxR_20l8TxhVEw65uWizUz5Bo,1495
|
|
48
57
|
bluer_ugv/README/consts.py,sha256=bQ98yk28E8-EBh2wUgMNr-sZ90IC3q7BmTzJe5XCS3g,257
|
|
49
58
|
bluer_ugv/README/items.py,sha256=esAHk5pAXAEV1XBaRjnCqmD_42HFcsvZwO9EljsmiZc,2221
|
|
50
59
|
bluer_ugv/README/releases.py,sha256=0_nYEXDoCiIyzoVdl8DtKBWnN5aE9BsmEbeQ5ZySUg8,116
|
|
51
60
|
bluer_ugv/README/root.py,sha256=h1piDAmlkdfbKZeZTW3HWzsW4VpKG6L776oYK7hC-J0,296
|
|
52
|
-
bluer_ugv/README/shortcuts.py,sha256=
|
|
61
|
+
bluer_ugv/README/shortcuts.py,sha256=vjE1QUdZg4omCoqy3BoTXQUbe6c5ERyq2Hjbl5TDw28,1316
|
|
53
62
|
bluer_ugv/README/arzhang/__init__.py,sha256=va9n90xUAEkO1-161yciOdmqOTJ2RaBOi-5yTA6IEPs,350
|
|
54
63
|
bluer_ugv/README/arzhang/algo.py,sha256=om7gokRGJ5X_yMi40r9SgoNav3C4Pcd7S7TuQv58ccs,134
|
|
55
64
|
bluer_ugv/README/arzhang/consts.py,sha256=o7IDyn7hCXFsHQuAX_qM196R1vEkTcxyC9K5TOaB4G4,239
|
|
56
65
|
bluer_ugv/README/arzhang/design.py,sha256=1DtC1GQRKhM7wUWVSW2zsg6ww6y1RlcFr5iQYYOQwpo,1303
|
|
57
66
|
bluer_ugv/README/arzhang/flag.py,sha256=aTSQXk_sK09Wj7UCtAFkqruA0jwTvySHycG5pMu6Kp0,553
|
|
58
67
|
bluer_ugv/README/arzhang/items.py,sha256=kMbopWBiwSelO4wFB0hD65Ndty_XXqEJBpJVibRUawU,1657
|
|
68
|
+
bluer_ugv/README/computer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
|
+
bluer_ugv/README/computer/box.py,sha256=d_VVOZYYRYWrUAZQjnfzXX_tmb_mKMONe7IVqJqifJI,745
|
|
70
|
+
bluer_ugv/README/computer/docs.py,sha256=v2h2suPieoyPR4bQBlitBjpPtC8z3NI84Nd-H40aCmA,467
|
|
71
|
+
bluer_ugv/README/computer/pcb.py,sha256=E2eZ9Xp_y-utJuIps4lmj_Z6wxq77zOG3zuwhaLLT0I,1498
|
|
72
|
+
bluer_ugv/README/computer/power.py,sha256=NDr3vWM4TGARlvRJuWg7DhkWAitBxnCorxrV73Xxn28,390
|
|
73
|
+
bluer_ugv/README/computer/schematics.py,sha256=1ZPKmuEBWwYb7_L1uzjK-14e-9qeBENpZCdgnbu6yeI,378
|
|
74
|
+
bluer_ugv/README/computer/testing.py,sha256=fJVpPxeg3KNtvRg15j14GDkzXQqPoFUVGRtGp7_Xk2Y,428
|
|
59
75
|
bluer_ugv/README/eagle/__init__.py,sha256=jDRkrWZL4ZNOS3jwTs3uHKAbrXQjbVimYSjC4ShX8ww,647
|
|
60
76
|
bluer_ugv/README/eagle/consts.py,sha256=u92JMMAWnB8ayWxKNTiqz_leAAszv427m4nZjJYJq4Y,116
|
|
61
77
|
bluer_ugv/README/eagle/items.py,sha256=ombp026VFK_w1oP7p9X6jcRskr4jTDOXqoxD0UB5Rvo,320
|
|
62
78
|
bluer_ugv/README/fire/__init__.py,sha256=JZcj-UQvUpDFOOW-uPVf63dvseGnEKVBeydHrQwIpnU,643
|
|
63
79
|
bluer_ugv/README/fire/consts.py,sha256=xM3UXPvQlyuxbqjhs3wrqAH7rMgebpW1KabBZJ3I-pI,114
|
|
64
80
|
bluer_ugv/README/fire/items.py,sha256=1r7sUjj0SrrPfHCadFEBORw3x0l6mXwk1T9Eu-QDzZk,74
|
|
65
|
-
bluer_ugv/README/rangin/__init__.py,sha256=
|
|
81
|
+
bluer_ugv/README/rangin/__init__.py,sha256=zLC9N7x6_e0Gxj52TWb9nTgCDo9nKYViOhrAxPjAvH4,2480
|
|
66
82
|
bluer_ugv/README/rangin/consts.py,sha256=QOtHe3TL9XoVQk3KD8bxBCdnXXjjnyCtobsYqYVPJ7s,270
|
|
67
83
|
bluer_ugv/README/rangin/items.py,sha256=PZST5IQl4fTHG5RIe3gJGa2dqiH4tXa0WXPGkhwKbgw,243
|
|
68
84
|
bluer_ugv/README/ravin/__init__.py,sha256=T_JGY6XXeiutQ80JRCaxSIx-lkovRoXj6Vl_g1eXtq0,243
|
|
69
85
|
bluer_ugv/README/ravin/consts.py,sha256=ofmtRHvct6qYK-MAc5clBI9sGFEIVhITx3PAxra61JA,54
|
|
70
86
|
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
|
|
77
87
|
bluer_ugv/README/swallow/__init__.py,sha256=Xp3jXDG67omwp8pcVKerq-P6eZ853EDHIfhrxM9-Ew8,250
|
|
78
88
|
bluer_ugv/README/swallow/analog.py,sha256=NmFEukeKepYRtIc0UT_F96uRKKukFM585UA6mlaW9ZM,360
|
|
79
89
|
bluer_ugv/README/swallow/consts.py,sha256=VKu8qhDqLiGICErKpW-FMUtHGDM0P28teR8eKM8gFc4,376
|
|
@@ -82,7 +92,7 @@ bluer_ugv/README/swallow/digital/__init__.py,sha256=kyb46k4FsGZKgWW2QRM33pLUQl5t
|
|
|
82
92
|
bluer_ugv/README/swallow/digital/algo/__init__.py,sha256=iHwEi_kwQUk0E3YtGKDrjTKV-PDRuDpAo69IMCE8uZ4,711
|
|
83
93
|
bluer_ugv/README/swallow/digital/algo/navigation.py,sha256=Hg_tkGYnE8qbM37Go4KlAaO-sNAtOBmaNZlPda45BCc,1780
|
|
84
94
|
bluer_ugv/README/swallow/digital/algo/yolo.py,sha256=NlDISZ9LOUmMAzdEYzVYOrIwbDGdM8euMURlBOGACUk,930
|
|
85
|
-
bluer_ugv/README/swallow/digital/design/__init__.py,sha256=
|
|
95
|
+
bluer_ugv/README/swallow/digital/design/__init__.py,sha256=9ScXJn0UdHYVYiWyTV0Uz4EmWoZ-7_s1bJQiGgCLAwA,2751
|
|
86
96
|
bluer_ugv/README/swallow/digital/design/mechanical.py,sha256=OwgMrFIpRA-RR9CwurXaif09GCd6_i3zGuAfkH0jtsM,983
|
|
87
97
|
bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py,sha256=VefIdTUXnsxVj3rmjsguV7N2BD9tPRiiaHjjRl84QUM,1517
|
|
88
98
|
bluer_ugv/README/ugvs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -128,13 +138,16 @@ bluer_ugv/help/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
|
|
128
138
|
bluer_ugv/help/__main__.py,sha256=ww3p0cIRZm-SDODZ_fYAzPV_-nucxtidjK1IP2idW8g,229
|
|
129
139
|
bluer_ugv/help/functions.py,sha256=_JcncL82A-6m9P9J6MX6Z_FtZ09k6HWuirozKl48xXY,367
|
|
130
140
|
bluer_ugv/help/git.py,sha256=4CcaA8lHoplrrFgF5lolwVT79SLr3gE2iqXpAIfzH64,319
|
|
131
|
-
bluer_ugv/help/swallow/__init__.py,sha256=
|
|
141
|
+
bluer_ugv/help/swallow/__init__.py,sha256=t65DuR-96-29wNylRysfId86OLNxsW4AM2YnN4V4DbM,755
|
|
132
142
|
bluer_ugv/help/swallow/dataset.py,sha256=59D5XLQG1PRWfPwfM73Jz1-f0qh_cO0q18qLtsxXtj0,2495
|
|
133
143
|
bluer_ugv/help/swallow/debug.py,sha256=70krqg-YtjxPjPwWnx4J1Fxlvw46hHyAYq7pA7yPt50,481
|
|
134
144
|
bluer_ugv/help/swallow/env.py,sha256=AwNGF7ZcwQz7-Q8uKaLuajyIMXpi9yGMS27Xq0-QvUs,1325
|
|
135
145
|
bluer_ugv/help/swallow/keyboard.py,sha256=YNkGWvE7tN3agCaL2R30FSIF2zw6oXa5ZJdnTJQA3Hk,518
|
|
136
146
|
bluer_ugv/help/swallow/select_target.py,sha256=s1-v2IyT6thAncIzo4wKnU8hFJ-rDyi-IDzx2kMaJrs,390
|
|
137
147
|
bluer_ugv/help/swallow/ultrasonic_sensor.py,sha256=rhxHQWDU7orCvqC_TeJWMCJFrm4qyJyHdiUIUIpZmhU,1223
|
|
148
|
+
bluer_ugv/help/swallow/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
149
|
+
bluer_ugv/help/swallow/video/functions.py,sha256=Ek0wrBUCNXSbBGIgMwD-8GUuULvSzL4zDv4lD8SGe6I,939
|
|
150
|
+
bluer_ugv/help/swallow/video/playlist.py,sha256=Wg09FONWjuKOFYxDD7Ni3OjrSf8cnadscth0xU1NjfI,1663
|
|
138
151
|
bluer_ugv/swallow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
152
|
bluer_ugv/swallow/__main__.py,sha256=eQPKYwnIG5Brr39-mhyuLSW5ghj91FAhqwrO4kLLKi0,1199
|
|
140
153
|
bluer_ugv/swallow/debug.py,sha256=0M-XjKqTnm-sNGaHWeuaM6tlkSSEQNqaLpmozNHALw0,2497
|
|
@@ -151,8 +164,7 @@ bluer_ugv/swallow/session/classical/mode.py,sha256=6rFe1IIpfijuI7Xd-wcGKhYQ7EdQx
|
|
|
151
164
|
bluer_ugv/swallow/session/classical/mousepad.py,sha256=LI7yvmtrZZaGUgPGpxNU7zcPkW8D5ykHlY_O-4H2STs,1871
|
|
152
165
|
bluer_ugv/swallow/session/classical/position.py,sha256=gNeNzNpUG8zkDrcwibxaYStPNKUN1_DV5RjHu_pHMIg,913
|
|
153
166
|
bluer_ugv/swallow/session/classical/push_button.py,sha256=s8sPart_dECjLK-gfsJi0UorRYcFYf3ofLqjmG8PoA8,2397
|
|
154
|
-
bluer_ugv/swallow/session/classical/
|
|
155
|
-
bluer_ugv/swallow/session/classical/session.py,sha256=lHchI7OB9S65K5QGvqPYfFu90q3SN8eNlXZiXSdcvVI,5444
|
|
167
|
+
bluer_ugv/swallow/session/classical/session.py,sha256=n3Q9G3Qdbw8Cb12yaEj5HLfuyJm70kZi_DVJqxItD8E,5532
|
|
156
168
|
bluer_ugv/swallow/session/classical/camera/__init__.py,sha256=KOehn6qHKj3EMbV5uGXKIfN_v4D5-E2xH9aCWqbNlAI,375
|
|
157
169
|
bluer_ugv/swallow/session/classical/camera/generic.py,sha256=xmztClNYkosYo2TcIS2Ax4Bessc8lx4hlt9LnMcobfU,1216
|
|
158
170
|
bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=HoeTlifGEfnedb6o8P-O0TcP1bNDRJ0M7vWupQh1pL4,6790
|
|
@@ -169,6 +181,13 @@ bluer_ugv/swallow/session/classical/motor/left.py,sha256=eKyEI8CqQiUTTmpNlJrXro9
|
|
|
169
181
|
bluer_ugv/swallow/session/classical/motor/rear.py,sha256=mIBpUxBeiw1me5WY3jbtMyaG8SzyCA1_SzUu6ywdy50,539
|
|
170
182
|
bluer_ugv/swallow/session/classical/motor/right.py,sha256=3BwCXA6VxxyRBG3rsnRXGviS5gIda14UCqaELGMOJNk,539
|
|
171
183
|
bluer_ugv/swallow/session/classical/motor/steering.py,sha256=-_-6C9cGYFgt_WH3hwTSV8jL5I_qkxc2O45Ck8SlFCo,545
|
|
184
|
+
bluer_ugv/swallow/session/classical/screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
185
|
+
bluer_ugv/swallow/session/classical/screen/classes.py,sha256=5lS7vtDk2YeEPEd6ywowgiPgE2iYz9WIWoyBsCcUbGM,1156
|
|
186
|
+
bluer_ugv/swallow/session/classical/screen/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
187
|
+
bluer_ugv/swallow/session/classical/screen/video/__main__.py,sha256=2uyKoxnZ9LwYWlEP_KDEyvIrwRL31SjK7I-xvM-eZpI,2190
|
|
188
|
+
bluer_ugv/swallow/session/classical/screen/video/engine.py,sha256=-P_VSdqBjP2KBooMzcc-izWP-GMfl4q07t4Fyc6CQH4,3752
|
|
189
|
+
bluer_ugv/swallow/session/classical/screen/video/player.py,sha256=XLXYVHqseZKKD-CmyW2NXzuGarf91BJGSNP7t1nMJzM,3353
|
|
190
|
+
bluer_ugv/swallow/session/classical/screen/video/playlist.py,sha256=OAqPz_eOlBdWKlYDmqtD3FaO9duAbA94kr02jSbSFIo,2934
|
|
172
191
|
bluer_ugv/swallow/session/classical/setpoint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
173
192
|
bluer_ugv/swallow/session/classical/setpoint/classes.py,sha256=a2ACbE4oEdguuOjtrP2bIyuEpl97TK_JCTGir05KZkg,5054
|
|
174
193
|
bluer_ugv/swallow/session/classical/setpoint/steering.py,sha256=yuhW3u9YgZ756h4wyMWJYW9914d8oYRKLga67rTW-Tw,288
|
|
@@ -178,13 +197,13 @@ bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py,sha256=glWK3p5l
|
|
|
178
197
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py,sha256=eP5Kb6aGqOAcOBBlhGvSWbUL_hKJZ8w5ggwkndzKBqo,227
|
|
179
198
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py,sha256=v_yCBzg4uvnra4Yy_M3Ngaab80PBEbkp2SHfaWfXgb8,3720
|
|
180
199
|
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=
|
|
200
|
+
bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py,sha256=jqDVuYjWzyK-5n71fNmMCxURst0CyrhzjnLhEsWtnps,10317
|
|
182
201
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=bVcG8V0P6SlJz18za6OvVEPrkdsiR_78CGiAxrpcPQ4,1575
|
|
183
202
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
|
|
184
203
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
|
|
185
204
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=yj2MY_Jo1FzeXnR_JoFAXsb9eHEVhicDiHEsUa8z03U,1525
|
|
186
|
-
bluer_ugv-7.
|
|
187
|
-
bluer_ugv-7.
|
|
188
|
-
bluer_ugv-7.
|
|
189
|
-
bluer_ugv-7.
|
|
190
|
-
bluer_ugv-7.
|
|
205
|
+
bluer_ugv-7.432.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
|
|
206
|
+
bluer_ugv-7.432.1.dist-info/METADATA,sha256=ES_8eyAvSlkHJYb4thzErcVoYJvGKTfVqB_N_9GeTaM,5579
|
|
207
|
+
bluer_ugv-7.432.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
208
|
+
bluer_ugv-7.432.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
|
|
209
|
+
bluer_ugv-7.432.1.dist-info/RECORD,,
|
bluer_ugv/README/shield/docs.py
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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
|
-
)
|
|
File without changes
|
|
File without changes
|