Skip to content

Commit 18df995

Browse files
committed
Preliminary adaptation mypalletizer
1 parent 63ddc3a commit 18df995

File tree

5 files changed

+83
-12
lines changed

5 files changed

+83
-12
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ record.txt
1111
test_test.py
1212

1313
.DS_Store
14-
14+
.history
1515
.VSCodeCounter
1616
.vscode/.ropeproject/config.py
1717
.vscode/.ropeproject/objectdb

pymycobot/common.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ def _int2coord(self, _int):
109109

110110
def _flatten(self, _list):
111111
return sum(
112-
([x] if not isinstance(x, list) else self._flatten(x) for x in _list), []
112+
([x] if not isinstance(x, list) else self._flatten(x)
113+
for x in _list), []
113114
)
114115

115116
def _process_data_command(self, args):
@@ -118,7 +119,8 @@ def _process_data_command(self, args):
118119

119120
return self._flatten(
120121
[
121-
[self._encode_int16(int(i)) for i in x] if isinstance(x, list) else x
122+
[self._encode_int16(int(i))
123+
for i in x] if isinstance(x, list) else x
122124
for x in args
123125
]
124126
)
@@ -135,24 +137,24 @@ def _process_received(self, data, genre):
135137
# Get valid header: 0xfe0xfe
136138
for idx in range(data_len - 1):
137139
if self._is_frame_header(data, idx):
138-
break
140+
data_len = data[idx + 2] - 2
141+
if data_len > 0:
142+
break
139143
else:
140144
return []
141145

142-
data_len = data[idx + 2] - 2
143-
144146
# compare send header and received header
145147
cmd_id = data[idx + 3]
146148
if cmd_id != genre:
147149
return []
148150
data_pos = idx + 4
149-
valid_data = data[data_pos : data_pos + data_len]
151+
valid_data = data[data_pos: data_pos + data_len]
150152

151153
# process valid data
152154
res = []
153155
if data_len == 12 or data_len == 8:
154156
for idx in range(0, len(valid_data), 2):
155-
one = valid_data[idx : idx + 2]
157+
one = valid_data[idx: idx + 2]
156158
res.append(self._decode_int16(one))
157159
elif data_len == 2:
158160
if genre in [ProtocolCode.IS_SERVO_ENABLE]:

pymycobot/generate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55

66
from pymycobot.log import setup_logging
7+
from pymycobot.error import calibration_parameters
78
from pymycobot.common import ProtocolCode, DataProcessor
89

910

pymycobot/mycobot.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def _mesg(self, genre, *args, **kwargs):
7979
**kwargs: support `has_reply`
8080
has_reply: Whether there is a return value to accept.
8181
"""
82-
real_command, has_reply = super(MyCobot, self)._mesg(genre, *args, **kwargs)
82+
real_command, has_reply = super(
83+
MyCobot, self)._mesg(genre, *args, **kwargs)
8384
self._write(self._flatten(real_command))
8485

8586
if has_reply:
@@ -140,7 +141,8 @@ def send_radians(self, radians, speed):
140141
speed (int): 0 ~ 100
141142
"""
142143
calibration_parameters(len6=radians, speed=speed)
143-
degrees = [self._angle2int(radian * (180 / math.pi)) for radian in radians]
144+
degrees = [self._angle2int(radian * (180 / math.pi))
145+
for radian in radians]
144146
return self._mesg(ProtocolCode.SEND_ANGLES, degrees, speed)
145147

146148
def sync_send_angles(self, degrees, speed, timeout=7):

pymycobot/mypalletizer.py

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,77 @@
77
from .common import ProtocolCode, read, write
88

99

10-
def calibration_parameters(**kwargs):
10+
class MyPalletizedataException(Exception):
1111
pass
1212

1313

14+
MIN_ID = 0
15+
MAX_ID = 5
16+
17+
# In fact, most joints cannot reach plus or minus 180 degrees.
18+
# There may be a value greater than 180 when reading the angle,
19+
# and the maximum and minimum values are expanded for compatibility.
20+
MIN_ANGLE = -170.0
21+
MAX_ANGLE = 170.0
22+
23+
24+
def calibration_parameters(**kwargs):
25+
if kwargs.get("id", None) is not None and not MIN_ID <= kwargs["id"] <= MAX_ID:
26+
raise MyPalletizedataException(
27+
"The id not right, should be {0} ~ {1}, but received {2}.".format(
28+
MIN_ID, MAX_ID, kwargs["id"]
29+
)
30+
)
31+
32+
if (
33+
kwargs.get("degree", None) is not None
34+
and not MIN_ANGLE <= kwargs["degree"] <= MAX_ANGLE
35+
):
36+
raise MyPalletizedataException(
37+
"degree value not right, should be {0} ~ {1}, but received {2}".format(
38+
MIN_ANGLE, MAX_ANGLE, kwargs["degree"]
39+
)
40+
)
41+
42+
if kwargs.get("degrees", None) is not None:
43+
degrees = kwargs["degrees"]
44+
if not isinstance(degrees, list):
45+
raise MyPalletizedataException("`degrees` must be a list.")
46+
if len(degrees) != 4:
47+
raise MyPalletizedataException(
48+
"The length of `degrees` must be 4.")
49+
for idx, angle in enumerate(degrees):
50+
if not MIN_ANGLE <= angle <= MAX_ANGLE:
51+
raise MyPalletizedataException(
52+
"Has invalid degree value, error on index {0}. Degree should be {1} ~ {2}.".format(
53+
idx, MIN_ANGLE, MAX_ANGLE
54+
)
55+
)
56+
57+
if kwargs.get("coords", None) is not None:
58+
coords = kwargs["coords"]
59+
if not isinstance(coords, list):
60+
raise MyPalletizedataException("`coords` must be a list.")
61+
if len(coords) != 4:
62+
raise MyPalletizedataException(
63+
"The length of `coords` must be 4.")
64+
65+
if kwargs.get("speed", None) is not None and not 0 <= kwargs["speed"] <= 100:
66+
raise MyPalletizedataException(
67+
"speed value not right, should be 0 ~ 100, the error speed is %s"
68+
% kwargs["speed"]
69+
)
70+
71+
if kwargs.get("rgb", None) is not None:
72+
rgb_str = ["r", "g", "b"]
73+
for i, v in enumerate(kwargs["rgb"]):
74+
if not (0 <= v <= 255):
75+
raise MyPalletizedataException(
76+
"The RGB value needs be 0 ~ 255, but the %s is %s" % (
77+
rgb_str[i], v)
78+
)
79+
80+
1481
class MyPalletizer(MycobotCommandGenerater):
1582
def __init__(self, port, baudrate="115200", timeout=0.1, debug=False):
1683
"""
@@ -24,7 +91,6 @@ def __init__(self, port, baudrate="115200", timeout=0.1, debug=False):
2491
self.debug = debug
2592
setup_logging(self.debug)
2693
self.log = logging.getLogger(__name__)
27-
2894
self.calibration_parameters = calibration_parameters
2995

3096
import serial

0 commit comments

Comments
 (0)