Two loops complete and tested: build 4 stories high and small pyramid

This commit is contained in:
Michael Soukup 2014-08-05 20:45:14 +02:00
parent fc7149240e
commit 5ee0353e01
3 changed files with 86 additions and 107 deletions

View File

@ -178,139 +178,117 @@ def test_movec(controller):
def four_stories(controller):
print "Initial block placement."
print "On each side"
print "\t(r0, edge, z0)"
print "\t(r1, edge, z0)"
def check_theta_edges(controller):
controller.movec_hax(config.R_LVL0 - config.BLOCK_DIM, config.THETA_EDGE_RIGHT, config.Z_MIN)
controller.movel(config.R_LVL0 - config.BLOCK_DIM, config.THETA_EDGE_RIGHT, config.Z_MIN)
print 'Theta edge right.'
dummy = raw_input('Press any key to continue...')
controller.movec_hax(config.R_LVL0 - config.BLOCK_DIM, config.THETA_EDGE_LEFT, config.Z_MIN)
controller.movel(config.R_LVL0 - config.BLOCK_DIM, config.THETA_EDGE_LEFT, config.Z_MIN)
print 'Theta edge left.'
dummy = raw_input('Press any key to continue...')
def test_pick_place(controller):
dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 + math.pi/64 #medium gap
# #dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 #small gap
#dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 - math.pi/200#no gap
# Initial: 1x2 left side
#speed = 0.7
speed = 0.2
# buffer some params
edge_left = config.THETA_EDGE_LEFT
edge_right = config.THETA_EDGE_RIGHT
r_startpick = 1.3
r_endpick = 0.1
z_endpick = 0.5
vel = 0.2
acc = 1.1*vel
moves = []
moves += controller.pick_block(1, config.THETA_EDGE_LEFT, 0, speed)
moves += controller.place_block(0, dtheta_lvl0/2, 0, speed)
moves += controller.pick_block(0, config.THETA_EDGE_LEFT, 0, speed)
moves += controller.place_block(0, -dtheta_lvl0/2, 0, speed)
controller.movels(moves, wait=False)
moves.append(controller.blocklevel2move(0.5, 0, 0, acc, vel, 0))
moves += controller.pick_block(1, edge_left, 0, acc, vel)
moves += controller.place_block(0, 0, 0, acc, vel)
moves += controller.pick_block(1, edge_right, 0, acc, vel)
moves.append(controller.blocklevel2move(1.1, edge_right/2, 2, acc, vel, 0.15))
moves += controller.place_block(0, 0, 1, acc, vel)
moves += controller.pick_block(0, edge_left, 0, acc, vel)
moves.append(controller.blocklevel2move(0.1, edge_left/2, 3, acc, vel, 0.15))
moves += controller.place_block(0, 0, 2, acc, vel)
moves += controller.pick_block(0, edge_right, 0, acc, vel)
moves.append(controller.blocklevel2move(0.1, edge_right/2, 4, acc, vel, 0.15))
moves += controller.place_block(0, 0, 3, acc, vel)
moves.append(controller.blocklevel2move(1.5, 0, 0.1, acc, vel, 0))
dummy = raw_input("Press enter to start...")
print 'Exectuting loop'
controller.exec_moves(moves, wait=False)
looping = True
while looping:
looping = controller.is_looping(1.0) # blocks for 1 sec
moves.reverse()
controller.movels(moves, wait=True)
# Shit is smooth!
controller.exec_moves(moves, wait=False)
looping = True
while looping:
looping = controller.is_looping(1.0) # blocks for 1 sec
def small_pyramid(controller):
# Initial block placement.
# On each side
# (r0, edge, z0)
# (r1, edge, z0)
# (r0, edge, z1)
print "Initial block placement."
print "On each side"
print "\t(r0, edge, z0)"
print "\t(r1, edge, z0)"
print "\t(r0, edge, z1)"
dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 + math.pi/64 #medium gap
speed = 0.2
acc = config.ACCELERATION
# buffer some params
edge_left = config.THETA_EDGE_LEFT
edge_right = config.THETA_EDGE_RIGHT
r_startpick = 1.3
r_endpick = 0.1
z_endpick = 0.5
vel = 0.2
acc = 1.1*vel
dtheta_lvl0 = config.BLOCK_DIM/config.R_LVL0 + math.pi/64 #medium gap
moves = []
# Pick left (r0, edge, z1), place in middle
moves += controller.pick_block(0, config.THETA_EDGE_LEFT, 1, speed)
tmp_pose = controller.blocklvl2pose(0.2, -dtheta_lvl0, 1.1)
moves.append(tmp_pose + [acc, speed, 0.05])
moves += controller.place_block(0, 0, 0, speed)
moves.append(controller.blocklevel2move(0.5, 0, 0, acc, vel, 0)) #initial
moves += controller.pick_block(0, edge_left, 1, acc, vel)
moves.append(controller.blocklevel2move(0.1, edge_left/2, 2, acc, vel, 0.15))
moves += controller.place_block(0, 0, 0, acc, vel)
# Pick left (r1, edge, z0), place left
moves += controller.pick_block(1, config.THETA_EDGE_LEFT, 0, speed)
tmp_pose = controller.blocklvl2pose(1.1, config.THETA_EDGE_LEFT+dtheta_lvl0, 0.5)
moves.append(tmp_pose + [acc, speed, 0.05])
moves += controller.place_block(0, -dtheta_lvl0, 0, speed)
moves += controller.pick_block(0, edge_right, 1, acc, vel)
moves.append(controller.blocklevel2move(0.1, (edge_right+dtheta_lvl0)/2, 2, acc, vel, 0.15))
moves += controller.place_block(0, dtheta_lvl0, 0, acc, vel)
# Pick right (r0, edge, z1), place right
tmp_pose = controller.blocklvl2pose(1.3, config.THETA_EDGE_RIGHT-dtheta_lvl0, 1.2)
moves.append(tmp_pose + [acc, speed, 0.05])
#moves += controller.blocklvl2arc(1.3, config.THETA_EDGE_RIGHT - math.pi/16, 1, vel=speed, blend_last=0.03)
moves += controller.pick_block(0, config.THETA_EDGE_RIGHT, 1, speed)
tmp_pose = controller.blocklvl2pose(0, config.THETA_EDGE_RIGHT-dtheta_lvl0, 1.2)
moves.append(tmp_pose + [acc, speed, 0.03])
moves += controller.place_block(0, dtheta_lvl0, 0, speed)
moves.append(controller.blocklevel2move(1.1, (edge_left+dtheta_lvl0)/2, 0.5, acc, vel, 0.15))
moves += controller.pick_block(1, edge_left, 0, acc, vel)
moves += controller.place_block(0, -dtheta_lvl0, 0, acc, vel)
# Pick right (r1, edge, z0), place lvl1 right
moves += controller.pick_block(1, config.THETA_EDGE_RIGHT, 0, speed)
tmp_pose = controller.blocklvl2pose(1.1, config.THETA_EDGE_RIGHT-dtheta_lvl0, 1.1)
moves.append(tmp_pose + [acc, speed, 0.03])
moves += controller.place_block(0, 0.5*dtheta_lvl0, 1, speed)
moves.append(controller.blocklevel2move(1.1, (edge_right-dtheta_lvl0)/2, 0.5, acc, vel, 0.15))
moves += controller.pick_block(1, edge_right, 0, acc, vel)
moves.append(controller.blocklevel2move(1.1, edge_right/2, 2, acc, vel, 0.15))
moves += controller.place_block(0, 0.5*dtheta_lvl0, 1, acc, vel)
# Pick left (r0, edge, z0), place lvl1 left
moves += controller.blocklvl2arc(1.3, config.THETA_EDGE_LEFT + math.pi/16, 0.1, vel=speed, blend_last=0.03)
moves += controller.pick_block(0, config.THETA_EDGE_LEFT, 0, speed)
tmp_pose = controller.blocklvl2pose(0, config.THETA_EDGE_LEFT+dtheta_lvl0, 1.1)
moves.append(tmp_pose + [acc, speed, 0.03])
moves += controller.place_block(0, -0.5*dtheta_lvl0, 1, speed)
moves += controller.pick_block(0, edge_left, 0, acc, vel)
moves.append(controller.blocklevel2move(0.1, edge_left/2, 2, acc, vel, 0.15))
moves += controller.place_block(0, -0.5*dtheta_lvl0, 1, acc, vel)
# Pick right (r0, edge, z0), place on top
moves += controller.blocklvl2arc(1.3, config.THETA_EDGE_RIGHT - math.pi/16, 0, vel=speed, blend_last=0.03)
moves += controller.pick_block(0, config.THETA_EDGE_RIGHT, 0, speed)
tmp_pose = controller.blocklvl2pose(0, config.THETA_EDGE_RIGHT-dtheta_lvl0, 2.1)
moves.append(tmp_pose + [acc, speed, 0.03])
moves += controller.place_block(0, 0, 2, speed)
moves.append(controller.blocklevel2move(1.1, (edge_right-dtheta_lvl0)/2, 0.5, acc, vel, 0.15))
moves += controller.pick_block(0, edge_right, 0, acc, vel)
moves.append(controller.blocklevel2move(0.1, edge_right/2, 3, acc, vel, 0.15))
moves += controller.place_block(0, 0, 2, acc, vel)
# Execute moves
controller.movels(moves, wait=False)
moves.append(controller.blocklevel2move(1.5, 0, 0.1, acc, vel, 0))
dummy = raw_input("Press enter to start...")
print 'Exectuting loop'
controller.exec_moves(moves, wait=False)
looping = True
while looping:
looping = controller.is_looping(1.0) # blocks for 1 sec
moves.reverse()
controller.movels(moves, wait=True)
controller.exec_moves(moves, wait=False)
looping = True
while looping:
looping = controller.is_looping(1.0) # blocks for 1 sec
def big_pyramid(controller):
dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 + math.pi/64 #medium gap
#dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 #small gap
#dtheta_lvl0 = config.BLOCK_DIM / config.R_LVL0 - math.pi/200#no gap
# Initial block placement.
# On each side
# (r0, edge, z0)
# (r1, edge, z0)
# (r0, edge, z1)
# (r1, edge, z1)
# (r0, edge, z2)
# (r1, edge, z2)
speed = 0.2
moves = []
#move += controller.blocklvl2arc(0, config.THETA_EDGE_LEFT + math.pi/16, 1, vel=speed, blend_last=0.03)
moves += controller.pick_block(0, config.THETA_EDGE_LEFT, 1, speed) # Pick left (r0, edge, z1)
moves += controller.place_block(0, -0.5*dtheta_lvl0, 0)
moves += controller.pick_block(1, config.THETA_EDGE_LEFT, 0, speed) # Pick left (r1, edge, z0)
moves += controller.place_block(0, -1.5*dtheta_lvl0, 0)
moves += controller.blocklvl2arc(0.1, config.THETA_EDGE_RIGHT - math.pi/16, 1, vel=speed, blend_last=0.03)
moves += controller.pick_block(0, config.THETA_EDGE_RIGHT, 1, speed) # Pick right (r0, edge, z1)
moves += controller.place_block(0, 0.5*dtheta_lvl0, 0)
moves += controller.pick_block(1, config.THETA_EDGE_RIGHT, 0, speed) # Pick right (r1, edge, z0)
moves += controller.place_block(0, 1.5*dtheta_lvl0, 0)
def unit_tests(func_list, controller):
running = True
@ -345,7 +323,9 @@ if __name__ == '__main__':
("Test unitary moves.", test_unitary_moves),
("Test multi-directional moves", test_multi_moves),
("Check loop constraints", check_loop_constraints),
("Test URScript's movec", test_movec)
("Test URScript's movec", test_movec),
("Build four stories high", four_stories),
("Build small pyramid", small_pyramid)
]
unit_tests(tests, controller)

View File

@ -272,11 +272,10 @@ class DemoController(object):
return sum(map(abs, v)) > threshold
def blocklevel2move(self, r_lvl, theta, z_lvl, acc=0.5, vel=0.1, r=0):
# loop acc/vel
def blocklevel2move(self, r_lvl, theta, z_lvl, acc, vel, blend):
r = self.r_lvl0 - r_lvl*self.block_dim
z = self.z_lvl0 + z_lvl*self.block_dim
move = self.cylinder2cartesian(r, theta, z) + [acc, vel, r]
move = self.cylinder2cartesian(r, theta, z) + [acc, vel, blend]
return move

Binary file not shown.