Skip to content

Commit 7865fa5

Browse files
committed
Merge branches 'main' and 'main' of https://github.com/elephantrobotics/pymycobot
2 parents cc4953c + 1ac44af commit 7865fa5

File tree

6 files changed

+43
-64
lines changed

6 files changed

+43
-64
lines changed

Makefile

Lines changed: 0 additions & 37 deletions
This file was deleted.

pymycobot/common.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ 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
267+
GET_SERVO_P = 0xE7
266268
# IIC
267269
# SET_IIC_STATE = 0xA4
268270
# GET_IIS_BYTE = 0xA5
@@ -728,6 +730,7 @@ def read(self, genre, method=None, command=None, _class=None, timeout=None):
728730
wait_time = 1
729731
while True and time.time() - t < wait_time:
730732
data = self._serial_port.read()
733+
self.log.debug("data: {}".format(data))
731734
k += 1
732735
if _class in ["Mercury", "MercurySocket"]:
733736
if data_len == 3:
@@ -742,7 +745,8 @@ def read(self, genre, method=None, command=None, _class=None, timeout=None):
742745
if genre in (
743746
ProtocolCode.GET_ATOM_PRESS_STATUS,
744747
ProtocolCode.GET_SERVO_MOTOR_COUNTER_CLOCKWISE,
745-
ProtocolCode.GET_SERVO_MOTOR_CLOCKWISE
748+
ProtocolCode.GET_SERVO_MOTOR_CLOCKWISE,
749+
ProtocolCode.GET_SERVO_P,
746750
) and _class in ["MyArmM", "MyArmC", "MyArmAPI"]:
747751
break
748752
datas = b''

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/mercurychassis_api.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,11 @@ def get_base_version(self):
162162
def go_straight(self, speed=0.2):
163163
"""
164164
Forward control
165-
:param speed: speed (float, optional): Movement speed. Defaults to 0.2. range 0 ~ 1
165+
:param speed: speed (float, optional): Movement speed. Defaults to 0.2. range 0 ~ 0.5 m/s
166166
:return: None
167167
"""
168-
if speed < 0 or speed > 1:
169-
raise Exception("The movement speed range is 0~1, but the received value is {}".format(speed))
168+
if speed < 0 or speed > 0.5:
169+
raise Exception("The movement speed range is 0~0.5, but the received value is {}".format(speed))
170170
self.Send_Data[0] = ProtocolCode.header
171171
self.Send_Data[1] = 0
172172
self.Send_Data[2] = 0
@@ -195,11 +195,11 @@ def go_straight(self, speed=0.2):
195195
def go_back(self, speed=-0.2):
196196
"""
197197
Back control
198-
:param speed: speed (float, optional): Movement speed. Defaults to 0.25. range -1 ~ 0
198+
:param speed: speed (float, optional): Movement speed. Defaults to -0.2. range -0.5 ~ 0 m/s
199199
:return: None
200200
"""
201-
if not -1 <= speed <= 0:
202-
raise Exception("The movement speed range is -1~0, but the received value is {}".format(speed))
201+
if not -0.5 <= speed <= 0:
202+
raise Exception("The movement speed range is -0.5~0, but the received value is {}".format(speed))
203203
self.Send_Data = [0] * 11
204204
self.Send_Data[0] = ProtocolCode.header
205205
self.Send_Data[1] = 0
@@ -231,12 +231,12 @@ def go_back(self, speed=-0.2):
231231
def turn_left(self, speed=0.2):
232232
"""
233233
Left turn control
234-
:param speed: speed (float, optional): Movement speed. Defaults to 0.2. range 0 ~ 1
234+
:param speed: speed (float, optional): Movement speed. Defaults to 0.2. range 0 ~ 0.5 m/s
235235
:return: None
236236
"""
237237

238-
if speed < 0 or speed > 1:
239-
raise Exception("The movement speed range is 0~1, but the received value is {}".format(speed))
238+
if speed < 0 or speed > 0.5:
239+
raise Exception("The movement speed range is 0~5, but the received value is {}".format(speed))
240240
self.Send_Data = [0] * 11
241241
self.Send_Data[0] = ProtocolCode.header
242242
self.Send_Data[1] = 0
@@ -266,11 +266,11 @@ def turn_left(self, speed=0.2):
266266
def turn_right(self, speed=-0.2):
267267
"""
268268
Right turn control
269-
:param speed: speed (float, optional): Movement speed. Defaults to -0.2. range -1 ~ 0
269+
:param speed: speed (float, optional): Movement speed. Defaults to -0.2. range -0.5 ~ 0 m/s
270270
:return: None
271271
"""
272-
if not -1 <= speed <= 0:
273-
raise Exception("The movement speed range is -1~0, but the received value is {}".format(speed))
272+
if not -0.5 <= speed <= 0:
273+
raise Exception("The movement speed range is -0.5~0, but the received value is {}".format(speed))
274274
self.Send_Data = [0] * 11
275275

276276
self.Send_Data[0] = ProtocolCode.header

