Skip to content

Commit b6b6070

Browse files
committed
Merge branch 'develop' of 192.168.1.19:vinman/xArm-Python-SDK into develop
2 parents ac62681 + 1b1f5ae commit b6b6070

File tree

8 files changed

+273
-60
lines changed

8 files changed

+273
-60
lines changed

doc/api/xarm_api.md

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,16 @@ xArm-Python-SDK API Documentation (V1.15.0): class XArmAPI in module xarm.wrappe
11961196
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
11971197
11981198

1199+
#### def __get_tool_digital_input__(self, ionum=None):
1200+
1201+
> Get the digital value of the specified Tool GPIO,Compared with the "get_tgpio_digital" interface,
1202+
>     the value of TI2 is obtained when the ionum is not transmitted.
1203+
>
1204+
> :param ionum: 0 or 1 or or 2 or 3 or 4 (both 0 and 4), default is None
1205+
> :return: tuple((code, value or value list)), only when code is 0, the returned result is correct.
1206+
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
1207+
1208+
11991209
#### def __get_traj_speeding__(self, rate):
12001210

12011211
> Obtain the joint and velocity values of joint overspeed during trajectory recording
@@ -2049,11 +2059,12 @@ xArm-Python-SDK API Documentation (V1.15.0): class XArmAPI in module xarm.wrappe
20492059

20502060
#### def __set_bio_gripper_control_mode__(self, mode):
20512061

2052-
> Set the mode of the bio gripper
2062+
> Set the bio gripper control mode
20532063
> Note:
20542064
>     1. Only available in the new version of BIO Gripper
20552065
>
2056-
> :param mode: mode
2066+
> :param mode: 0: bio gripper opening and closing mode
2067+
>              1: position loop mode
20572068
>
20582069
> :return: code
20592070
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
@@ -2073,30 +2084,29 @@ xArm-Python-SDK API Documentation (V1.15.0): class XArmAPI in module xarm.wrappe
20732084

20742085
#### def __set_bio_gripper_force__(self, force):
20752086

2076-
> Set the force of the bio gripper
2087+
> Set the bio gripper force
20772088
> Note:
20782089
>     1. Only available in the new version of BIO Gripper
20792090
>
2080-
> :param force: force (1-100)
2091+
> :param force: gripper force between 10 and 100
20812092
>
20822093
> :return: code
20832094
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
20842095
20852096

20862097
#### def __set_bio_gripper_position__(self, pos, speed=0, force=100, wait=True, timeout=5, **kwargs):
20872098

