wujihandpy 1.5.0rc1__cp38-cp38-win_amd64.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.
- wujihandpy/__init__.py +37 -0
- wujihandpy/_core/__init__.pyi +625 -0
- wujihandpy/_core/filter.pyi +8 -0
- wujihandpy/_core/logging.pyi +65 -0
- wujihandpy/_core.cp38-win_amd64.pyd +0 -0
- wujihandpy/_version.py +34 -0
- wujihandpy-1.5.0rc1.dist-info/DELVEWHEEL +2 -0
- wujihandpy-1.5.0rc1.dist-info/METADATA +313 -0
- wujihandpy-1.5.0rc1.dist-info/RECORD +17 -0
- wujihandpy-1.5.0rc1.dist-info/WHEEL +5 -0
- wujihandpy-1.5.0rc1.dist-info/licenses/LICENSE +21 -0
- wujihandpy.libs/.load-order-wujihandpy-1.5.0rc1 +5 -0
- wujihandpy.libs/libusb-1.0-b8a6a96692604f71b1f8833eda7ca0e9.dll +0 -0
- wujihandpy.libs/msvcp140-6b4456f8f4093623a2447d077cc6f028.dll +0 -0
- wujihandpy.libs/msvcp140_1-096c6fd9306df44b85fc6abdfeecb116.dll +0 -0
- wujihandpy.libs/msvcp140_atomic_wait-73c4359c1efe6b0ca91b3bf40aaf2693.dll +0 -0
- wujihandpy.libs/vcruntime140_1-db3b30bbef3102c0df3cebf52ebc5830.dll +0 -0
wujihandpy/__init__.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# start delvewheel patch
|
|
5
|
+
def _delvewheel_patch_1_10_0():
|
|
6
|
+
import ctypes
|
|
7
|
+
import os
|
|
8
|
+
import platform
|
|
9
|
+
import sys
|
|
10
|
+
libs_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'wujihandpy.libs'))
|
|
11
|
+
is_conda_cpython = platform.python_implementation() == 'CPython' and (hasattr(ctypes.pythonapi, 'Anaconda_GetVersion') or 'packaged by conda-forge' in sys.version)
|
|
12
|
+
if sys.version_info[:2] >= (3, 8) and not is_conda_cpython or sys.version_info[:2] >= (3, 10):
|
|
13
|
+
if os.path.isdir(libs_dir):
|
|
14
|
+
os.add_dll_directory(libs_dir)
|
|
15
|
+
else:
|
|
16
|
+
load_order_filepath = os.path.join(libs_dir, '.load-order-wujihandpy-1.5.0rc1')
|
|
17
|
+
if os.path.isfile(load_order_filepath):
|
|
18
|
+
import ctypes.wintypes
|
|
19
|
+
with open(os.path.join(libs_dir, '.load-order-wujihandpy-1.5.0rc1')) as file:
|
|
20
|
+
load_order = file.read().split()
|
|
21
|
+
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
|
|
22
|
+
kernel32.LoadLibraryExW.restype = ctypes.wintypes.HMODULE
|
|
23
|
+
kernel32.LoadLibraryExW.argtypes = ctypes.wintypes.LPCWSTR, ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD
|
|
24
|
+
for lib in load_order:
|
|
25
|
+
lib_path = os.path.join(os.path.join(libs_dir, lib))
|
|
26
|
+
if os.path.isfile(lib_path) and not kernel32.LoadLibraryExW(lib_path, None, 8):
|
|
27
|
+
raise OSError('Error loading {}; {}'.format(lib, ctypes.FormatError(ctypes.get_last_error())))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_delvewheel_patch_1_10_0()
|
|
31
|
+
del _delvewheel_patch_1_10_0
|
|
32
|
+
# end delvewheel patch
|
|
33
|
+
|
|
34
|
+
from ._core import *
|
|
35
|
+
from ._version import __version__
|
|
36
|
+
|
|
37
|
+
__all__ = ["__version__", 'Hand', 'Finger', 'Joint', 'IController', 'filter']
|
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import numpy
|
|
3
|
+
import numpy.typing
|
|
4
|
+
import typing
|
|
5
|
+
from . import filter
|
|
6
|
+
from . import logging
|
|
7
|
+
__all__: list[str] = ['Finger', 'Hand', 'IController', 'Joint', 'filter', 'logging']
|
|
8
|
+
class Finger:
|
|
9
|
+
def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
10
|
+
...
|
|
11
|
+
def get_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
12
|
+
...
|
|
13
|
+
def get_joint_current_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
14
|
+
...
|
|
15
|
+
def get_joint_effort_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
16
|
+
...
|
|
17
|
+
def get_joint_error_code(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
18
|
+
...
|
|
19
|
+
def get_joint_firmware_date(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
20
|
+
...
|
|
21
|
+
def get_joint_firmware_version(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
22
|
+
...
|
|
23
|
+
def get_joint_lower_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
24
|
+
...
|
|
25
|
+
def get_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
26
|
+
...
|
|
27
|
+
def get_joint_upper_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
28
|
+
...
|
|
29
|
+
def joint(self, index: typing.SupportsInt) -> Joint:
|
|
30
|
+
...
|
|
31
|
+
def read_joint_actual_position(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
32
|
+
...
|
|
33
|
+
def read_joint_actual_position_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
34
|
+
...
|
|
35
|
+
def read_joint_actual_position_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
36
|
+
...
|
|
37
|
+
def read_joint_bus_voltage(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float32]:
|
|
38
|
+
...
|
|
39
|
+
def read_joint_bus_voltage_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float32]]:
|
|
40
|
+
...
|
|
41
|
+
def read_joint_bus_voltage_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
42
|
+
...
|
|
43
|
+
def read_joint_current_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
44
|
+
...
|
|
45
|
+
def read_joint_current_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
46
|
+
...
|
|
47
|
+
def read_joint_current_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
48
|
+
...
|
|
49
|
+
def read_joint_effort_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
50
|
+
...
|
|
51
|
+
def read_joint_effort_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
52
|
+
...
|
|
53
|
+
def read_joint_effort_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
54
|
+
...
|
|
55
|
+
def read_joint_error_code(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
56
|
+
...
|
|
57
|
+
def read_joint_error_code_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
58
|
+
...
|
|
59
|
+
def read_joint_error_code_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
60
|
+
...
|
|
61
|
+
def read_joint_firmware_date(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
62
|
+
...
|
|
63
|
+
def read_joint_firmware_date_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
64
|
+
...
|
|
65
|
+
def read_joint_firmware_date_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
66
|
+
...
|
|
67
|
+
def read_joint_firmware_version(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
68
|
+
...
|
|
69
|
+
def read_joint_firmware_version_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
70
|
+
...
|
|
71
|
+
def read_joint_firmware_version_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
72
|
+
...
|
|
73
|
+
def read_joint_lower_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
74
|
+
...
|
|
75
|
+
def read_joint_lower_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
76
|
+
...
|
|
77
|
+
def read_joint_lower_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
78
|
+
...
|
|
79
|
+
def read_joint_temperature(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float32]:
|
|
80
|
+
...
|
|
81
|
+
def read_joint_temperature_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float32]]:
|
|
82
|
+
...
|
|
83
|
+
def read_joint_temperature_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
84
|
+
...
|
|
85
|
+
def read_joint_upper_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
86
|
+
...
|
|
87
|
+
def read_joint_upper_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
88
|
+
...
|
|
89
|
+
def read_joint_upper_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
90
|
+
...
|
|
91
|
+
@typing.overload
|
|
92
|
+
def write_joint_control_mode(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
93
|
+
...
|
|
94
|
+
@typing.overload
|
|
95
|
+
def write_joint_control_mode(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
96
|
+
...
|
|
97
|
+
@typing.overload
|
|
98
|
+
def write_joint_control_mode_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
99
|
+
...
|
|
100
|
+
@typing.overload
|
|
101
|
+
def write_joint_control_mode_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
102
|
+
...
|
|
103
|
+
@typing.overload
|
|
104
|
+
def write_joint_control_mode_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
105
|
+
...
|
|
106
|
+
@typing.overload
|
|
107
|
+
def write_joint_control_mode_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
108
|
+
...
|
|
109
|
+
@typing.overload
|
|
110
|
+
def write_joint_current_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
111
|
+
...
|
|
112
|
+
@typing.overload
|
|
113
|
+
def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
114
|
+
...
|
|
115
|
+
@typing.overload
|
|
116
|
+
def write_joint_current_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
117
|
+
...
|
|
118
|
+
@typing.overload
|
|
119
|
+
def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
120
|
+
...
|
|
121
|
+
@typing.overload
|
|
122
|
+
def write_joint_current_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
123
|
+
...
|
|
124
|
+
@typing.overload
|
|
125
|
+
def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
126
|
+
...
|
|
127
|
+
@typing.overload
|
|
128
|
+
def write_joint_effort_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
129
|
+
...
|
|
130
|
+
@typing.overload
|
|
131
|
+
def write_joint_effort_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
132
|
+
...
|
|
133
|
+
@typing.overload
|
|
134
|
+
def write_joint_effort_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
135
|
+
...
|
|
136
|
+
@typing.overload
|
|
137
|
+
def write_joint_effort_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
138
|
+
...
|
|
139
|
+
@typing.overload
|
|
140
|
+
def write_joint_effort_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
141
|
+
...
|
|
142
|
+
@typing.overload
|
|
143
|
+
def write_joint_effort_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
144
|
+
...
|
|
145
|
+
@typing.overload
|
|
146
|
+
def write_joint_enabled(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
147
|
+
...
|
|
148
|
+
@typing.overload
|
|
149
|
+
def write_joint_enabled(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
150
|
+
...
|
|
151
|
+
@typing.overload
|
|
152
|
+
def write_joint_enabled_async(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
153
|
+
...
|
|
154
|
+
@typing.overload
|
|
155
|
+
def write_joint_enabled_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
156
|
+
...
|
|
157
|
+
@typing.overload
|
|
158
|
+
def write_joint_enabled_unchecked(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
159
|
+
...
|
|
160
|
+
@typing.overload
|
|
161
|
+
def write_joint_enabled_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
162
|
+
...
|
|
163
|
+
@typing.overload
|
|
164
|
+
def write_joint_reset_error(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
165
|
+
...
|
|
166
|
+
@typing.overload
|
|
167
|
+
def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
168
|
+
...
|
|
169
|
+
@typing.overload
|
|
170
|
+
def write_joint_reset_error_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
171
|
+
...
|
|
172
|
+
@typing.overload
|
|
173
|
+
def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
174
|
+
...
|
|
175
|
+
@typing.overload
|
|
176
|
+
def write_joint_reset_error_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
177
|
+
...
|
|
178
|
+
@typing.overload
|
|
179
|
+
def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
180
|
+
...
|
|
181
|
+
@typing.overload
|
|
182
|
+
def write_joint_sin_level(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
183
|
+
...
|
|
184
|
+
@typing.overload
|
|
185
|
+
def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
186
|
+
...
|
|
187
|
+
@typing.overload
|
|
188
|
+
def write_joint_sin_level_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
189
|
+
...
|
|
190
|
+
@typing.overload
|
|
191
|
+
def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
192
|
+
...
|
|
193
|
+
@typing.overload
|
|
194
|
+
def write_joint_sin_level_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
195
|
+
...
|
|
196
|
+
@typing.overload
|
|
197
|
+
def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
198
|
+
...
|
|
199
|
+
@typing.overload
|
|
200
|
+
def write_joint_target_position(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
201
|
+
...
|
|
202
|
+
@typing.overload
|
|
203
|
+
def write_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
204
|
+
...
|
|
205
|
+
@typing.overload
|
|
206
|
+
def write_joint_target_position_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
207
|
+
...
|
|
208
|
+
@typing.overload
|
|
209
|
+
def write_joint_target_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
210
|
+
...
|
|
211
|
+
@typing.overload
|
|
212
|
+
def write_joint_target_position_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
213
|
+
...
|
|
214
|
+
@typing.overload
|
|
215
|
+
def write_joint_target_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
216
|
+
...
|
|
217
|
+
class Hand:
|
|
218
|
+
def __init__(self, serial_number: str | None = None, usb_pid: typing.SupportsInt = -1, usb_vid: typing.SupportsInt = 1155, mask: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_] | None = None) -> None:
|
|
219
|
+
...
|
|
220
|
+
def finger(self, index: typing.SupportsInt) -> Finger:
|
|
221
|
+
...
|
|
222
|
+
def get_firmware_date(self) -> numpy.uint32:
|
|
223
|
+
...
|
|
224
|
+
def get_firmware_version(self) -> numpy.uint32:
|
|
225
|
+
...
|
|
226
|
+
def get_handedness(self) -> numpy.uint8:
|
|
227
|
+
...
|
|
228
|
+
def get_input_voltage(self) -> numpy.float32:
|
|
229
|
+
...
|
|
230
|
+
def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
231
|
+
...
|
|
232
|
+
def get_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
233
|
+
...
|
|
234
|
+
def get_joint_current_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
235
|
+
...
|
|
236
|
+
def get_joint_effort_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
237
|
+
...
|
|
238
|
+
def get_joint_error_code(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
239
|
+
...
|
|
240
|
+
def get_joint_firmware_date(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
241
|
+
...
|
|
242
|
+
def get_joint_firmware_version(self) -> numpy.typing.NDArray[numpy.uint32]:
|
|
243
|
+
...
|
|
244
|
+
def get_joint_lower_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
245
|
+
...
|
|
246
|
+
def get_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
247
|
+
...
|
|
248
|
+
def get_joint_upper_limit(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
249
|
+
...
|
|
250
|
+
def get_product_sn(self) -> str:
|
|
251
|
+
"""
|
|
252
|
+
Get device product serial number
|
|
253
|
+
"""
|
|
254
|
+
def get_system_time(self) -> numpy.uint32:
|
|
255
|
+
...
|
|
256
|
+
def get_temperature(self) -> numpy.float32:
|
|
257
|
+
...
|
|
258
|
+
def raw_sdo_read(self, finger_id: typing.SupportsInt, joint_id: typing.SupportsInt, index: typing.SupportsInt, sub_index: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> bytes:
|
|
259
|
+
...
|
|
260
|
+
def raw_sdo_write(self, finger_id: typing.SupportsInt, joint_id: typing.SupportsInt, index: typing.SupportsInt, sub_index: typing.SupportsInt, data: bytes, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
261
|
+
...
|
|
262
|
+
def read_firmware_date(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
263
|
+
...
|
|
264
|
+
def read_firmware_date_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
265
|
+
...
|
|
266
|
+
def read_firmware_date_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
267
|
+
...
|
|
268
|
+
def read_firmware_version(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
269
|
+
...
|
|
270
|
+
def read_firmware_version_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
271
|
+
...
|
|
272
|
+
def read_firmware_version_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
273
|
+
...
|
|
274
|
+
def read_handedness(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint8:
|
|
275
|
+
...
|
|
276
|
+
def read_handedness_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint8]:
|
|
277
|
+
...
|
|
278
|
+
def read_handedness_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
279
|
+
...
|
|
280
|
+
def read_input_voltage(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float32:
|
|
281
|
+
...
|
|
282
|
+
def read_input_voltage_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float32]:
|
|
283
|
+
...
|
|
284
|
+
def read_input_voltage_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
285
|
+
...
|
|
286
|
+
def read_joint_actual_position(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
287
|
+
...
|
|
288
|
+
def read_joint_actual_position_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
289
|
+
...
|
|
290
|
+
def read_joint_actual_position_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
291
|
+
...
|
|
292
|
+
def read_joint_bus_voltage(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float32]:
|
|
293
|
+
...
|
|
294
|
+
def read_joint_bus_voltage_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float32]]:
|
|
295
|
+
...
|
|
296
|
+
def read_joint_bus_voltage_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
297
|
+
...
|
|
298
|
+
def read_joint_current_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
299
|
+
...
|
|
300
|
+
def read_joint_current_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
301
|
+
...
|
|
302
|
+
def read_joint_current_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
303
|
+
...
|
|
304
|
+
def read_joint_effort_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
305
|
+
...
|
|
306
|
+
def read_joint_effort_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
307
|
+
...
|
|
308
|
+
def read_joint_effort_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
309
|
+
...
|
|
310
|
+
def read_joint_error_code(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
311
|
+
...
|
|
312
|
+
def read_joint_error_code_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
313
|
+
...
|
|
314
|
+
def read_joint_error_code_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
315
|
+
...
|
|
316
|
+
def read_joint_firmware_date(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
317
|
+
...
|
|
318
|
+
def read_joint_firmware_date_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
319
|
+
...
|
|
320
|
+
def read_joint_firmware_date_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
321
|
+
...
|
|
322
|
+
def read_joint_firmware_version(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.uint32]:
|
|
323
|
+
...
|
|
324
|
+
def read_joint_firmware_version_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.uint32]]:
|
|
325
|
+
...
|
|
326
|
+
def read_joint_firmware_version_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
327
|
+
...
|
|
328
|
+
def read_joint_lower_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
329
|
+
...
|
|
330
|
+
def read_joint_lower_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
331
|
+
...
|
|
332
|
+
def read_joint_lower_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
333
|
+
...
|
|
334
|
+
def read_joint_temperature(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float32]:
|
|
335
|
+
...
|
|
336
|
+
def read_joint_temperature_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float32]]:
|
|
337
|
+
...
|
|
338
|
+
def read_joint_temperature_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
339
|
+
...
|
|
340
|
+
def read_joint_upper_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.typing.NDArray[numpy.float64]:
|
|
341
|
+
...
|
|
342
|
+
def read_joint_upper_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.typing.NDArray[numpy.float64]]:
|
|
343
|
+
...
|
|
344
|
+
def read_joint_upper_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
345
|
+
...
|
|
346
|
+
def read_system_time(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
347
|
+
...
|
|
348
|
+
def read_system_time_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
349
|
+
...
|
|
350
|
+
def read_system_time_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
351
|
+
...
|
|
352
|
+
def read_temperature(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float32:
|
|
353
|
+
...
|
|
354
|
+
def read_temperature_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float32]:
|
|
355
|
+
...
|
|
356
|
+
def read_temperature_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
357
|
+
...
|
|
358
|
+
def realtime_controller(self, enable_upstream: bool, filter: filter.IFilter) -> IController:
|
|
359
|
+
...
|
|
360
|
+
def start_latency_test(self) -> None:
|
|
361
|
+
...
|
|
362
|
+
def stop_latency_test(self) -> None:
|
|
363
|
+
...
|
|
364
|
+
@typing.overload
|
|
365
|
+
def write_joint_control_mode(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
366
|
+
...
|
|
367
|
+
@typing.overload
|
|
368
|
+
def write_joint_control_mode(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
369
|
+
...
|
|
370
|
+
@typing.overload
|
|
371
|
+
def write_joint_control_mode_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
372
|
+
...
|
|
373
|
+
@typing.overload
|
|
374
|
+
def write_joint_control_mode_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
375
|
+
...
|
|
376
|
+
@typing.overload
|
|
377
|
+
def write_joint_control_mode_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
378
|
+
...
|
|
379
|
+
@typing.overload
|
|
380
|
+
def write_joint_control_mode_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
381
|
+
...
|
|
382
|
+
@typing.overload
|
|
383
|
+
def write_joint_current_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
384
|
+
...
|
|
385
|
+
@typing.overload
|
|
386
|
+
def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
387
|
+
...
|
|
388
|
+
@typing.overload
|
|
389
|
+
def write_joint_current_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
390
|
+
...
|
|
391
|
+
@typing.overload
|
|
392
|
+
def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
393
|
+
...
|
|
394
|
+
@typing.overload
|
|
395
|
+
def write_joint_current_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
396
|
+
...
|
|
397
|
+
@typing.overload
|
|
398
|
+
def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
399
|
+
...
|
|
400
|
+
@typing.overload
|
|
401
|
+
def write_joint_effort_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
402
|
+
...
|
|
403
|
+
@typing.overload
|
|
404
|
+
def write_joint_effort_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
405
|
+
...
|
|
406
|
+
@typing.overload
|
|
407
|
+
def write_joint_effort_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
408
|
+
...
|
|
409
|
+
@typing.overload
|
|
410
|
+
def write_joint_effort_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
411
|
+
...
|
|
412
|
+
@typing.overload
|
|
413
|
+
def write_joint_effort_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
414
|
+
...
|
|
415
|
+
@typing.overload
|
|
416
|
+
def write_joint_effort_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
417
|
+
...
|
|
418
|
+
@typing.overload
|
|
419
|
+
def write_joint_enabled(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
420
|
+
...
|
|
421
|
+
@typing.overload
|
|
422
|
+
def write_joint_enabled(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
423
|
+
...
|
|
424
|
+
@typing.overload
|
|
425
|
+
def write_joint_enabled_async(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
426
|
+
...
|
|
427
|
+
@typing.overload
|
|
428
|
+
def write_joint_enabled_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
429
|
+
...
|
|
430
|
+
@typing.overload
|
|
431
|
+
def write_joint_enabled_unchecked(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
432
|
+
...
|
|
433
|
+
@typing.overload
|
|
434
|
+
def write_joint_enabled_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
435
|
+
...
|
|
436
|
+
@typing.overload
|
|
437
|
+
def write_joint_reset_error(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
438
|
+
...
|
|
439
|
+
@typing.overload
|
|
440
|
+
def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
441
|
+
...
|
|
442
|
+
@typing.overload
|
|
443
|
+
def write_joint_reset_error_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
444
|
+
...
|
|
445
|
+
@typing.overload
|
|
446
|
+
def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
447
|
+
...
|
|
448
|
+
@typing.overload
|
|
449
|
+
def write_joint_reset_error_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
450
|
+
...
|
|
451
|
+
@typing.overload
|
|
452
|
+
def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
453
|
+
...
|
|
454
|
+
@typing.overload
|
|
455
|
+
def write_joint_sin_level(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
456
|
+
...
|
|
457
|
+
@typing.overload
|
|
458
|
+
def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
459
|
+
...
|
|
460
|
+
@typing.overload
|
|
461
|
+
def write_joint_sin_level_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
462
|
+
...
|
|
463
|
+
@typing.overload
|
|
464
|
+
def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
465
|
+
...
|
|
466
|
+
@typing.overload
|
|
467
|
+
def write_joint_sin_level_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
468
|
+
...
|
|
469
|
+
@typing.overload
|
|
470
|
+
def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
471
|
+
...
|
|
472
|
+
@typing.overload
|
|
473
|
+
def write_joint_target_position(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
474
|
+
...
|
|
475
|
+
@typing.overload
|
|
476
|
+
def write_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
477
|
+
...
|
|
478
|
+
@typing.overload
|
|
479
|
+
def write_joint_target_position_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
480
|
+
...
|
|
481
|
+
@typing.overload
|
|
482
|
+
def write_joint_target_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
483
|
+
...
|
|
484
|
+
@typing.overload
|
|
485
|
+
def write_joint_target_position_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
486
|
+
...
|
|
487
|
+
@typing.overload
|
|
488
|
+
def write_joint_target_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64], timeout: typing.SupportsFloat = 0.5) -> None:
|
|
489
|
+
...
|
|
490
|
+
class IController:
|
|
491
|
+
def __enter__(self) -> IController:
|
|
492
|
+
...
|
|
493
|
+
def __exit__(self, arg0: typing.Any, arg1: typing.Any, arg2: typing.Any) -> None:
|
|
494
|
+
...
|
|
495
|
+
def close(self) -> None:
|
|
496
|
+
...
|
|
497
|
+
def get_joint_actual_effort(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
498
|
+
...
|
|
499
|
+
def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
|
|
500
|
+
...
|
|
501
|
+
def set_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
|
|
502
|
+
...
|
|
503
|
+
class Joint:
|
|
504
|
+
def get_joint_actual_position(self) -> numpy.float64:
|
|
505
|
+
...
|
|
506
|
+
def get_joint_bus_voltage(self) -> numpy.float32:
|
|
507
|
+
...
|
|
508
|
+
def get_joint_current_limit(self) -> numpy.float64:
|
|
509
|
+
...
|
|
510
|
+
def get_joint_effort_limit(self) -> numpy.float64:
|
|
511
|
+
...
|
|
512
|
+
def get_joint_error_code(self) -> numpy.uint32:
|
|
513
|
+
...
|
|
514
|
+
def get_joint_firmware_date(self) -> numpy.uint32:
|
|
515
|
+
...
|
|
516
|
+
def get_joint_firmware_version(self) -> numpy.uint32:
|
|
517
|
+
...
|
|
518
|
+
def get_joint_lower_limit(self) -> numpy.float64:
|
|
519
|
+
...
|
|
520
|
+
def get_joint_temperature(self) -> numpy.float32:
|
|
521
|
+
...
|
|
522
|
+
def get_joint_upper_limit(self) -> numpy.float64:
|
|
523
|
+
...
|
|
524
|
+
def read_joint_actual_position(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float64:
|
|
525
|
+
...
|
|
526
|
+
def read_joint_actual_position_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float64]:
|
|
527
|
+
...
|
|
528
|
+
def read_joint_actual_position_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
529
|
+
...
|
|
530
|
+
def read_joint_bus_voltage(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float32:
|
|
531
|
+
...
|
|
532
|
+
def read_joint_bus_voltage_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float32]:
|
|
533
|
+
...
|
|
534
|
+
def read_joint_bus_voltage_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
535
|
+
...
|
|
536
|
+
def read_joint_current_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float64:
|
|
537
|
+
...
|
|
538
|
+
def read_joint_current_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float64]:
|
|
539
|
+
...
|
|
540
|
+
def read_joint_current_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
541
|
+
...
|
|
542
|
+
def read_joint_effort_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float64:
|
|
543
|
+
...
|
|
544
|
+
def read_joint_effort_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float64]:
|
|
545
|
+
...
|
|
546
|
+
def read_joint_effort_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
547
|
+
...
|
|
548
|
+
def read_joint_error_code(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
549
|
+
...
|
|
550
|
+
def read_joint_error_code_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
551
|
+
...
|
|
552
|
+
def read_joint_error_code_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
553
|
+
...
|
|
554
|
+
def read_joint_firmware_date(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
555
|
+
...
|
|
556
|
+
def read_joint_firmware_date_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
557
|
+
...
|
|
558
|
+
def read_joint_firmware_date_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
559
|
+
...
|
|
560
|
+
def read_joint_firmware_version(self, timeout: typing.SupportsFloat = 0.5) -> numpy.uint32:
|
|
561
|
+
...
|
|
562
|
+
def read_joint_firmware_version_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.uint32]:
|
|
563
|
+
...
|
|
564
|
+
def read_joint_firmware_version_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
565
|
+
...
|
|
566
|
+
def read_joint_lower_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float64:
|
|
567
|
+
...
|
|
568
|
+
def read_joint_lower_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float64]:
|
|
569
|
+
...
|
|
570
|
+
def read_joint_lower_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
571
|
+
...
|
|
572
|
+
def read_joint_temperature(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float32:
|
|
573
|
+
...
|
|
574
|
+
def read_joint_temperature_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float32]:
|
|
575
|
+
...
|
|
576
|
+
def read_joint_temperature_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
577
|
+
...
|
|
578
|
+
def read_joint_upper_limit(self, timeout: typing.SupportsFloat = 0.5) -> numpy.float64:
|
|
579
|
+
...
|
|
580
|
+
def read_joint_upper_limit_async(self, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[numpy.float64]:
|
|
581
|
+
...
|
|
582
|
+
def read_joint_upper_limit_unchecked(self, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
583
|
+
...
|
|
584
|
+
def write_joint_control_mode(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
585
|
+
...
|
|
586
|
+
def write_joint_control_mode_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
587
|
+
...
|
|
588
|
+
def write_joint_control_mode_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
589
|
+
...
|
|
590
|
+
def write_joint_current_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
591
|
+
...
|
|
592
|
+
def write_joint_current_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
593
|
+
...
|
|
594
|
+
def write_joint_current_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
595
|
+
...
|
|
596
|
+
def write_joint_effort_limit(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
597
|
+
...
|
|
598
|
+
def write_joint_effort_limit_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
599
|
+
...
|
|
600
|
+
def write_joint_effort_limit_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
601
|
+
...
|
|
602
|
+
def write_joint_enabled(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
603
|
+
...
|
|
604
|
+
def write_joint_enabled_async(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
605
|
+
...
|
|
606
|
+
def write_joint_enabled_unchecked(self, value: bool, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
607
|
+
...
|
|
608
|
+
def write_joint_reset_error(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
609
|
+
...
|
|
610
|
+
def write_joint_reset_error_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
611
|
+
...
|
|
612
|
+
def write_joint_reset_error_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
613
|
+
...
|
|
614
|
+
def write_joint_sin_level(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
615
|
+
...
|
|
616
|
+
def write_joint_sin_level_async(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
617
|
+
...
|
|
618
|
+
def write_joint_sin_level_unchecked(self, value: typing.SupportsInt, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
619
|
+
...
|
|
620
|
+
def write_joint_target_position(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
621
|
+
...
|
|
622
|
+
def write_joint_target_position_async(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> typing.Awaitable[None]:
|
|
623
|
+
...
|
|
624
|
+
def write_joint_target_position_unchecked(self, value: typing.SupportsFloat, timeout: typing.SupportsFloat = 0.5) -> None:
|
|
625
|
+
...
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
__all__: list[str] = ['Level', 'flush', 'set_log_level', 'set_log_path', 'set_log_to_console', 'set_log_to_file']
|
|
4
|
+
class Level:
|
|
5
|
+
"""
|
|
6
|
+
Members:
|
|
7
|
+
|
|
8
|
+
Trace
|
|
9
|
+
|
|
10
|
+
Debug
|
|
11
|
+
|
|
12
|
+
Info
|
|
13
|
+
|
|
14
|
+
Warn
|
|
15
|
+
|
|
16
|
+
Error
|
|
17
|
+
|
|
18
|
+
Critical
|
|
19
|
+
|
|
20
|
+
Off
|
|
21
|
+
"""
|
|
22
|
+
Critical: typing.ClassVar[Level] # value = <Level.Critical: 5>
|
|
23
|
+
Debug: typing.ClassVar[Level] # value = <Level.Debug: 1>
|
|
24
|
+
Error: typing.ClassVar[Level] # value = <Level.Error: 4>
|
|
25
|
+
Info: typing.ClassVar[Level] # value = <Level.Info: 2>
|
|
26
|
+
Off: typing.ClassVar[Level] # value = <Level.Off: 6>
|
|
27
|
+
Trace: typing.ClassVar[Level] # value = <Level.Trace: 0>
|
|
28
|
+
Warn: typing.ClassVar[Level] # value = <Level.Warn: 3>
|
|
29
|
+
__members__: typing.ClassVar[dict[str, Level]] # value = {'Trace': <Level.Trace: 0>, 'Debug': <Level.Debug: 1>, 'Info': <Level.Info: 2>, 'Warn': <Level.Warn: 3>, 'Error': <Level.Error: 4>, 'Critical': <Level.Critical: 5>, 'Off': <Level.Off: 6>}
|
|
30
|
+
def __eq__(self, other: typing.Any) -> bool:
|
|
31
|
+
...
|
|
32
|
+
def __getstate__(self) -> int:
|
|
33
|
+
...
|
|
34
|
+
def __hash__(self) -> int:
|
|
35
|
+
...
|
|
36
|
+
def __index__(self) -> int:
|
|
37
|
+
...
|
|
38
|
+
def __init__(self, value: typing.SupportsInt) -> None:
|
|
39
|
+
...
|
|
40
|
+
def __int__(self) -> int:
|
|
41
|
+
...
|
|
42
|
+
def __ne__(self, other: typing.Any) -> bool:
|
|
43
|
+
...
|
|
44
|
+
def __repr__(self) -> str:
|
|
45
|
+
...
|
|
46
|
+
def __setstate__(self, state: typing.SupportsInt) -> None:
|
|
47
|
+
...
|
|
48
|
+
def __str__(self) -> str:
|
|
49
|
+
...
|
|
50
|
+
@property
|
|
51
|
+
def name(self) -> str:
|
|
52
|
+
...
|
|
53
|
+
@property
|
|
54
|
+
def value(self) -> int:
|
|
55
|
+
...
|
|
56
|
+
def flush() -> None:
|
|
57
|
+
...
|
|
58
|
+
def set_log_level(value: Level) -> None:
|
|
59
|
+
...
|
|
60
|
+
def set_log_path(value: str) -> None:
|
|
61
|
+
...
|
|
62
|
+
def set_log_to_console(value: bool) -> None:
|
|
63
|
+
...
|
|
64
|
+
def set_log_to_file(value: bool) -> None:
|
|
65
|
+
...
|
|
Binary file
|
wujihandpy/_version.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# file generated by setuptools-scm
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
TYPE_CHECKING = False
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from typing import Tuple
|
|
16
|
+
from typing import Union
|
|
17
|
+
|
|
18
|
+
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
20
|
+
else:
|
|
21
|
+
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
23
|
+
|
|
24
|
+
version: str
|
|
25
|
+
__version__: str
|
|
26
|
+
__version_tuple__: VERSION_TUPLE
|
|
27
|
+
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
30
|
+
|
|
31
|
+
__version__ = version = '1.5.0rc1'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 5, 0, 'rc1')
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = 'ge0283a468'
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Version: 1.10.0
|
|
2
|
+
Arguments: ['C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-hhrrn7qg\\cp38-win_amd64\\build\\venv\\Scripts\\delvewheel', 'repair', '--add-path', 'C:/vcpkg/installed/x64-windows/bin', '-w', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-hhrrn7qg\\cp38-win_amd64\\repaired_wheel', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-hhrrn7qg\\cp38-win_amd64\\built_wheel\\wujihandpy-1.5.0rc1-cp38-cp38-win_amd64.whl']
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: wujihandpy
|
|
3
|
+
Version: 1.5.0rc1
|
|
4
|
+
Summary: Python bindings for WujiHandCpp
|
|
5
|
+
Author-Email: Zihan Qin <zihanqin2048@gmail.com>
|
|
6
|
+
Maintainer-Email: Wuji Technology <support@pan-motor.com>
|
|
7
|
+
License: MIT License
|
|
8
|
+
|
|
9
|
+
Copyright (c) 2025 Wuji Technology
|
|
10
|
+
|
|
11
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
13
|
+
in the Software without restriction, including without limitation the rights
|
|
14
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
furnished to do so, subject to the following conditions:
|
|
17
|
+
|
|
18
|
+
The above copyright notice and this permission notice shall be included in all
|
|
19
|
+
copies or substantial portions of the Software.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
SOFTWARE.
|
|
28
|
+
|
|
29
|
+
Project-URL: homepage, https://github.com/wuji-technology/wujihandpy
|
|
30
|
+
Project-URL: repository, https://github.com/wuji-technology/wujihandpy
|
|
31
|
+
Project-URL: Bug Tracker, https://github.com/wuji-technology/wujihandpy/issues
|
|
32
|
+
Requires-Python: >=3.8
|
|
33
|
+
Requires-Dist: numpy
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# wujihandpy
|
|
37
|
+
|
|
38
|
+
[](LICENSE) [](https://github.com/wuji-technology/wujihandpy/releases)
|
|
39
|
+
|
|
40
|
+
Wuji Hand SDK: C++ core with Python bindings, for controlling and communicating with Wuji Hand. WujihandPy is the Python binding of [WujihandCpp](wujihandcpp/README.md), providing an easy-to-use Python API for Wujihand dexterous-hand devices. Supports synchronous, asynchronous, unchecked operations and real-time control.
|
|
41
|
+
|
|
42
|
+
## Table of Contents
|
|
43
|
+
|
|
44
|
+
- [Repository Structure](#repository-structure)
|
|
45
|
+
- [Usage](#usage)
|
|
46
|
+
- [Prerequisites](#prerequisites)
|
|
47
|
+
- [Installation](#installation)
|
|
48
|
+
- [Running](#running)
|
|
49
|
+
- [Troubleshooting](#troubleshooting)
|
|
50
|
+
- [Appendix](#appendix)
|
|
51
|
+
- [Contact](#contact)
|
|
52
|
+
|
|
53
|
+
## Repository Structure
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
├── src/
|
|
57
|
+
│ ├── wujihandpy/
|
|
58
|
+
│ │ ├── __init__.py
|
|
59
|
+
│ │ └── _core/
|
|
60
|
+
│ ├── main.cpp
|
|
61
|
+
│ └── *.hpp
|
|
62
|
+
├── example/
|
|
63
|
+
│ ├── 1.read.py
|
|
64
|
+
│ ├── 2.write.py
|
|
65
|
+
│ ├── 3.realtime.py
|
|
66
|
+
│ └── 4.async.py
|
|
67
|
+
├── wujihandcpp/
|
|
68
|
+
│ ├── include/
|
|
69
|
+
│ │ └── wujihandcpp/
|
|
70
|
+
│ ├── src/
|
|
71
|
+
│ └── tests/
|
|
72
|
+
├── .github/
|
|
73
|
+
│ └── workflows/
|
|
74
|
+
├── pyproject.toml
|
|
75
|
+
├── CMakeLists.txt
|
|
76
|
+
└── README.md
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Directory Description
|
|
80
|
+
|
|
81
|
+
| Directory | Description |
|
|
82
|
+
|-----------|-------------|
|
|
83
|
+
| `src/` | Python binding source code and C++ headers |
|
|
84
|
+
| `src/wujihandpy/` | Python package with type stubs |
|
|
85
|
+
| `example/` | Usage examples for read, write, realtime, and async operations |
|
|
86
|
+
| `wujihandcpp/` | Underlying C++ SDK implementation |
|
|
87
|
+
| `wujihandcpp/include/` | C++ header files |
|
|
88
|
+
| `wujihandcpp/src/` | C++ source files |
|
|
89
|
+
| `.github/workflows/` | CI/CD automation |
|
|
90
|
+
|
|
91
|
+
## Usage
|
|
92
|
+
|
|
93
|
+
### Prerequisites
|
|
94
|
+
|
|
95
|
+
**Supported CPU Architectures:**
|
|
96
|
+
|
|
97
|
+
- x86_64
|
|
98
|
+
- ARM64
|
|
99
|
+
|
|
100
|
+
**Minimum System Requirements (Linux):**
|
|
101
|
+
|
|
102
|
+
- glibc 2.28+ (Debian 10+, Ubuntu 18.10+, Fedora 29+, CentOS/RHEL 8+)
|
|
103
|
+
- Python 3.8-3.14
|
|
104
|
+
|
|
105
|
+
**Minimum System Requirements (Windows):**
|
|
106
|
+
|
|
107
|
+
WujihandPy does not support Windows yet; we will work to add support as soon as possible.
|
|
108
|
+
|
|
109
|
+
### Installation
|
|
110
|
+
|
|
111
|
+
WujihandPy supports one-line installation via pip:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
pip install wujihandpy
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
For Linux users, you need to configure udev rules to allow non-root users to access USB devices:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="0483", MODE="0666"' | \
|
|
121
|
+
sudo tee /etc/udev/rules.d/95-wujihand.rules && \
|
|
122
|
+
sudo udevadm control --reload-rules && \
|
|
123
|
+
sudo udevadm trigger
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Running
|
|
127
|
+
|
|
128
|
+
#### Import Modules
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
import wujihandpy
|
|
132
|
+
import numpy as np
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### Connect to the Hand
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
hand = wujihandpy.Hand()
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Read Data
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
def read_<dataname>(self) -> datatype
|
|
145
|
+
def read_<dataname>(self) -> np.ndarray[datatype] # For bulk-read
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
All available data can be found in the [API Reference](https://docs.wuji.tech/docs/en/wuji-hand/latest/sdk-user-guide/api-reference/).
|
|
149
|
+
|
|
150
|
+
For example, read the hand's powered-on running time (us):
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
time = hand.read_system_time()
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Besides hand-level data, each joint also has its own data; joint-level data names all use `joint` as the prefix.
|
|
157
|
+
|
|
158
|
+
For example, read the current position of joint 0 on finger 1 (index finger):
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
position = hand.finger(1).joint(0).read_joint_actual_position()
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Joint angles are of type `np.float64` in radians. The zero point and positive direction follow the definitions in the [URDF files](https://github.com/wuji-technology/wuji-hand-description).
|
|
165
|
+
|
|
166
|
+
Reading multiple data items with a single command is called **Bulk-Read**.
|
|
167
|
+
|
|
168
|
+
For example, the following reads the current position of all (20) joints on the hand:
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
positions = hand.read_joint_actual_position()
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
For bulk reads, the function returns an `np.ndarray[np.float64]` containing all values:
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
>>> print(positions)
|
|
178
|
+
[[ 0.975 0.523 0.271 -0.45 ]
|
|
179
|
+
[ 0.382 0.241 -0.003 -0.275]
|
|
180
|
+
[-0.299 0.329 0.067 -0.286]
|
|
181
|
+
[-0.122 0.228 0.315 -0.178]
|
|
182
|
+
[ 0.205 0.087 0.288 -0.149]]
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`read` blocks until the operation completes. When the function returns, the read is guaranteed to have succeeded.
|
|
186
|
+
|
|
187
|
+
#### Write Data
|
|
188
|
+
|
|
189
|
+
The write API is similar, but takes an extra parameter for the target value:
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
def write_<dataname>(self, datatype)
|
|
193
|
+
def write_<dataname>(self, np.ndarray[datatype]) # For bulk-write
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
For example, write a target position to a single joint:
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
hand.finger(1).joint(0).write_joint_target_position(0.8)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Valid angle limits for each joint can be obtained via:
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
upper = <Hand / Finger / Joint>.read_joint_upper_limit()
|
|
206
|
+
lower = <Hand / Finger / Joint>.read_joint_lower_limit()
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
If the written angle is outside the valid range, it will be automatically clamped to the upper/lower limit.
|
|
210
|
+
|
|
211
|
+
**Bulk-Write** is also supported. For example, write the same target position to all joints of finger 1 (index finger):
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
hand.finger(1).write_joint_target_position(0.8)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
If each joint has a different target, pass an `np.ndarray` containing the target values for each joint:
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
hand.finger(1).write_joint_target_position(
|
|
221
|
+
np.array(
|
|
222
|
+
# J1 J2 J3 J4
|
|
223
|
+
[0.8, 0.0, 0.8, 0.8],
|
|
224
|
+
dtype=np.float64,
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`write` blocks until the operation completes. When the function returns, the write is guaranteed to have succeeded.
|
|
230
|
+
|
|
231
|
+
#### Realtime Control
|
|
232
|
+
|
|
233
|
+
By default, both reads and writes use a buffer pool: data is accumulated for a while before being transmitted, so the maximum read/write frequency cannot exceed 100 Hz.
|
|
234
|
+
|
|
235
|
+
For scenarios that require smooth joint position control, use [Realtime Control](https://docs.wuji.tech/docs/en/wuji-hand/latest/sdk-user-guide/tutorial/#4-real-time-control).
|
|
236
|
+
|
|
237
|
+
#### Asynchronous Read/Write
|
|
238
|
+
|
|
239
|
+
All read/write functions have asynchronous versions, with an `_async` suffix.
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
async def read_<dataname>_async(self) -> datatype
|
|
243
|
+
async def read_<dataname>_async(self) -> np.ndarray[datatype] # For bulk-read
|
|
244
|
+
async def write_<dataname>_async(self, datatype)
|
|
245
|
+
async def write_<dataname>_async(self, np.ndarray[datatype]) # For bulk-write
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Asynchronous APIs must be awaited. The thread/event loop is not blocked while waiting, and when the call returns the read/write is guaranteed to have succeeded.
|
|
249
|
+
|
|
250
|
+
#### Unchecked Read/Write
|
|
251
|
+
|
|
252
|
+
If you do not care whether a read/write succeeds, you can use the Unchecked versions, with an `_unchecked` suffix.
|
|
253
|
+
|
|
254
|
+
```python
|
|
255
|
+
def read_<dataname>_unchecked(self) -> None
|
|
256
|
+
def write_<dataname>_unchecked(self, datatype)
|
|
257
|
+
def write_<dataname>_unchecked(self, np.ndarray[datatype]) # For bulk-write
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Unchecked functions always return immediately without blocking, and are typically used in latency-sensitive scenarios.
|
|
261
|
+
|
|
262
|
+
#### Get Cached Values
|
|
263
|
+
|
|
264
|
+
If you want to retrieve results from previous reads/writes, use the `get` family of functions:
|
|
265
|
+
|
|
266
|
+
```python
|
|
267
|
+
def get_<dataname>(self) -> datatype
|
|
268
|
+
def get_<dataname>(self) -> np.ndarray[datatype] # For bulk-read
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
`get` functions also never block. They always return the most recently read value, regardless of whether it came from `read`, `async-read`, or `read-unchecked`.
|
|
272
|
+
|
|
273
|
+
If the data has never been requested, or the request has not succeeded yet, the return value of `get` is undefined (usually 0).
|
|
274
|
+
|
|
275
|
+
#### Examples
|
|
276
|
+
|
|
277
|
+
All example code is located in the [example](example) directory.
|
|
278
|
+
|
|
279
|
+
## Troubleshooting
|
|
280
|
+
|
|
281
|
+
1. **Could not find a version that satisfies the requirement**
|
|
282
|
+
|
|
283
|
+
If you see this error during installation, upgrade pip first:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
python3 -m pip install --upgrade pip
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Then retry with the upgraded pip:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
python3 -m pip install wujihandpy
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Appendix
|
|
296
|
+
|
|
297
|
+
### Performance and Optimization
|
|
298
|
+
|
|
299
|
+
While ensuring usability, WujihandPy has been optimized for performance and efficiency as much as possible.
|
|
300
|
+
|
|
301
|
+
We recommend prioritizing bulk read/write to maximize performance.
|
|
302
|
+
|
|
303
|
+
For scenarios that require smooth joint position control, be sure to use `realtime_controller`.
|
|
304
|
+
|
|
305
|
+
### References
|
|
306
|
+
|
|
307
|
+
- **Documentation**: [Quick Start](https://docs.wuji.tech/docs/en/wuji-hand/latest/sdk-user-guide/introduction/)
|
|
308
|
+
- **API Reference**: [API Reference](https://docs.wuji.tech/docs/en/wuji-hand/latest/sdk-user-guide/api-reference/)
|
|
309
|
+
- **URDF Files**: [wuji-hand-description](https://github.com/wuji-technology/wuji-hand-description)
|
|
310
|
+
|
|
311
|
+
## Contact
|
|
312
|
+
|
|
313
|
+
For any questions, please contact [support@wuji.tech](mailto:support@wuji.tech).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
wujihandpy/_core.cp38-win_amd64.pyd,sha256=8rS8MXuqA_IDdtTMV0IqYkp53SZ2bCQnUrZ5boNLIMo,1126912
|
|
2
|
+
wujihandpy/_version.py,sha256=GTjge0Zf2O0GeQfFhC9V5TZKyEmu3ViACzROoUcrmy8,756
|
|
3
|
+
wujihandpy/__init__.py,sha256=si_A12gcebXlXDQxnOHhHLct0nRd475GisihfIky1E4,1755
|
|
4
|
+
wujihandpy/_core/filter.pyi,sha256=bhf3_lTgyf0BeVhp4TqUw0nJgoE0f-kyzw7vJrt67nI,235
|
|
5
|
+
wujihandpy/_core/logging.pyi,sha256=I35XdCZfBS-M7eslyzX3zUEBSKa_HIOspRXyZYwbvu0,1933
|
|
6
|
+
wujihandpy/_core/__init__.pyi,sha256=RbK_3F3J0qiPVgWwZ4OPKd8mPh0Du0eLNdvMYnq5Ra4,35934
|
|
7
|
+
wujihandpy-1.5.0rc1.dist-info/DELVEWHEEL,sha256=HDWQXEK6h0ew7ovSrGFeyZ3SYz6AaZXweJur0mw-hyo,453
|
|
8
|
+
wujihandpy-1.5.0rc1.dist-info/METADATA,sha256=9T59DhviH_DFfMGKYXRWB2Vr3nq1Li3v5ncp6DOv59E,10231
|
|
9
|
+
wujihandpy-1.5.0rc1.dist-info/RECORD,,
|
|
10
|
+
wujihandpy-1.5.0rc1.dist-info/WHEEL,sha256=yXMtVL9U8RkqJEJfb-z5X2s1_G1r2eGG-REYk3wgjZ0,104
|
|
11
|
+
wujihandpy-1.5.0rc1.dist-info/licenses/LICENSE,sha256=aWRV7TIHNfIAV58Abtu5ubNfqOHUeANdqg_QXb99nto,1093
|
|
12
|
+
wujihandpy.libs/.load-order-wujihandpy-1.5.0rc1,sha256=PDMbbuLU-0mUQ3VqXxdjGcHuhFeXDyIBP4MoLXNTtY0,252
|
|
13
|
+
wujihandpy.libs/libusb-1.0-b8a6a96692604f71b1f8833eda7ca0e9.dll,sha256=l_ZU0jNGBfirQunYUkHFqOt27bUvHAJ9IHPS0hV5wsw,158208
|
|
14
|
+
wujihandpy.libs/msvcp140-6b4456f8f4093623a2447d077cc6f028.dll,sha256=ahXtplqbjEwqs-INszrdCI9SGEf3k4TlcFxlohyXXl8,554496
|
|
15
|
+
wujihandpy.libs/msvcp140_1-096c6fd9306df44b85fc6abdfeecb116.dll,sha256=_zWuTtz8emGvB4nYikaWEMwvvIaiuxCeyXCo1ADHT5Y,15360
|
|
16
|
+
wujihandpy.libs/msvcp140_atomic_wait-73c4359c1efe6b0ca91b3bf40aaf2693.dll,sha256=qNNSRnoTTtwdwI64BlqOlPhoMKFPukI9A1iE6y90USM,29696
|
|
17
|
+
wujihandpy.libs/vcruntime140_1-db3b30bbef3102c0df3cebf52ebc5830.dll,sha256=apm8ASjgx9bLv2FfzCaQlWXhfUyjRRuX-Jh_nGrLxsg,49776
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Wuji Technology
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|