pymycobot 3.5.0.dev5__tar.gz → 3.5.0.dev7__tar.gz
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.
- {pymycobot-3.5.0.dev5/pymycobot.egg-info → pymycobot-3.5.0.dev7}/PKG-INFO +1 -1
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/__init__.py +1 -1
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/common.py +25 -3
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/error.py +45 -14
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/log.py +6 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercury.py +2 -1
- pymycobot-3.5.0.dev7/pymycobot/mercury_api.py +1654 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercurysocket.py +2 -2
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7/pymycobot.egg-info}/PKG-INFO +1 -1
- pymycobot-3.5.0.dev5/pymycobot/mercury_api.py +0 -1064
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/LICENSE +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/MANIFEST.in +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/README.md +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/Interface.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/bluet.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/elephantrobot.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/generate.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/genre.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mecharm.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mecharmsocket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercurychassis.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myagv.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarm.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarm_api.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmc.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmm.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmsocket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddy.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddybluetooth.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddyemoticon.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddysocket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobot.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobotpro630.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobotsocket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mypalletizer.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mypalletizersocket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/progripper.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/public.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/ultraArm.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/utils.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/SOURCES.txt +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/dependency_links.txt +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/requires.txt +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/top_level.txt +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/requirements.txt +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/setup.cfg +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/setup.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_api.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_generator.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_socket.py +0 -0
- {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_utils.py +0 -0
|
@@ -61,7 +61,7 @@ if sys.platform == "linux":
|
|
|
61
61
|
from pymycobot.mybuddyemoticon import MyBuddyEmoticon
|
|
62
62
|
__all__.append("MyBuddyEmoticon")
|
|
63
63
|
|
|
64
|
-
__version__ = "3.5.
|
|
64
|
+
__version__ = "3.5.0dev7"
|
|
65
65
|
__author__ = "Elephantrobotics"
|
|
66
66
|
__email__ = "weiquan.xu@elephantrobotics.com"
|
|
67
67
|
__git_url__ = "https://github.com/elephantrobotics/pymycobot"
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
from __future__ import division
|
|
4
4
|
import time
|
|
5
5
|
import struct
|
|
6
|
+
import logging
|
|
6
7
|
import sys
|
|
7
8
|
|
|
9
|
+
from pymycobot.log import setup_logging
|
|
10
|
+
from pymycobot.error import calibration_parameters
|
|
11
|
+
|
|
8
12
|
|
|
9
13
|
class ProtocolCode(object):
|
|
10
14
|
# BASIC
|
|
@@ -77,11 +81,14 @@ class ProtocolCode(object):
|
|
|
77
81
|
JOG_ABSOLUTE = 0x31
|
|
78
82
|
JOG_COORD = 0x32
|
|
79
83
|
JOG_INCREMENT = 0x33
|
|
84
|
+
JOG_INCREMENT_COORD = 0x34
|
|
85
|
+
|
|
80
86
|
JOG_STOP = 0x34
|
|
81
87
|
JOG_INCREMENT_COORD = 0x34
|
|
82
88
|
|
|
83
89
|
COBOTX_GET_SOLUTION_ANGLES = 0x35
|
|
84
90
|
COBOTX_SET_SOLUTION_ANGLES = 0x36
|
|
91
|
+
JOG_BASE_INCREMENT_COORD = 0x37
|
|
85
92
|
|
|
86
93
|
SET_ENCODER = 0x3A
|
|
87
94
|
GET_ENCODER = 0x3B
|
|
@@ -93,6 +100,8 @@ class ProtocolCode(object):
|
|
|
93
100
|
GET_SPEED = 0x40
|
|
94
101
|
SET_SPEED = 0x41
|
|
95
102
|
GET_FEED_OVERRIDE = 0x42
|
|
103
|
+
GET_MAX_ACC = 0x42
|
|
104
|
+
SET_MAX_ACC = 0x43
|
|
96
105
|
GET_ACCELERATION = 0x44
|
|
97
106
|
SET_ACCELERATION = 0x45
|
|
98
107
|
GET_JOINT_MIN_ANGLE = 0x4A
|
|
@@ -202,7 +211,7 @@ class ProtocolCode(object):
|
|
|
202
211
|
GET_JOINT_CURRENT = 0x91
|
|
203
212
|
SET_CURRENT_STATE = 0x92
|
|
204
213
|
GET_POS_OVER = 0x94
|
|
205
|
-
CLEAR_ENCODERS_ERROR =
|
|
214
|
+
CLEAR_ENCODERS_ERROR = 0xEA
|
|
206
215
|
GET_DOWN_ENCODERS = 0x96
|
|
207
216
|
|
|
208
217
|
# planning speed
|
|
@@ -224,13 +233,15 @@ class ProtocolCode(object):
|
|
|
224
233
|
GET_SERVO_LASTPDI = 0xE6
|
|
225
234
|
SERVO_RESTORE = 0xE7
|
|
226
235
|
SET_VOID_COMPENSATE = 0xE7
|
|
227
|
-
SET_ERROR_DETECT_MODE = 0xE8
|
|
228
|
-
GET_ERROR_DETECT_MODE = 0xE9
|
|
236
|
+
# SET_ERROR_DETECT_MODE = 0xE8
|
|
237
|
+
# GET_ERROR_DETECT_MODE = 0xE9
|
|
229
238
|
|
|
230
239
|
MERCURY_GET_BASE_COORDS = 0xF0
|
|
231
240
|
MERCURY_SET_BASE_COORD = 0xF1
|
|
232
241
|
MERCURY_SET_BASE_COORDS = 0xF2
|
|
233
242
|
MERCURY_JOG_BASE_COORD = 0xF3
|
|
243
|
+
GET_MONITOR_MODE = 0xFB
|
|
244
|
+
SET_MONITOR_MODE = 0xFC
|
|
234
245
|
|
|
235
246
|
MERCURY_DRAG_TECH_SAVE = 0x70
|
|
236
247
|
MERCURY_DRAG_TECH_EXECUTE = 0x71
|
|
@@ -314,6 +325,17 @@ class ProtocolCode(object):
|
|
|
314
325
|
|
|
315
326
|
|
|
316
327
|
class DataProcessor(object):
|
|
328
|
+
def __init__(self, debug=False):
|
|
329
|
+
"""
|
|
330
|
+
Args:
|
|
331
|
+
debug : whether show debug info
|
|
332
|
+
"""
|
|
333
|
+
self._version = sys.version_info[:2][0]
|
|
334
|
+
self.debug = debug
|
|
335
|
+
setup_logging(self.debug)
|
|
336
|
+
self.log = logging.getLogger(__name__)
|
|
337
|
+
self.calibration_parameters = calibration_parameters
|
|
338
|
+
|
|
317
339
|
def _mesg(self, genre, *args, **kwargs):
|
|
318
340
|
"""
|
|
319
341
|
Args:
|
|
@@ -149,7 +149,7 @@ def public_check(parameter_list, kwargs, robot_limit, class_name, exception_clas
|
|
|
149
149
|
# TODO 280/320共用MyCobot,无法进行数据限位
|
|
150
150
|
# elif parameter == 'coords':
|
|
151
151
|
# check_coords(value, robot_limit, class_name, exception_class)
|
|
152
|
-
elif parameter in ['rftype', 'move_type', 'end', 'is_linear', 'status', 'mode', 'direction']:
|
|
152
|
+
elif parameter in ['rftype', 'move_type', 'end', 'is_linear', 'status', 'mode', 'direction', 'pin_signal']:
|
|
153
153
|
check_0_or_1(parameter, value, [0, 1],
|
|
154
154
|
value_type, exception_class, int)
|
|
155
155
|
elif parameter == 'acceleration':
|
|
@@ -237,16 +237,16 @@ def public_check(parameter_list, kwargs, robot_limit, class_name, exception_clas
|
|
|
237
237
|
def calibration_parameters(**kwargs):
|
|
238
238
|
robot_limit = {
|
|
239
239
|
"Mercury": {
|
|
240
|
-
"id": [1, 2, 3, 4, 5, 6, 11, 12
|
|
241
|
-
"angles_min": [-165, -55, -173, -165, -20, -180, -60, -138
|
|
242
|
-
"angles_max": [165, 95, 5, 165, 265, 180, 0, 188
|
|
240
|
+
"id": [1, 2, 3, 4, 5, 6, 11, 12],
|
|
241
|
+
"angles_min": [-165, -55, -173, -165, -20, -180, -60, -138],
|
|
242
|
+
"angles_max": [165, 95, 5, 165, 265, 180, 0, 188],
|
|
243
243
|
"coords_min": [-441.37, -441.37, -206.52, -180, -180, -180],
|
|
244
244
|
"coords_max": [441.37, 441.37, 628.02, 180, 180, 180]
|
|
245
245
|
},
|
|
246
246
|
"MercurySocket": {
|
|
247
|
-
"id": [1, 2, 3, 4, 5, 6, 11, 12
|
|
248
|
-
"angles_min": [-165, -55, -173, -165, -20, -180, -60, -138
|
|
249
|
-
"angles_max": [165, 95, 5, 165, 265, 180, 0, 188
|
|
247
|
+
"id": [1, 2, 3, 4, 5, 6, 11, 12],
|
|
248
|
+
"angles_min": [-165, -55, -173, -165, -20, -180, -60, -138],
|
|
249
|
+
"angles_max": [165, 95, 5, 165, 265, 180, 0, 188],
|
|
250
250
|
"coords_min": [-441.37, -441.37, -206.52, -180, -180, -180],
|
|
251
251
|
"coords_max": [441.37, 441.37, 628.02, 180, 180, 180]
|
|
252
252
|
},
|
|
@@ -347,7 +347,7 @@ def calibration_parameters(**kwargs):
|
|
|
347
347
|
elif parameter == 'angle':
|
|
348
348
|
id = kwargs.get('id', None)
|
|
349
349
|
if id in [11, 12, 13]:
|
|
350
|
-
index = robot_limit[class_name]['id'][id-
|
|
350
|
+
index = robot_limit[class_name]['id'][id-5] - 5
|
|
351
351
|
else:
|
|
352
352
|
index = robot_limit[class_name]['id'][id-1] - 1
|
|
353
353
|
if value < robot_limit[class_name]["angles_min"][index] or value > robot_limit[class_name]["angles_max"][index]:
|
|
@@ -388,8 +388,7 @@ def calibration_parameters(**kwargs):
|
|
|
388
388
|
|
|
389
389
|
elif parameter == 'rgb':
|
|
390
390
|
check_rgb_value(value, MercuryDataException, class_name)
|
|
391
|
-
|
|
392
|
-
elif parameter in ['direction', 'flag', 'value']:
|
|
391
|
+
elif parameter in ['direction', 'flag', 'value', 'mode', 'pin_signal']:
|
|
393
392
|
if value not in [0, 1]:
|
|
394
393
|
raise MercuryDataException(
|
|
395
394
|
"{} only supports 0 or 1, but received {}".format(parameter, value))
|
|
@@ -404,17 +403,17 @@ def calibration_parameters(**kwargs):
|
|
|
404
403
|
raise MercuryDataException(
|
|
405
404
|
"The angle range is -90° ~ 90°, but received {}".format(value))
|
|
406
405
|
elif parameter == 'address':
|
|
407
|
-
if value <
|
|
406
|
+
if value < 5 or value > 69:
|
|
408
407
|
raise MercuryDataException(
|
|
409
|
-
"The
|
|
408
|
+
"The address range is 5 ~ 69, but received {}".format(value))
|
|
410
409
|
elif parameter == 'value':
|
|
411
410
|
if value < 1 or value > 32000:
|
|
412
411
|
raise MercuryDataException(
|
|
413
412
|
"The angle value is 1 ~ 32000, but received {}".format(value))
|
|
414
413
|
elif parameter == "servo_restore":
|
|
415
|
-
if value not in [1, 2, 3, 4, 5, 6,
|
|
414
|
+
if value not in [1, 2, 3, 4, 5, 6, 254]:
|
|
416
415
|
raise MercuryDataException(
|
|
417
|
-
"The joint_id should be in [1,2,3,4,5,6
|
|
416
|
+
"The joint_id should be in [1,2,3,4,5,6,,254], but received {}".format(value))
|
|
418
417
|
elif parameter == "data_len":
|
|
419
418
|
if value < 1 or value > 45:
|
|
420
419
|
raise MercuryDataException(
|
|
@@ -423,6 +422,38 @@ def calibration_parameters(**kwargs):
|
|
|
423
422
|
if value < 0:
|
|
424
423
|
raise MercuryDataException(
|
|
425
424
|
"The parameter max_time must be greater than or equal to 0, but received {}".format(value))
|
|
425
|
+
elif parameter == "max_acc":
|
|
426
|
+
mode = kwargs.get("mode", None)
|
|
427
|
+
if mode == 0:
|
|
428
|
+
if value < 1 or value > 150:
|
|
429
|
+
raise MercuryDataException(
|
|
430
|
+
"The parameter max_acc data range only supports 1 ~ 150, but received {}".format(value))
|
|
431
|
+
elif mode == 1:
|
|
432
|
+
if value < 1 or value > 400:
|
|
433
|
+
raise MercuryDataException(
|
|
434
|
+
"The parameter max_acc data range only supports 1 ~ 400, but received {}".format(value))
|
|
435
|
+
elif parameter == "servo_id":
|
|
436
|
+
if value not in [11,12]:
|
|
437
|
+
raise MercuryDataException(
|
|
438
|
+
"The parameter servo_id data range only supports 11 or 12, but received {}".format(value))
|
|
439
|
+
elif parameter == "max_speed":
|
|
440
|
+
mode = kwargs.get("mode", None)
|
|
441
|
+
if mode == 0:
|
|
442
|
+
min_speed = 1
|
|
443
|
+
max_speed = 150
|
|
444
|
+
if value < min_speed or value > max_speed:
|
|
445
|
+
raise MercuryDataException(
|
|
446
|
+
"The parameter max_speed data range only supports {} ~ {}, but received {}".format(min_speed, max_speed, value))
|
|
447
|
+
elif mode == 1:
|
|
448
|
+
min_speed = 1
|
|
449
|
+
max_speed = 200
|
|
450
|
+
if value < min_speed or value > max_speed:
|
|
451
|
+
raise MercuryDataException(
|
|
452
|
+
"The parameter max_speed data range only supports {} ~ {}, but received {}".format(min_speed, max_speed, value))
|
|
453
|
+
elif parameter in ['gripper_type', 'pin_no']:
|
|
454
|
+
value_type = type(value)
|
|
455
|
+
check_0_or_1(parameter, value, [1, 2], value_type, MercuryDataException, int)
|
|
456
|
+
|
|
426
457
|
elif class_name == "MyAgv":
|
|
427
458
|
for parameter in parameter_list[1:]:
|
|
428
459
|
value = kwargs.get(parameter, None)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import logging.handlers
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
def setup_logging(debug=False):
|
|
@@ -14,6 +15,11 @@ def setup_logging(debug=False):
|
|
|
14
15
|
logger_handle.setFormatter(debug_fomatter)
|
|
15
16
|
if debug:
|
|
16
17
|
logger_handle.setLevel(logging.DEBUG)
|
|
18
|
+
# 100M日志
|
|
19
|
+
save = logging.handlers.RotatingFileHandler(
|
|
20
|
+
"python_debug.log", maxBytes=100*1024*1024, backupCount=1)
|
|
21
|
+
save.setFormatter(debug_fomatter)
|
|
22
|
+
root_logger.addHandler(save)
|
|
17
23
|
else:
|
|
18
24
|
logger_handle.setLevel(logging.WARNING)
|
|
19
25
|
|
|
@@ -29,7 +29,8 @@ class Mercury(MercuryCommandGenerator):
|
|
|
29
29
|
self.lock = threading.Lock()
|
|
30
30
|
self.has_reply_command = []
|
|
31
31
|
self.is_stop = False
|
|
32
|
-
self.read_threading = threading.Thread(target=self.read_thread
|
|
32
|
+
self.read_threading = threading.Thread(target=self.read_thread)
|
|
33
|
+
self.read_threading.daemon = True
|
|
33
34
|
self.read_threading.start()
|
|
34
35
|
|
|
35
36
|
def open(self):
|