Skip to content

Commit ae4666e

Browse files
committed
Fixed the error of MyArmM pid setting range
1 parent 360f6e1 commit ae4666e

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

pymycobot/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ class ProtocolCode(object):
263263
GET_SERVOS_ENCODER_DRAG = 0xEF
264264
RESTORE_SERVO_SYSTEM_PARAM = 0x0a
265265
GET_SERVO_D = 0xE8
266+
SET_SERVO_P = 0x70
266267
# IIC
267268
# SET_IIC_STATE = 0xA4
268269
# GET_IIS_BYTE = 0xA5

pymycobot/error.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ def calibration_parameters(**kwargs):
312312
"joint_id": [1, 2, 3, 4, 5, 6, 7],
313313
"servo_id": [1, 2, 3, 4, 5, 6, 7, 8],
314314
"angles_min": [-168, -77, -86, -159, -95, -161, -118],
315-
"angles_max": [172, 90, 91, 148, 84, 146, 0],
315+
"angles_max": [172, 90, 91, 148, 84, 146, 2],
316316
"encoders_min": [137, 1163, 1035, 1013, 248, 979, 220, 706],
317317
"encoders_max": [4004, 2945, 3079, 3026, 3724, 2994, 3704, 2048],
318318
}
@@ -453,13 +453,13 @@ def calibration_parameters(**kwargs):
453453
min_encoder = limit_info["encoders_min"][i]
454454
if value < min_encoder or value > max_encoder:
455455
raise MyArmDataException(
456-
"angle value not right, should be {min_encoder} ~ {max_encoder}, but received {value}"
456+
f"angle value not right, should be {min_encoder} ~ {max_encoder}, but received {value}"
457457
)
458458
elif parameter == 'encoders':
459459
for i, v in enumerate(value):
460460
max_encoder = limit_info["encoders_max"][i]
461461
min_encoder = limit_info["encoders_min"][i]
462-
if value < min_encoder or value > max_encoder:
462+
if v < min_encoder or v > max_encoder:
463463
raise MyArmDataException(
464464
f"encoder value not right, should be {min_encoder} ~ {max_encoder}, but received {v}"
465465
)

pymycobot/myarm_api.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ def _mesg(self, genre, *args, **kwargs):
9696
result = self._int2angle(result)
9797
return result
9898
if genre in (ProtocolCode.GET_ATOM_PRESS_STATUS, ):
99+
if self.__class__.__name__ == 'MyArmM':
100+
return res[0]
99101
return res
100102
elif genre in [
101103
ProtocolCode.GET_ANGLES, ProtocolCode.GET_JOINT_MAX_ANGLE, ProtocolCode.GET_JOINT_MIN_ANGLE,
@@ -115,7 +117,7 @@ def _mesg(self, genre, *args, **kwargs):
115117
rank = [i for i, e in enumerate(reverse_bins) if e != '0']
116118
result.append(rank)
117119
return result
118-
elif genre == ProtocolCode.GET_ROBOT_FIRMWARE_VERSION:
120+
elif genre in (ProtocolCode.GET_ROBOT_FIRMWARE_VERSION, ProtocolCode.GET_ROBOT_TOOL_FIRMWARE_VERSION):
119121
return self._int2coord(res[0])
120122
else:
121123
return res
@@ -144,10 +146,6 @@ def get_robot_tool_firmware_version(self):
144146
"""Get the Robot Tool Firmware Version (End Atom)"""
145147
return self._mesg(ProtocolCode.GET_ROBOT_TOOL_FIRMWARE_VERSION, has_reply=True)
146148

147-
# def get_robot_serial_number(self):
148-
# """Get the bot number"""
149-
# return self._mesg(ProtocolCode.GET_ROBOT_SERIAL_NUMBER, has_reply=True)
150-
151149
def set_robot_err_check_state(self, status):
152150
"""Set Error Detection Status You can turn off error detection, but do not turn it off unless necessary
153151
@@ -175,7 +173,8 @@ def get_recv_queue_max_len(self):
175173

176174
def set_recv_queue_max_len(self, max_len):
177175
"""Set the total length of the receiving command queue"""
178-
self._mesg(ProtocolCode.SET_RECV_QUEUE_SIZE, max_len, has_reply=True)
176+
assert 0 < max_len <= 100, "queue size must be in range 1 - 100"
177+
self._mesg(ProtocolCode.SET_RECV_QUEUE_SIZE, max_len)
179178

180179
def get_recv_queue_len(self):
181180
"""The current length of the read receive queue"""
@@ -275,7 +274,9 @@ def set_servo_p(self, servo_id, data):
275274
data (int): 0-254
276275
277276
"""
278-
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_SAVE, servo_id, data)
277+
assert 0 <= data <= 254, "data must be between 0 and 254"
278+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
279+
self._mesg(ProtocolCode.SET_SERVO_P, servo_id, data)
279280

280281
def get_servo_p(self, servo_id):
281282
"""Reads the position loop P scale factor of the specified servo motor
@@ -292,6 +293,8 @@ def set_servo_d(self, servo_id, data):
292293
servo_id (int): 0-254
293294
data (int): 0-254
294295
"""
296+
assert 0 <= data <= 254, "data must be between 0 and 254"
297+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
295298
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_EXECUTE, servo_id, data)
296299

297300
def get_servo_d(self, servo_id):
@@ -309,6 +312,8 @@ def set_servo_i(self, servo_id, data):
309312
servo_id (int): 0 - 254
310313
data (int): 0 - 254
311314
"""
315+
assert 0 <= data <= 254, "data must be between 0 and 254"
316+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
312317
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_PAUSE, servo_id, data)
313318

314319
def get_servo_i(self, servo_id):
@@ -322,6 +327,8 @@ def set_servo_cw(self, servo_id, data):
322327
servo_id (int): 0 - 254
323328
data (int): 0 - 32
324329
"""
330+
assert 0 <= data <= 32, "data must be between 0 and 32"
331+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
325332
self._mesg(ProtocolCode.SET_SERVO_MOTOR_CLOCKWISE, servo_id, data)
326333

327334
def get_servo_cw(self, servo_id):
@@ -339,6 +346,8 @@ def set_servo_cww(self, servo_id, data):
339346
servo_id (int): 0 - 254
340347
data (int): 0 - 32
341348
"""
349+
assert 0 <= data <= 32, "data must be between 0 and 32"
350+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
342351
return self._mesg(ProtocolCode.SET_SERVO_MOTOR_COUNTER_CLOCKWISE, servo_id, data)
343352

344353
def get_servo_cww(self, servo_id):

0 commit comments

Comments
 (0)