pymycobot/myarm_api.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import sys
66
import logging
77
import threading
8+
import time
9+
810
from pymycobot.common import ProtocolCode, write, read, DataProcessor
911
from pymycobot.error import calibration_parameters
1012
from pymycobot.log import setup_logging
@@ -52,7 +54,7 @@ def _mesg(self, genre, *args, **kwargs):
5254
**kwargs: support `has_reply`
5355
has_reply: Whether there is a return value to accept.
5456
"""
55-
57+
time.sleep(0.01)
5658
real_command, has_reply = super(MyArmAPI, self)._mesg(genre, *args, **kwargs)
5759
command = self._flatten(real_command)
5860
with self.lock:
@@ -96,6 +98,8 @@ def _mesg(self, genre, *args, **kwargs):
9698
result = self._int2angle(result)
9799
return result
98100
if genre in (ProtocolCode.GET_ATOM_PRESS_STATUS, ):
101+
if self.__class__.__name__ == 'MyArmM':
102+
return res[0]
99103
return res
100104
elif genre in [
101105
ProtocolCode.GET_ANGLES, ProtocolCode.GET_JOINT_MAX_ANGLE, ProtocolCode.GET_JOINT_MIN_ANGLE,
@@ -115,7 +119,7 @@ def _mesg(self, genre, *args, **kwargs):
115119
rank = [i for i, e in enumerate(reverse_bins) if e != '0']
116120
result.append(rank)
117121
return result
118-
elif genre == ProtocolCode.GET_ROBOT_FIRMWARE_VERSION:
122+
elif genre in (ProtocolCode.GET_ROBOT_FIRMWARE_VERSION, ProtocolCode.GET_ROBOT_TOOL_FIRMWARE_VERSION):
119123
return self._int2coord(res[0])
120124
else:
121125
return res
@@ -144,10 +148,6 @@ def get_robot_tool_firmware_version(self):
144148
"""Get the Robot Tool Firmware Version (End Atom)"""
145149
return self._mesg(ProtocolCode.GET_ROBOT_TOOL_FIRMWARE_VERSION, has_reply=True)
146150

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-
151151
def set_robot_err_check_state(self, status):
152152
"""Set Error Detection Status You can turn off error detection, but do not turn it off unless necessary
153153
@@ -175,7 +175,8 @@ def get_recv_queue_max_len(self):
175175

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

180181
def get_recv_queue_len(self):
181182
"""The current length of the read receive queue"""
@@ -275,15 +276,17 @@ def set_servo_p(self, servo_id, data):
275276
data (int): 0-254
276277
277278
"""
278-
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_SAVE, servo_id, data)
279+
assert 0 <= data <= 254, "data must be between 0 and 254"
280+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
281+
self._mesg(ProtocolCode.SET_SERVO_P, servo_id, data)
279282

280283
def get_servo_p(self, servo_id):
281284
"""Reads the position loop P scale factor of the specified servo motor
282285
283286
Args:
284287
servo_id (int): 0-254
285288
"""
286-
return self._mesg(ProtocolCode.SERVO_RESTORE, servo_id, has_reply=True)
289+
return self._mesg(ProtocolCode.GET_SERVO_P, servo_id, has_reply=True)
287290

288291
def set_servo_d(self, servo_id, data):
289292
"""Sets the proportional factor for the position ring D of the specified servo motor
@@ -292,6 +295,8 @@ def set_servo_d(self, servo_id, data):
292295
servo_id (int): 0-254
293296
data (int): 0-254
294297
"""
298+
assert 0 <= data <= 254, "data must be between 0 and 254"
299+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
295300
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_EXECUTE, servo_id, data)
296301

297302
def get_servo_d(self, servo_id):
@@ -309,6 +314,8 @@ def set_servo_i(self, servo_id, data):
309314
servo_id (int): 0 - 254
310315
data (int): 0 - 254
311316
"""
317+
assert 0 <= data <= 254, "data must be between 0 and 254"
318+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
312319
self._mesg(ProtocolCode.MERCURY_DRAG_TECH_PAUSE, servo_id, data)
313320

314321
def get_servo_i(self, servo_id):
@@ -322,6 +329,8 @@ def set_servo_cw(self, servo_id, data):
322329
servo_id (int): 0 - 254
323330
data (int): 0 - 32
324331
"""
332+
assert 0 <= data <= 32, "data must be between 0 and 32"
333+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
325334
self._mesg(ProtocolCode.SET_SERVO_MOTOR_CLOCKWISE, servo_id, data)
326335

327336
def get_servo_cw(self, servo_id):
@@ -339,6 +348,8 @@ def set_servo_cww(self, servo_id, data):
339348
servo_id (int): 0 - 254
340349
data (int): 0 - 32
341350
"""
351+
assert 0 <= data <= 32, "data must be between 0 and 32"
352+
self.calibration_parameters(class_name=self.__class__.__name__, servo_id=servo_id)
342353
return self._mesg(ProtocolCode.SET_SERVO_MOTOR_COUNTER_CLOCKWISE, servo_id, data)
343354

344355
def get_servo_cww(self, servo_id):

pymycobot/mycobotpro630.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,8 +744,9 @@ def start_robot(self, power_on_only=False):
744744
return False
745745

746746
for i in range(6):
747-
self._servo_init_can_output(Joint(i))
748-
self._servo_clear_encoder_error(Joint(i))
747+
if self.get_joint_error_mask(Joint(i)) & (1 << 16):
748+
self._servo_init_can_output(Joint(i))
749+
self._servo_clear_encoder_error(Joint(i))
749750

750751
os.system("halcmd setp or2.0.in1 1")
751752
return True

0 commit comments

Comments
 (0)