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 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,8 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ __all__: list[str] = ['IFilter', 'LowPass']
4
+ class IFilter:
5
+ pass
6
+ class LowPass(IFilter):
7
+ def __init__(self, cutoff_freq: typing.SupportsFloat = 10.0) -> None:
8
+ ...
@@ -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: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Release](https://img.shields.io/github/v/release/wuji-technology/wujihandpy)](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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: scikit-build-core 0.11.6
3
+ Root-Is-Purelib: false
4
+ Tag: cp38-cp38-win_amd64
5
+
@@ -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.
@@ -0,0 +1,5 @@
1
+ libusb-1.0-b8a6a96692604f71b1f8833eda7ca0e9.dll
2
+ msvcp140_atomic_wait-73c4359c1efe6b0ca91b3bf40aaf2693.dll
3
+ msvcp140-6b4456f8f4093623a2447d077cc6f028.dll
4
+ vcruntime140_1-db3b30bbef3102c0df3cebf52ebc5830.dll
5
+ msvcp140_1-096c6fd9306df44b85fc6abdfeecb116.dll