Skip to content

Commit 87c21b8

Browse files
committed
fix:1. The blockly object has been clamped and the control has been changed to continuously detect the grasped state; 2. blockly enables judgment to obtain the torque sensor value; 3. Python IDE is compatible with running the blockly module; 4. blockly's xarm5 end leveling repair; 5. blockly trajectory Record to determine whether the file name is empty; 6. blockly sends the modbus command module to return a character; 7. detects that Blockly contains a counter control before printing the counter value
1 parent 20c4f12 commit 87c21b8

File tree

5 files changed

+75
-26
lines changed

5 files changed

+75
-26
lines changed

xarm/tools/blockly/_blockly_base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,19 @@ def _get_condition_expression(self, value_block, arg_map=None):
202202
cmd_li = re.sub('\s+', ' ', cmd_li)
203203
cmd_li = cmd_li.strip().split(' ')
204204
int_li = [int(da, 16) for da in cmd_li]
205-
return '[data if isinstance(data, int) else [hex(da).split("0x")[1].upper().zfill(2) for da in data] for ' \
206-
'data in self._arm.getset_tgpio_modbus_data({}, host_id={})]'.format(int_li, host_id)
205+
return '[" ".join([hex(da).split("0x")[1].upper().zfill(2) for da in data]) if isinstance(data, list) else data for ' \
206+
'data in self._arm.getset_tgpio_modbus_data({}, host_id={})][-1]'.format(int_li, host_id)
207207
elif block.attrib['type'] == 'get_gripper_status':
208208
fields = self._get_nodes('field', root=block)
209209
timeout = fields[0].text
210-
return '0 == self._arm.arm.check_gripper_status()'
210+
return '0 == self._arm.arm.check_catch_gripper_status({})'.format(timeout)
211211
elif block.attrib['type'] == 'get_ft_sensor':
212212
direction_li = ['Fx', 'Fy', 'Fz', 'Tx', 'Ty', 'Tz']
213213
fields = self._get_nodes('field', root=block)
214214
direction = fields[0].text
215-
return 'self._arm.get_joints_torque()[1][{}]'.format(direction_li.index(direction))
215+
return '[self._arm.ft_sensor_enable(1), self._arm.set_state(0), self._arm.get_ft_sensor_data()[1][{}]][2] if' \
216+
' self._arm.get_ft_sensor_config()[1][1] == 0 else self._arm.get_ft_sensor_data()[1][{}]'.\
217+
format(direction_li.index(direction), direction_li.index(direction))
216218
elif block.attrib['type'] == 'get_counter':
217219
return 'self._arm.count'
218220

xarm/tools/blockly/_blockly_handler.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def __init__(self, xml_path):
3636
self._count_callbacks= []
3737

3838
self.is_run_linear_track = False
39+
self._is_run_blockly = False
40+
self._listen_counter = False
3941

4042
def _append_init_code(self, code):
4143
self._init_code_list.append(code)
@@ -100,11 +102,13 @@ def _handle_set_angle_acceleration(self, block, indent=0, arg_map=None):
100102
self._append_main_code('self._angle_acc = {}'.format(self._get_field_value(block)), indent + 2)
101103

102104
def _handle_set_counter_increase(self, block, indent=0, arg_map=None):
105+
self._listen_counter = True
103106
self._append_main_code('code = self._arm.set_counter_increase()', indent + 2)
104107
self._append_main_code('if not self._check_code(code, \'set_counter_increase\'):', indent + 2)
105108
self._append_main_code(' return', indent + 2)
106109

