xarm-python-sdk 1.15.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. xarm/__init__.py +2 -0
  2. xarm/build_backend.py +17 -0
  3. xarm/core/__init__.py +2 -0
  4. xarm/core/comm/__init__.py +5 -0
  5. xarm/core/comm/base.py +303 -0
  6. xarm/core/comm/serial_port.py +44 -0
  7. xarm/core/comm/socket_port.py +150 -0
  8. xarm/core/comm/uxbus_cmd_protocol.py +100 -0
  9. xarm/core/config/__init__.py +0 -0
  10. xarm/core/config/x_code.py +1427 -0
  11. xarm/core/config/x_config.py +553 -0
  12. xarm/core/utils/__init__.py +3 -0
  13. xarm/core/utils/convert.py +124 -0
  14. xarm/core/utils/crc16.py +76 -0
  15. xarm/core/utils/debug_print.py +21 -0
  16. xarm/core/utils/log.py +98 -0
  17. xarm/core/version.py +1 -0
  18. xarm/core/wrapper/__init__.py +11 -0
  19. xarm/core/wrapper/uxbus_cmd.py +1457 -0
  20. xarm/core/wrapper/uxbus_cmd_ser.py +94 -0
  21. xarm/core/wrapper/uxbus_cmd_tcp.py +305 -0
  22. xarm/tools/__init__.py +0 -0
  23. xarm/tools/blockly/__init__.py +1 -0
  24. xarm/tools/blockly/_blockly_base.py +416 -0
  25. xarm/tools/blockly/_blockly_handler.py +1338 -0
  26. xarm/tools/blockly/_blockly_highlight.py +94 -0
  27. xarm/tools/blockly/_blockly_node.py +61 -0
  28. xarm/tools/blockly/_blockly_tool.py +480 -0
  29. xarm/tools/blockly_tool.py +1864 -0
  30. xarm/tools/gcode.py +90 -0
  31. xarm/tools/list_ports.py +39 -0
  32. xarm/tools/modbus_tcp.py +205 -0
  33. xarm/tools/threads.py +30 -0
  34. xarm/tools/utils.py +36 -0
  35. xarm/version.py +1 -0
  36. xarm/wrapper/__init__.py +1 -0
  37. xarm/wrapper/studio_api.py +34 -0
  38. xarm/wrapper/xarm_api.py +4416 -0
  39. xarm/x3/__init__.py +2 -0
  40. xarm/x3/base.py +2638 -0
  41. xarm/x3/base_board.py +198 -0
  42. xarm/x3/code.py +62 -0
  43. xarm/x3/decorator.py +104 -0
  44. xarm/x3/events.py +166 -0
  45. xarm/x3/ft_sensor.py +264 -0
  46. xarm/x3/gpio.py +457 -0
  47. xarm/x3/grammar_async.py +21 -0
  48. xarm/x3/grammar_coroutine.py +24 -0
  49. xarm/x3/gripper.py +830 -0
  50. xarm/x3/modbus_tcp.py +84 -0
  51. xarm/x3/parse.py +110 -0
  52. xarm/x3/record.py +216 -0
  53. xarm/x3/report.py +204 -0
  54. xarm/x3/robotiq.py +220 -0
  55. xarm/x3/servo.py +485 -0
  56. xarm/x3/studio.py +138 -0
  57. xarm/x3/track.py +424 -0
  58. xarm/x3/utils.py +43 -0
  59. xarm/x3/xarm.py +1928 -0
  60. xarm_python_sdk-1.15.2.dist-info/METADATA +103 -0
  61. xarm_python_sdk-1.15.2.dist-info/RECORD +63 -0
  62. xarm_python_sdk-1.15.2.dist-info/WHEEL +4 -0
  63. xarm_python_sdk-1.15.2.dist-info/licenses/LICENSE +27 -0