2088-
> Set the position of the bio gripper
2089-
> Note:
2090-
>     1. Only available in the new version of BIO Gripper
2099+
> Set the bio gripper position
20912100
>
2092-
> :param pos: position(70-150)
2093-
> :param speed: speed value, default is 0 (not set the speed)
2094-
> :param force: force value, default is 100
2095-
> :param wait: whether to wait for the bio gripper motion complete, default is True
2101+
> :param pos: gripper pos between 71 and 150
2102+
> :param speed: gripper speed between 0 and 4500
2103+
> :param force: gripper force between 10 and 100
2104+
> :param wait: whether to wait for the robotiq motion to complete, default is True
20962105
> :param timeout: maximum waiting time(unit: second), default is 5, only available if wait=True
20972106
>
2098-
> :return: code
2099-
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
2107+
> :return: tuple((code, robotiq_response))
2108+
>     code: See the [API Code Documentation](./xarm_api_code.md#api-code) for details.
2109+
>     robotiq_response: See the robotiq documentation
21002110
21012111

21022112
#### def __set_bio_gripper_speed__(self, speed):

xarm/tools/blockly/_blockly_base.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,24 @@ def _get_condition_expression(self, value_block, arg_map=None):
224224
addr = int(fields[0].text.replace(' ', '').replace('0x', '').replace(',', '').replace('\xa0', ''), 16)
225225
return "list(map(lambda x: hex(x).split('0x')[1].upper().zfill(4)[:2] + ' ' + hex(x).split('0x')[1]." \
226226
"upper().zfill(4)[2:], self._arm.read_holding_registers({}, 1)[1]))[0]".format(str(addr))
227+
elif block.attrib['type'] == 'get_position':
228+
direction_li = ['X', 'Y', 'Z', 'R', 'P', 'Y']
229+
fields = self._get_nodes('field', root=block)
230+
is_axis = True if fields[0].text == 'axis' else False
231+
direction = int(fields[1].text)
232+
if is_axis:
233+
return 'round(self._arm.get_position_aa()[1][{}], 2)'.format(direction-1)
234+
else:
235+
return 'round(self._arm.get_position()[1][{}], 2)'.format(direction-1)
236+
elif block.attrib['type'] == 'get_joint_angle':
237+
angle_li = ['J1', 'J2', 'J3', 'J4', 'J5', 'J6']
238+
fields = self._get_nodes('field', root=block)
239+
servo_angle = fields[0].text
240+
return 'round(self._arm.get_servo_angle(servo_id={})[1], 2)'.format(servo_angle)
241+
elif block.attrib['type'] == 'check_bio_g2_gripper_is_catch':
242+
fields = self._get_nodes('field', root=block)
243+
timeout = float(fields[0].text)
244+
return 'self._arm.arm.check_bio_gripper_is_catch(timeout={})'.format(timeout)
227245

228246

229247
def __get_logic_compare(self, block, arg_map=None):

xarm/tools/blockly/_blockly_handler.py

Lines changed: 127 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import json
1010
import re
11+
import math
1112
from ._blockly_base import _BlocklyBase, OPS_MAP
1213
from ._blockly_highlight import HIGHLIGHT_BLOCKS
1314

@@ -417,8 +418,9 @@ def _handle_gpio_set_digital(self, block, indent=0, arg_map=None):
417418
fields = self._get_nodes('field', root=block)
418419
io = fields[0].text
419420
value = 0 if fields[1].text == 'LOW' else 1
420-
delay_sec = fields[2].text if len(fields) > 2 else 0
421-
self._append_main_code('code = self._arm.set_tgpio_digital({}, {}, delay_sec={})'.format(io, value, delay_sec), indent + 2)
421+
is_sync = fields[2].text if len(fields) > 2 else 'True'
422+
delay_sec = fields[3].text if len(fields) > 3 else 0
423+
self._append_main_code('code = self._arm.set_tgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
422424
self._append_main_code('if not self._check_code(code, \'set_tgpio_digital\'):', indent + 2)
423425
self._append_main_code(' return', indent + 2)
424426

@@ -435,14 +437,36 @@ def _handle_gpio_set_digital_with_xyz(self, block, indent=0, arg_map=None):
435437
self._append_main_code('if not self._check_code(code, \'set_tgpio_digital_with_xyz\'):', indent + 2)
436438
self._append_main_code(' return', indent + 2)
437439

440+
def _handle_gpio_set_digital_with_xyz_var(self, block, indent=0, arg_map=None):
441+
value_nodes = self._get_nodes('value', root=block)
442+
x = self._get_block_val(value_nodes[0], arg_map)
443+
y = self._get_block_val(value_nodes[1], arg_map)
444+
z = self._get_block_val(value_nodes[2], arg_map)
445+
xyz_li = [x, y, z]
446+
xyz = []
447+
for i in range(3):
448+
if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
449+
xyz.append(float(xyz_li[i]))
450+
else:
451+
xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
452+
xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
453+
str(math.log2(7)), xyz_li[2])
454+
tol_r = self._get_block_val(value_nodes[3], arg_map)
455+
io = self._get_block_val(value_nodes[4], arg_map)
456+
value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
457+
self._append_main_code(
458+
'code = self._arm.set_tgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
459+
self._append_main_code('if not self._check_code(code, \'set_tgpio_digital_with_xyz\'):', indent + 2)
460+
self._append_main_code(' return', indent + 2)
461+
438462
def _handle_get_suction_cup(self, block, indent=0, arg_map=None):
439463
self._append_main_code('{}self._arm.get_suction_cup(hardware_version={})'.format('{}', self._vacuum_version), indent + 2)
440464

441465
def _handle_check_air_pump_state(self, block, indent=0, arg_map=None):
442466
fields = self._get_nodes('field', root=block)
443467
state = 1 if fields[0].text == 'ON' else 0
444468
timeout = float(fields[1].text)
445-
self._append_main_code('self._arm.arm.check_air_pump_state({}, timeout={})'.format(state, timeout), indent + 2)
469+
self._append_main_code('self._arm.arm.check_air_pump_state({}, timeout={}, hardware_version={})'.format(state, timeout, self._vacuum_version), indent + 2)
446470

447471
def _handle_check_bio_gripper_is_catch(self, block, indent=0, arg_map=None):
448472
fields = self._get_nodes('field', root=block)
@@ -464,7 +488,7 @@ def _handle_set_suction_cup(self, block, indent=0, arg_map=None):
464488
wait = False
465489
fields = self._get_nodes('field', root=block, name='delay')
466490
delay_sec = fields[0].text if len(fields) > 0 else 0
467-
self._append_main_code('code = self._arm.set_suction_cup({}, wait={}, delay_sec={}, hardware_version={})'.format( on, wait, delay_sec, self._vacuum_version), indent + 2)
491+
self._append_main_code('code = self._arm.set_suction_cup({}, wait={}, delay_sec={}, hardware_version={})'.format(on, wait, delay_sec, self._vacuum_version), indent + 2)
468492
self._append_main_code('if not self._check_code(code, \'set_suction_cup\'):', indent + 2)
469493
self._append_main_code(' return', indent + 2)
470494

@@ -511,8 +535,9 @@ def _handle_gpio_set_controller_digital(self, block, indent=0, arg_map=None):
511535
fields = self._get_nodes('field', root=block)
512536
io = fields[0].text
513537
value = 0 if fields[1].text == 'LOW' else 1
514-
delay_sec = fields[2].text if len(fields) > 2 else 0
515-
self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={})'.format(io, value, delay_sec), indent + 2)
538+
is_sync = fields[2].text if len(fields) > 2 else 'True'
539+
delay_sec = fields[3].text if len(fields) > 3 else 0
540+
self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
516541
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital\'):', indent + 2)
517542
self._append_main_code(' return', indent + 2)
518543