107110
def _handle_set_counter_reset(self, block, indent=0, arg_map=None):
111+
self._listen_counter = True
108112
self._append_main_code('code = self._arm.set_counter_reset()', indent + 2)
109113
self._append_main_code('if not self._check_code(code, \'set_counter_reset\'):', indent + 2)
110114
self._append_main_code(' return', indent + 2)
@@ -337,9 +341,12 @@ def _handle_studio_run_traj(self, block, indent=0, arg_map=None):
337341
filename = fields[0].text
338342
speed = fields[1].text
339343
times = fields[2].text
340-
self._append_main_code('code = self._arm.playback_trajectory(times={}, filename=\'{}\', wait=True, double_speed={})'.format(times, filename, speed), indent + 2)
341-
self._append_main_code('if not self._check_code(code, \'playback_trajectory\'):', indent + 2)
342-
self._append_main_code(' return', indent + 2)
344+
if filename:
345+
self._append_main_code('code = self._arm.playback_trajectory(times={}, filename=\'{}\', wait=True, double_speed={})'.format(times, filename, speed), indent + 2)
346+
self._append_main_code('if not self._check_code(code, \'playback_trajectory\'):', indent + 2)
347+
self._append_main_code(' return', indent + 2)
348+
else:
349+
self._append_main_code('pass', indent + 2)
343350

344351
def _handle_app_studio_traj(self, block, indent=0, arg_map=None):
345352
fields = self._get_nodes('field', root=block)
@@ -1089,11 +1096,12 @@ def _handle_python_code(self, block, indent=0, arg_map=None, **kwargs):
10891096

10901097
def _handle_set_end_level(self, block, indent=0, arg_map=None, **kwargs):
10911098
if not self.axis_type:
1092-
return
1099+
return
1100+
self._append_main_code('self._arm.arm.wait_move()', indent + 2)
10931101
self._append_main_code('current_angle = self._arm.angles', indent + 2)
10941102
if self.axis_type[0] == 5:
10951103
self._append_main_code('angle = -(current_angle[1] + current_angle[2])', indent + 2)
1096-
self._append_main_code('code = self._arm.set_servo_angle(servo_id=4, angle=angle)', indent + 2,)
1104+
self._append_main_code('code = self._arm.set_servo_angle(angle=[*current_angle[:3], angle, current_angle[4]])', indent + 2,)
10971105
elif self.axis_type[0] == 6:
10981106
self._append_main_code('angle_5 = {}'.format('-(current_angle[1] - current_angle[2])' if self.axis_type[1]==9 or self.axis_type[1]==12 else
10991107
'-(current_angle[1] + current_angle[2])'), indent + 2)
@@ -1138,7 +1146,7 @@ def _handle_set_ft_sensor(self, block, indent=0, arg_map=None):
11381146
for index, axis in enumerate(force_axis_list):
11391147
if axis == force_axis:
11401148
force_axis_value[index] = 1
1141-
force_ref_value[index] = int(force_ref)
1149+
force_ref_value[index] = float(force_ref)
11421150
self._append_main_code('code = self._arm.config_force_control({}, {}, {}, [0] * 6)'.format(ref_frame, force_axis_value,
11431151
force_ref_value), indent + 2)
11441152
self._append_main_code('if not self._check_code(code, \'set_tgpio_modbus\'):', indent + 2)
@@ -1150,7 +1158,7 @@ def _handle_set_ft_sensor(self, block, indent=0, arg_map=None):
11501158
self._append_main_code('self._arm.ft_sensor_app_set(2)', indent + 2)
11511159
self._append_main_code('self._arm.set_state(0)', indent + 2)
11521160
self._append_main_code('start_time = time.time()', indent + 2)
1153-
self._append_main_code('while time.time() - start_time > {}:'.format(wait_time), indent + 2)
1161+
self._append_main_code('while time.time() - start_time < {}:'.format(wait_time), indent + 2)
11541162
self._append_main_code('if self._arm.error_code != 0:', indent + 3)
11551163
self._append_main_code(' return', indent + 4)
11561164
self._append_main_code('self._arm.ft_sensor_app_set(0)', indent + 2)
@@ -1160,7 +1168,11 @@ def _handle_studio_run_blockly(self, block, indent=0, arg_map=None):
11601168
projectName = fields[0].text
11611169
fileName = fields[1].text
11621170
times = fields[2].text
1163-
self._append_main_code('start_run_blockly(fileName="{}", times={})'.format(fileName, times), indent + 2)
1171+
if not self._is_exec:
1172+
self._append_main_code('self._start_run_blockly(fileName="{}", times={})'.format(fileName.lstrip('/'), times), indent + 2)
1173+
else:
1174+
self._append_main_code('start_run_blockly(fileName="{}", times={})'.format(fileName, times), indent + 2)
1175+
self._is_run_blockly = True
11641176

