86 lines
3.7 KiB
Python
86 lines
3.7 KiB
Python
"""
|
|
Python library to control Robotiq Two Finger Gripper connected to UR robot via Python-URX
|
|
|
|
Tested using a UR5 Version CB3 and Robotiq 2-Finger Gripper Version 85
|
|
|
|
SETUP
|
|
|
|
You must install the driver first (http://support.robotiq.com/pages/viewpage.action?pageId=5963876) and then power on the gripper from the gripper UI
|
|
|
|
FAQ
|
|
|
|
Why does this class group all the commands together and run them as a single program as opposed to running each line seperately (like most of URX)?
|
|
|
|
- The gripper is controlled by connecting to the robot's computer (TCP/IP) and then communicating with the gripper via a socket (127.0.0.1:63352). The scope of the socket is at the program level. It will be automatically closed whenever a program finishes. Therefore it's important that we run all commands as a single program.
|
|
|
|
DOCUMENTATION
|
|
|
|
- This code was developed by downloading the "gripper package" on http://support.robotiq.com/pages/viewpage.action?pageId=5963876
|
|
- Open folder "robotiq_2f_gripper_programs_CB3"
|
|
- robotiq_2f_gripper_programs_CB3/advanced_template_test.script was referenced to create this class
|
|
|
|
Future Features
|
|
|
|
- Though I haven't developed it yet if you look in robotiq_2f_gripper_programs_CB3/advanced_template_test.script and view function "rq_get_var" there is an example of how to determine the current state of the gripper and if it's holding an object.
|
|
"""
|
|
|
|
import logging
|
|
|
|
class Robotiq_Two_Finger_Gripper(object):
|
|
complete_program = ""
|
|
header = "def myProg():" + b"\n"
|
|
end = b"\n" + "end"
|
|
logger = False
|
|
|
|
def __init__(self):
|
|
self.logger = logging.getLogger("urx")
|
|
self.reset()
|
|
|
|
def reset(self):
|
|
self.complete_program = ""
|
|
self.add_line_to_program("set_analog_inputrange(0, 0)")
|
|
self.add_line_to_program("set_analog_inputrange(1, 0)")
|
|
self.add_line_to_program("set_analog_inputrange(2, 0)")
|
|
self.add_line_to_program("set_analog_inputrange(3, 0)")
|
|
self.add_line_to_program("set_analog_outputdomain(0, 0)")
|
|
self.add_line_to_program("set_analog_outputdomain(1, 0)")
|
|
self.add_line_to_program("set_tool_voltage(0)")
|
|
self.add_line_to_program("set_runstate_outputs([])")
|
|
self.add_line_to_program("set_payload(0.85)") #0.85 is the weight of the gripper in KG
|
|
self.add_line_to_program("socket_close(\"gripper_socket\")")
|
|
#self.add_line_to_program("sleep(1)") #in Robotiq's example they do a wait here... I haven't found it nec
|
|
self.add_line_to_program("socket_open(\"127.0.0.1\",63352,\"gripper_socket\")")
|
|
#self.add_line_to_program("sleep(1)")
|
|
self.add_line_to_program("socket_set_var(\"SEP\",255,\"gripper_socket\")") #Speed 0-255 is valid
|
|
self.add_line_to_program("sync()")
|
|
self.add_line_to_program("socket_set_var(\"FOR\",50,\"gripper_socket\")") #Force 0-255 is valid
|
|
self.add_line_to_program("sync()")
|
|
self.add_line_to_program("socket_set_var(\"ACT\",1,\"gripper_socket\")") # Activate robot
|
|
self.add_line_to_program("sync()")
|
|
self.add_line_to_program("socket_set_var(\"GTO\",1,\"gripper_socket\")")
|
|
self.add_line_to_program("sync()")
|
|
|
|
def open_gripper(self):
|
|
self.add_line_to_program("socket_set_var(\"POS\",0,\"gripper_socket\")") #0 is open; range is 0-255
|
|
self.add_line_to_program("sync()")
|
|
self.add_line_to_program("sleep(2)")
|
|
|
|
def close_gripper(self):
|
|
self.add_line_to_program("socket_set_var(\"POS\",255,\"gripper_socket\")") #255 is closed; range is 0-255
|
|
self.add_line_to_program("sync()")
|
|
self.add_line_to_program("sleep(2)")
|
|
|
|
def add_line_to_program(self,new_line):
|
|
if(self.complete_program != ""):
|
|
self.complete_program += b"\n"
|
|
self.complete_program += new_line
|
|
|
|
def ret_program_to_run(self):
|
|
if(self.complete_program == ""):
|
|
self.logger.debug("robotiq_two_finger_gripper's program is empty")
|
|
return ""
|
|
|
|
prog = self.header
|
|
prog += self.complete_program
|
|
prog += self.end
|
|
return prog |