from
robolink
import
*
from
robodk
import
*
BALL_DIAMETER
=
100
APPROACH
=
100
nTCPs
=
6
def
box_calc(BALLS_SIDE
=
4
, BALLS_MAX
=
None
):
if
BALLS_MAX
is
None
: BALLS_MAX
=
BALLS_SIDE
*
*
3
xyz_list
=
[]
for
h
in
range
(BALLS_SIDE):
for
i
in
range
(BALLS_SIDE):
for
j
in
range
(BALLS_SIDE):
xyz_list
=
xyz_list
+
[[(i
+
0.5
)
*
BALL_DIAMETER, (j
+
0.5
)
*
BALL_DIAMETER, (h
+
0.5
)
*
BALL_DIAMETER]]
if
len
(xyz_list) >
=
BALLS_MAX:
return
xyz_list
return
xyz_list
def
pyramid_calc(BALLS_SIDE
=
4
):
BALL_DIAMETER
=
100
xyz_list
=
[]
sqrt2
=
2
*
*
(
0.5
)
for
h
in
range
(BALLS_SIDE):
for
i
in
range
(BALLS_SIDE
-
h):
for
j
in
range
(BALLS_SIDE
-
h):
height
=
h
*
BALL_DIAMETER
/
sqrt2
+
BALL_DIAMETER
/
2
xyz_list
=
xyz_list
+
[[i
*
BALL_DIAMETER
+
(h
+
1
)
*
BALL_DIAMETER
*
0.5
, j
*
BALL_DIAMETER
+
(h
+
1
)
*
BALL_DIAMETER
*
0.5
, height]]
return
xyz_list
def
balls_setup(frame, positions):
nballs
=
len
(positions)
step
=
1.0
/
(nballs
-
1
)
for
i
in
range
(nballs):
newball
=
frame.Paste()
newball.setName(
'ball '
+
str
(i))
newball.setPose(transl(positions[i]))
newball.setVisible(
True
,
False
)
newball.Recolor([
1
-
step
*
i, step
*
i,
0.2
,
1
])
def
cleanup_balls(parentnodes):
todelete
=
[]
for
item
in
parentnodes:
todelete
=
todelete
+
item.Childs()
for
item
in
todelete:
if
item.Name().startswith(
'ball'
):
item.Delete()
def
TCP_On(toolitem, tcp_id):
toolitem.AttachClosest()
toolitem.RDK().RunMessage(
'Set air valve %i on'
%
(tcp_id
+
1
))
toolitem.RDK().RunProgram(
'TCP_On(%i)'
%
(tcp_id
+
1
));
def
TCP_Off(toolitem, tcp_id, itemleave
=
0
):
toolitem.DetachAll(itemleave)
toolitem.RDK().RunMessage(
'Set air valve %i off'
%
(tcp_id
+
1
))
toolitem.RDK().RunProgram(
'TCP_Off(%i)'
%
(tcp_id
+
1
));
RDK
=
Robolink(robodk_path
=
"C:/robodk/bin/RoboDK.exe"
, robodk_ip
=
'127.0.0.1'
)
RDK.Render(
False
)
robot
=
RDK.Item(
'Fanuc M-710iC/50'
)
robot_tools
=
robot.Childs()
frame1
=
RDK.Item(
'Table 1'
)
frame2
=
RDK.Item(
'Table 2'
)
ballref
=
RDK.Item(
'reference ball'
)
ballref.Copy()
prog_reset
=
RDK.Item(
'Replace objects'
)
prog_reset.RunProgram()
cleanup_balls([frame1, frame2])
frame1_list
=
pyramid_calc(
4
)
frame2_list
=
pyramid_calc(
4
)
balls_setup(frame1, frame1_list)
for
tool
in
robot_tools:
if
tool.Name().startswith(
'TCP'
):
tool.Delete()
TCP_list
=
[]
for
i
in
range
(nTCPs):
TCPi_pose
=
transl(
0
,
0
,
100
)
*
rotz((
360
/
nTCPs)
*
i
*
pi
/
180
)
*
transl(
125
,
0
,
0
)
*
roty(pi
/
2
)
TCPi
=
robot.AddTool(TCPi_pose,
'TCP %i'
%
(i
+
1
))
TCP_list.append(TCPi)
TCP_0
=
TCP_list[
0
]
RDK.Render(
True
)
robot.setPoseTool(TCP_list[
0
])
nballs_frame1
=
len
(frame1_list)
nballs_frame2
=
len
(frame2_list)
idTake
=
nballs_frame1
-
1
idLeave
=
0
idTCP
=
0
target_app_frame
=
transl(
2
*
BALL_DIAMETER,
2
*
BALL_DIAMETER,
4
*
BALL_DIAMETER)
*
roty(pi)
*
transl(
0
,
0
,
-
APPROACH)
while
idTake >
=
0
:
ntake
=
min
(nTCPs, idTake
+
1
)
robot.setPoseFrame(frame1)
robot.setPoseTool(TCP_0)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])
robot.MoveJ(target_app_frame)
for
i
in
range
(ntake):
TCPi
=
TCP_list[i]
robot.setPoseTool(TCPi)
target
=
transl(frame1_list[idTake])
*
roty(pi)
*
rotx(
30
*
pi
/
180
)
target_app
=
target
*
transl(
0
,
0
,
-
APPROACH)
idTake
=
idTake
-
1
robot.MoveL(target_app)
robot.MoveL(target)
TCP_On(TCPi, i)
robot.MoveL(target_app)
robot.setPoseTool(TCP_0)
robot.MoveJ(target_app_frame)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])
robot.setPoseFrame(frame2)
robot.MoveJ(target_app_frame)
for
i
in
range
(ntake):
TCPi
=
TCP_list[i]
robot.setPoseTool(TCPi)
if
idLeave > nballs_frame2
-
1
:
raise
Exception(
"No room left to place objects in Table 2"
)
target
=
transl(frame2_list[idLeave])
*
roty(pi)
*
rotx(
30
*
pi
/
180
)
target_app
=
target
*
transl(
0
,
0
,
-
APPROACH)
idLeave
=
idLeave
+
1
robot.MoveL(target_app)
robot.MoveL(target)
TCP_Off(TCPi, i, frame2)
robot.MoveL(target_app)
robot.MoveJ(target_app_frame)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])
robot
=
RDK.Item(
'Fanuc M-710iC/50'
)
robot_tools
=
robot.Childs()
frame1
=
RDK.Item(
'Table 1'
)
frame2
=
RDK.Item(
'Table 2'
)
cleanup_balls([frame1 , frame2])
frame1_list
=
pyramid_calc(
4
)
frame2_list
=
pyramid_calc(
4
)
balls_setup(frame2, frame2_list)
for
tool
in
robot_tools:
if
tool.Name().startswith(
'TCP'
):
tool.Delete()
TCP_list
=
[]
for
i
in
range
(nTCPs):
TCPi_pose
=
transl(
0
,
0
,
100
)
*
rotz((
360
/
nTCPs)
*
i
*
pi
/
180
)
*
transl(
125
,
0
,
0
)
*
roty(pi
/
2
)
TCPi
=
robot.AddTool(TCPi_pose,
'TCP %i'
%
(i
+
1
))
TCP_list.append(TCPi)
TCP_0
=
TCP_list[
0
]
robot.setPoseTool(TCP_list[
0
])
nballs_frame2
=
len
(frame2_list)
nballs_frame1
=
len
(frame1_list)
idTake
=
nballs_frame2
-
1
idLeave
=
0
idTCP
=
0
target_app_frame
=
transl(
2
*
BALL_DIAMETER,
2
*
BALL_DIAMETER,
4
*
BALL_DIAMETER)
*
roty(pi)
*
transl(
0
,
0
,
-
APPROACH)
while
idTake >
=
0
:
ntake
=
min
(nTCPs, idTake
+
1
)
robot.setPoseFrame(frame2)
robot.setPoseTool(TCP_0)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])
robot.MoveJ(target_app_frame)
for
i
in
range
(ntake):
TCPi
=
TCP_list[i]
robot.setPoseTool(TCPi)
target
=
transl(frame2_list[idTake])
*
roty(pi)
*
rotx(
30
*
pi
/
180
)
target_app
=
target
*
transl(
0
,
0
,
-
APPROACH)
idTake
=
idTake
-
1
robot.MoveL(target_app)
robot.MoveL(target)
TCP_On(TCPi, i)
robot.MoveL(target_app)
robot.setPoseTool(TCP_0)
robot.MoveJ(target_app_frame)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])
robot.setPoseFrame(frame1)
robot.MoveJ(target_app_frame)
for
i
in
range
(ntake):
TCPi
=
TCP_list[i]
robot.setPoseTool(TCPi)
if
idLeave > nballs_frame2
-
1
:
raise
Exception(
"No room left to place objects in Table 2"
)
target
=
transl(frame1_list[idLeave])
*
roty(pi)
*
rotx(
30
*
pi
/
180
)
target_app
=
target
*
transl(
0
,
0
,
-
APPROACH)
idLeave
=
idLeave
+
1
robot.MoveL(target_app)
robot.MoveL(target)
TCP_Off(TCPi, i, frame2)
robot.MoveL(target_app)
robot.MoveJ(target_app_frame)
robot.MoveJ([
0
,
0
,
0
,
0
,
10
,
-
200
])