wujihandpy 0.5.2__cp314-cp314-win_amd64.whl → 1.0.0__cp314-cp314-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.

Potentially problematic release.


This version of wujihandpy might be problematic. Click here for more details.

wujihandpy/__init__.py CHANGED
@@ -2,17 +2,17 @@ from __future__ import annotations
2
2
 
3
3
 
4
4
  # start delvewheel patch
5
- def _delvewheel_patch_1_11_1():
5
+ def _delvewheel_patch_1_11_2():
6
6
  import os
7
7
  if os.path.isdir(libs_dir := os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'wujihandpy.libs'))):
8
8
  os.add_dll_directory(libs_dir)
9
9
 
10
10
 
11
- _delvewheel_patch_1_11_1()
12
- del _delvewheel_patch_1_11_1
11
+ _delvewheel_patch_1_11_2()
12
+ del _delvewheel_patch_1_11_2
13
13
  # end delvewheel patch
14
14
 
15
- from ._core import __doc__, Hand, Finger, Joint
15
+ from ._core import *
16
16
  from ._version import __version__
17
17
 
18
- __all__ = ["__doc__", "__version__", "Hand", "Finger", "Joint"]
18
+ __all__ = ["__version__", 'Hand', 'Finger', 'Joint', 'IController', 'filter']
@@ -2,8 +2,11 @@ from __future__ import annotations
2
2
  import numpy
3
3
  import numpy.typing
4
4
  import typing
5
- __all__: list[str] = ['Finger', 'Hand', 'Joint']
5
+ from . import filter
6
+ __all__: list[str] = ['Finger', 'Hand', 'IController', 'Joint', 'filter']
6
7
  class Finger:
8
+ def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
9
+ ...
7
10
  def get_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
8
11
  ...
9
12
  def get_joint_error_code(self) -> numpy.typing.NDArray[numpy.uint32]:
@@ -14,14 +17,18 @@ class Finger:
14
17
  ...
15
18
  def get_joint_lower_limit(self) -> numpy.typing.NDArray[numpy.float64]:
16
19
  ...
17
- def get_joint_position(self) -> numpy.typing.NDArray[numpy.float64]:
18
- ...
19
20
  def get_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
20
21
  ...
21
22
  def get_joint_upper_limit(self) -> numpy.typing.NDArray[numpy.float64]:
22
23
  ...
23
24
  def joint(self, index: typing.SupportsInt) -> Joint:
24
25
  ...
26
+ def read_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
27
+ ...
28
+ async def read_joint_actual_position_async(self) -> numpy.typing.NDArray[numpy.float64]:
29
+ ...
30
+ def read_joint_actual_position_unchecked(self) -> None:
31
+ ...
25
32
  def read_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
26
33
  ...
27
34
  async def read_joint_bus_voltage_async(self) -> numpy.typing.NDArray[numpy.float32]:
@@ -52,12 +59,6 @@ class Finger:
52
59
  ...
53
60
  def read_joint_lower_limit_unchecked(self) -> None:
54
61
  ...
55
- def read_joint_position(self) -> numpy.typing.NDArray[numpy.float64]:
56
- ...
57
- async def read_joint_position_async(self) -> numpy.typing.NDArray[numpy.float64]:
58
- ...
59
- def read_joint_position_unchecked(self) -> None:
60
- ...
61
62
  def read_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
62
63
  ...
63
64
  async def read_joint_temperature_async(self) -> numpy.typing.NDArray[numpy.float32]:
@@ -71,115 +72,115 @@ class Finger:
71
72
  def read_joint_upper_limit_unchecked(self) -> None:
72
73
  ...
73
74
  @typing.overload
74
- def write_joint_control_mode(self, value: numpy.uint16) -> None:
75
+ def write_joint_control_mode(self, value: typing.SupportsInt) -> None:
75
76
  ...
76
77
  @typing.overload