11651177
def _handle_studio_run_gcode(self, block, indent=0, arg_map=None):
11661178
fields = self._get_nodes('field', root=block)
@@ -1169,5 +1181,3 @@ def _handle_studio_run_gcode(self, block, indent=0, arg_map=None):
11691181
times = fields[2].text
11701182
self._append_main_code('start_run_gcode(projectName="{}", fileName="{}", times={})'.format(projectName, fileName, times), indent + 2)
11711183

1172-
1173-

xarm/tools/blockly/_blockly_tool.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ def _finish_robot_main_run_codes(self, error_exit=True, stop_exit=True):
105105
self._append_main_code(' self._arm.release_error_warn_changed_callback(self._error_warn_changed_callback)', indent=-1)
106106
if stop_exit:
107107
self._append_main_code(' self._arm.release_state_changed_callback(self._state_changed_callback)', indent=-1)
108-
self._append_main_code(' if hasattr(self._arm, \'release_count_changed_callback\'):', indent=-1)
109-
self._append_main_code(' self._arm.release_count_changed_callback(self._count_changed_callback)', indent=-1)
108+
if self._listen_counter:
109+
self._append_main_code(' if hasattr(self._arm, \'release_count_changed_callback\'):', indent=-1)
110+
self._append_main_code(' self._arm.release_count_changed_callback(self._count_changed_callback)', indent=-1)
110111