@@ -525,6 +550,27 @@ def _handle_gpio_set_controller_digital_with_xyz(self, block, indent=0, arg_map=
525550
tol_r = fields[3].text
526551
io = fields[4].text
527552
value = 0 if fields[5].text == 'LOW' else 1
553+
self._append_main_code(
554+
'code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
555+
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
556+
self._append_main_code(' return', indent + 2)
557+
558+
def _handle_gpio_set_controller_digital_with_xyz_var(self, block, indent=0, arg_map=None):
559+
value_nodes = self._get_nodes('value', root=block)
560+
x = self._get_block_val(value_nodes[0], arg_map)
561+
y = self._get_block_val(value_nodes[1], arg_map)
562+
z = self._get_block_val(value_nodes[2], arg_map)
563+
xyz_li = [x, y, z]
564+
xyz = []
565+
for i in range(3):
566+
if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
567+
xyz.append(float(xyz_li[i]))
568+
else:
569+
xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
570+
xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(str(math.log2(7)), xyz_li[2])
571+
tol_r = self._get_block_val(value_nodes[3], arg_map)
572+
io = self._get_block_val(value_nodes[4], arg_map)
573+
value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
528574
self._append_main_code('code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
529575
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
530576
self._append_main_code(' return', indent + 2)
@@ -533,20 +579,43 @@ def _handle_gpio_set_controller_digital_do(self, block, indent=0, arg_map=None):
533579
fields = self._get_nodes('field', root=block)
534580
io = fields[0].text
535581
value = 0 if fields[1].text == 'LOW' else 1
536-
delay_sec = fields[2].text if len(fields) > 2 else 0
537-
self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={})'.format(io, value, delay_sec), indent + 2)
538-
self._append_main_code('if not self._check_code(code, \'set_suction_cup\'):', indent + 2)
582+
is_sync = fields[2].text if len(fields) > 2 else 'True'
583+
delay_sec = fields[3].text if len(fields) > 3 else 0
584+
self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
585+
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital\'):', indent + 2)
539586
self._append_main_code(' return', indent + 2)
540587

541588
def _handle_gpio_set_controller_digital_with_xyz_do(self, block, indent=0, arg_map=None):
542-
fields = self._get_nodes('field', root=block)
543-
x = fields[0].text
544-
y = fields[1].text
545-
z = fields[2].text
589+
value_nodes = self._get_nodes('value', root=block)
590+
x = self._get_block_val(value_nodes[0], arg_map)
591+
y = self._get_block_val(value_nodes[1], arg_map)
592+
z = self._get_block_val(value_nodes[2], arg_map)
546593
xyz = list(map(float, [x, y, z]))
547-
tol_r = fields[3].text
548-
io = fields[4].text
549-
value = 0 if fields[5].text == 'LOW' else 1
594+
tol_r = self._get_block_val(value_nodes[3], arg_map)
595+
io = self._get_block_val(value_nodes[4], arg_map)
596+
value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
597+
self._append_main_code(
598+
'code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
599+
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
600+
self._append_main_code(' return', indent + 2)
601+
602+
def _handle_gpio_set_controller_digital_with_xyz_do_var(self, block, indent=0, arg_map=None):
603+
value_nodes = self._get_nodes('value', root=block)
604+
x = self._get_block_val(value_nodes[0], arg_map)
605+
y = self._get_block_val(value_nodes[1], arg_map)
606+
z = self._get_block_val(value_nodes[2], arg_map)
607+
tol_r = self._get_block_val(value_nodes[3], arg_map)
608+
io = self._get_block_val(value_nodes[4], arg_map)
609+
value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
610+
xyz_li = [x, y, z]
611+
xyz = []
612+
for i in range(3):
613+
if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
614+
xyz.append(float(xyz_li[i]))
615+
else:
616+
xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
617+
xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
618+
str(math.log2(7)), xyz_li[2])
550619
self._append_main_code('code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
551620
self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
552621
self._append_main_code(' return', indent + 2)
@@ -564,11 +633,35 @@ def _handle_gpio_set_controller_analog_with_xyz(self, block, indent=0, arg_map=N
564633
self._append_main_code('if not self._check_code(code, \'set_cgpio_analog_with_xyz\'):', indent + 2)
565634
self._append_main_code(' return', indent + 2)
566635

636+
def _handle_gpio_set_controller_analog_with_xyz_var(self, block, indent=0, arg_map=None):
637+
value_nodes = self._get_nodes('value', root=block)
638+
x = self._get_block_val(value_nodes[0], arg_map)
639+
y = self._get_block_val(value_nodes[1], arg_map)
640+
z = self._get_block_val(value_nodes[2], arg_map)
641+
# xyz = list(map(lambda x: float(x) if re.match('\d+(\.\d+)*$', x) is not None else [x, y, z].index(x), [x, y, z]))
642+
xyz_li = [x, y, z]
643+
xyz = []
644+
for i in range(3):
645+
if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
646+
xyz.append(float(xyz_li[i]))
647+
else:
648+
xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
649+
xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
650+
str(math.log2(7)), xyz_li[2])
651+
tol_r = self._get_block_val(value_nodes[3], arg_map)
652+
io = self._get_block_val(value_nodes[4], arg_map)
653+
value = self._get_block_val(value_nodes[5], arg_map)
654+
self._append_main_code('code = self._arm.set_cgpio_analog_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
655+
self._append_main_code('if not self._check_code(code, \'set_cgpio_analog_with_xyz\'):', indent + 2)
656+
self._append_main_code(' return', indent + 2)
657+
567658
def _handle_gpio_set_controller_analog(self, block, indent=0, arg_map=None):
568-
io = self._get_node('field', block).text
659+
fields = self._get_nodes('field', root=block)
660+
io = fields[0].text
661+
is_sync = fields[1].text
569662
value = self._get_node('value', root=block)
570663
value = self._get_block_val(value, arg_map=arg_map)
571-
self._append_main_code('code = self._arm.set_cgpio_analog({}, {})'.format(io, value), indent + 2)
664+
self._append_main_code('code = self._arm.set_cgpio_analog({}, {}, sync={})'.format(io, value, is_sync), indent + 2)
572665
self._append_main_code('if not self._check_code(code, \'set_cgpio_analog\'):', indent + 2)
573666
self._append_main_code(' return', indent + 2)
574667

@@ -686,6 +779,11 @@ def _handle_gripper_set_status(self, block, indent=0, arg_map=None):
686779
self._append_main_code('if not self._check_code(code, \'set_gripper_status\'):', indent + 2)
687780
self._append_main_code(' return', indent + 2)
688781

782+
def _handle_set_bio_g2_gripper_init(self, block, indent=0, arg_map=None):
783+
self._append_main_code('code = self._arm.set_bio_gripper_enable(True)', indent + 2)
784+
self._append_main_code('if not self._check_code(code, \'set_bio_gripper_enable\'):', indent + 2)
785+
self._append_main_code(' return', indent + 2)
786+
689787
def _handle_set_bio_gripper_init(self, block, indent=0, arg_map=None):
690788
self._append_main_code('code = self._arm.set_bio_gripper_enable(True)', indent + 2)
691789
self._append_main_code('if not self._check_code(code, \'set_bio_gripper_enable\'):', indent + 2)
@@ -707,6 +805,16 @@ def _handle_set_bio_gripper(self, block, indent=0, arg_map=None):
707805
self._append_main_code('if not self._check_code(code, \'close_bio_gripper\'):', indent + 2)
708806
self._append_main_code(' return', indent + 2)
709807

808+
def _handle_set_bio_gripper_pos_force(self, block, indent=0, arg_map=None):
809+
fields = self._get_nodes('field', root=block)
810+
pos = fields[0].text
811+
speed = fields[1].text
812+
force = fields[2].text
813+
wait = fields[3].text == 'TRUE'
814+
self._append_main_code('code = self._arm.set_bio_gripper_position(pos={}, speed={}, force={}, wait={})'.format(pos, speed, force, wait), indent + 2)
815+
self._append_main_code('if not self._check_code(code, \'open_bio_gripper\'):', indent + 2)
816+
self._append_main_code(' return', indent + 2)
817+
710818
def _handle_set_robotiq_init(self, block, indent=0, arg_map=None):
711819
self._append_main_code('code, ret = self._arm.robotiq_reset()', indent + 2)
712820
self._append_main_code('if not self._check_code(code, \'robotiq_reset\'):', indent + 2)
@@ -1124,6 +1232,7 @@ def _handle_python_code(self, block, indent=0, arg_map=None, **kwargs):
11241232
if (self._is_exec or (not self._is_exec and not self._is_ide)) and code.strip() and code not in \
11251233
['finally:', 'else:'] and all([i not in code for i in ['elif', 'except', 'def', 'class']]) \
11261234
and not code.startswith('@'):
1235+
# 只有在studio执行blockly时或者SDK直接调用run_blockly_app时才会执行
11271236
code_indent = re.match('(\s*).*', code).group(1)
11281237
self._append_main_code(code_indent + 'if not self.is_alive:', indent + 2)
11291238
self._append_main_code(code_indent + 'return', indent + 3)

0 commit comments

Comments
 (0)