thank you @fvr510 for the library.
This is probably the easiest way of using the rg2 gripper with pyhton.
for anyone who wants to use the RG2 gripper with the URX library, there was a small issue in the code I posted above.
I cant test it but what was missing was probably a program wrapper added to the code:
prog_start = "def Program():"
prog_end = "end \n Program()"
robot_program = prog_start + robot_program + prog_end
This is the full code:
import urx
rob = urx.Robot("10.10.10.22")
boilerplate = """
set_standard_analog_input_domain(0, 1)
set_standard_analog_input_domain(1, 1)
set_tool_analog_input_domain(0, 1)
set_tool_analog_input_domain(1, 1)
set_analog_outputdomain(0, 0)
set_analog_outputdomain(1, 0)
set_tool_voltage(0)
set_input_actions_to_default()
set_tcp(p[0.0,0.0,0.0,0.0,0.0,0.0])
set_payload(0.0)
set_gravity([0.0, 0.0, 9.82])
# begin: URCap Installation Node
# Source: RG - On Robot, 1.9.0, OnRobot A/S
# Type: RG Configuration
global measure_width=0
global grip_detected=False
global lost_grip=False
global zsysx=0
global zsysy=0
global zsysz=0.06935
global zsysm=0.7415
global zmasx=0
global zmasy=0
global zmasz=0.18659
global zmasm=0
global zmasm=0
global zslax=0
global zslay=0
global zslaz=0
global zslam=0
global zslam=0
thread lost_grip_thread():
while True:
set_tool_voltage(24)
if True ==get_digital_in(9):
sleep(0.024)
if True == grip_detected:
if False == get_digital_in(8):
grip_detected=False
lost_grip=True
end
end
set_tool_analog_input_domain(0, 1)
set_tool_analog_input_domain(1, 1)
zscale = (get_analog_in(2)-0.026)/2.9760034
zangle = zscale*1.57079633+-0.08726646
zwidth = 5.0+110*sin(zangle)
global measure_width = (floor(zwidth*10))/10-9.2
end
sync()
end
end
lg_thr = run lost_grip_thread()
def RG2(target_width=110, target_force=40, payload=0.0, set_payload=False, depth_compensation=False, slave=False):
grip_detected=False
if slave:
slave_grip_detected=False
else:
master_grip_detected=False
end
timeout = 0
timeout_limit = 750000
while get_digital_in(9) == False:
if timeout > timeout_limit:
break
end
timeout = timeout+1
sync()
end
def bit(input):
msb=65536
local i=0
local output=0
while i<17:
set_digital_out(8,True)
if input>=msb:
input=input-msb
set_digital_out(9,False)
else:
set_digital_out(9,True)
end
if get_digital_in(8):
out=1
end
sync()
set_digital_out(8,False)
sync()
input=input*2
output=output*2
i=i+1
end
return output
end
target_width=target_width+9.2
if target_force>40:
target_force=40
end
if target_force<4:
target_force=4
end
if target_width>110:
target_width=110
end
if target_width<0:
target_width=0
end
rg_data=floor(target_width)*4
rg_data=rg_data+floor(target_force/2)*4*111
rg_data=rg_data+32768
if slave:
rg_data=rg_data+16384
end
bit(rg_data)
if depth_compensation:
finger_length = 55.0/1000
finger_heigth_disp = 5.0/1000
center_displacement = 7.5/1000
start_pose = get_forward_kin()
set_analog_inputrange(2, 1)
zscale = (get_analog_in(2)-0.026)/2.9760034
zangle = zscale*1.57079633+-0.08726646
zwidth = 5.0+110*sin(zangle)
start_depth = cos(zangle)*finger_length
sleep(0.016)
timeout = 0
while get_digital_in(9) == True:
timeout=timeout+1
sleep(0.008)
if timeout > 20:
break
end
end
timeout = 0
timeout_limit = 750000
while get_digital_in(9) == False:
zscale = (get_analog_in(2)-0.026)/2.9760034
zangle = zscale*1.57079633+-0.08726646
zwidth = 5.0+110*sin(zangle)
measure_depth = cos(zangle)*finger_length
compensation_depth = (measure_depth - start_depth)
target_pose = pose_trans(start_pose,p[0,0,-compensation_depth,0,0,0])
if timeout > timeout_limit:
break
end
timeout=timeout+1
servoj(get_inverse_kin(target_pose),0,0,0.008,0.01,2000)
if point_dist(target_pose, get_forward_kin()) > 0.005:
popup("Lower grasping force or max width",title="RG-lag threshold exceeded", warning=False, error=False, blocking=False)
end
end
nspeed = norm(get_actual_tcp_speed())
while nspeed > 0.001:
servoj(get_inverse_kin(target_pose),0,0,0.008,0.01,2000)
nspeed = norm(get_actual_tcp_speed())
end
stopj(2)
end
if depth_compensation==False:
timeout = 0
timeout_count=20*0.008/0.008
while get_digital_in(9) == True:
timeout = timeout+1
sync()
if timeout > timeout_count:
break
end
end
timeout = 0
timeout_limit = 750000
while get_digital_in(9) == False:
timeout = timeout+1
sync()
if timeout > timeout_limit:
break
end
end
end
sleep(0.024)
if set_payload:
if slave:
if get_analog_in(3) < 2:
zslam=0
else:
zslam=payload
end
else:
if get_digital_in(8) == False:
zmasm=0
else:
zmasm=payload
end
end
zload=zmasm+zslam+zsysm
set_payload(zload,[(zsysx*zsysm+zmasx*zmasm+zslax*zslam)/zload,(zsysy*zsysm+zmasy*zmasm+zslay*zslam)/zload,(zsysz*zsysm+zmasz*zmasm+zslaz*zslam)/zload])
end
master_grip_detected=False
master_lost_grip=False
slave_grip_detected=False
slave_lost_grip=False
if True == get_digital_in(8):
master_grip_detected=True
end
if get_analog_in(3)>2:
slave_grip_detected=True
end
grip_detected=False
lost_grip=False
if True == get_digital_in(8):
grip_detected=True
end
zscale = (get_analog_in(2)-0.026)/2.9760034
zangle = zscale*1.57079633+-0.08726646
zwidth = 5.0+110*sin(zangle)
global measure_width = (floor(zwidth*10))/10-9.2
if slave:
slave_measure_width=measure_width
else:
master_measure_width=measure_width
end
return grip_detected
end
set_tool_voltage(24)
set_tcp(p[0,0,0.18659,0,-0,0])
"""
grip_width_open = 40
open_grip_command = f"RG2(target_width={grip_width_open}, target_force=1, payload=1, set_payload=False, depth_compensation=False) \n"
grip_width_closed = 0
close_grip_command = f"RG2(target_width={grip_width_closed}, target_force=1, payload=1, set_payload=False, depth_compensation=False) \n"
robot_program = boilerplate + open_grip_command + close_grip_command
prog_start = "def Program():"
prog_end = "end \n Program()"
robot_program = prog_start + robot_program + prog_end
rob.send_program(robot_program)
if someone tries this please report if it works.