@@ -0,0 +1,1457 @@
1
+ #!/usr/bin/env python3
2
+ # Software License Agreement (BSD License)
3
+ #
4
+ # Copyright (c) 2018, UFACTORY, Inc.
5
+ # All rights reserved.
6
+ #
7
+ # Author: Jimy Zhang <jimy.zhang@ufactory.cc> <jimy92@163.com>
8
+ # Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>
9
+
10
+ import time
11
+ import math
12
+ import threading
13
+ import functools
14
+ from ..utils import convert
15
+ from ..config.x_config import XCONF
16
+
17
+
18
+ def lock_require(func):
19
+ @functools.wraps(func)
20
+ def decorator(*args, **kwargs):
21
+ with args[0].lock:
22
+ return func(*args, **kwargs)
23
+ return decorator
24
+
25
+
26
+ class UxbusCmd(object):
27
+ BAUDRATES = (4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600,
28
+ 1000000, 1500000, 2000000, 2500000)
29
+
30
+ def __init__(self, set_feedback_key_tranid=None):
31
+ self._has_error = False
32
+ self._has_warn = False
33
+ self._state_is_ready = False
34
+ self._error_code = 0
35
+ self._warn_code = 0
36
+ self._cmd_num = 0
37
+ self._debug = False
38
+ self.lock = threading.Lock()
39
+ self._G_TOUT = XCONF.UxbusConf.GET_TIMEOUT / 1000
40
+ self._S_TOUT = XCONF.UxbusConf.SET_TIMEOUT / 1000
41
+ self._last_comm_time = time.monotonic()
42
+ self._last_modbus_comm_time = time.monotonic()
43
+ self._feedback_type = 0
44
+ self._set_feedback_key_tranid = set_feedback_key_tranid
45
+
46
+ @property
47
+ def last_comm_time(self):
48
+ return self._last_comm_time
49
+
50
+ @property
51
+ def state_is_ready(self):
52
+ return self._state_is_ready
53
+
54
+ def _get_trans_id(self):
55
+ return 0
56
+
57
+ def set_timeout(self, timeout):
58
+ try:
59
+ if isinstance(timeout, (tuple, list)):
60
+ if len(timeout) >= 2:
61
+ self._S_TOUT = timeout[0] if timeout[0] > 0 else self._S_TOUT
62
+ self._G_TOUT = timeout[1] if timeout[1] > 0 else self._G_TOUT
63
+ elif len(timeout) == 1:
64
+ self._S_TOUT = timeout[0] if timeout[0] > 0 else self._S_TOUT
65
+ self._G_TOUT = timeout[0] if timeout[0] > 0 else self._G_TOUT
66
+ elif isinstance(timeout, (int, float)):
67
+ self._S_TOUT = timeout if timeout > 0 else self._S_TOUT
68
+ self._G_TOUT = timeout if timeout > 0 else self._G_TOUT
69
+ except:
70
+ pass
71
+ return [self._S_TOUT, self._G_TOUT] if self._S_TOUT != self._G_TOUT else self._S_TOUT
72
+
73
+ def set_debug(self, debug):
74
+ self._debug = debug
75
+
76
+ def send_modbus_request(self, unit_id, pdu_data, pdu_len, prot_id=-1, t_id=None):
77
+ raise NotImplementedError
78
+
79
+ def recv_modbus_response(self, t_unit_id, t_trans_id, num, timeout, t_prot_id=-1, ret_raw=False):
80
+ raise NotImplementedError
81
+
82
+ @lock_require
83
+ def set_nu8(self, funcode, datas, num, timeout=None, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
84
+ need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
85
+ if feedback_key and need_set_fb:
86
+ self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
87
+
88
+ trans_id = self._get_trans_id()
89
+ if feedback_key and self._set_feedback_key_tranid:
90
+ self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
91
+ ret = self.send_modbus_request(funcode, datas, num)
92
+ if ret == -1:
93
+ return [XCONF.UxbusState.ERR_NOTTCP]
94
+ ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT if timeout is None else timeout)
95
+ if feedback_key and need_set_fb:
96
+ self._set_feedback_type_no_lock(self._feedback_type)
97
+ return ret
98
+
99
+ @lock_require
100
+ def getset_nu8(self, funcode, datas, num_send, num_get):
101
+ ret = self.send_modbus_request(funcode, datas, num_send)
102
+ if ret == -1:
103
+ return [XCONF.UxbusState.ERR_NOTTCP]
104
+ return self.recv_modbus_response(funcode, ret, num_get, self._S_TOUT)
105
+
106
+ @lock_require
107
+ def get_nu8(self, funcode, num):
108
+ ret = self.send_modbus_request(funcode, 0, 0)
109
+ if ret == -1:
110
+ return [XCONF.UxbusState.ERR_NOTTCP] * (num + 1)
111
+ return self.recv_modbus_response(funcode, ret, num, self._G_TOUT)
112
+
113
+ @lock_require
114
+ def set_nu16(self, funcode, datas, num, additional_bytes=None):
115
+ hexdata = convert.u16s_to_bytes(datas, num)
116
+ if additional_bytes is not None:
117
+ hexdata += additional_bytes
118
+ ret = self.send_modbus_request(funcode, hexdata, num * 2 + len(additional_bytes))
119
+ else:
120
+ ret = self.send_modbus_request(funcode, hexdata, num * 2)
121
+ if ret == -1:
122
+ return [XCONF.UxbusState.ERR_NOTTCP]
123
+ ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
124
+ return ret
125
+
126
+ @lock_require
127
+ def get_nu16(self, funcode, num):
128
+ ret = self.send_modbus_request(funcode, 0, 0)
129
+ if ret == -1:
130
+ return [XCONF.UxbusState.ERR_NOTTCP] * (num * 2 + 1)
131
+ ret = self.recv_modbus_response(funcode, ret, num * 2, self._G_TOUT)
132
+ data = [0] * (1 + num)
133
+ data[0] = ret[0]
134
+ data[1:num] = convert.bytes_to_u16s(ret[1:num * 2 + 1], num)
135
+ return data
136
+
137
+ @lock_require
138
+ def set_nfp32(self, funcode, datas, num, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
139
+ need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
140
+ if feedback_key and need_set_fb:
141
+ self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
142
+
143
+ trans_id = self._get_trans_id()
144
+ if feedback_key and self._set_feedback_key_tranid:
145
+ self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
146
+ hexdata = convert.fp32s_to_bytes(datas, num)
147
+ ret = self.send_modbus_request(funcode, hexdata, num * 4)
148
+ if ret == -1:
149
+ return [XCONF.UxbusState.ERR_NOTTCP]
150
+ ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
151
+ if feedback_key and need_set_fb:
152
+ self._set_feedback_type_no_lock(self._feedback_type)
153
+ return ret
154
+
155
+ @lock_require
156
+ def set_nfp32_with_bytes(self, funcode, datas, num, additional_bytes, rx_len=0, timeout=None, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
157
+ need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
158
+ if feedback_key and need_set_fb:
159
+ self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
160
+
161
+ trans_id = self._get_trans_id()
162
+ if feedback_key and self._set_feedback_key_tranid:
163
+ self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
164
+ hexdata = convert.fp32s_to_bytes(datas, num)
165
+ hexdata += additional_bytes
166
+ ret = self.send_modbus_request(funcode, hexdata, num * 4 + len(additional_bytes))
167
+ if ret == -1:
168
+ return [XCONF.UxbusState.ERR_NOTTCP]
169
+ ret = self.recv_modbus_response(funcode, ret, rx_len, self._S_TOUT if timeout is None else timeout)
170
+ if feedback_key and need_set_fb:
171
+ self._set_feedback_type_no_lock(self._feedback_type)
172
+ return ret
173
+
174
+ @lock_require
175
+ def set_nint32(self, funcode, datas, num, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
176
+ need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
177
+ if feedback_key and need_set_fb:
178
+ self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
179
+
180
+ trans_id = self._get_trans_id()
181
+ if feedback_key and self._set_feedback_key_tranid:
182
+ self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
183
+ hexdata = convert.int32s_to_bytes(datas, num)
184
+ ret = self.send_modbus_request(funcode, hexdata, num * 4)
185
+ if ret == -1:
186
+ return [XCONF.UxbusState.ERR_NOTTCP]
187
+ ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
188
+ if feedback_key and need_set_fb:
189
+ self._set_feedback_type_no_lock(self._feedback_type)
190
+ return ret
191
+
192
+ @lock_require
193
+ def get_nfp32(self, funcode, num, timeout=None):
194
+ ret = self.send_modbus_request(funcode, 0, 0)
195
+ if ret == -1:
196
+ return [XCONF.UxbusState.ERR_NOTTCP] * (num * 4 + 1)
197
+ ret = self.recv_modbus_response(funcode, ret, num * 4, timeout if timeout is not None else self._G_TOUT)
198
+ data = [0] * (1 + num)
199
+ data[0] = ret[0]
200
+ data[1:num+1] = convert.bytes_to_fp32s(ret[1:num * 4 + 1], num)
201
+ return data
202
+
203
+ @lock_require
204
+ def get_nfp32_with_datas(self, funcode, datas, num_send, num_get, timeout=None):
205
+ ret = self.send_modbus_request(funcode, datas, num_send)
206
+ if ret == -1:
207
+ return [XCONF.UxbusState.ERR_NOTTCP]
208
+ ret = self.recv_modbus_response(funcode, ret, num_get * 4, timeout if timeout is not None else self._G_TOUT)
209
+ data = [0] * (1 + num_get)
210
+ data[0] = ret[0]
211
+ data[1:num_get + 1] = convert.bytes_to_fp32s(ret[1:num_get * 4 + 1], num_get)
212
+ return data
213
+
214
+ @lock_require
215
+ def swop_nfp32(self, funcode, datas, txn, rxn):
216
+ hexdata = convert.fp32s_to_bytes(datas, txn)
217
+ ret = self.send_modbus_request(funcode, hexdata, txn * 4)
218
+ if ret == -1:
219
+ return [XCONF.UxbusState.ERR_NOTTCP] * (rxn + 1)
220
+ ret = self.recv_modbus_response(funcode, ret, rxn * 4, self._G_TOUT)
221
+ data = [0] * (1 + rxn)
222
+ data[0] = ret[0]
223
+ data[1:rxn+1] = convert.bytes_to_fp32s(ret[1:rxn * 4 + 1], rxn)
224
+ return data
225
+
226
+ @lock_require
227
+ def is_nfp32(self, funcode, datas, txn):
228
+ hexdata = convert.fp32s_to_bytes(datas, txn)
229
+ ret = self.send_modbus_request(funcode, hexdata, txn * 4)
230
+ if ret == -1:
231
+ return [XCONF.UxbusState.ERR_NOTTCP] * 2
232
+ return self.recv_modbus_response(funcode, ret, 1, self._G_TOUT)
233
+
234
+ def get_version(self):
235
+ return self.get_nu8(XCONF.UxbusReg.GET_VERSION, 40)
236
+
237
+ def get_robot_sn(self):
238
+ return self.get_nu8(XCONF.UxbusReg.GET_ROBOT_SN, 40)
239
+
240
+ def check_verification(self):
241
+ # txdata = signature, 175: signature length if use 14-character SN for plain text, do not miss '\n's
242
+ return self.get_nu8(XCONF.UxbusReg.CHECK_VERIFY, 1)
243
+
244
+ def system_control(self, value):
245
+ txdata = [value]
246
+ return self.set_nu8(XCONF.UxbusReg.SYSTEM_CONTROL, txdata, 1)
247
+
248
+ def set_record_traj(self, value):
249
+ txdata = [value]
250
+ return self.set_nu8(XCONF.UxbusReg.SET_TRAJ_RECORD, txdata, 1)
251
+
252
+ def playback_traj(self, value, spdx=1, feedback_key=None):
253
+ txdata = [value, spdx]
254
+ return self.set_nint32(XCONF.UxbusReg.PLAY_TRAJ, txdata, 2, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
255
+
256
+ def playback_traj_old(self, value):
257
+ txdata = [value]
258
+ return self.set_nint32(XCONF.UxbusReg.PLAY_TRAJ, txdata, 1)
259
+
260
+ def save_traj(self, filename, wait_time=2, feedback_key=None):
261
+ char_list = list(filename)
262
+ txdata = [ord(i) for i in char_list]
263
+ name_len = len(txdata)
264
+ if name_len > 80:
265
+ print("name length should not exceed 80 characters!")
266
+ return [XCONF.UxbusState.ERR_PARAM]
267
+ txdata = txdata + [0] * (81 - name_len)
268
+
269
+ ret = self.set_nu8(XCONF.UxbusReg.SAVE_TRAJ, txdata, 81, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
270
+ time.sleep(wait_time) # Must! or buffer would be flushed if set mode to pos_mode
271
+ return ret
272
+
273
+ def load_traj(self, filename, wait_time=2, feedback_key=None):
274
+ char_list = list(filename)
275
+ txdata = [ord(i) for i in char_list]
276
+ name_len = len(txdata)
277
+ if name_len > 80:
278
+ print("name length should not exceed 80 characters!")
279
+ return [XCONF.UxbusState.ERR_PARAM]
280
+ txdata = txdata + [0] * (81 - name_len)
281
+
282
+ ret = self.set_nu8(XCONF.UxbusReg.LOAD_TRAJ, txdata, 81, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
283
+ if wait_time > 0:
284
+ time.sleep(wait_time) # Must! or buffer would be flushed if set mode to pos_mode
285
+ return ret
286
+
287
+ def get_traj_rw_status(self):
288
+ return self.get_nu8(XCONF.UxbusReg.GET_TRAJ_RW_STATUS, 1)
289
+
290
+ def set_reduced_mode(self, on_off):
291
+ txdata = [on_off]
292
+ return self.set_nu8(XCONF.UxbusReg.SET_REDUCED_MODE, txdata, 1)
293
+
294
+ def set_reduced_linespeed(self, lspd_mm):
295
+ txdata = [lspd_mm]
296
+ return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_TRSV, txdata, 1)
297
+
298
+ def set_reduced_jointspeed(self, jspd_rad):
299
+ txdata = [jspd_rad]
300
+ return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_P2PV, txdata, 1)
301
+
302
+ def get_reduced_mode(self):
303
+ return self.get_nu8(XCONF.UxbusReg.GET_REDUCED_MODE, 1)
304
+
305
+ def get_reduced_states(self, length=21):
306
+ ret = self.get_nu8(XCONF.UxbusReg.GET_REDUCED_STATE, length)
307
+ msg = [0] * 8
308
+ msg[0] = ret[0]
309
+ msg[1] = ret[1] # reduced_mode_is_on
310
+ msg[2] = convert.bytes_to_16s(ret[2:14], 6) # tcp_boundary
311
+ msg[3:5] = convert.bytes_to_fp32s(ret[14:22], 2) # tcp_speed, joint_speed
312
+ if length == 79:
313
+ msg[5] = convert.bytes_to_fp32s(ret[22:78], 14) # joint range
314
+ msg[6:8] = ret[78:80] # fense_is_on, collision_rebound
315
+ return msg
316
+
317
+ def set_xyz_limits(self, xyz_list):
318
+ return self.set_nint32(XCONF.UxbusReg.SET_LIMIT_XYZ, xyz_list, 6)
319
+
320
+ def set_timer(self, sec_later, timer_id, fun_code, param1=0, param2=0):
321
+ txdata = [sec_later, timer_id, fun_code, param1, param2]
322
+ return self.set_nint32(XCONF.UxbusReg.SET_TIMER, txdata, 5)
323
+
324
+ def cancel_timer(self, timer_id):
325
+ txdata = [timer_id]
326
+ return self.set_nint32(XCONF.UxbusReg.CANCEL_TIMER, txdata, 1)
327
+
328
+ def set_world_offset(self, pose_offset):
329
+ return self.set_nfp32(XCONF.UxbusReg.SET_WORLD_OFFSET, pose_offset, 6)
330
+
331
+ def cnter_reset(self):
332
+ return self.set_nu8(XCONF.UxbusReg.CNTER_RESET, 0, 0)
333
+
334
+ def cnter_plus(self):
335
+ return self.set_nu8(XCONF.UxbusReg.CNTER_PLUS, 0, 0)
336
+
337
+ def set_reduced_jrange(self, jrange_rad):
338
+ return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_JRANGE, jrange_rad, 14)
339
+
340
+ def set_fense_on(self, on_off):
341
+ txdata = [on_off]
342
+ return self.set_nu8(XCONF.UxbusReg.SET_FENSE_ON, txdata, 1)
343
+
344
+ def set_collis_reb(self, on_off):
345
+ txdata = [on_off]
346
+ return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_REB, txdata, 1)
347
+
348
+ def motion_en(self, axis_id, enable):
349
+ txdata = [axis_id, int(enable)]
350
+ return self.set_nu8(XCONF.UxbusReg.MOTION_EN, txdata, 2, timeout=self._S_TOUT if self._S_TOUT >= 5 else 5)
351
+
352
+ def set_state(self, value):
353
+ txdata = [value]
354
+ return self.set_nu8(XCONF.UxbusReg.SET_STATE, txdata, 1)
355
+
356
+ def get_state(self):
357
+ return self.get_nu8(XCONF.UxbusReg.GET_STATE, 1)
358
+
359
+ def get_cmdnum(self):
360
+ return self.get_nu16(XCONF.UxbusReg.GET_CMDNUM, 1)
361
+
362
+ def get_err_code(self):
363
+ return self.get_nu8(XCONF.UxbusReg.GET_ERROR, 2)
364
+
365
+ def get_hd_types(self):
366
+ return self.get_nu8(XCONF.UxbusReg.GET_HD_TYPES, 2)
367
+
368
+ def reload_dynamics(self):
369
+ return self.set_nu8(XCONF.UxbusReg.RELOAD_DYNAMICS, 0, 0)
370
+
371
+ def clean_err(self):
372
+ return self.set_nu8(XCONF.UxbusReg.CLEAN_ERR, 0, 0)
373
+
374
+ def clean_war(self):
375
+ return self.set_nu8(XCONF.UxbusReg.CLEAN_WAR, 0, 0)
376
+
377
+ def set_brake(self, axis_id, enable):
378
+ txdata = [axis_id, int(enable)]
379
+ return self.set_nu8(XCONF.UxbusReg.SET_BRAKE, txdata, 2)
380
+
381
+ def set_mode(self, mode, detection_param=-1):
382
+ if detection_param >= 0:
383
+ txdata = [mode, detection_param]
384
+ return self.set_nu8(XCONF.UxbusReg.SET_MODE, txdata, 2)
385
+ else:
386
+ txdata = [mode]
387
+ return self.set_nu8(XCONF.UxbusReg.SET_MODE, txdata, 1)
388
+
389
+ def set_report_tau_or_i(self, tau_or_i): # 0 for tau(default), 1 for i
390
+ txdata = [tau_or_i]
391
+ return self.set_nu8(XCONF.UxbusReg.REPORT_TAU_OR_I, txdata, 1)
392
+
393
+ def get_report_tau_or_i(self):
394
+ return self.get_nu8(XCONF.UxbusReg.GET_REPORT_TAU_OR_I, 1)
395
+
396
+ def set_cartesian_velo_continuous(self, on_off): # False for not continuous, True for continuous
397
+ txdata = [int(on_off)]
398
+ return self.set_nu8(XCONF.UxbusReg.SET_CARTV_CONTINUE, txdata, 1)
399
+
400
+ def set_allow_approx_motion(self, on_off):
401
+ txdata = [int(on_off)]
402
+ return self.set_nu8(XCONF.UxbusReg.SET_ALLOW_APPROX_MOTION, txdata, 1)
403
+
404
+ def get_allow_approx_motion(self):
405
+ return self.get_nu8(XCONF.UxbusReg.GET_ALLOW_APPROX_MOTION, 1)
406
+
407
+ def move_line(self, mvpose, mvvelo, mvacc, mvtime, only_check_type=0, motion_type=0):
408
+ txdata = [mvpose[i] for i in range(6)]
409
+ txdata += [mvvelo, mvacc, mvtime]
410
+ if only_check_type <= 0 and motion_type == 0:
411
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_LINE, txdata, 9)
412
+ else:
413
+ byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
414
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE, txdata, 9, byte_data, 3, timeout=10)
415
+
416
+ def move_line_common(self, mvpose, mvvelo, mvacc, mvtime, radius=-1, coord=0, is_axis_angle=False, only_check_type=0, motion_type=0, feedback_key=None):
417
+ """
418
+ 通用指令, 固件1.10.0开始支持
419
+ """
420
+ txdata = [mvpose[i] for i in range(6)]
421
+ _radius = -1 if radius is None else radius
422
+ txdata += [mvvelo, mvacc, mvtime, _radius]
423
+ if motion_type == 0:
424
+ byte_data = bytes([coord, int(is_axis_angle), only_check_type])
425
+ else:
426
+ byte_data = bytes([coord, int(is_axis_angle), only_check_type, int(motion_type)])
427
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
428
+
429
+ def move_line_aa(self, mvpose, mvvelo, mvacc, mvtime, mvcoord, relative, only_check_type=0, motion_type=0):
430
+ float_data = [mvpose[i] for i in range(6)]
431
+ float_data += [mvvelo, mvacc, mvtime]
432
+ byte_data = bytes([mvcoord, relative])
433
+ if only_check_type <= 0 and motion_type == 0:
434
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_AA, float_data, 9, byte_data)
435
+ else:
436
+ byte_data += bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
437
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_AA, float_data, 9, byte_data, 3, timeout=10)
438
+
439
+ def move_servo_cart_aa(self, mvpose, mvvelo, mvacc, tool_coord, relative):
440
+ float_data = [mvpose[i] for i in range(6)]
441
+ float_data += [mvvelo, mvacc, tool_coord]
442
+ byte_data = bytes([relative])
443
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_SERVO_CART_AA, float_data, 9, byte_data)
444
+
445
+ def move_relative(self, pose, mvvelo, mvacc, mvtime, radius, is_joint_motion=False, is_angle_axis=False, only_check_type=0, motion_type=0, feedback_key=None):
446
+ float_data = [0] * 7
447
+ for i in range(min(7, len(pose))):
448
+ float_data[i] = pose[i]
449
+ float_data += [mvvelo, mvacc, mvtime, radius]
450
+ byte_data = bytes([int(is_joint_motion), int(is_angle_axis)])
451
+ if only_check_type <= 0 and motion_type == 0:
452
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_RELATIVE, float_data, 11, byte_data, feedback_key=feedback_key)
453
+ else:
454
+ byte_data += bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
455
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_RELATIVE, float_data, 11, byte_data, 3, timeout=10, feedback_key=feedback_key)
456
+
457
+ def get_position_aa(self):
458
+ return self.get_nfp32(XCONF.UxbusReg.GET_TCP_POSE_AA, 6)
459
+
460
+ @lock_require
461
+ def get_pose_offset(self, pose1, pose2, orient_type_in=0, orient_type_out=0):
462
+ float_data = [pose1[i] for i in range(6)]
463
+ float_data += [pose2[j] for j in range(6)]
464
+ byte_data = bytes([orient_type_in, orient_type_out])
465
+ ret_fp_num = 6
466
+ funcode = XCONF.UxbusReg.CAL_POSE_OFFSET
467
+ hexdata = convert.fp32s_to_bytes(float_data, 12)
468
+ hexdata += byte_data
469
+
470
+ ret = self.send_modbus_request(funcode, hexdata, len(hexdata))
471
+ if ret == -1:
472
+ return [XCONF.UxbusState.ERR_NOTTCP] * (ret_fp_num * 4 + 1)
473
+
474
+ ret = self.recv_modbus_response(funcode, ret, ret_fp_num * 4, self._G_TOUT)
475
+ data = [0] * (1 + ret_fp_num)
476
+ data[0] = ret[0]
477
+ data[1:ret_fp_num+1] = convert.bytes_to_fp32s(ret[1:ret_fp_num * 4 + 1], ret_fp_num)
478
+ return data
479
+
480
+ def move_line_tool(self, mvpose, mvvelo, mvacc, mvtime, only_check_type=0, motion_type=0):
481
+ txdata = [mvpose[i] for i in range(6)]
482
+ txdata += [mvvelo, mvacc, mvtime]
483
+ if only_check_type <= 0 and motion_type == 0:
484
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_LINE_TOOL, txdata, 9)
485
+ else:
486
+ byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
487
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_TOOL, txdata, 9, byte_data, 3, timeout=10)
488
+
489
+ def move_lineb(self, mvpose, mvvelo, mvacc, mvtime, mvradii, only_check_type=0, motion_type=0):
490
+ txdata = [mvpose[i] for i in range(6)]
491
+ txdata += [mvvelo, mvacc, mvtime, mvradii]
492
+ if only_check_type <= 0 and motion_type == 0:
493
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_LINEB, txdata, 10)
494
+ else:
495
+ byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
496
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINEB, txdata, 10, byte_data, 3, timeout=10)
497
+
498
+ def move_joint(self, mvjoint, mvvelo, mvacc, mvtime, only_check_type=0, feedback_key=None):
499
+ txdata = [mvjoint[i] for i in range(7)]
500
+ txdata += [mvvelo, mvacc, mvtime]
501
+ if only_check_type <= 0:
502
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_JOINT, txdata, 10, feedback_key=feedback_key)
503
+ else:
504
+ byte_data = bytes([only_check_type])
505
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_JOINT, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
506
+
507
+ def move_jointb(self, mvjoint, mvvelo, mvacc, mvradii, only_check_type=0, feedback_key=None):
508
+ txdata = [mvjoint[i] for i in range(7)]
509
+ txdata += [mvvelo, mvacc, mvradii]
510
+ if only_check_type <= 0:
511
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_JOINTB, txdata, 10, feedback_key=feedback_key)
512
+ else:
513
+ byte_data = bytes([only_check_type])
514
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_JOINTB, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
515
+
516
+ def move_gohome(self, mvvelo, mvacc, mvtime, only_check_type=0, feedback_key=None):
517
+ txdata = [mvvelo, mvacc, mvtime]
518
+ if only_check_type <= 0:
519
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_HOME, txdata, 3, feedback_key=feedback_key)
520
+ else:
521
+ byte_data = bytes([only_check_type])
522
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_HOME, txdata, 3, byte_data, 3, timeout=10, feedback_key=feedback_key)
523
+
524
+ def move_servoj(self, mvjoint, mvvelo, mvacc, mvtime):
525
+ txdata = [mvjoint[i] for i in range(7)]
526
+ txdata += [mvvelo, mvacc, mvtime]
527
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_SERVOJ, txdata, 10)
528
+
529
+ def move_servo_cartesian(self, mvpose, mvvelo, mvacc, mvtime):
530
+ txdata = [mvpose[i] for i in range(6)]
531
+ txdata += [mvvelo, mvacc, mvtime]
532
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_SERVO_CART, txdata, 9)
533
+
534
+ # # This interface is no longer supported
535
+ # def set_servot(self, jnt_taus):
536
+ # txdata = [jnt_taus[i] for i in range(7)]
537
+ # return self.set_nfp32(XCONF.UxbusReg.SET_SERVOT, txdata, 7)
538
+
539
+ def get_joint_tau(self):
540
+ return self.get_nfp32(XCONF.UxbusReg.GET_JOINT_TAU, 7)
541
+
542
+ def set_safe_level(self, level):
543
+ txdata = [level]
544
+ return self.set_nu8(XCONF.UxbusReg.SET_SAFE_LEVEL, txdata, 1)
545
+
546
+ def get_safe_level(self):
547
+ return self.get_nu8(XCONF.UxbusReg.GET_SAFE_LEVEL, 1)
548
+
549
+ def sleep_instruction(self, sltime):
550
+ txdata = [sltime]
551
+ return self.set_nfp32(XCONF.UxbusReg.SLEEP_INSTT, txdata, 1)
552
+
553
+ def move_circle(self, pose1, pose2, mvvelo, mvacc, mvtime, percent, only_check_type=0):
554
+ txdata = [0] * 16
555
+ for i in range(6):
556
+ txdata[i] = pose1[i]
557
+ txdata[6 + i] = pose2[i]
558
+ txdata[12] = mvvelo
559
+ txdata[13] = mvacc
560
+ txdata[14] = mvtime
561
+ txdata[15] = percent
562
+ if only_check_type <= 0:
563
+ return self.set_nfp32(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16)
564
+ else:
565
+ byte_data = bytes([only_check_type])
566
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16, byte_data, 3, timeout=10)
567
+
568
+ def move_circle_common(self, pose1, pose2, mvvelo, mvacc, mvtime, percent, coord=0, is_axis_angle=False, only_check_type=0, feedback_key=None):
569
+ """
570
+ 通用指令, 固件1.10.0开始支持
571
+ """
572
+ txdata = [0] * 16
573
+ for i in range(6):
574
+ txdata[i] = pose1[i]
575
+ txdata[6 + i] = pose2[i]
576
+ txdata[12] = mvvelo
577
+ txdata[13] = mvacc
578
+ txdata[14] = mvtime
579
+ txdata[15] = percent
580
+ byte_data = bytes([coord, int(is_axis_angle), only_check_type])
581
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16, byte_data, 3, timeout=10, feedback_key=feedback_key)
582
+
583
+ def set_tcp_jerk(self, jerk):
584
+ txdata = [jerk]
585
+ return self.set_nfp32(XCONF.UxbusReg.SET_TCP_JERK, txdata, 1)
586
+
587
+ def set_tcp_maxacc(self, acc):
588
+ txdata = [acc]
589
+ return self.set_nfp32(XCONF.UxbusReg.SET_TCP_MAXACC, txdata, 1)
590
+
591
+ def set_joint_jerk(self, jerk):
592
+ txdata = [jerk]
593
+ return self.set_nfp32(XCONF.UxbusReg.SET_JOINT_JERK, txdata, 1)
594
+
595
+ def set_joint_maxacc(self, acc):
596
+ txdata = [acc]
597
+ return self.set_nfp32(XCONF.UxbusReg.SET_JOINT_MAXACC, txdata, 1)
598
+
599
+ def set_tcp_offset(self, pose_offset):
600
+ return self.set_nfp32(XCONF.UxbusReg.SET_TCP_OFFSET, pose_offset, 6)
601
+
602
+ def set_tcp_load(self, load_mass, load_com, feedback_key=None):
603
+ param_list = [load_mass]
604
+ param_list.extend(load_com)
605
+ return self.set_nfp32(XCONF.UxbusReg.SET_LOAD_PARAM, param_list, 4, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.TRIGGER)
606
+
607
+ def set_collis_sens(self, value):
608
+ txdata = [value]
609
+ return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_SENS, txdata, 1)
610
+
611
+ def set_teach_sens(self, value):
612
+ txdata = [value]
613
+ return self.set_nu8(XCONF.UxbusReg.SET_TEACH_SENS, txdata, 1)
614
+
615
+ def set_gravity_dir(self, gravity_dir):
616
+ return self.set_nfp32(XCONF.UxbusReg.SET_GRAVITY_DIR, gravity_dir, 3)
617
+
618
+ def clean_conf(self):
619
+ return self.set_nu8(XCONF.UxbusReg.CLEAN_CONF, 0, 0)
620
+
621
+ def save_conf(self):
622
+ return self.set_nu8(XCONF.UxbusReg.SAVE_CONF, 0, 0)
623
+
624
+ def get_joint_pos(self):
625
+ return self.get_nfp32(XCONF.UxbusReg.GET_JOINT_POS, 7)
626
+
627
+ def get_joint_states(self, num=3):
628
+ return self.get_nfp32_with_datas(XCONF.UxbusReg.GET_JOINT_POS, [num], 1, 7 * num)
629
+
630
+ def get_tcp_pose(self):
631
+ return self.get_nfp32(XCONF.UxbusReg.GET_TCP_POSE, 6)
632
+
633
+ def get_ik(self, pose):
634
+ return self.swop_nfp32(XCONF.UxbusReg.GET_IK, pose, 6, 7)
635
+
636
+ def get_fk(self, angles):
637
+ return self.swop_nfp32(XCONF.UxbusReg.GET_FK, angles, 7, 6)
638
+
639
+ def is_joint_limit(self, joint):
640
+ return self.is_nfp32(XCONF.UxbusReg.IS_JOINT_LIMIT, joint, 7)
641
+
642
+ def is_tcp_limit(self, pose):
643
+ return self.is_nfp32(XCONF.UxbusReg.IS_TCP_LIMIT, pose, 6)
644
+
645
+ @lock_require
646
+ def gripper_addr_w16(self, addr, value):
647
+ return self.tgpio_addr_w16(addr, value, bid=XCONF.GRIPPER_ID)
648
+
649
+ @lock_require
650
+ def gripper_addr_r16(self, addr):
651
+ return self.tgpio_addr_r16(addr, bid=XCONF.GRIPPER_ID)
652
+
653
+ @lock_require
654
+ def gripper_addr_w32(self, addr, value):
655
+ return self.tgpio_addr_w32(addr, value, bid=XCONF.GRIPPER_ID)
656
+
657
+ @lock_require
658
+ def gripper_addr_r32(self, addr):
659
+ return self.tgpio_addr_r32(addr, bid=XCONF.GRIPPER_ID)
660
+
661
+ def gripper_set_en(self, value):
662
+ return self.gripper_addr_w16(XCONF.ServoConf.CON_EN, value)
663
+
664
+ def gripper_set_mode(self, value):
665
+ return self.gripper_addr_w16(XCONF.ServoConf.CON_MODE, value)
666
+
667
+ def gripper_set_zero(self):
668
+ return self.gripper_addr_w16(XCONF.ServoConf.MT_ZERO, 1)
669
+
670
+ def gripper_get_pos(self):
671
+ return self.gripper_addr_r32(XCONF.ServoConf.CURR_POS)
672
+
673
+ def gripper_set_pos(self, pulse):
674
+ return self.gripper_addr_w32(XCONF.ServoConf.TAGET_POS, pulse)
675
+
676
+ def gripper_set_posspd(self, speed):
677
+ return self.gripper_addr_w16(XCONF.ServoConf.POS_SPD, speed)
678
+
679
+ def gripper_get_errcode(self):
680
+ ret = self.get_nu8(XCONF.UxbusReg.TGPIO_ERR, 2)
681
+ return ret
682
+
683
+ def gripper_clean_err(self):
684
+ return self.gripper_addr_w16(XCONF.ServoConf.RESET_ERR, 1)
685
+
686
+ @lock_require
687
+ def tgpio_addr_w16(self, addr, value, bid=XCONF.TGPIO_HOST_ID, additional_bytes=None):
688
+ txdata = bytes([bid])
689
+ txdata += convert.u16_to_bytes(addr)
690
+ txdata += convert.fp32_to_bytes(value)
691
+ if additional_bytes is not None:
692
+ txdata += additional_bytes
693
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W16B, txdata, 7 + len(additional_bytes))
694
+ else:
695
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W16B, txdata, 7)
696
+ if ret == -1:
697
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
698
+
699
+ ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_W16B, ret, 0, self._G_TOUT)
700
+ return ret
701
+
702
+ @lock_require
703
+ def tgpio_addr_r16(self, addr, bid=XCONF.TGPIO_HOST_ID, fmt='>l'):
704
+ txdata = bytes([bid])
705
+ txdata += convert.u16_to_bytes(addr)
706
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_R16B, txdata, 3)
707
+ if ret == -1:
708
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
709
+
710
+ ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_R16B, ret, 4, self._G_TOUT)
711
+ return [ret[0], convert.bytes_to_num32(ret[1:5], fmt=fmt)]
712
+
713
+ @lock_require
714
+ def tgpio_addr_w32(self, addr, value, bid=XCONF.TGPIO_HOST_ID):
715
+ txdata = bytes([bid])
716
+ txdata += convert.u16_to_bytes(addr)
717
+ txdata += convert.fp32_to_bytes(value)
718
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W32B, txdata, 7)
719
+ if ret == -1:
720
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
721
+
722
+ ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_W32B, ret, 0, self._G_TOUT)
723
+ return ret
724
+
725
+ @lock_require
726
+ def tgpio_addr_r32(self, addr, bid=XCONF.TGPIO_HOST_ID, fmt='>l'):
727
+ txdata = bytes([bid])
728
+ txdata += convert.u16_to_bytes(addr)
729
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_R32B, txdata, 3)
730
+ if ret == -1:
731
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
732
+
733
+ ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_R32B, ret, 4, self._G_TOUT)
734
+ return [ret[0], convert.bytes_to_num32(ret[1:5], fmt=fmt)]
735
+
736
+ def tgpio_get_digital(self):
737
+ ret = self.tgpio_addr_r16(XCONF.ServoConf.DIGITAL_IN)
738
+ value = [0] * 5
739
+ value[0] = ret[0]
740
+ value[1] = ret[1] & 0x0001
741
+ value[2] = (ret[1] & 0x0002) >> 1
742
+ value[3] = (ret[1] & 0x0004) >> 2
743
+ value[4] = (ret[1] & 0x0008) >> 3
744
+ return value
745
+
746
+ def tgpio_set_digital(self, ionum, value, sync=None):
747
+ tmp = 0
748
+ if ionum == 1:
749
+ tmp = tmp | 0x0100
750
+ if value:
751
+ tmp = tmp | 0x0001
752
+ elif ionum == 2:
753
+ tmp = tmp | 0x0200
754
+ if value:
755
+ tmp = tmp | 0x0002
756
+ elif ionum == 3:
757
+ tmp = tmp | 0x1000
758
+ if value:
759
+ tmp = tmp | 0x0010
760
+ elif ionum == 4:
761
+ tmp = tmp | 0x0400
762
+ if value:
763
+ tmp = tmp | 0x0004
764
+ elif ionum == 5:
765
+ tmp = tmp | 0x0800
766
+ if value:
767
+ tmp = tmp | 0x0008
768
+ else:
769
+ return [-1, -1]
770
+ if sync is not None:
771
+ return self.tgpio_addr_w16(XCONF.ServoConf.DIGITAL_OUT, tmp, additional_bytes=bytes([sync]))
772
+ else:
773
+ return self.tgpio_addr_w16(XCONF.ServoConf.DIGITAL_OUT, tmp)
774
+
775
+ def tgpio_get_analog1(self):
776
+ ret = self.tgpio_addr_r16(XCONF.ServoConf.ANALOG_IO1)
777
+ value = [0] * 2
778
+ value[0] = ret[0]
779
+ value[1] = ret[1] * 3.3 / 4095.0
780
+ return value
781
+
782
+ def tgpio_get_analog2(self):
783
+ ret = self.tgpio_addr_r16(XCONF.ServoConf.ANALOG_IO2)
784
+ value = [0] * 2
785
+ value[0] = ret[0]
786
+ value[1] = ret[1] * 3.3 / 4095.0
787
+ return value
788
+
789
+ def set_modbus_timeout(self, value, is_transparent_transmission=False):
790
+ txdata = [int(value)]
791
+ return self.set_nu16(XCONF.UxbusReg.TGPIO_COM_TIOUT if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MB_TIOUT, txdata, 1)
792
+
793
+ def set_modbus_baudrate(self, baudrate):
794
+ if baudrate not in self.BAUDRATES:
795
+ return [-1, -1]
796
+ ret = self.tgpio_addr_r16(XCONF.ServoConf.MODBUS_BAUDRATE & 0x0FFF)
797
+ if ret[0] == 0:
798
+ baud_val = self.BAUDRATES.index(baudrate)
799
+ if ret[1] != baud_val:
800
+ # self.tgpio_addr_w16(XCONF.ServoConf.MODBUS_BAUDRATE, baud_val)
801
+ self.tgpio_addr_w16(0x1A0B, baud_val)
802
+ time.sleep(0.3)
803
+ return self.tgpio_addr_w16(XCONF.ServoConf.SOFT_REBOOT, 1)
804
+ return ret[:2]
805
+
806
+ @lock_require
807
+ def tgpio_set_modbus(self, modbus_t, len_t, host_id=XCONF.TGPIO_HOST_ID, limit_sec=0.0, is_transparent_transmission=False):
808
+ txdata = bytes([host_id])
809
+ txdata += bytes(modbus_t)
810
+ if limit_sec > 0:
811
+ diff_time = time.monotonic() - self._last_modbus_comm_time
812
+ if diff_time < limit_sec:
813
+ time.sleep(limit_sec - diff_time)
814
+ ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_COM_DATA if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MODBUS, txdata, len_t + 1)
815
+ if ret == -1:
816
+ self._last_modbus_comm_time = time.monotonic()
817
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
818
+
819
+ ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_COM_DATA if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MODBUS, ret, -1, self._G_TOUT)
820
+ self._last_modbus_comm_time = time.monotonic()
821
+ return ret
822
+
823
+ @lock_require
824
+ def tgpio_delay_set_digital(self, ionum, on_off, delay_sec):
825
+ txdata = bytes([ionum, on_off])
826
+ txdata += convert.fp32_to_bytes(delay_sec)
827
+ ret = self.send_modbus_request(XCONF.UxbusReg.DELAYED_TGPIO_SET, txdata, 6)
828
+ if ret == -1:
829
+ return [XCONF.UxbusState.ERR_NOTTCP]
830
+ return self.recv_modbus_response(XCONF.UxbusReg.DELAYED_TGPIO_SET, ret, 0, self._S_TOUT)
831
+
832
+ @lock_require
833
+ def cgpio_delay_set_digital(self, ionum, on_off, delay_sec):
834
+ txdata = bytes([ionum, on_off])
835
+ txdata += convert.fp32_to_bytes(delay_sec)
836
+ ret = self.send_modbus_request(XCONF.UxbusReg.DELAYED_CGPIO_SET, txdata, 6)
837
+ if ret == -1:
838
+ return [XCONF.UxbusState.ERR_NOTTCP]
839
+ return self.recv_modbus_response(XCONF.UxbusReg.DELAYED_CGPIO_SET, ret, 0, self._S_TOUT)
840
+
841
+ @lock_require
842
+ def cgpio_position_set_digital(self, ionum, on_off, xyz, tol_r):
843
+ txdata = bytes([ionum, on_off])
844
+ txdata += convert.fp32s_to_bytes(xyz, 3)
845
+ txdata += convert.fp32_to_bytes(tol_r)
846
+ ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_CGPIO_SET, txdata, 18)
847
+ if ret == -1:
848
+ return [XCONF.UxbusState.ERR_NOTTCP]
849
+ return self.recv_modbus_response(XCONF.UxbusReg.POSITION_CGPIO_SET, ret, 0, self._S_TOUT)
850
+
851
+ @lock_require
852
+ def tgpio_position_set_digital(self, ionum, on_off, xyz, tol_r):
853
+ txdata = bytes([ionum, on_off])
854
+ txdata += convert.fp32s_to_bytes(xyz, 3)
855
+ txdata += convert.fp32_to_bytes(tol_r)
856
+ ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_TGPIO_SET, txdata, 18)
857
+ if ret == -1:
858
+ return [XCONF.UxbusState.ERR_NOTTCP]
859
+ return self.recv_modbus_response(XCONF.UxbusReg.POSITION_TGPIO_SET, ret, 0, self._S_TOUT)
860
+
861
+ @lock_require
862
+ def cgpio_position_set_analog(self, ionum, value, xyz, tol_r):
863
+ txdata = bytes([ionum])
864
+ txdata += convert.u16_to_bytes(int(value / 10.0 * 4095.0))
865
+ txdata += convert.fp32s_to_bytes(xyz, 3)
866
+ txdata += convert.fp32_to_bytes(tol_r)
867
+ ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_CGPIO_SET_ANALOG, txdata, 19)
868
+ if ret == -1:
869
+ return [XCONF.UxbusState.ERR_NOTTCP]
870
+ return self.recv_modbus_response(XCONF.UxbusReg.POSITION_CGPIO_SET_ANALOG, ret, 0, self._S_TOUT)
871
+
872
+ # io_type: 0 for CGPIO, 1 for TGPIO
873
+ def config_io_stop_reset(self, io_type, on_off):
874
+ txdata = [io_type, on_off]
875
+ return self.set_nu8(XCONF.UxbusReg.SET_IO_STOP_RESET, txdata, 2)
876
+
877
+ def gripper_modbus_w16s(self, addr, value, length):
878
+ txdata = bytes([XCONF.GRIPPER_ID])
879
+ txdata += bytes([0x10])
880
+ txdata += convert.u16_to_bytes(addr)
881
+ txdata += convert.u16_to_bytes(length)
882
+ txdata += bytes([length * 2])
883
+ txdata += value
884
+ ret = self.tgpio_set_modbus(txdata, length * 2 + 7)
885
+ return ret
886
+
887
+ def gripper_modbus_r16s(self, addr, length):
888
+ txdata = bytes([XCONF.GRIPPER_ID])
889
+ txdata += bytes([0x03])
890
+ txdata += convert.u16_to_bytes(addr)
891
+ txdata += convert.u16_to_bytes(length)
892
+ ret = self.tgpio_set_modbus(txdata, 6)
893
+ return ret
894
+
895
+ def gripper_modbus_set_en(self, value):
896
+ value = convert.u16_to_bytes(int(value))
897
+ return self.gripper_modbus_w16s(XCONF.ServoConf.CON_EN, value, 1)
898
+
899
+ def gripper_modbus_set_mode(self, value):
900
+ value = convert.u16_to_bytes(int(value))
901
+ return self.gripper_modbus_w16s(XCONF.ServoConf.CON_MODE, value, 1)
902
+
903
+ def gripper_modbus_set_zero(self):
904
+ value = convert.u16_to_bytes(int(1))
905
+ return self.gripper_modbus_w16s(XCONF.ServoConf.MT_ZERO, value, 1)
906
+
907
+ def gripper_modbus_get_pos(self):
908
+ ret = self.gripper_modbus_r16s(XCONF.ServoConf.CURR_POS, 2)
909
+ ret1 = [0] * 2
910
+ ret1[0] = ret[0]
911
+ if ret[0] in [0, XCONF.UxbusState.ERR_CODE, XCONF.UxbusState.WAR_CODE] and len(ret) == 9:
912
+ ret1[1] = convert.bytes_to_long_big(ret[5:9])
913
+ else:
914
+ if ret1[0] == 0:
915
+ ret1[0] = XCONF.UxbusState.ERR_LENG
916
+ # print('gripper_modbus_get_pos:', len(ret), ret)
917
+ # print(ret1, ret)
918
+ return ret1
919
+
920
+ def gripper_modbus_set_pos(self, pulse):
921
+ value = bytes([(int(pulse) >> 24) & 0xFF])
922
+ value += bytes([(int(pulse) >> 16) & 0xFF])
923
+ value += bytes([(int(pulse) >> 8) & 0xFF])
924
+ value += bytes([int(pulse) & 0xFF])
925
+ return self.gripper_modbus_w16s(XCONF.ServoConf.TAGET_POS, value, 2)
926
+
927
+ def gripper_modbus_set_posspd(self, speed):
928
+ speed = convert.u16_to_bytes(int(speed))
929
+ return self.gripper_modbus_w16s(XCONF.ServoConf.POS_SPD, speed, 1)
930
+
931
+ def gripper_modbus_get_errcode(self):
932
+ ret = self.gripper_modbus_r16s(XCONF.ServoConf.ERR_CODE, 1)
933
+ ret1 = [0] * 2
934
+ ret1[0] = ret[0]
935
+ if ret[0] in [0, XCONF.UxbusState.ERR_CODE, XCONF.UxbusState.WAR_CODE] and len(ret) == 7:
936
+ ret1[1] = convert.bytes_to_u16(ret[5:7])
937
+ else:
938
+ if ret1[0] == 0:
939
+ ret1[0] = XCONF.UxbusState.ERR_LENG
940
+ # print('gripper_modbus_get_errcode:', len(ret), ret)
941
+ # print(ret1, ret)
942
+ return ret1
943
+
944
+ def gripper_modbus_clean_err(self):
945
+ value = convert.u16_to_bytes(int(1))
946
+ return self.gripper_modbus_w16s(XCONF.ServoConf.RESET_ERR, value, 1)
947
+
948
+ def servo_set_zero(self, axis_id):
949
+ txdata = [int(axis_id)]
950
+ ret = self.set_nu8(XCONF.UxbusReg.SERVO_ZERO, txdata, 1)
951
+ return ret
952
+
953
+ def servo_get_dbmsg(self):
954
+ ret = self.get_nu8(XCONF.UxbusReg.SERVO_DBMSG, 16)
955
+ return ret
956
+
957
+ @lock_require
958
+ def servo_addr_w16(self, axis_id, addr, value):
959
+ txdata = bytes([axis_id])
960
+ txdata += convert.u16_to_bytes(addr)
961
+ txdata += convert.fp32_to_bytes(value)
962
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_W16B, txdata, 7)
963
+ if ret == -1:
964
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
965
+
966
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_W16B, ret, 0, self._G_TOUT)
967
+ return ret
968
+
969
+ @lock_require
970
+ def servo_addr_r16(self, axis_id, addr):
971
+ txdata = bytes([axis_id])
972
+ txdata += convert.u16_to_bytes(addr)
973
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R16B, txdata, 3)
974
+ if ret == -1:
975
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
976
+
977
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R16B, ret, 4, self._G_TOUT)
978
+ return [ret[0], convert.bytes_to_long_big(ret[1:5])]
979
+ # return [ret[0], convert.bytes_to_long_big(ret[1:5])[0]]
980
+
981
+ @lock_require
982
+ def servo_addr_w32(self, axis_id, addr, value):
983
+ txdata = bytes([axis_id])
984
+ txdata += convert.u16_to_bytes(addr)
985
+ txdata += convert.fp32_to_bytes(value)
986
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_W32B, txdata, 7)
987
+ if ret == -1:
988
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
989
+
990
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_W32B, ret, 0, self._G_TOUT)
991
+ return ret
992
+
993
+ @lock_require
994
+ def servo_addr_r32(self, axis, addr):
995
+ txdata = bytes([axis])
996
+ txdata += convert.u16_to_bytes(addr)
997
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R32B, txdata, 3)
998
+ if ret == -1:
999
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
1000
+
1001
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R32B, ret, 4, self._G_TOUT)
1002
+ return [ret[0], convert.bytes_to_long_big(ret[1:5])]
1003
+ # return [ret[0], convert.bytes_to_long_big(ret[1:5])[0]]
1004
+
1005
+ # -----------------------------------------------------
1006
+ # controler gpio
1007
+ # -----------------------------------------------------
1008
+ def cgpio_get_auxdigit(self):
1009
+ ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_DIGIT, 1)
1010
+ value = [0] * 2
1011
+ value[0] = ret[0]
1012
+ value[1] = ret[1]
1013
+ return value
1014
+
1015
+ def cgpio_get_analog1(self):
1016
+ ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_ANALOG1, 1)
1017
+ value = [0] * 2
1018
+ value[0] = ret[0]
1019
+ value[1] = ret[1] * 10.0 / 4095.0
1020
+ return value
1021
+
1022
+ def cgpio_get_analog2(self):
1023
+ ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_ANALOG2, 1)
1024
+ value = [0] * 2
1025
+ value[0] = ret[0]
1026
+ value[1] = ret[1] * 10.0 / 4095.0
1027
+ return value
1028
+
1029
+ def cgpio_set_auxdigit(self, ionum, value, sync=None):
1030
+ tmp = [0] * 2
1031
+ if ionum > 7:
1032
+ tmp[1] = tmp[1] | (0x0100 << (ionum - 8))
1033
+ if value:
1034
+ tmp[1] = tmp[1] | (0x0001 << (ionum - 8))
1035
+ if sync is not None:
1036
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2, additional_bytes=bytes([sync]))
1037
+ else:
1038
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2)
1039
+ else:
1040
+ tmp[0] = tmp[0] | (0x0100 << ionum)
1041
+ if value:
1042
+ tmp[0] = tmp[0] | (0x0001 << ionum)
1043
+ if sync is not None:
1044
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 1, additional_bytes=bytes([sync]))
1045
+ else:
1046
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 1)
1047
+ # return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2 if ionum > 7 else 1)
1048
+
1049
+ def cgpio_set_analog1(self, value, sync=None):
1050
+ txdata = [int(value / 10.0 * 4095.0)]
1051
+ if sync is not None:
1052
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG1, txdata, 1, additional_bytes=bytes([sync]))
1053
+ else:
1054
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG1, txdata, 1)
1055
+
1056
+ def cgpio_set_analog2(self, value, sync=None):
1057
+ txdata = [int(value / 10.0 * 4095.0)]
1058
+ if sync is not None:
1059
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG2, txdata, 1, additional_bytes=bytes([sync]))
1060
+ else:
1061
+ return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG2, txdata, 1)
1062
+
1063
+ def cgpio_set_infun(self, num, fun):
1064
+ txdata = [int(num), int(fun)]
1065
+ return self.set_nu8(XCONF.UxbusReg.CGPIO_SET_IN_FUN, txdata, 2)
1066
+
1067
+ def cgpio_set_outfun(self, num, fun):
1068
+ txdata = [int(num), int(fun)]
1069
+ return self.set_nu8(XCONF.UxbusReg.CGPIO_SET_OUT_FUN, txdata, 2)
1070
+
1071
+ def cgpio_get_state(self):
1072
+ # ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, 34)
1073
+ # ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, 50)
1074
+ ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, -1)
1075
+ msg = [0] * 13
1076
+ msg[0] = ret[0]
1077
+ msg[1] = ret[1]
1078
+ msg[2] = ret[2]
1079
+
1080
+ msg[3:11] = convert.bytes_to_u16s(ret[3:19], 8)
1081
+ msg[7] = msg[7] / 4095.0 * 10.0
1082
+ msg[8] = msg[8] / 4095.0 * 10.0
1083
+ msg[9] = msg[9] / 4095.0 * 10.0
1084
+ msg[10] = msg[10] / 4095.0 * 10.0
1085
+ msg[11] = ret[19:27]
1086
+ msg[12] = ret[27:35]
1087
+ if len(ret) >= 50:
1088
+ msg[11] = ret[19:27] + ret[35:43]
1089
+ msg[12] = ret[27:35] + ret[43:51]
1090
+ return msg
1091
+
1092
+ def set_self_collision_detection(self, on_off):
1093
+ txdata = [on_off]
1094
+ return self.set_nu8(XCONF.UxbusReg.SET_SELF_COLLIS_CHECK, txdata, 1)
1095
+
1096
+ def set_collision_tool_model(self, tool_type, params):
1097
+ if len(params) > 0:
1098
+ byte_data = bytes([tool_type])
1099
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.SET_COLLIS_TOOL, params, len(params), byte_data)
1100
+ else:
1101
+ txdata = [tool_type]
1102
+ return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_TOOL, txdata, 1)
1103
+
1104
+ def set_simulation_robot(self, on_off):
1105
+ txdata = [int(on_off)]
1106
+ return self.set_nu8(XCONF.UxbusReg.SET_SIMULATION_ROBOT, txdata, 1)
1107
+
1108
+ def get_power_board_version(self):
1109
+ return self.get_nu8(XCONF.UxbusReg.GET_PWR_VERSION, 6)
1110
+
1111
+ def get_movement(self):
1112
+ return self.get_nu8(XCONF.UxbusReg.GET_MOVEMENT, 1)
1113
+
1114
+ def vc_set_jointv(self, jnt_v, jnt_sync, duration=-1):
1115
+ additional_bytes = bytes([jnt_sync])
1116
+ if duration >= 0:
1117
+ additional_bytes += convert.fp32_to_bytes(duration)
1118
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.VC_SET_JOINTV, jnt_v, 7, additional_bytes)
1119
+
1120
+ def vc_set_linev(self, line_v, coord, duration=-1):
1121
+ additional_bytes = bytes([coord])
1122
+ if duration >= 0:
1123
+ additional_bytes += convert.fp32_to_bytes(duration)
1124
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.VC_SET_CARTV, line_v, 6, additional_bytes)
1125
+
1126
+ def iden_load(self, iden_type, num_get, timeout=500, estimated_mass=0):
1127
+ txdata = bytes([iden_type])
1128
+ if estimated_mass > 0:
1129
+ txdata += convert.fp32_to_bytes(estimated_mass)
1130
+ return self.get_nfp32_with_datas(XCONF.UxbusReg.IDEN_LOAD, txdata, 5 if estimated_mass > 0 else 1, num_get, timeout=timeout)
1131
+
1132
+ def iden_joint_friction(self, sn, timeout=500):
1133
+ txdata = [ord(i) for i in list(sn)]
1134
+ return self.get_nfp32_with_datas(XCONF.UxbusReg.IDEN_FRIC, txdata, 14, 1, timeout=timeout)
1135
+
1136
+ @lock_require
1137
+ def set_impedance(self, coord, c_axis, M, K, B):
1138
+ txdata = bytes([coord])
1139
+ txdata += bytes(c_axis[:6])
1140
+ txdata += convert.fp32s_to_bytes(M, 6)
1141
+ txdata += convert.fp32s_to_bytes(K, 6)
1142
+ txdata += convert.fp32s_to_bytes(B, 6)
1143
+ ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CONFIG, txdata, 79)
1144
+ if ret == -1:
1145
+ return [XCONF.UxbusState.ERR_NOTTCP]
1146
+ return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CONFIG, ret, 0, self._S_TOUT)
1147
+
1148
+ @lock_require
1149
+ def set_impedance_mbk(self, M, K, B):
1150
+ txdata = convert.fp32s_to_bytes(M, 6)
1151
+ txdata += convert.fp32s_to_bytes(K, 6)
1152
+ txdata += convert.fp32s_to_bytes(B, 6)
1153
+ ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CTRL_MBK, txdata, 72)
1154
+ if ret == -1:
1155
+ return [XCONF.UxbusState.ERR_NOTTCP]
1156
+ return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CTRL_MBK, ret, 0, self._S_TOUT)
1157
+
1158
+ @lock_require
1159
+ def set_impedance_config(self, coord, c_axis):
1160
+ txdata = bytes([coord])
1161
+ txdata += bytes(c_axis[:6])
1162
+ ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CTRL_CONFIG, txdata, 7)
1163
+ if ret == -1:
1164
+ return [XCONF.UxbusState.ERR_NOTTCP]
1165
+ return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CTRL_CONFIG, ret, 0, self._S_TOUT)
1166
+
1167
+ @lock_require
1168
+ def config_force_control(self, coord, c_axis, f_ref, limits):
1169
+ txdata = bytes([coord])
1170
+ txdata += bytes(c_axis[:6])
1171
+ txdata += convert.fp32s_to_bytes(f_ref, 6)
1172
+ txdata += convert.fp32s_to_bytes(limits, 6)
1173
+ ret = self.send_modbus_request(XCONF.UxbusReg.FORCE_CTRL_CONFIG, txdata, 55)
1174
+ if ret == -1:
1175
+ return [XCONF.UxbusState.ERR_NOTTCP]
1176
+ return self.recv_modbus_response(XCONF.UxbusReg.FORCE_CTRL_CONFIG, ret, 0, self._S_TOUT)
1177
+
1178
+ @lock_require
1179
+ def set_force_control_pid(self, kp, ki, kd, xe_limit):
1180
+ txdata = convert.fp32s_to_bytes(kp, 6)
1181
+ txdata += convert.fp32s_to_bytes(ki, 6)
1182
+ txdata += convert.fp32s_to_bytes(kd, 6)
1183
+ txdata += convert.fp32s_to_bytes(xe_limit, 6)
1184
+ ret = self.send_modbus_request(XCONF.UxbusReg.FORCE_CTRL_PID, txdata, 96)
1185
+ if ret == -1:
1186
+ return [XCONF.UxbusState.ERR_NOTTCP]
1187
+ return self.recv_modbus_response(XCONF.UxbusReg.FORCE_CTRL_PID, ret, 0, self._S_TOUT)
1188
+
1189
+ def ft_sensor_set_zero(self):
1190
+ return self.set_nu8(XCONF.UxbusReg.FTSENSOR_SET_ZERO, 0, 0)
1191
+ # return self.getset_nu8(XCONF.UxbusReg.FTSENSOR_SET_ZERO, [], 0, 1)
1192
+
1193
+ def ft_sensor_iden_load(self):
1194
+ return self.iden_load(0, 10)
1195
+
1196
+ def ft_sensor_cali_load(self, iden_result_list):
1197
+ return self.set_nfp32(XCONF.UxbusReg.FTSENSOR_CALI_LOAD_OFFSET, iden_result_list, 10)
1198
+
1199
+ def ft_sensor_enable(self, on_off):
1200
+ txdata = [on_off]
1201
+ return self.set_nu8(XCONF.UxbusReg.FTSENSOR_ENABLE, txdata, 1)
1202
+
1203
+ def ft_sensor_app_set(self, app_code):
1204
+ txdata = [app_code]
1205
+ return self.set_nu8(XCONF.UxbusReg.FTSENSOR_SET_APP, txdata, 1)
1206
+
1207
+ def ft_sensor_app_get(self):
1208
+ return self.get_nu8(XCONF.UxbusReg.FTSENSOR_GET_APP, 1)
1209
+
1210
+ def ft_sensor_get_data(self, is_new=True):
1211
+ return self.get_nfp32(XCONF.UxbusReg.FTSENSOR_GET_DATA if is_new else XCONF.UxbusReg.FTSENSOR_GET_DATA_OLD, 6)
1212
+
1213
+ def ft_sensor_get_config(self):
1214
+ ret = self.get_nu8(XCONF.UxbusReg.FTSENSOR_GET_CONFIG, 280)
1215
+ if ret[0] in [0, 1, 2]:
1216
+ ft_app_status = ret[1]
1217
+ ft_started = ret[2]
1218
+ ft_type = ret[3]
1219
+ ft_id = ret[4]
1220
+ ft_freq = convert.bytes_to_u16(ret[5:7])
1221
+ ft_mass = convert.bytes_to_fp32(ret[7:11])
1222
+ ft_dir_bias = convert.bytes_to_fp32(ret[11:15])
1223
+ ft_centroid = convert.bytes_to_fp32s(ret[15:27], 3)
1224
+ ft_zero = convert.bytes_to_fp32s(ret[27:51], 6)
1225
+
1226
+ imp_coord = ret[51]
1227
+ imp_c_axis = ret[52:58]
1228
+ M = convert.bytes_to_fp32s(ret[58:82], 6)
1229
+ K = convert.bytes_to_fp32s(ret[82:106], 6)
1230
+ B = convert.bytes_to_fp32s(ret[106:130], 6)
1231
+
1232
+ fc_coord = ret[130]
1233
+ fc_c_axis = ret[131:137]
1234
+ force_ref = convert.bytes_to_fp32s(ret[137:161], 6)
1235
+ limits = convert.bytes_to_fp32s(ret[161:185], 6)
1236
+ kp = convert.bytes_to_fp32s(ret[185:209], 6)
1237
+ ki = convert.bytes_to_fp32s(ret[209:233], 6)
1238
+ kd = convert.bytes_to_fp32s(ret[233:257], 6)
1239
+ xe_limit = convert.bytes_to_fp32s(ret[257:281], 6)
1240
+ return [
1241
+ ret[0],
1242
+ ft_app_status, ft_started, ft_type, ft_id, ft_freq,
1243
+ ft_mass, ft_dir_bias, ft_centroid, ft_zero,
1244
+ imp_coord, imp_c_axis, M, K, B,
1245
+ fc_coord, fc_c_axis, force_ref, limits,
1246
+ kp, ki, kd, xe_limit
1247
+ ]
1248
+ return ret
1249
+
1250
+ # def ft_sensor_get_error(self):
1251
+ # ret = self.servo_addr_r16(8, 0x0010)
1252
+ # if ret[0] in [0, 1, 2] and len(ret) > 1 and ret[1] == 27:
1253
+ # ret[0] = 0
1254
+ # return ret
1255
+
1256
+ @lock_require
1257
+ def ft_sensor_get_error(self):
1258
+ txdata = bytes([8])
1259
+ txdata += convert.u16_to_bytes(0x0010)
1260
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R16B, txdata, 3)
1261
+ if ret == -1:
1262
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
1263
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R16B, ret, 4, self._G_TOUT)
1264
+ if ret[0] in [0, 1, 2]:
1265
+ if convert.bytes_to_long_big(ret[1:5]) == 27:
1266
+ return [ret[0], 0]
1267
+ else:
1268
+ return [ret[0], ret[3]]
1269
+ return [ret[0], 0]
1270
+
1271
+ def cali_tcp_pose(self, four_pnts):
1272
+ txdata = []
1273
+ for k in range(4):
1274
+ txdata += [four_pnts[k][i] for i in range(6)]
1275
+ return self.swop_nfp32(XCONF.UxbusReg.CALI_TCP_POSE, txdata, 24, 3)
1276
+
1277
+ # default: mode: x+ then y+; trust_ind: trust x+ dir
1278
+ def cali_user_orient(self, three_pnts, mode=0, trust_ind=0):
1279
+ txdata = []
1280
+ for k in range(3):
1281
+ txdata += [three_pnts[k][i] for i in range(6)]
1282
+ byte_data = bytes([mode, trust_ind])
1283
+ rxn = 3
1284
+ ret = self.set_nfp32_with_bytes(XCONF.UxbusReg.CALI_WRLD_ORIENT, txdata, 18, byte_data, rxn * 4)
1285
+ data = [0] * (1 + rxn)
1286
+ data[0] = ret[0]
1287
+ data[1:rxn+1] = convert.bytes_to_fp32s(ret[1:rxn * 4 + 1], rxn)
1288
+ return data
1289
+
1290
+ def cali_tcp_orient(self, rpy_be, rpy_bt):
1291
+ txdata = [rpy_be[i] for i in range(3)]
1292
+ txdata += [rpy_bt[i] for i in range(3)]
1293
+ return self.swop_nfp32(XCONF.UxbusReg.CALI_TCP_ORIENT, txdata, 6, 3)
1294
+
1295
+ def cali_user_pos(self, rpy_ub, pos_b_uorg):
1296
+ txdata = [rpy_ub[i] for i in range(3)]
1297
+ txdata += [pos_b_uorg[i] for i in range(3)]
1298
+ return self.swop_nfp32(XCONF.UxbusReg.CALI_WRLD_POSE, txdata, 6, 3)
1299
+
1300
+ def get_tcp_rotation_radius(self, value):
1301
+ txdata = [value]
1302
+ data = [0] * 2
1303
+ ret = self.getset_nu8(XCONF.UxbusReg.GET_TCP_ROTATION_RADIUS, txdata, 1, 4)
1304
+ data[0] = ret[0]
1305
+ data[1] = convert.bytes_to_fp32s(ret[1:], 1)
1306
+ return data
1307
+
1308
+ def get_max_joint_velocity(self, eveloc, joint_pos):
1309
+ txdata = [eveloc]
1310
+ txdata += [joint_pos[i] for i in range(7)]
1311
+ return self.swop_nfp32(XCONF.UxbusReg.GET_MAX_JOINT_VELOCITY, txdata, 8, 1)
1312
+
1313
+ def track_modbus_w16s(self, addr, value, length):
1314
+ txdata = bytes([XCONF.TRACK_ID])
1315
+ txdata += bytes([0x10])
1316
+ txdata += convert.u16_to_bytes(addr)
1317
+ txdata += convert.u16_to_bytes(length)
1318
+ txdata += bytes([length * 2])
1319
+ txdata += value
1320
+ ret = self.tgpio_set_modbus(txdata, length * 2 + 7, host_id=XCONF.LINEER_TRACK_HOST_ID, limit_sec=0.001)
1321
+ return ret
1322
+
1323
+ def track_modbus_r16s(self, addr, length, fcode=0x03):
1324
+ txdata = bytes([XCONF.TRACK_ID])
1325
+ txdata += bytes([fcode])
1326
+ txdata += convert.u16_to_bytes(addr)
1327
+ txdata += convert.u16_to_bytes(length)
1328
+ ret = self.tgpio_set_modbus(txdata, 6, host_id=XCONF.LINEER_TRACK_HOST_ID, limit_sec=0.001)
1329
+ return ret
1330
+
1331
+ def iden_tcp_load(self, estimated_mass=0):
1332
+ return self.iden_load(1, 4, timeout=300, estimated_mass=estimated_mass)
1333
+
1334
+ @lock_require
1335
+ def servo_error_addr_r32(self, axis, addr):
1336
+ txdata = bytes([axis])
1337
+ txdata += convert.u16_to_bytes(addr)
1338
+ ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_ERROR, txdata, 3)
1339
+ if ret == -1:
1340
+ return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
1341
+
1342
+ ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_ERROR, ret, 4, self._G_TOUT)
1343
+ return [ret[0], convert.bytes_to_long_big(ret[1:5])]
1344
+
1345
+ def get_dh_params(self):
1346
+ return self.get_nfp32(XCONF.UxbusReg.GET_DH, 28)
1347
+
1348
+ def set_dh_params(self, dh_params, flag=0):
1349
+ if len(dh_params) < 28:
1350
+ dh_params.extend([0] * 28 - len(dh_params))
1351
+ byte_data = bytes([flag])
1352
+ return self.set_nfp32_with_bytes(XCONF.UxbusReg.SET_DH, dh_params, 28, byte_data, 1, timeout=10)
1353
+
1354
+ def _set_feedback_type_no_lock(self, feedback_type):
1355
+ ret = self.send_modbus_request(XCONF.UxbusReg.SET_FEEDBACK_TYPE, [feedback_type], 1)
1356
+ if ret == -1:
1357
+ return [XCONF.UxbusState.ERR_NOTTCP]
1358
+ return self.recv_modbus_response(XCONF.UxbusReg.SET_FEEDBACK_TYPE, ret, 0, self._S_TOUT)
1359
+
1360
+ @lock_require
1361
+ def set_feedback_type(self, feedback_type):
1362
+ ret = self._set_feedback_type_no_lock(feedback_type)
1363
+ if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
1364
+ self._feedback_type = feedback_type
1365
+ return ret
1366
+
1367
+ def check_feedback(self, feedback_key=None):
1368
+ ret = self.set_nu8(XCONF.UxbusReg.FEEDBACK_CHECK, [], 0, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.MOTION_FINISH)
1369
+ return ret
1370
+
1371
+ @lock_require
1372
+ def send_hex_cmd(self, datas, timeout=10):
1373
+ if len(datas) < 7:
1374
+ # datas length error
1375
+ return [-2]
1376
+ trans_id = int('{}{}'.format(datas[0], datas[1]), base=16)
1377
+ prot_id = int('{}{}'.format(datas[2], datas[3]), base=16)
1378
+ if prot_id not in [0, 2, 3]:
1379
+ # protocol_identifier error, only support 0/2/3,
1380
+ # 0: standard modbus protocol
1381
+ # 2: private modbus protocol
1382
+ # 3: private modbus protocol (with heart beat)
1383
+ return [-3]
1384
+ length = int('{}{}'.format(datas[4], datas[5]), base=16)
1385
+ if length != len(datas) - 6:
1386
+ # protocol length data error
1387
+ return [-4]
1388
+ unit_id = int('{}'.format(datas[6]), base=16)
1389
+ pdu_data = bytes.fromhex('{}'.format(''.join(map(str, datas[7:]))))
1390
+ ret = self.send_modbus_request(unit_id, pdu_data, len(pdu_data), prot_id=prot_id, t_id=trans_id)
1391
+ if ret == -1:
1392
+ return [XCONF.UxbusState.ERR_NOTTCP]
1393
+ return self.recv_modbus_response(unit_id, ret, -1, timeout, t_prot_id=prot_id, ret_raw=True)
1394
+
1395
+ def set_common_param(self, param_type, param_val):
1396
+ txdata = bytes([param_type])
1397
+ if param_type == 1:
1398
+ txdata += convert.fp32_to_bytes(param_val)
1399
+ elif param_type == 12 or param_type == 14:
1400
+ txdata += convert.fp32s_to_bytes(param_val, 6)
1401
+ else:
1402
+ # 2/3/6/11/13
1403
+ txdata += convert.int32_to_bytes(param_val)
1404
+ return self.set_nu8(XCONF.UxbusReg.SET_COMMON_PARAM, txdata, len(txdata))
1405
+
1406
+ def get_common_param(self, param_type):
1407
+ txdata = bytes([param_type])
1408
+ ret = self.getset_nu8(XCONF.UxbusReg.GET_COMMON_PARAM, txdata, 1, -1)
1409
+ data = [0] * 2
1410
+ data[0] = ret[0]
1411
+ if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
1412
+ if param_type == 1:
1413
+ data[1] = convert.bytes_to_fp32(ret[1:])
1414
+ elif param_type == 12 or param_type == 14:
1415
+ data[1] = convert.bytes_to_fp32s(ret[1:], 6)
1416
+ else:
1417
+ # 2/3/6/11/13
1418
+ data[1] = convert.bytes_to_u32(ret[1:])
1419
+ return data
1420
+
1421
+ def get_common_info(self, param_type):
1422
+ txdata = bytes([param_type])
1423
+ ret = self.getset_nu8(XCONF.UxbusReg.GET_COMMON_INFO, txdata, 1, -1)
1424
+ data = [0] * 2
1425
+ data[0] = ret[0]
1426
+ if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
1427
+ if param_type == 1 or param_type == 2:
1428
+ data[1] = ret[1]
1429
+ elif param_type == 50:
1430
+ data[1] = convert.bytes_to_fp32(ret[1:])
1431
+ elif param_type in [101, 107]:
1432
+ data[1] = ret[1]
1433
+ data.append(convert.bytes_to_fp32(ret[2:6]))
1434
+ data.append(convert.bytes_to_fp32(ret[6:10]))
1435
+ elif param_type in [102, 104]:
1436
+ data[1] = ret[1]
1437
+ data.append(convert.bytes_to_fp32(ret[2:]))
1438
+ elif param_type == 105:
1439
+ data[1] = convert.bytes_to_fp32(ret[1:])
1440
+ data.append(convert.bytes_to_fp32(ret[5:]))
1441
+ elif param_type in [103, 106]:
1442
+ data[1] = ret[1]
1443
+ data.extend(convert.bytes_to_fp32s(ret[2:], 7))
1444
+ else:
1445
+ data[0] = XCONF.UxbusState.ERR_PARAM
1446
+ return data
1447
+
1448
+ def get_traj_speeding(self, rate):
1449
+ txdata = bytes([rate])
1450
+ ret = self.getset_nu8(XCONF.UxbusReg.GET_TRAJ_SPEEDING, txdata, 1, -1)
1451
+ data = [0] * 4
1452
+ data[0] = ret[0]
1453
+ if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
1454
+ data[1] = convert.bytes_to_int32(ret[1:5])
1455
+ data[2] = convert.bytes_to_int32(ret[5:9])
1456
+ data[3] = round(math.degrees(convert.bytes_to_fp32(ret[9:])),3)
1457
+ return data