77
78
  def write_joint_control_mode(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
78
79
  ...
79
80
  @typing.overload
80
- async def write_joint_control_mode_async(self, value: numpy.uint16) -> None:
81
+ async def write_joint_control_mode_async(self, value: typing.SupportsInt) -> None:
81
82
  ...
82
83
  @typing.overload
83
84
  async def write_joint_control_mode_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
84
85
  ...
85
86
  @typing.overload
86
- def write_joint_control_mode_unchecked(self, value: numpy.uint16) -> None:
87
+ def write_joint_control_mode_unchecked(self, value: typing.SupportsInt) -> None:
87
88
  ...
88
89
  @typing.overload
89
90
  def write_joint_control_mode_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
90
91
  ...
91
92
  @typing.overload
92
- def write_joint_control_position(self, value: numpy.float64) -> None:
93
+ def write_joint_current_limit(self, value: typing.SupportsInt) -> None:
93
94
  ...
94
95
  @typing.overload
95
- def write_joint_control_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
96
+ def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
96
97
  ...
97
98
  @typing.overload
98
- async def write_joint_control_position_async(self, value: numpy.float64) -> None:
99
+ async def write_joint_current_limit_async(self, value: typing.SupportsInt) -> None:
99
100
  ...
100
101
  @typing.overload
101
- async def write_joint_control_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
102
+ async def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
102
103
  ...
103
104
  @typing.overload
104
- def write_joint_control_position_unchecked(self, value: numpy.float64) -> None:
105
+ def write_joint_current_limit_unchecked(self, value: typing.SupportsInt) -> None:
105
106
  ...
106
107
  @typing.overload
107
- def write_joint_control_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
108
+ def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
108
109
  ...
109
110
  @typing.overload
110
- def write_joint_control_word(self, value: numpy.uint16) -> None:
111
+ def write_joint_enabled(self, value: bool) -> None:
111
112
  ...
112
113
  @typing.overload
113
- def write_joint_control_word(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
114
+ def write_joint_enabled(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
114
115
  ...
115
116
  @typing.overload
116
- async def write_joint_control_word_async(self, value: numpy.uint16) -> None:
117
+ async def write_joint_enabled_async(self, value: bool) -> None:
117
118
  ...
118
119
  @typing.overload
119
- async def write_joint_control_word_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
120
+ async def write_joint_enabled_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
120
121
  ...
121
122
  @typing.overload
122
- def write_joint_control_word_unchecked(self, value: numpy.uint16) -> None:
123
+ def write_joint_enabled_unchecked(self, value: bool) -> None:
123
124
  ...
124
125
  @typing.overload
125
- def write_joint_control_word_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
126
+ def write_joint_enabled_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
126
127
  ...
127
128
  @typing.overload
128
- def write_joint_current_limit(self, value: numpy.uint16) -> None:
129
+ def write_joint_reset_error(self, value: typing.SupportsInt) -> None:
129
130
  ...
130
131
  @typing.overload
131
- def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
132
+ def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
132
133
  ...
133
134
  @typing.overload
134
- async def write_joint_current_limit_async(self, value: numpy.uint16) -> None:
135
+ async def write_joint_reset_error_async(self, value: typing.SupportsInt) -> None:
135
136
  ...
136
137
  @typing.overload
137
- async def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
138
+ async def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
138
139
  ...
139
140
  @typing.overload
140
- def write_joint_current_limit_unchecked(self, value: numpy.uint16) -> None:
141
+ def write_joint_reset_error_unchecked(self, value: typing.SupportsInt) -> None:
141
142
  ...
142
143
  @typing.overload
143
- def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
144
+ def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
144
145
  ...
145
146
  @typing.overload
146
- def write_joint_reset_error(self, value: numpy.uint16) -> None:
147
+ def write_joint_sin_level(self, value: typing.SupportsInt) -> None:
147
148
  ...
148
149
  @typing.overload
149
- def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
150
+ def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
150
151
  ...
151
152
  @typing.overload
152
- async def write_joint_reset_error_async(self, value: numpy.uint16) -> None:
153
+ async def write_joint_sin_level_async(self, value: typing.SupportsInt) -> None:
153
154
  ...
154
155
  @typing.overload
155
- async def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
156
+ async def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
156
157
  ...
157
158
  @typing.overload
158
- def write_joint_reset_error_unchecked(self, value: numpy.uint16) -> None:
159
+ def write_joint_sin_level_unchecked(self, value: typing.SupportsInt) -> None:
159
160
  ...
160
161
  @typing.overload
161
- def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
162
+ def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
162
163
  ...
163
164
  @typing.overload
164
- def write_joint_sin_level(self, value: numpy.uint16) -> None:
165
+ def write_joint_target_position(self, value: typing.SupportsFloat) -> None:
165
166
  ...
166
167
  @typing.overload
167
- def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
168
+ def write_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
168
169
  ...
169
170
  @typing.overload
170
- async def write_joint_sin_level_async(self, value: numpy.uint16) -> None:
171
+ async def write_joint_target_position_async(self, value: typing.SupportsFloat) -> None:
171
172
  ...
172
173
  @typing.overload
173
- async def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
174
+ async def write_joint_target_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
174
175
  ...
175
176
  @typing.overload
176
- def write_joint_sin_level_unchecked(self, value: numpy.uint16) -> None:
177
+ def write_joint_target_position_unchecked(self, value: typing.SupportsFloat) -> None:
177
178
  ...
178
179
  @typing.overload
179
- def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
180
+ def write_joint_target_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
180
181
  ...
181
182
  class Hand:
182
- 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:
183
+ 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:
183
184
  ...
184
185
  def finger(self, index: typing.SupportsInt) -> Finger:
185
186
  ...
@@ -191,6 +192,8 @@ class Hand:
191
192
  ...
192
193
  def get_input_voltage(self) -> numpy.float32:
193
194
  ...
195
+ def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
196
+ ...
194
197
  def get_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
195
198
  ...
196
199
  def get_joint_error_code(self) -> numpy.typing.NDArray[numpy.uint32]:
@@ -201,8 +204,6 @@ class Hand:
201
204
  ...
202
205
  def get_joint_lower_limit(self) -> numpy.typing.NDArray[numpy.float64]:
203
206
  ...
204
- def get_joint_position(self) -> numpy.typing.NDArray[numpy.float64]:
205
- ...
206
207
  def get_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
207
208
  ...
208
209
  def get_joint_upper_limit(self) -> numpy.typing.NDArray[numpy.float64]:
@@ -211,12 +212,6 @@ class Hand:
211
212
  ...
212
213
  def get_temperature(self) -> numpy.float32:
213
214
  ...
214
- @typing.overload
215
- def pdo_write_unchecked(self, arg0: numpy.float64) -> None:
216
- ...
217
- @typing.overload
218
- def pdo_write_unchecked(self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
219
- ...
220
215
  def read_firmware_date(self) -> numpy.uint32:
221
216
  ...
222
217
  async def read_firmware_date_async(self) -> numpy.uint32:
@@ -241,6 +236,12 @@ class Hand:
241
236
  ...
242
237
  def read_input_voltage_unchecked(self) -> None:
243
238
  ...
239
+ def read_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
240
+ ...
241
+ async def read_joint_actual_position_async(self) -> numpy.typing.NDArray[numpy.float64]:
242
+ ...
243
+ def read_joint_actual_position_unchecked(self) -> None:
244
+ ...
244
245
  def read_joint_bus_voltage(self) -> numpy.typing.NDArray[numpy.float32]:
245
246
  ...
246
247
  async def read_joint_bus_voltage_async(self) -> numpy.typing.NDArray[numpy.float32]:
@@ -271,12 +272,6 @@ class Hand:
271
272
  ...
272
273
  def read_joint_lower_limit_unchecked(self) -> None:
273
274
  ...
274
- def read_joint_position(self) -> numpy.typing.NDArray[numpy.float64]:
275
- ...
276
- async def read_joint_position_async(self) -> numpy.typing.NDArray[numpy.float64]:
277
- ...
278
- def read_joint_position_unchecked(self) -> None:
279
- ...
280
275
  def read_joint_temperature(self) -> numpy.typing.NDArray[numpy.float32]:
281
276
  ...
282
277
  async def read_joint_temperature_async(self) -> numpy.typing.NDArray[numpy.float32]:
@@ -301,133 +296,130 @@ class Hand:
301
296
  ...
302
297
  def read_temperature_unchecked(self) -> None:
303
298
  ...
304
- def write_global_tpdo_id(self, value: numpy.uint16) -> None:
305
- ...
306
- async def write_global_tpdo_id_async(self, value: numpy.uint16) -> None:
307
- ...
308
- def write_global_tpdo_id_unchecked(self, value: numpy.uint16) -> None:
299
+ def realtime_controller(self, enable_upstream: bool, filter: filter.IFilter) -> IController:
309
300
  ...
310
301
  @typing.overload
311
- def write_joint_control_mode(self, value: numpy.uint16) -> None:
302
+ def write_joint_control_mode(self, value: typing.SupportsInt) -> None:
312
303
  ...
313
304
  @typing.overload
314
305
  def write_joint_control_mode(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
315
306
  ...
316
307
  @typing.overload
317
- async def write_joint_control_mode_async(self, value: numpy.uint16) -> None:
308
+ async def write_joint_control_mode_async(self, value: typing.SupportsInt) -> None:
318
309
  ...
319
310
  @typing.overload
320
311
  async def write_joint_control_mode_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
321
312
  ...
322
313
  @typing.overload
323
- def write_joint_control_mode_unchecked(self, value: numpy.uint16) -> None:
314
+ def write_joint_control_mode_unchecked(self, value: typing.SupportsInt) -> None:
324
315
  ...
325
316
  @typing.overload
326
317
  def write_joint_control_mode_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
327
318
  ...
328
319
  @typing.overload
329
- def write_joint_control_position(self, value: numpy.float64) -> None:
320
+ def write_joint_current_limit(self, value: typing.SupportsInt) -> None:
330
321
  ...
331
322
  @typing.overload
332
- def write_joint_control_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
323
+ def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
333
324
  ...
334
325
  @typing.overload
335
- async def write_joint_control_position_async(self, value: numpy.float64) -> None:
326
+ async def write_joint_current_limit_async(self, value: typing.SupportsInt) -> None:
336
327
  ...
337
328
  @typing.overload
338
- async def write_joint_control_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
329
+ async def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
339
330
  ...
340
331
  @typing.overload
341
- def write_joint_control_position_unchecked(self, value: numpy.float64) -> None:
332
+ def write_joint_current_limit_unchecked(self, value: typing.SupportsInt) -> None:
342
333
  ...
343
334
  @typing.overload
344
- def write_joint_control_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
335
+ def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
345
336
  ...
346
337
  @typing.overload
347
- def write_joint_control_word(self, value: numpy.uint16) -> None:
338
+ def write_joint_enabled(self, value: bool) -> None:
348
339
  ...
349
340
  @typing.overload
350
- def write_joint_control_word(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
341
+ def write_joint_enabled(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
351
342
  ...
352
343
  @typing.overload
353
- async def write_joint_control_word_async(self, value: numpy.uint16) -> None:
344
+ async def write_joint_enabled_async(self, value: bool) -> None:
354
345
  ...
355
346
  @typing.overload
356
- async def write_joint_control_word_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
347
+ async def write_joint_enabled_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
357
348
  ...
358
349
  @typing.overload
359
- def write_joint_control_word_unchecked(self, value: numpy.uint16) -> None:
350
+ def write_joint_enabled_unchecked(self, value: bool) -> None:
360
351
  ...
361
352
  @typing.overload
362
- def write_joint_control_word_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
353
+ def write_joint_enabled_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.bool_]) -> None:
363
354
  ...
364
355
  @typing.overload
365
- def write_joint_current_limit(self, value: numpy.uint16) -> None:
356
+ def write_joint_reset_error(self, value: typing.SupportsInt) -> None:
366
357
  ...
367
358
  @typing.overload
368
- def write_joint_current_limit(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
359
+ def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
369
360
  ...
370
361
  @typing.overload
371
- async def write_joint_current_limit_async(self, value: numpy.uint16) -> None:
362
+ async def write_joint_reset_error_async(self, value: typing.SupportsInt) -> None:
372
363
  ...
373
364
  @typing.overload
374
- async def write_joint_current_limit_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
365
+ async def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
375
366
  ...
376
367
  @typing.overload
377
- def write_joint_current_limit_unchecked(self, value: numpy.uint16) -> None:
368
+ def write_joint_reset_error_unchecked(self, value: typing.SupportsInt) -> None:
378
369
  ...
379
370
  @typing.overload
380
- def write_joint_current_limit_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
371
+ def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
381
372
  ...
382
373
  @typing.overload
383
- def write_joint_reset_error(self, value: numpy.uint16) -> None:
374
+ def write_joint_sin_level(self, value: typing.SupportsInt) -> None:
384
375
  ...
385
376
  @typing.overload
386
- def write_joint_reset_error(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
377
+ def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
387
378
  ...
388
379
  @typing.overload
389
- async def write_joint_reset_error_async(self, value: numpy.uint16) -> None:
380
+ async def write_joint_sin_level_async(self, value: typing.SupportsInt) -> None:
390
381
  ...
391
382
  @typing.overload
392
- async def write_joint_reset_error_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
383
+ async def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
393
384
  ...
394
385
  @typing.overload
395
- def write_joint_reset_error_unchecked(self, value: numpy.uint16) -> None:
386
+ def write_joint_sin_level_unchecked(self, value: typing.SupportsInt) -> None:
396
387
  ...
397
388
  @typing.overload
398
- def write_joint_reset_error_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
389
+ def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
399
390
  ...
400
391
  @typing.overload
401
- def write_joint_sin_level(self, value: numpy.uint16) -> None:
392
+ def write_joint_target_position(self, value: typing.SupportsFloat) -> None:
402
393
  ...
403
394
  @typing.overload
404
- def write_joint_sin_level(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
395
+ def write_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
405
396
  ...
406
397
  @typing.overload
407
- async def write_joint_sin_level_async(self, value: numpy.uint16) -> None:
398
+ async def write_joint_target_position_async(self, value: typing.SupportsFloat) -> None:
408
399
  ...
409
400
  @typing.overload
410
- async def write_joint_sin_level_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
401
+ async def write_joint_target_position_async(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
411
402
  ...
412
403
  @typing.overload
413
- def write_joint_sin_level_unchecked(self, value: numpy.uint16) -> None:
404
+ def write_joint_target_position_unchecked(self, value: typing.SupportsFloat) -> None:
414
405
  ...
415
406
  @typing.overload
416
- def write_joint_sin_level_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.uint16]) -> None:
417
- ...
418
- def write_pdo_enabled(self, value: numpy.uint8) -> None:
407
+ def write_joint_target_position_unchecked(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
419
408
  ...
420
- async def write_pdo_enabled_async(self, value: numpy.uint8) -> None:
409
+ class IController:
410
+ def __enter__(self) -> IController:
421
411
  ...
422
- def write_pdo_enabled_unchecked(self, value: numpy.uint8) -> None:
412
+ def __exit__(self, arg0: typing.Any, arg1: typing.Any, arg2: typing.Any) -> None:
423
413
  ...
424
- def write_pdo_interval(self, value: numpy.uint32) -> None:
414
+ def close(self) -> None:
425
415
  ...
426
- async def write_pdo_interval_async(self, value: numpy.uint32) -> None:
416
+ def get_joint_actual_position(self) -> numpy.typing.NDArray[numpy.float64]:
427
417
  ...
428
- def write_pdo_interval_unchecked(self, value: numpy.uint32) -> None:
418
+ def set_joint_target_position(self, value_array: typing.Annotated[numpy.typing.ArrayLike, numpy.float64]) -> None:
429
419
  ...
430
420
  class Joint:
421
+ def get_joint_actual_position(self) -> numpy.float64:
422
+ ...
431
423
  def get_joint_bus_voltage(self) -> numpy.float32:
432
424
  ...
433
425
  def get_joint_error_code(self) -> numpy.uint32:
@@ -438,12 +430,16 @@ class Joint:
438
430
  ...
439
431
  def get_joint_lower_limit(self) -> numpy.float64:
440
432
  ...
441
- def get_joint_position(self) -> numpy.float64:
442
- ...
443
433
  def get_joint_temperature(self) -> numpy.float32:
444
434
  ...
445
435
  def get_joint_upper_limit(self) -> numpy.float64:
446
436
  ...
437
+ def read_joint_actual_position(self) -> numpy.float64:
438
+ ...
439
+ async def read_joint_actual_position_async(self) -> numpy.float64:
440
+ ...
441
+ def read_joint_actual_position_unchecked(self) -> None:
442
+ ...
447
443
  def read_joint_bus_voltage(self) -> numpy.float32:
448
444
  ...
449
445
  async def read_joint_bus_voltage_async(self) -> numpy.float32:
@@ -474,12 +470,6 @@ class Joint:
474
470
  ...
475
471
  def read_joint_lower_limit_unchecked(self) -> None:
476
472
  ...
477
- def read_joint_position(self) -> numpy.float64:
478
- ...
479
- async def read_joint_position_async(self) -> numpy.float64:
480
- ...
481
- def read_joint_position_unchecked(self) -> None:
482
- ...
483
473
  def read_joint_temperature(self) -> numpy.float32:
484
474
  ...
485
475
  async def read_joint_temperature_async(self) -> numpy.float32:
@@ -492,39 +482,39 @@ class Joint:
492
482
  ...
493
483
  def read_joint_upper_limit_unchecked(self) -> None:
494
484
  ...
495
- def write_joint_control_mode(self, value: numpy.uint16) -> None:
485
+ def write_joint_control_mode(self, value: typing.SupportsInt) -> None:
496
486
  ...
497
- async def write_joint_control_mode_async(self, value: numpy.uint16) -> None:
487
+ async def write_joint_control_mode_async(self, value: typing.SupportsInt) -> None:
498
488
  ...
499
- def write_joint_control_mode_unchecked(self, value: numpy.uint16) -> None:
489
+ def write_joint_control_mode_unchecked(self, value: typing.SupportsInt) -> None:
500
490
  ...
501
- def write_joint_control_position(self, value: numpy.float64) -> None:
491
+ def write_joint_current_limit(self, value: typing.SupportsInt) -> None:
502
492
  ...
503
- async def write_joint_control_position_async(self, value: numpy.float64) -> None:
493
+ async def write_joint_current_limit_async(self, value: typing.SupportsInt) -> None:
504
494
  ...
505
- def write_joint_control_position_unchecked(self, value: numpy.float64) -> None:
495
+ def write_joint_current_limit_unchecked(self, value: typing.SupportsInt) -> None:
506
496
  ...
507
- def write_joint_control_word(self, value: numpy.uint16) -> None:
497
+ def write_joint_enabled(self, value: bool) -> None:
508
498
  ...
509
- async def write_joint_control_word_async(self, value: numpy.uint16) -> None:
499
+ async def write_joint_enabled_async(self, value: bool) -> None:
510
500
  ...
511
- def write_joint_control_word_unchecked(self, value: numpy.uint16) -> None:
501
+ def write_joint_enabled_unchecked(self, value: bool) -> None:
512
502
  ...
513
- def write_joint_current_limit(self, value: numpy.uint16) -> None:
503
+ def write_joint_reset_error(self, value: typing.SupportsInt) -> None:
514
504
  ...
515
- async def write_joint_current_limit_async(self, value: numpy.uint16) -> None:
505
+ async def write_joint_reset_error_async(self, value: typing.SupportsInt) -> None:
516
506
  ...
517
- def write_joint_current_limit_unchecked(self, value: numpy.uint16) -> None:
507
+ def write_joint_reset_error_unchecked(self, value: typing.SupportsInt) -> None:
518
508
  ...
519
- def write_joint_reset_error(self, value: numpy.uint16) -> None:
509
+ def write_joint_sin_level(self, value: typing.SupportsInt) -> None:
520
510
  ...
521
- async def write_joint_reset_error_async(self, value: numpy.uint16) -> None:
511
+ async def write_joint_sin_level_async(self, value: typing.SupportsInt) -> None:
522
512
  ...
523
- def write_joint_reset_error_unchecked(self, value: numpy.uint16) -> None:
513
+ def write_joint_sin_level_unchecked(self, value: typing.SupportsInt) -> None:
524
514
  ...
525
- def write_joint_sin_level(self, value: numpy.uint16) -> None:
515
+ def write_joint_target_position(self, value: typing.SupportsFloat) -> None:
526
516
  ...
527
- async def write_joint_sin_level_async(self, value: numpy.uint16) -> None:
517
+ async def write_joint_target_position_async(self, value: typing.SupportsFloat) -> None:
528
518
  ...
529
- def write_joint_sin_level_unchecked(self, value: numpy.uint16) -> None:
519
+ def write_joint_target_position_unchecked(self, value: typing.SupportsFloat) -> None:
530
520
  ...
@@ -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
+ ...
Binary file
wujihandpy/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.5.2'
32
- __version_tuple__ = version_tuple = (0, 5, 2)
31
+ __version__ = version = '1.0.0'
32
+ __version_tuple__ = version_tuple = (1, 0, 0)
33
33
 
34
- __commit_id__ = commit_id = 'ga2dd2e0d2'
34
+ __commit_id__ = commit_id = 'g05d7911c2'
@@ -0,0 +1,2 @@
1
+ Version: 1.11.2
2
+ Arguments: ['C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-0xcdz1cp\\cp314-win_amd64\\build\\venv\\Scripts\\delvewheel', 'repair', '--add-path', 'C:/vcpkg/installed/x64-windows/bin', '-w', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-0xcdz1cp\\cp314-win_amd64\\repaired_wheel', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-0xcdz1cp\\cp314-win_amd64\\built_wheel\\wujihandpy-1.0.0-cp314-cp314-win_amd64.whl']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: wujihandpy
3
- Version: 0.5.2
3
+ Version: 1.0.0
4
4
  Summary: Python bindings for WujiHandCpp
5
5
  Author-Email: Zihan Qin <zihanqin2048@gmail.com>
6
6
  Maintainer-Email: Wuji Technology <support@pan-motor.com>
@@ -117,8 +117,8 @@ hand = wujihandpy.Hand()
117
117
  ### 读数据
118
118
 
119
119
  ```python
120
- def read_<dataname>(self) -> np.<datatype>
121
- def read_<dataname>(self) -> np.array<datatype> # For bulk-read
120
+ def read_<dataname>(self) -> datatype
121
+ def read_<dataname>(self) -> np.ndarray[datatype] # For bulk-read
122
122
  ```
123
123
 
124
124
  所有可使用的数据均定义在 `wujihandpy/_core.pyi` 中。
@@ -134,7 +134,7 @@ time = hand.read_system_time()
134
134
  例如,读取第1个手指(食指),第0个关节的当前位置数据:
135
135
 
136
136
  ```python
137
- position = hand.finger(1).joint(0).read_joint_position()
137
+ position = hand.finger(1).joint(0).read_joint_actual_position()
138
138
  ```
139
139
 
140
140
  关节角度为 `np.float64` 类型,单位为弧度,零点和正方向与 [URDF文件](https://github.com/Wuji-Technology-Co-Ltd/wujihand-urdf) 中定义的相同。
@@ -144,7 +144,7 @@ position = hand.finger(1).joint(0).read_joint_position()
144
144
  例如,以下指令读取整手所有(20个)关节的当前位置数据:
145
145
 
146
146
  ```python
147
- positions = hand.read_joint_position()
147
+ positions = hand.read_joint_actual_position()
148
148
  ```
149
149
 
150
150
  进行批量读时,函数返回包含所有数据的 `np.ndarray[np.float64]`:
@@ -165,21 +165,21 @@ positions = hand.read_joint_position()
165
165
  写数据拥有类似的 API,但多了一个参数用于传递目标值:
166
166
 
167
167
  ```python
168
- def write_<dataname>(self, np.<datatype>)
169
- def write_<dataname>(self, np.array<datatype>) # For bulk-write
168
+ def write_<dataname>(self, datatype)
169
+ def write_<dataname>(self, np.ndarray[datatype]) # For bulk-write
170
170
  ```
171
171
 
172
172
  例如,写入单个关节的目标位置数据:
173
173
 
174
174
  ```python
175
- hand.finger(1).joint(0).write_joint_control_position(np.float64(0.8))
175
+ hand.finger(1).joint(0).write_joint_target_position(0.8)
176
176
  ```
177
177
 
178
178
  各关节的合法角度范围可通过以下 API 获取:
179
179
 
180
180
  ```python
181
- upper = (Hand | Finger | Joint).read_joint_upper_limit()
182
- lower = (Hand | Finger | Joint).read_joint_lower_limit()
181
+ upper = < Hand / Finger / Joint >.read_joint_upper_limit()
182
+ lower = < Hand / Finger / Joint >.read_joint_lower_limit()
183
183
  ```
184
184
 
185
185
  若写入的角度超出合法范围,会被自动限幅至最高/最低值。
@@ -187,13 +187,13 @@ lower = (Hand | Finger | Joint).read_joint_lower_limit()
187
187
  **批量写**数据也是可行的,例如,批量为第一个手指写入目标位置数据:
188
188
 
189
189
  ```python
190
- hand.finger(1).write_joint_control_position(np.float64(0.8))
190
+ hand.finger(1).write_joint_target_position(0.8)
191
191
  ```
192
192
 
193
193
  如果每个关节的目标值不同,可以传入一个包含所有目标值的 `np.array`:
194
194
 
195
195
  ```python
196
- hand.finger(1).write_joint_control_position(
196
+ hand.finger(1).write_joint_target_position(
197
197
  np.array(
198
198
  # J1 J2 J3 J4
199
199
  [0.8, 0.0, 0.8, 0.8],
@@ -209,10 +209,10 @@ hand.finger(1).write_joint_control_position(
209
209
  读写函数均有对应的异步版本,函数名以 `_async` 作为后缀。
210
210
 
211
211
  ``` python
212
- async def read_<dataname>_async(self) -> np.<datatype>
213
- async def read_<dataname>_async(self) -> np.array<datatype> # For bulk-read
214
- async def write_<dataname>_async(self, np.<datatype>)
215
- async def write_<dataname>_async(self, np.array<datatype>) # For bulk-write
212
+ async def read_<dataname>_async(self) -> datatype
213
+ async def read_<dataname>_async(self) -> np.ndarray[datatype] # For bulk-read
214
+ async def write_<dataname>_async(self, datatype)
215
+ async def write_<dataname>_async(self, np.ndarray[datatype]) # For bulk-write
216
216
  ```
217
217
 
218
218
  异步接口需 `await`;等待期间不阻塞线程/事件循环,返回时保证读/写已经成功。
@@ -224,8 +224,8 @@ async def write_<dataname>_async(self, np.array<datatype>) # For bulk-write
224
224
  ```python
225
225
  def read_<dataname>_unchecked(self) -> None
226
226
  def read_<dataname>_unchecked(self) -> None # For bulk-read
227
- def write_<dataname>_unchecked(self, np.<datatype>)
228
- def write_<dataname>_unchecked(self, np.array<datatype>) # For bulk-write
227
+ def write_<dataname>_unchecked(self, datatype)
228
+ def write_<dataname>_unchecked(self, np.ndarray[datatype]) # For bulk-write
229
229
  ```
230
230
 
231
231
  Unchecked 函数总是立即返回,不会阻塞,通常用于对实时性要求较高的场景。
@@ -235,27 +235,25 @@ Unchecked 函数总是立即返回,不会阻塞,通常用于对实时性要
235
235
  如果希望获取以往读/写的结果,可以使用 `get` 系列函数:
236
236
 
237
237
  ```python
238
- def get_<dataname>(self) -> np.<datatype>
239
- def get_<dataname>(self) -> np.array<datatype> # For bulk-read
238
+ def get_<dataname>(self) -> datatype
239
+ def get_<dataname>(self) -> np.ndarray[datatype] # For bulk-read
240
240
  ```
241
241
 
242
242
  `get` 系列函数同样不会阻塞,它总是立即返回最近一次读取到的数据,无论该数据来自 `read`、`async-read` 还是 `read-unchecked`。
243
243
 
244
244
  如果尚未请求过该数据,或请求尚未成功,`get` 函数的返回值是未定义的(通常为0)。
245
245
 
246
- ### PDO 写
246
+ ### 实时控制
247
247
 
248
- 默认的读/写方式均带有缓冲池,积攒一段数据后才进行传输,最高读/写频率无法超过 100Hz。
248
+ 默认的读/写方式均带有缓冲池,积攒一段时间数据后才进行传输,最高读/写频率无法超过 100Hz。
249
249
 
250
- 对于需要高频率实时控制关节位置(如 1kHz)的场景,需使用 PDO 非阻塞写接口。
250
+ 对于需要流畅控制关节位置的场景,需使用 realtime_controller。
251
251
 
252
- ```python
253
- hand.pdo_write_unchecked(np.float64(0.8))
254
- # 或按 5x4 结构批量发送:
255
- # hand.pdo_write_unchecked(np.array([...], dtype=np.float64))
256
- ```
252
+ 具体的控制示例可见 [example](example) 目录:
257
253
 
258
- PDO 启用前需特别配置,见 [example/4.pdo.py](example/4.pdo.py)
254
+ 单向写:[realtime.py](example/4.realtime.py)
255
+
256
+ 双向读/写:[realtime_duplex.py](example/5.realtime_duplex.py)
259
257
 
260
258
  ## 性能与优化
261
259
 
@@ -263,6 +261,8 @@ WujihandPy 在充分保证易用性的同时,尽可能优化了性能与效率
263
261
 
264
262
  我们强烈建议优先使用批量读/写以最大限度地发挥性能。
265
263
 
264
+ 对于需要流畅控制关节位置的场景,请务必使用 realtime_controller。
265
+
266
266
  ## 许可证
267
267
 
268
268
  本项目采用 MIT 许可证,详情见 [LICENSE](LICENSE) 文件。
@@ -0,0 +1,13 @@
1
+ wujihandpy/_core.cp314-win_amd64.pyd,sha256=pDr565s6yIiunwyA9Gpq9B50Qs2q8QmbdeujoUwE9po,485376
2
+ wujihandpy/_version.py,sha256=XU2B0PQMT4sDJu2ptWqHSvUNE14luu_OmGG_oZIMuAs,746
3
+ wujihandpy/__init__.py,sha256=vPhIatTFj099nPHxR0ifTFN4gKRt_9dstEgA7U3jR9E,503
4
+ wujihandpy/_core/filter.pyi,sha256=bhf3_lTgyf0BeVhp4TqUw0nJgoE0f-kyzw7vJrt67nI,235
5
+ wujihandpy/_core/__init__.pyi,sha256=F94Z31a3PLpQsXHFmqpaQQSfefSfvvNh3eP5gDxftqo,22394
6
+ wujihandpy-1.0.0.dist-info/DELVEWHEEL,sha256=ajm0CT9Yj1XPUwIbowm_LHRm_6zqJjxRdrKbUiGQlcw,455
7
+ wujihandpy-1.0.0.dist-info/METADATA,sha256=32D_JDjINxLq14gSc9Q9qqAUpkOeJcAgYGmJDuIom0I,8029
8
+ wujihandpy-1.0.0.dist-info/RECORD,,
9
+ wujihandpy-1.0.0.dist-info/WHEEL,sha256=gWMs92Yhbl9pSGNRFWCXG1mfeuNl7HhxcJG5aLu4nQc,106
10
+ wujihandpy-1.0.0.dist-info/licenses/LICENSE,sha256=aWRV7TIHNfIAV58Abtu5ubNfqOHUeANdqg_QXb99nto,1093
11
+ wujihandpy.libs/libusb-1.0-fcae749f9e5fd72ad41bbcc029d2e10a.dll,sha256=_K50n55f1yrUG7zAKdLhCqCeWP2bp2qvH831bsQU13c,158208
12
+ wujihandpy.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll,sha256=pMIim9wqKmMKzcCVtNhgCOXD47x3cxdDVPPaT1vrnN4,575056
13
+ wujihandpy.libs/msvcp140_atomic_wait-eb238a7437cff8f49c01cc67fd035163.dll,sha256=aR3icdyYE_-F-pRwzFoq8K2INB8tg4IhD8HFdLrgehc,29696
@@ -1,2 +0,0 @@
1
- Version: 1.11.1
2
- Arguments: ['C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-mggnxvto\\cp314-win_amd64\\build\\venv\\Scripts\\delvewheel', 'repair', '--add-path', 'C:/vcpkg/installed/x64-windows/bin', '-w', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-mggnxvto\\cp314-win_amd64\\repaired_wheel', 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\cibw-run-mggnxvto\\cp314-win_amd64\\built_wheel\\wujihandpy-0.5.2-cp314-cp314-win_amd64.whl']
@@ -1,12 +0,0 @@
1
- wujihandpy/_core.cp314-win_amd64.pyd,sha256=62gIhLKhj_hUjUX7YQ5W4BiVOpCvHCPBSmBoNy30z2o,460800
2
- wujihandpy/_core.pyi,sha256=AYPn5is8_03XWTOCmk8us0-r7vkY8_fAWcbuuFYK0A0,22597
3
- wujihandpy/_version.py,sha256=QJ6Wh_ZvwZjLkcwjPJmDkeMxkPTIZUbXCYfZQyGTcfo,746
4
- wujihandpy/__init__.py,sha256=5plS1qToxzRcyDIZqsXH0THLwK31-6bCQY2mEzv3u6U,516
5
- wujihandpy-0.5.2.dist-info/DELVEWHEEL,sha256=1mURiVTo9JF9SsMaRD8W757dv1RmtNLDrOhO6sF2T2Y,455
6
- wujihandpy-0.5.2.dist-info/METADATA,sha256=Dr7rJvg4kjdvLm29x7BTT_onQsin4QFWwX8FpBwqWEM,8037
7
- wujihandpy-0.5.2.dist-info/RECORD,,
8
- wujihandpy-0.5.2.dist-info/WHEEL,sha256=gWMs92Yhbl9pSGNRFWCXG1mfeuNl7HhxcJG5aLu4nQc,106
9
- wujihandpy-0.5.2.dist-info/licenses/LICENSE,sha256=aWRV7TIHNfIAV58Abtu5ubNfqOHUeANdqg_QXb99nto,1093
10
- wujihandpy.libs/libusb-1.0-f227a173b895cb3e1548ee0bb7bb839c.dll,sha256=8iehc7iVyz4VSO4Lt7uDnGV2T_aHfg4cO-VWnMYSxm4,158208
11
- wujihandpy.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll,sha256=pMIim9wqKmMKzcCVtNhgCOXD47x3cxdDVPPaT1vrnN4,575056
12
- wujihandpy.libs/msvcp140_atomic_wait-eb238a7437cff8f49c01cc67fd035163.dll,sha256=aR3icdyYE_-F-pRwzFoq8K2INB8tg4IhD8HFdLrgehc,29696