bluer-ugv 7.176.1__py3-none-any.whl → 7.196.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/env/set.sh +2 -0
- bluer_ugv/.abcli/swallow/keyboard/test.sh +9 -0
- bluer_ugv/.abcli/swallow/keyboard.sh +17 -0
- bluer_ugv/.abcli/tests/help.sh +5 -1
- bluer_ugv/README/swallow/digital/design/__init__.py +7 -1
- bluer_ugv/__init__.py +1 -1
- bluer_ugv/help/swallow/__init__.py +2 -0
- bluer_ugv/help/swallow/env.py +2 -1
- bluer_ugv/help/swallow/keyboard.py +33 -0
- bluer_ugv/swallow/session/classical/camera/generic.py +1 -1
- bluer_ugv/swallow/session/classical/camera/navigation.py +1 -1
- bluer_ugv/swallow/session/classical/camera/tracking.py +1 -1
- bluer_ugv/swallow/session/classical/camera/yolo.py +1 -1
- bluer_ugv/swallow/session/classical/keyboard/__init__.py +0 -0
- bluer_ugv/swallow/session/classical/keyboard/__main__.py +31 -0
- bluer_ugv/swallow/session/classical/{keyboard.py → keyboard/classes.py} +24 -35
- bluer_ugv/swallow/session/classical/keyboard/keys.py +81 -0
- bluer_ugv/swallow/session/classical/keyboard/testing.py +22 -0
- bluer_ugv/swallow/session/classical/session.py +1 -1
- bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +1 -1
- {bluer_ugv-7.176.1.dist-info → bluer_ugv-7.196.1.dist-info}/METADATA +2 -2
- {bluer_ugv-7.176.1.dist-info → bluer_ugv-7.196.1.dist-info}/RECORD +25 -18
- {bluer_ugv-7.176.1.dist-info → bluer_ugv-7.196.1.dist-info}/WHEEL +0 -0
- {bluer_ugv-7.176.1.dist-info → bluer_ugv-7.196.1.dist-info}/licenses/LICENSE +0 -0
- {bluer_ugv-7.176.1.dist-info → bluer_ugv-7.196.1.dist-info}/top_level.txt +0 -0
|
@@ -5,6 +5,8 @@ function bluer_ugv_swallow_env_set() {
|
|
|
5
5
|
|
|
6
6
|
if [[ "$var_name" == "steering" ]]; then
|
|
7
7
|
var_name=BLUER_SBC_SWALLOW_HAS_STEERING
|
|
8
|
+
elif [[ "$var_name" == "full_keyboard" ]]; then
|
|
9
|
+
var_name=BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD
|
|
8
10
|
else
|
|
9
11
|
bluer_ai_log_error "$var_name: var not found."
|
|
10
12
|
return 1
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_keyboard() {
|
|
4
|
+
local task=$1
|
|
5
|
+
|
|
6
|
+
local function_name=bluer_ugv_swallow_keyboard_$task
|
|
7
|
+
if [[ $(type -t $function_name) == "function" ]]; then
|
|
8
|
+
$function_name "${@:2}"
|
|
9
|
+
return
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
sudo -E $(which python3) \
|
|
13
|
+
-m bluer_ugv.swallow.session.classical.keyboard \
|
|
14
|
+
"$@"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
bluer_ai_source_caller_suffix_path /keyboard
|
bluer_ugv/.abcli/tests/help.sh
CHANGED
|
@@ -13,12 +13,16 @@ function test_bluer_ugv_help() {
|
|
|
13
13
|
"@swallow dataset list" \
|
|
14
14
|
"@swallow dataset upload" \
|
|
15
15
|
\
|
|
16
|
+
"@swallow debug" \
|
|
17
|
+
\
|
|
16
18
|
"@swallow env" \
|
|
17
19
|
"@swallow env cp" \
|
|
18
20
|
"@swallow env list" \
|
|
19
21
|
"@swallow env set" \
|
|
20
22
|
\
|
|
21
|
-
"@swallow
|
|
23
|
+
"@swallow keyboard" \
|
|
24
|
+
"@swallow keyboard test" \
|
|
25
|
+
\
|
|
22
26
|
"@swallow select_target" \
|
|
23
27
|
\
|
|
24
28
|
"@swallow ultrasonic" \
|
|
@@ -8,6 +8,7 @@ from bluer_ugv.README.swallow.consts import (
|
|
|
8
8
|
)
|
|
9
9
|
from bluer_ugv.designs.swallow.parts import dict_of_parts
|
|
10
10
|
from bluer_ugv.README.swallow.digital.design import mechanical, ultrasonic_sensor
|
|
11
|
+
from bluer_ugv.swallow.session.classical.keyboard.keys import ControlKeys
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
docs = (
|
|
@@ -20,11 +21,16 @@ docs = (
|
|
|
20
21
|
},
|
|
21
22
|
{
|
|
22
23
|
"path": "../docs/swallow/digital/design/operation.md",
|
|
24
|
+
"cols": 2,
|
|
23
25
|
"items": ImageItems(
|
|
24
26
|
{
|
|
25
|
-
f"{swallow_assets2}/
|
|
27
|
+
f"{swallow_assets2}/20251019_121811.jpg": "",
|
|
28
|
+
f"{swallow_assets2}/20251019_121842.jpg": "",
|
|
26
29
|
}
|
|
27
30
|
),
|
|
31
|
+
"macros": {
|
|
32
|
+
"keys:::": ControlKeys.as_table(),
|
|
33
|
+
},
|
|
28
34
|
},
|
|
29
35
|
{
|
|
30
36
|
"path": "../docs/swallow/digital/design/parts.md",
|
bluer_ugv/__init__.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from bluer_ugv.help.swallow.dataset import help_functions as help_dataset
|
|
2
2
|
from bluer_ugv.help.swallow.debug import help_debug
|
|
3
3
|
from bluer_ugv.help.swallow.env import help_functions as help_env
|
|
4
|
+
from bluer_ugv.help.swallow.keyboard import help_functions as help_keyboard
|
|
4
5
|
from bluer_ugv.help.swallow.select_target import help_select_target
|
|
5
6
|
from bluer_ugv.help.swallow.ultrasonic_sensor import (
|
|
6
7
|
help_functions as help_ultrasonic_sensor,
|
|
@@ -10,6 +11,7 @@ help_functions = {
|
|
|
10
11
|
"dataset": help_dataset,
|
|
11
12
|
"debug": help_debug,
|
|
12
13
|
"env": help_env,
|
|
14
|
+
"keyboard": help_keyboard,
|
|
13
15
|
"select_target": help_select_target,
|
|
14
16
|
"ultrasonic": help_ultrasonic_sensor,
|
|
15
17
|
}
|
bluer_ugv/help/swallow/env.py
CHANGED
|
@@ -43,11 +43,12 @@ def help_set(
|
|
|
43
43
|
"@swallow",
|
|
44
44
|
"env",
|
|
45
45
|
"set",
|
|
46
|
-
"steering",
|
|
46
|
+
"full_keyboard | steering",
|
|
47
47
|
"0 | 1",
|
|
48
48
|
],
|
|
49
49
|
"set env.",
|
|
50
50
|
{
|
|
51
|
+
"full_keyboard: BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD": "",
|
|
51
52
|
"steering: BLUER_SBC_SWALLOW_HAS_STEERING": "",
|
|
52
53
|
},
|
|
53
54
|
mono=mono,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from bluer_options.terminal import show_usage, xtra
|
|
4
|
+
|
|
5
|
+
from bluer_ugv import env
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def help_test(
|
|
9
|
+
tokens: List[str],
|
|
10
|
+
mono: bool,
|
|
11
|
+
) -> str:
|
|
12
|
+
options = xtra("dryrun", mono=mono)
|
|
13
|
+
|
|
14
|
+
args = [
|
|
15
|
+
"[--keys 1234567890-+/.]",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
return show_usage(
|
|
19
|
+
[
|
|
20
|
+
"@swallow",
|
|
21
|
+
"keyboard",
|
|
22
|
+
"test",
|
|
23
|
+
f"[{options}]",
|
|
24
|
+
]
|
|
25
|
+
+ args,
|
|
26
|
+
"test keyboard.",
|
|
27
|
+
mono=mono,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
help_functions = {
|
|
32
|
+
"test": help_test,
|
|
33
|
+
}
|
|
@@ -4,7 +4,7 @@ from bluer_algo.socket.classes import SocketComm, 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
|
|
|
7
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
7
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
8
8
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
9
9
|
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
10
10
|
from bluer_ugv.logger import logger
|
|
@@ -13,7 +13,7 @@ from bluer_algo.image_classifier.model.predictor import ImageClassifierPredictor
|
|
|
13
13
|
|
|
14
14
|
from bluer_ugv import env
|
|
15
15
|
from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
|
|
16
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
16
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
17
17
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
18
18
|
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
19
19
|
from bluer_ugv.swallow.session.classical.mode import OperationMode
|
|
@@ -10,7 +10,7 @@ from bluer_sbc.imager.camera import instance as camera
|
|
|
10
10
|
from bluer_ugv import env
|
|
11
11
|
from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
|
|
12
12
|
from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
|
|
13
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
13
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
14
14
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
15
15
|
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
16
16
|
from bluer_ugv.swallow.session.classical.mode import OperationMode
|
|
@@ -13,7 +13,7 @@ from bluer_algo.yolo.model.predictor import YoloPredictor
|
|
|
13
13
|
|
|
14
14
|
from bluer_ugv import env
|
|
15
15
|
from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
|
|
16
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
16
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
17
17
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
18
18
|
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
19
19
|
from bluer_ugv.swallow.session.classical.mode import OperationMode
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
|
|
3
|
+
from blueness import module
|
|
4
|
+
from blueness.argparse.generic import sys_exit
|
|
5
|
+
|
|
6
|
+
from bluer_ugv import NAME
|
|
7
|
+
from bluer_ugv.swallow.session.classical.keyboard.testing import test
|
|
8
|
+
from bluer_ugv.logger import logger
|
|
9
|
+
|
|
10
|
+
NAME = module.name(__file__, NAME)
|
|
11
|
+
|
|
12
|
+
parser = argparse.ArgumentParser(NAME)
|
|
13
|
+
parser.add_argument(
|
|
14
|
+
"task",
|
|
15
|
+
type=str,
|
|
16
|
+
help="test",
|
|
17
|
+
)
|
|
18
|
+
parser.add_argument(
|
|
19
|
+
"--keys",
|
|
20
|
+
type=str,
|
|
21
|
+
default=" ",
|
|
22
|
+
)
|
|
23
|
+
args = parser.parse_args()
|
|
24
|
+
|
|
25
|
+
success = False
|
|
26
|
+
if args.task == "test":
|
|
27
|
+
success = test(args.keys)
|
|
28
|
+
else:
|
|
29
|
+
success = None
|
|
30
|
+
|
|
31
|
+
sys_exit(logger, NAME, args.task, success)
|
|
@@ -5,19 +5,13 @@ from typing import Any, Dict
|
|
|
5
5
|
from bluer_sbc.session.functions import reply_to_bash
|
|
6
6
|
from bluer_algo.socket.classes import DEV_HOST
|
|
7
7
|
|
|
8
|
-
from bluer_ugv.swallow.session.classical.
|
|
9
|
-
from bluer_ugv.swallow.session.classical.mode import OperationMode
|
|
8
|
+
from bluer_ugv.swallow.session.classical.keyboard.keys import ControlKeys
|
|
10
9
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
10
|
+
from bluer_ugv.swallow.session.classical.mode import OperationMode
|
|
11
|
+
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
11
12
|
from bluer_ugv import env
|
|
12
13
|
from bluer_ugv.logger import logger
|
|
13
14
|
|
|
14
|
-
bash_keys = {
|
|
15
|
-
"i": "exit",
|
|
16
|
-
"o": "shutdown",
|
|
17
|
-
"p": "reboot",
|
|
18
|
-
"u": "update",
|
|
19
|
-
}
|
|
20
|
-
|
|
21
15
|
|
|
22
16
|
class ClassicalKeyboard:
|
|
23
17
|
def __init__(
|
|
@@ -25,14 +19,9 @@ class ClassicalKeyboard:
|
|
|
25
19
|
leds: ClassicalLeds,
|
|
26
20
|
setpoint: ClassicalSetPoint,
|
|
27
21
|
):
|
|
28
|
-
logger.info(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
", ".join(
|
|
32
|
-
[f"{key}:{action}" for key, action in bash_keys.items()],
|
|
33
|
-
),
|
|
34
|
-
)
|
|
35
|
-
)
|
|
22
|
+
logger.info(self.__class__.__name__)
|
|
23
|
+
|
|
24
|
+
self.keys = ControlKeys()
|
|
36
25
|
|
|
37
26
|
self.leds = leds
|
|
38
27
|
|
|
@@ -62,20 +51,20 @@ class ClassicalKeyboard:
|
|
|
62
51
|
|
|
63
52
|
# bash keys
|
|
64
53
|
if self.special_key:
|
|
65
|
-
for key, event in
|
|
54
|
+
for key, event in self.keys.special_keys.items():
|
|
66
55
|
if keyboard.is_pressed(key):
|
|
67
56
|
reply_to_bash(event)
|
|
68
57
|
return False
|
|
69
58
|
|
|
70
59
|
# other keys
|
|
71
60
|
for key, func in {
|
|
72
|
-
"
|
|
61
|
+
self.keys.get("stop"): self.setpoint.stop,
|
|
73
62
|
"x": self.setpoint.start,
|
|
74
|
-
"
|
|
63
|
+
self.keys.get("speed backward"): lambda: self.setpoint.put(
|
|
75
64
|
what="speed",
|
|
76
65
|
value=self.setpoint.get(what="speed") - 10,
|
|
77
66
|
),
|
|
78
|
-
"
|
|
67
|
+
self.keys.get("speed forward"): lambda: self.setpoint.put(
|
|
79
68
|
what="speed",
|
|
80
69
|
value=self.setpoint.get(what="speed") + 10,
|
|
81
70
|
),
|
|
@@ -85,14 +74,14 @@ class ClassicalKeyboard:
|
|
|
85
74
|
func()
|
|
86
75
|
|
|
87
76
|
# steering
|
|
88
|
-
if keyboard.is_pressed("
|
|
77
|
+
if keyboard.is_pressed(self.keys.get("steer left")):
|
|
89
78
|
self.special_key = False
|
|
90
79
|
self.last_key = "a"
|
|
91
80
|
self.setpoint.put(
|
|
92
81
|
what="steering",
|
|
93
82
|
value=env.BLUER_UGV_SWALLOW_STEERING_SETPOINT,
|
|
94
83
|
)
|
|
95
|
-
elif keyboard.is_pressed("
|
|
84
|
+
elif keyboard.is_pressed(self.keys.get("steer right")):
|
|
96
85
|
self.special_key = False
|
|
97
86
|
self.last_key = "d"
|
|
98
87
|
self.setpoint.put(
|
|
@@ -103,12 +92,12 @@ class ClassicalKeyboard:
|
|
|
103
92
|
self.setpoint.check_steering_expiry()
|
|
104
93
|
|
|
105
94
|
# debug mode
|
|
106
|
-
if keyboard.is_pressed("
|
|
95
|
+
if keyboard.is_pressed(self.keys.get("debug on")):
|
|
107
96
|
self.special_key = False
|
|
108
97
|
self.set("debug_mode", True)
|
|
109
98
|
logger.info(f'debug enabled, run "@swallow debug" on {DEV_HOST}.')
|
|
110
99
|
|
|
111
|
-
if keyboard.is_pressed("
|
|
100
|
+
if keyboard.is_pressed(self.keys.get("debug off")):
|
|
112
101
|
self.special_key = False
|
|
113
102
|
self.set("debug_mode", False)
|
|
114
103
|
logger.info("debug disabled.")
|
|
@@ -116,33 +105,33 @@ class ClassicalKeyboard:
|
|
|
116
105
|
# mode
|
|
117
106
|
mode = self.get("mode", OperationMode.NONE)
|
|
118
107
|
updated_mode = mode
|
|
119
|
-
if keyboard.is_pressed("
|
|
108
|
+
if keyboard.is_pressed(self.keys.get("mode = none")):
|
|
120
109
|
updated_mode = OperationMode.NONE
|
|
121
110
|
|
|
122
|
-
if keyboard.is_pressed("
|
|
123
|
-
updated_mode = OperationMode.TRAINING
|
|
124
|
-
|
|
125
|
-
if keyboard.is_pressed("g"):
|
|
111
|
+
if keyboard.is_pressed(self.keys.get("mode = action")):
|
|
126
112
|
updated_mode = OperationMode.ACTION
|
|
127
113
|
|
|
114
|
+
if keyboard.is_pressed(self.keys.get("mode = training")):
|
|
115
|
+
updated_mode = OperationMode.TRAINING
|
|
116
|
+
|
|
128
117
|
if mode != updated_mode:
|
|
129
118
|
self.set("mode", updated_mode)
|
|
130
119
|
logger.info("mode: {}.".format(updated_mode.name.lower()))
|
|
131
120
|
self.special_key = False
|
|
132
121
|
|
|
133
122
|
# ultrasound
|
|
134
|
-
if keyboard.is_pressed("
|
|
123
|
+
if keyboard.is_pressed(self.keys.get("ultrasonic off")):
|
|
135
124
|
self.set("ultrasound_enabled", False)
|
|
136
|
-
logger.info("ultrasound:
|
|
125
|
+
logger.info("ultrasound: off")
|
|
137
126
|
self.special_key = False
|
|
138
127
|
|
|
139
|
-
if keyboard.is_pressed("
|
|
128
|
+
if keyboard.is_pressed(self.keys.get("ultrasonic on")):
|
|
140
129
|
self.set("ultrasound_enabled", True)
|
|
141
|
-
logger.info("ultrasound:
|
|
130
|
+
logger.info("ultrasound: on")
|
|
142
131
|
self.special_key = False
|
|
143
132
|
|
|
144
133
|
# special key
|
|
145
|
-
if keyboard.is_pressed("
|
|
134
|
+
if keyboard.is_pressed(self.keys.get("special key")) and not self.special_key:
|
|
146
135
|
self.special_key = True
|
|
147
136
|
logger.info("🪄 special key enabled.")
|
|
148
137
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from typing import Dict, Tuple
|
|
2
|
+
|
|
3
|
+
from bluer_sbc.env import BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD
|
|
4
|
+
|
|
5
|
+
from bluer_ugv.logger import logger
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ControlKeys:
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
is_numpad: bool = BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD == 0,
|
|
12
|
+
):
|
|
13
|
+
self.is_numpad = is_numpad
|
|
14
|
+
logger.info(
|
|
15
|
+
"{}: {}".format(
|
|
16
|
+
self.__class__.__name__,
|
|
17
|
+
"numpad" if self.is_numpad else "full",
|
|
18
|
+
)
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
self._keys: Dict[str, Tuple[str, str]] = {
|
|
22
|
+
"ultrasonic off": ("n", "-"),
|
|
23
|
+
"ultrasonic on": ("m", "+"),
|
|
24
|
+
"debug off": ("v", "9"),
|
|
25
|
+
"debug on": ("b", "7"),
|
|
26
|
+
"mode = none": ("y", "5"),
|
|
27
|
+
"mode = action": ("g", "1"),
|
|
28
|
+
"mode = training": ("t", "3"),
|
|
29
|
+
"special key": ("z", "."),
|
|
30
|
+
"speed backward": ("s", "2"),
|
|
31
|
+
"speed forward": ("w", "8"),
|
|
32
|
+
"steer left": ("a", "4"),
|
|
33
|
+
"steer right": ("d", "6"),
|
|
34
|
+
"stop": (" ", "0"),
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def as_table():
|
|
39
|
+
keys = ControlKeys()
|
|
40
|
+
table = keys._keys.copy() # pylint: disable=protected-access
|
|
41
|
+
|
|
42
|
+
for is_numpad in [False, True]:
|
|
43
|
+
keys.is_numpad = is_numpad
|
|
44
|
+
|
|
45
|
+
special_keys = keys.special_keys
|
|
46
|
+
for key, event in special_keys.items():
|
|
47
|
+
if event not in table:
|
|
48
|
+
table[event] = ["", ""]
|
|
49
|
+
|
|
50
|
+
table[event][int(is_numpad)] = f"*{key}"
|
|
51
|
+
|
|
52
|
+
return [
|
|
53
|
+
"| event | full keyboard | numpad |",
|
|
54
|
+
"|-|-|-|",
|
|
55
|
+
] + sorted(
|
|
56
|
+
[
|
|
57
|
+
" | ".join(["", event] + list(keys) + [""])
|
|
58
|
+
for event, keys in table.items()
|
|
59
|
+
]
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def get(self, event: str) -> str:
|
|
63
|
+
return self._keys[event][int(self.is_numpad)]
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def special_keys(self) -> Dict[str, str]:
|
|
67
|
+
return (
|
|
68
|
+
{
|
|
69
|
+
"7": "exit",
|
|
70
|
+
"9": "shutdown",
|
|
71
|
+
"5": "reboot",
|
|
72
|
+
"1": "update",
|
|
73
|
+
}
|
|
74
|
+
if self.is_numpad
|
|
75
|
+
else {
|
|
76
|
+
"i": "exit",
|
|
77
|
+
"o": "shutdown",
|
|
78
|
+
"p": "reboot",
|
|
79
|
+
"u": "update",
|
|
80
|
+
}
|
|
81
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import keyboard
|
|
2
|
+
|
|
3
|
+
from blueness import module
|
|
4
|
+
|
|
5
|
+
from bluer_ugv import NAME
|
|
6
|
+
from bluer_ugv.logger import logger
|
|
7
|
+
|
|
8
|
+
NAME = module.name(__file__, NAME)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test(list_of_keys: str = "") -> bool:
|
|
12
|
+
logger.info("{}.testing({}): ^C to stop".format(NAME, list_of_keys))
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
while True:
|
|
16
|
+
for key in list_of_keys:
|
|
17
|
+
if keyboard.is_pressed(key):
|
|
18
|
+
logger.info(f"{key} is pressed.")
|
|
19
|
+
except KeyboardInterrupt:
|
|
20
|
+
logger.info("^C detected.")
|
|
21
|
+
|
|
22
|
+
return True
|
|
@@ -13,7 +13,7 @@ from bluer_ugv.swallow.session.classical.camera import (
|
|
|
13
13
|
ClassicalYoloCamera,
|
|
14
14
|
)
|
|
15
15
|
from bluer_ugv.swallow.session.classical.push_button import ClassicalPushButton
|
|
16
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
16
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
17
17
|
from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
|
|
18
18
|
from bluer_ugv.swallow.session.classical.mousepad import ClassicalMousePad
|
|
19
19
|
from bluer_ugv.swallow.session.classical.motor import (
|
|
@@ -13,7 +13,7 @@ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import (
|
|
|
13
13
|
from bluer_ugv.swallow.session.classical.ultrasonic_sensor.log import (
|
|
14
14
|
UltrasonicSensorDetectionLog,
|
|
15
15
|
)
|
|
16
|
-
from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
|
|
16
|
+
from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
|
|
17
17
|
from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
|
|
18
18
|
from bluer_ugv.logger import logger
|
|
19
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bluer_ugv
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.196.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
|
[](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.196.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=
|
|
1
|
+
bluer_ugv/__init__.py,sha256=dlZ6KdgmjA40cFkgY0OcNNt-vfLvgx9fTB-WGQtQ2RI,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
|
|
@@ -15,6 +15,7 @@ bluer_ugv/.abcli/swallow.sh,sha256=hfgFLNtqePdH5kDuNJoIvOfyKpef26Qq3pXhgsSaLAs,3
|
|
|
15
15
|
bluer_ugv/.abcli/swallow/dataset.sh,sha256=w-uuMLZEkfDbseLlCZu4xsg0veznj6ATU88Lzclh3xo,342
|
|
16
16
|
bluer_ugv/.abcli/swallow/debug.sh,sha256=JVjExhotePW3gZG2MUS6IzbXVQwMAefKYJiSP88wqlk,559
|
|
17
17
|
bluer_ugv/.abcli/swallow/env.sh,sha256=5rKCdZhrQa_9Lr96j1h7XrWBcf0YEeV3w3o0vLWGd0M,360
|
|
18
|
+
bluer_ugv/.abcli/swallow/keyboard.sh,sha256=RYR5vgV0C1SATqekQ_F6Lr6Ums0IAkH9THX2ZPcitoY,402
|
|
18
19
|
bluer_ugv/.abcli/swallow/select_target.sh,sha256=fwHmKbVcn_OEW4q-cjNc8Eyi6hOi1pMAb6x5tW8_lb0,183
|
|
19
20
|
bluer_ugv/.abcli/swallow/session.sh,sha256=mMSq2kl8q1v-6QRgz5iK9oJid0VC2AGjwK1dZCMUtLo,885
|
|
20
21
|
bluer_ugv/.abcli/swallow/ultrasonic.sh,sha256=GqnVn4u-FFC8SVsCYHiwABBDkgALe4mgRMloitlfeP8,380
|
|
@@ -25,11 +26,12 @@ bluer_ugv/.abcli/swallow/dataset/list.sh,sha256=-hqgmThG2JfheFSYIe6Z3UH05X5hrSuI
|
|
|
25
26
|
bluer_ugv/.abcli/swallow/dataset/upload.sh,sha256=KM33QM4rIQpltbd_V49wPWear9Wi8cJNo0bBBeCEENU,577
|
|
26
27
|
bluer_ugv/.abcli/swallow/env/cp.sh,sha256=vWBlG9n4Q6m_lBWcot9nyN6kc7-uil5skCjfJWHCfrY,168
|
|
27
28
|
bluer_ugv/.abcli/swallow/env/list.sh,sha256=pT-hRS0ZfmogAfAMfm-hh0raGoUAnl66U5VuqgyeIwE,173
|
|
28
|
-
bluer_ugv/.abcli/swallow/env/set.sh,sha256=
|
|
29
|
+
bluer_ugv/.abcli/swallow/env/set.sh,sha256=TfRGz5mZ1ezGaJVZWPNf4yCpC2xOEk-Im5uKVvnLR00,555
|
|
30
|
+
bluer_ugv/.abcli/swallow/keyboard/test.sh,sha256=B04AO-Er3_utzULPziyKD0aybuN2bry7h9wrQBEJ0tA,218
|
|
29
31
|
bluer_ugv/.abcli/swallow/ultrasonic/review.sh,sha256=XoKwUliTcH-yTHrIo1cc9RSxL3tYQsBfWf1XOJ6YtOI,717
|
|
30
32
|
bluer_ugv/.abcli/swallow/ultrasonic/test.sh,sha256=WRq4jnm2lv6q7fAw-_6Xg7DD8kgki48t8ilwXA-SsBM,582
|
|
31
33
|
bluer_ugv/.abcli/tests/README.sh,sha256=w1xjPWgCfWbLtON_LEn2cvSmPLulzm7kTBPEC3LJixs,142
|
|
32
|
-
bluer_ugv/.abcli/tests/help.sh,sha256=
|
|
34
|
+
bluer_ugv/.abcli/tests/help.sh,sha256=WOPID4QyuS57vpl5uEyYwytOF_pnMsbm4YgcZUcuvu8,1193
|
|
33
35
|
bluer_ugv/.abcli/tests/swallow_dataset_combine.sh,sha256=tXjZj5iOOmCz3ito9lBDYjaAvR2odNzs2LRXsrM6d6c,291
|
|
34
36
|
bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh,sha256=Ff4V7fi-h1myRT9ajjaKXesNrpaxLZMGDidBT8G31Kw,360
|
|
35
37
|
bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh,sha256=N3Iq-zJV2OfEoft44D1BBLOlrkAbUDN_Rp_sAmjCEVk,311
|
|
@@ -75,7 +77,7 @@ bluer_ugv/README/swallow/digital/__init__.py,sha256=kyb46k4FsGZKgWW2QRM33pLUQl5t
|
|
|
75
77
|
bluer_ugv/README/swallow/digital/algo/__init__.py,sha256=iHwEi_kwQUk0E3YtGKDrjTKV-PDRuDpAo69IMCE8uZ4,711
|
|
76
78
|
bluer_ugv/README/swallow/digital/algo/navigation.py,sha256=Hg_tkGYnE8qbM37Go4KlAaO-sNAtOBmaNZlPda45BCc,1780
|
|
77
79
|
bluer_ugv/README/swallow/digital/algo/yolo.py,sha256=NlDISZ9LOUmMAzdEYzVYOrIwbDGdM8euMURlBOGACUk,930
|
|
78
|
-
bluer_ugv/README/swallow/digital/design/__init__.py,sha256=
|
|
80
|
+
bluer_ugv/README/swallow/digital/design/__init__.py,sha256=RwH9vIDnocrKVt5WaBZq3Nxh2DygOLWelOsrvyEl1Aw,2324
|
|
79
81
|
bluer_ugv/README/swallow/digital/design/mechanical.py,sha256=OwgMrFIpRA-RR9CwurXaif09GCd6_i3zGuAfkH0jtsM,983
|
|
80
82
|
bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py,sha256=VefIdTUXnsxVj3rmjsguV7N2BD9tPRiiaHjjRl84QUM,1517
|
|
81
83
|
bluer_ugv/designs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -96,10 +98,11 @@ bluer_ugv/help/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
|
|
96
98
|
bluer_ugv/help/__main__.py,sha256=ww3p0cIRZm-SDODZ_fYAzPV_-nucxtidjK1IP2idW8g,229
|
|
97
99
|
bluer_ugv/help/functions.py,sha256=_JcncL82A-6m9P9J6MX6Z_FtZ09k6HWuirozKl48xXY,367
|
|
98
100
|
bluer_ugv/help/git.py,sha256=4CcaA8lHoplrrFgF5lolwVT79SLr3gE2iqXpAIfzH64,319
|
|
99
|
-
bluer_ugv/help/swallow/__init__.py,sha256=
|
|
101
|
+
bluer_ugv/help/swallow/__init__.py,sha256=LZRT9EhacDqXqTKgygmJ-LraGwqciP3Ahp3P4p5o7R8,650
|
|
100
102
|
bluer_ugv/help/swallow/dataset.py,sha256=59D5XLQG1PRWfPwfM73Jz1-f0qh_cO0q18qLtsxXtj0,2495
|
|
101
103
|
bluer_ugv/help/swallow/debug.py,sha256=70krqg-YtjxPjPwWnx4J1Fxlvw46hHyAYq7pA7yPt50,481
|
|
102
|
-
bluer_ugv/help/swallow/env.py,sha256=
|
|
104
|
+
bluer_ugv/help/swallow/env.py,sha256=PUrh0CD-UPqpJQjzonndji9yZs8nRfYCa26M3MnctRM,1096
|
|
105
|
+
bluer_ugv/help/swallow/keyboard.py,sha256=YNkGWvE7tN3agCaL2R30FSIF2zw6oXa5ZJdnTJQA3Hk,518
|
|
103
106
|
bluer_ugv/help/swallow/select_target.py,sha256=s1-v2IyT6thAncIzo4wKnU8hFJ-rDyi-IDzx2kMaJrs,390
|
|
104
107
|
bluer_ugv/help/swallow/ultrasonic_sensor.py,sha256=rhxHQWDU7orCvqC_TeJWMCJFrm4qyJyHdiUIUIpZmhU,1223
|
|
105
108
|
bluer_ugv/swallow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -113,17 +116,21 @@ bluer_ugv/swallow/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
113
116
|
bluer_ugv/swallow/session/__main__.py,sha256=QFOnflCI6tB_qoG0S4Dpy-L0pW20tFffPPOb96LtypM,636
|
|
114
117
|
bluer_ugv/swallow/session/functions.py,sha256=Jfv7Ab6TEhZMtVv348imNg7JVgPNezFcuovq5r65rAo,666
|
|
115
118
|
bluer_ugv/swallow/session/classical/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
116
|
-
bluer_ugv/swallow/session/classical/keyboard.py,sha256=FdgC2pZWJnLdoAwBppplSaDx4YjlVxiL9Cb9XpsTOuU,4417
|
|
117
119
|
bluer_ugv/swallow/session/classical/leds.py,sha256=ElhE08rm-KLbQ59lJzStLWeNsfoO7tV2fPBMBXCKX_E,2241
|
|
118
120
|
bluer_ugv/swallow/session/classical/mode.py,sha256=6rFe1IIpfijuI7Xd-wcGKhYQ7EdQxG4mYGVliTjS118,117
|
|
119
121
|
bluer_ugv/swallow/session/classical/mousepad.py,sha256=LI7yvmtrZZaGUgPGpxNU7zcPkW8D5ykHlY_O-4H2STs,1871
|
|
120
122
|
bluer_ugv/swallow/session/classical/push_button.py,sha256=s8sPart_dECjLK-gfsJi0UorRYcFYf3ofLqjmG8PoA8,2397
|
|
121
|
-
bluer_ugv/swallow/session/classical/session.py,sha256=
|
|
123
|
+
bluer_ugv/swallow/session/classical/session.py,sha256=mkWG1FfbU_lVAAf0MQRdOboMkg_jCozU_21BVex0Q2c,5184
|
|
122
124
|
bluer_ugv/swallow/session/classical/camera/__init__.py,sha256=KOehn6qHKj3EMbV5uGXKIfN_v4D5-E2xH9aCWqbNlAI,375
|
|
123
|
-
bluer_ugv/swallow/session/classical/camera/generic.py,sha256=
|
|
124
|
-
bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=
|
|
125
|
-
bluer_ugv/swallow/session/classical/camera/tracking.py,sha256=
|
|
126
|
-
bluer_ugv/swallow/session/classical/camera/yolo.py,sha256=
|
|
125
|
+
bluer_ugv/swallow/session/classical/camera/generic.py,sha256=9xTXisNYoiNVtT0-2wW9DvD6viIPpRR7rIyAwnbyvWs,1201
|
|
126
|
+
bluer_ugv/swallow/session/classical/camera/navigation.py,sha256=HoeTlifGEfnedb6o8P-O0TcP1bNDRJ0M7vWupQh1pL4,6790
|
|
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
|
|
129
|
+
bluer_ugv/swallow/session/classical/keyboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
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
|
|
133
|
+
bluer_ugv/swallow/session/classical/keyboard/testing.py,sha256=GFh-6-HkT1sYlGt-Y2traBFD8lle3C-HcvVrdzsITEo,511
|
|
127
134
|
bluer_ugv/swallow/session/classical/motor/__init__.py,sha256=Ja9pVS6h5wnZiDvJ2IaibLcleQl3inIF_YRJg9VGKlw,323
|
|
128
135
|
bluer_ugv/swallow/session/classical/motor/generic.py,sha256=VzCEqkuil-7ncyv2TxI7NMofIiLhuZGl61Ck3Yog55s,2860
|
|
129
136
|
bluer_ugv/swallow/session/classical/motor/left.py,sha256=eKyEI8CqQiUTTmpNlJrXro90x2_la5KejVLgj_pXkQM,537
|
|
@@ -135,7 +142,7 @@ bluer_ugv/swallow/session/classical/setpoint/classes.py,sha256=a2ACbE4oEdguuOjtr
|
|
|
135
142
|
bluer_ugv/swallow/session/classical/setpoint/steering.py,sha256=yuhW3u9YgZ756h4wyMWJYW9914d8oYRKLga67rTW-Tw,288
|
|
136
143
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
137
144
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py,sha256=SHCwEk_K9L0BG1X7W1JnnhTnQBGJ--TiN-QuH2Je28E,1732
|
|
138
|
-
bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py,sha256=
|
|
145
|
+
bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py,sha256=MIwfvni7DVLo3whxHnfnKiftbcksLhsoQI61wCH_hoU,4086
|
|
139
146
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py,sha256=eP5Kb6aGqOAcOBBlhGvSWbUL_hKJZ8w5ggwkndzKBqo,227
|
|
140
147
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py,sha256=v_yCBzg4uvnra4Yy_M3Ngaab80PBEbkp2SHfaWfXgb8,3720
|
|
141
148
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py,sha256=Ks_VqD6tV0Yw0lcSETOFcMwQaUedwLBwLlSblIrVs24,10202
|
|
@@ -143,8 +150,8 @@ bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py,sha256=vMvmay2Gxg8
|
|
|
143
150
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py,sha256=_iQmec2VSq-ORkTVpXSNJg08hrSz2M1O8LzNZEtoT9U,959
|
|
144
151
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py,sha256=En-J8BRTiR8k9p2CBbW0cOUuw8nctD5DOXDm5uhCNO4,3987
|
|
145
152
|
bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py,sha256=RIMHXmLXe1zXLvCNU163ymLI8XM6te9LXuCMnLuulbA,1515
|
|
146
|
-
bluer_ugv-7.
|
|
147
|
-
bluer_ugv-7.
|
|
148
|
-
bluer_ugv-7.
|
|
149
|
-
bluer_ugv-7.
|
|
150
|
-
bluer_ugv-7.
|
|
153
|
+
bluer_ugv-7.196.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
|
|
154
|
+
bluer_ugv-7.196.1.dist-info/METADATA,sha256=R3pyTxNAj-cE0OAy-YE1FmpHNwS75OsEM7qGfDI3u3Y,5596
|
|
155
|
+
bluer_ugv-7.196.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
156
|
+
bluer_ugv-7.196.1.dist-info/top_level.txt,sha256=_MlDhFvIPpher9Zs7xyJTHgO2xJJTbfR1dzncz3LQnk,10
|
|
157
|
+
bluer_ugv-7.196.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|