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.
Files changed (51) hide show
  1. {pymycobot-3.5.0.dev5/pymycobot.egg-info → pymycobot-3.5.0.dev7}/PKG-INFO +1 -1
  2. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/__init__.py +1 -1
  3. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/common.py +25 -3
  4. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/error.py +45 -14
  5. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/log.py +6 -0
  6. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercury.py +2 -1
  7. pymycobot-3.5.0.dev7/pymycobot/mercury_api.py +1654 -0
  8. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercurysocket.py +2 -2
  9. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7/pymycobot.egg-info}/PKG-INFO +1 -1
  10. pymycobot-3.5.0.dev5/pymycobot/mercury_api.py +0 -1064
  11. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/LICENSE +0 -0
  12. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/MANIFEST.in +0 -0
  13. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/README.md +0 -0
  14. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/Interface.py +0 -0
  15. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/bluet.py +0 -0
  16. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/elephantrobot.py +0 -0
  17. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/generate.py +0 -0
  18. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/genre.py +0 -0
  19. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mecharm.py +0 -0
  20. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mecharmsocket.py +0 -0
  21. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mercurychassis.py +0 -0
  22. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myagv.py +0 -0
  23. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarm.py +0 -0
  24. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarm_api.py +0 -0
  25. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmc.py +0 -0
  26. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmm.py +0 -0
  27. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/myarmsocket.py +0 -0
  28. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddy.py +0 -0
  29. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddybluetooth.py +0 -0
  30. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddyemoticon.py +0 -0
  31. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mybuddysocket.py +0 -0
  32. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobot.py +0 -0
  33. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobotpro630.py +0 -0
  34. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mycobotsocket.py +0 -0
  35. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mypalletizer.py +0 -0
  36. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/mypalletizersocket.py +0 -0
  37. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/progripper.py +0 -0
  38. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/public.py +0 -0
  39. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/ultraArm.py +0 -0
  40. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot/utils.py +0 -0
  41. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/SOURCES.txt +0 -0
  42. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/dependency_links.txt +0 -0
  43. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/requires.txt +0 -0
  44. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/pymycobot.egg-info/top_level.txt +0 -0
  45. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/requirements.txt +0 -0
  46. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/setup.cfg +0 -0
  47. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/setup.py +0 -0
  48. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_api.py +0 -0
  49. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_generator.py +0 -0
  50. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_socket.py +0 -0
  51. {pymycobot-3.5.0.dev5 → pymycobot-3.5.0.dev7}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymycobot
3
- Version: 3.5.0.dev5
3
+ Version: 3.5.0.dev7
4
4
  Summary: Python API for serial communication of MyCobot.
5
5
  Home-page: https://github.com/elephantrobotics/pymycobot
6
6
  Author: Elephantrobotics
@@ -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.0dev5"
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 = 0x95
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, 13],
241
- "angles_min": [-165, -55, -173, -165, -20, -180, -60, -138, -118],
242
- "angles_max": [165, 95, 5, 165, 265, 180, 0, 188, 118],
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, 13],
248
- "angles_min": [-165, -55, -173, -165, -20, -180, -60, -138, -118],
249
- "angles_max": [165, 95, 5, 165, 265, 180, 0, 188, 118],
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-4] - 4
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
- # if direction is not None:
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 < 32 or value > 34:
406
+ if value < 5 or value > 69:
408
407
  raise MercuryDataException(
409
- "The angle address is 32 ~ 34, but received {}".format(value))
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, 7, 13, 254]:
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,7,13,254], but received {}".format(value))
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, daemon=True)
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):