111112
# if self._listen_tgpio_digital or self._listen_tgpio_analog or self._listen_cgpio_state \
112113
# or len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks):
@@ -183,6 +184,7 @@ def _init_robot_main_class_codes(self, init=True, wait_seconds=1, mode=0, state=
183184
self.__define_callback_thread_func()
184185
self.__define_listen_gpio_thread_func()
185186
self.__define_listen_count_thread_func()
187+
self.__define_run_blockly_func()
186188
self.__define_robot_init_func(init=init, wait_seconds=wait_seconds, mode=mode, state=state, error_exit=error_exit, stop_exit=stop_exit)
187189
self.__define_error_warn_changed_callback_func(error_exit=error_exit)
188190
self.__define_state_changed_callback_func(stop_exit=stop_exit)
@@ -327,6 +329,12 @@ def __define_listen_count_thread_func(self):
327329
self._append_main_init_code(' self._counter_val = values')
328330
self._append_main_init_code(' time.sleep(0.01)\n')
329331

332+
def __define_run_blockly_func(self):
333+
if self._is_run_blockly and not self._is_exec:
334+
self._append_main_init_code(' def _start_run_blockly(self, fileName, times):')
335+
self._append_main_init_code(' for i in range(times):')
336+
self._append_main_init_code(' self._arm.run_blockly_app(fileName, init=False, axis_type=[self._arm.axis, self._arm.device_type])\n')
337+
330338
def __define_robot_init_func(self, init=True, wait_seconds=1, mode=0, state=0, error_exit=True, stop_exit=True):
331339
# Define XArm Init Function:
332340
self._append_main_init_code(' # Robot init')
@@ -343,9 +351,9 @@ def __define_robot_init_func(self, init=True, wait_seconds=1, mode=0, state=0, e
343351
self._append_main_init_code(' self._arm.register_error_warn_changed_callback(self._error_warn_changed_callback)')
344352
if stop_exit:
345353
self._append_main_init_code(' self._arm.register_state_changed_callback(self._state_changed_callback)')
346-
347-
self._append_main_init_code(' if hasattr(self._arm, \'register_count_changed_callback\'):')
348-
self._append_main_init_code(' self._arm.register_count_changed_callback(self._count_changed_callback)')
354+
if self._listen_counter:
355+
self._append_main_init_code(' if hasattr(self._arm, \'register_count_changed_callback\'):')
356+
self._append_main_init_code(' self._arm.register_count_changed_callback(self._count_changed_callback)')
349357
self._append_main_init_code('')
350358

351359
def __define_error_warn_changed_callback_func(self, error_exit=True):
@@ -372,10 +380,11 @@ def __define_state_changed_callback_func(self, stop_exit=True):
372380

373381
def __define_count_changed_callback_func(self):
374382
# Define count changed callback
375-
self._append_main_init_code(' # Register count changed callback')
376-
self._append_main_init_code(' def _count_changed_callback(self, data):')
377-
self._append_main_init_code(' if self.is_alive:')
378-
self._append_main_init_code(' self.pprint(\'counter val: {}\'.format(data[\'count\']))\n')
383+
if self._listen_counter:
384+
self._append_main_init_code(' # Register count changed callback')
385+
self._append_main_init_code(' def _count_changed_callback(self, data):')
386+
self._append_main_init_code(' if self.is_alive:')
387+
self._append_main_init_code(' self.pprint(\'counter val: {}\'.format(data[\'count\']))\n')
379388

380389
def __define_pprint_func(self):
381390
self._append_main_init_code(' @staticmethod')

xarm/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '1.13.28'
1+
__version__ = '1.13.29'

xarm/x3/gripper.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def __check_gripper_position(self, target_pos, timeout=None):
425425
time.sleep(0.2)
426426
return code
427427

428-
def check_gripper_status(self, timeout=None):
428+
def __check_gripper_status(self, timeout=None):
429429
start_move = False
430430
not_start_move_cnt = 0
431431
failed_cnt = 0
@@ -453,6 +453,34 @@ def check_gripper_status(self, timeout=None):
453453
time.sleep(0.1)
454454
return code
455455

456+
def check_catch_gripper_status(self, timeout=None):
457+
start_move = False
458+
not_start_move_cnt = 0
459+
failed_cnt = 0
460+
if not timeout or not isinstance(timeout, (int, float)) or timeout <= 0:
461+
timeout = 10
462+
expired = time.monotonic() + timeout
463+
code = APIState.WAIT_FINISH_TIMEOUT
464+
while self.connected and time.monotonic() < expired:
465+
_, status = self.get_gripper_status()
466+
failed_cnt = 0 if _ == 0 else failed_cnt + 1
467+
if _ == 0:
468+
if status & 0x03 == 2:
469+
if start_move:
470+
return 0
471+
else:
472+
not_start_move_cnt += 1
473+
if not_start_move_cnt > 2:
474+
return 0
475+
elif not start_move:
476+
not_start_move_cnt = 0
477+
start_move = True
478+
else:
479+
if failed_cnt > 10:
480+
return APIState.CHECK_FAILED
481+
time.sleep(0.1)
482+
return code
483+
456484
@xarm_is_connected(_type='set')
457485
def _set_modbus_gripper_position(self, pos, wait=False, speed=None, auto_enable=False, timeout=None, **kwargs):
458486
if kwargs.get('wait_motion', True):
@@ -486,7 +514,7 @@ def _set_modbus_gripper_position(self, pos, wait=False, speed=None, auto_enable=
486514
ret[0] = self._check_modbus_code(ret, only_check_code=True)
487515
if wait and ret[0] == 0:
488516
if self.gripper_is_support_status:
489-
return self.check_gripper_status(timeout=timeout)
517+
return self.__check_gripper_status(timeout=timeout)
490518
else:
491519
return self.__check_gripper_position(pos, timeout=timeout)
492520
return ret[0]

0 commit comments

Comments
 (0)