|
| 1 | +#!/usr/bin/env python3 |
| 2 | +# Software License Agreement (BSD License) |
| 3 | +# |
| 4 | +# Copyright (c) 2019, UFACTORY, Inc. |
| 5 | +# All rights reserved. |
| 6 | +# |
| 7 | +# Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com> |
| 8 | + |
| 9 | +""" |
| 10 | +Example: yinshi RH56 gripper Control |
| 11 | +Please make sure that the gripper is attached to the end. |
| 12 | +""" |
| 13 | + |
| 14 | +import os |
| 15 | +import sys |
| 16 | +import time |
| 17 | +sys.path.append(os.path.join(os.path.dirname(__file__), '../../..')) |
| 18 | + |
| 19 | +from xarm.wrapper import XArmAPI |
| 20 | +from configparser import ConfigParser |
| 21 | +parser = ConfigParser() |
| 22 | +parser.read('../robot.conf') |
| 23 | +try: |
| 24 | + ip = parser.get('xArm', 'ip') |
| 25 | +except: |
| 26 | + ip = input('Please input the xArm ip address[192.168.1.194]:') |
| 27 | + if not ip: |
| 28 | + ip = '192.168.1.194' |
| 29 | + |
| 30 | +# 各自由度角度、力控、速度寄存器地址 |
| 31 | +FINGER_ADDR = { |
| 32 | + 0: 0x05CE, # 小拇指 |
| 33 | + 1: 0x05D0, # 无名指 |
| 34 | + 2: 0x05D2, # 中指 |
| 35 | + 3: 0x05D4, #食指 |
| 36 | + 4: 0x05D6, #大拇指弯曲 |
| 37 | + 5: 0x05D8, #大拇指旋转 |
| 38 | +} |
| 39 | +FORCE_ADDR = { |
| 40 | + 0: 0x05DA, # 小拇指 |
| 41 | + 1: 0x05DC, |
| 42 | + 2: 0x05DE, |
| 43 | + 3: 0x05E0, |
| 44 | + 4: 0x05E2, |
| 45 | + 5: 0x05E4, |
| 46 | +} |
| 47 | +SPEED_ADDR = { |
| 48 | + 0: 0x05F2, # 小拇指 |
| 49 | + 1: 0x05F4, |
| 50 | + 2: 0x05F6, |
| 51 | + 3: 0x05F8, |
| 52 | + 4: 0x05FA, |
| 53 | + 5: 0x05FC, |
| 54 | +} |
| 55 | + |
| 56 | +HAND_ID = 0x01 |
| 57 | + |
| 58 | +def set_rh56_finger_speed(arm, finger_id, speed): |
| 59 | + speed = min(max(round(speed), 0), 1000) |
| 60 | + addr = SPEED_ADDR[finger_id] |
| 61 | + modbus = [HAND_ID, 0x06, (addr >> 8) & 0xFF, addr & 0xFF, (speed >> 8) & 0xFF, speed & 0xFF] |
| 62 | + code, res_data = arm.getset_tgpio_modbus_data(modbus, timeout=100) |
| 63 | + if code != 0: |
| 64 | + print('[FAILED] set the speed of finger-{}, code={}, res_data={}'.format(finger_id, code, res_data)) |
| 65 | + else: |
| 66 | + print('[SUCCESS] set the speed of finger-{}, res_data={}'.format(finger_id, res_data)) |
| 67 | + return code, res_data |
| 68 | + |
| 69 | +def set_rh56_finger_force(arm, finger_id, force): |
| 70 | + force = min(max(round(force), 0), 1000) |
| 71 | + addr = FORCE_ADDR[finger_id] |
| 72 | + modbus = [HAND_ID, 0x06, (addr >> 8) & 0xFF, addr & 0xFF, (force >> 8) & 0xFF, force & 0xFF] |
| 73 | + code, res_data = arm.getset_tgpio_modbus_data(modbus, timeout=100) |
| 74 | + if code != 0: |
| 75 | + print('[FAILED] set the force of finger-{}, code={}, res_data={}'.format(finger_id, code, res_data)) |
| 76 | + else: |
| 77 | + print('[SUCCESS] set the force of finger-{}, res_data={}'.format(finger_id, res_data)) |
| 78 | + return code, res_data |
| 79 | + |
| 80 | +def set_rh56_finger_pos(arm, finger_id, pos): |
| 81 | + pos = min(max(round(pos), 0), 1000) if pos != -1 else 0xFFFF |
| 82 | + addr = FINGER_ADDR[finger_id] |
| 83 | + modbus = [HAND_ID, 0x06, (addr >> 8) & 0xFF, addr & 0xFF, (pos >> 8) & 0xFF, pos & 0xFF] |
| 84 | + code, res_data = arm.getset_tgpio_modbus_data(modbus, timeout=100) |
| 85 | + if code != 0: |
| 86 | + print('[FAILED] set the pos of finger-{}, code={}, res_data={}'.format(finger_id, code, res_data)) |
| 87 | + else: |
| 88 | + print('[SUCCESS] set the pos of finger-{}, res_data={}'.format(finger_id, res_data)) |
| 89 | + return code, res_data |
| 90 | + |
| 91 | +def set_rh56_finger(arm, pos, speed=1000, force=500, open_threshold=500): |
| 92 | + # 决定执行顺序:闭合用正序,张开用反序。位置大于500认为张开,小于等于500认为是闭合。 |
| 93 | + if pos <= open_threshold: |
| 94 | + finger_order = range(0, 5) # 抓取(闭合) |
| 95 | + else: |
| 96 | + finger_order = reversed(range(0, 5)) # 张开 |
| 97 | + |
| 98 | + for finger_id in finger_order: |
| 99 | + set_rh56_finger_speed(arm, finger_id, speed) |
| 100 | + set_rh56_finger_force(arm, finger_id, force) |
| 101 | + set_rh56_finger_pos(arm, finger_id, pos) |
| 102 | + time.sleep(0.01) |
| 103 | + |
| 104 | +arm = XArmAPI(ip) |
| 105 | +time.sleep(0.5) |
| 106 | +if arm.warn_code != 0: |
| 107 | + arm.clean_warn() |
| 108 | +if arm.error_code != 0: |
| 109 | + arm.clean_error() |
| 110 | + |
| 111 | +arm.motion_enable(True) |
| 112 | +arm.set_mode(0) |
| 113 | +arm.set_state(0) |
| 114 | + |
| 115 | +code = arm.set_tgpio_modbus_timeout(20) |
| 116 | +print('set_tgpio_modbus_timeout, code={}'.format(code)) |
| 117 | + |
| 118 | +code = arm.set_tgpio_modbus_baudrate(115200) |
| 119 | +print('set_tgpio_modbus_baudrate, code={}'.format(code)) |
| 120 | +time.sleep(2) |
| 121 | + |
| 122 | +for i in range(100): |
| 123 | + set_rh56_finger(arm, pos=1000, force=500,speed=1000) |
| 124 | + time.sleep(2) |
| 125 | + set_rh56_finger(arm, pos=0, force=500, speed=1000) |
| 126 | + time.sleep(2) |
0 commit comments