Source code for hop.hexabundle_allocation.problem_operations.robot_parameters
import numpy as np
import string
import sys
import re
from ..general_operations.trigonometry import convert_radians_to_degrees
# assigning magnet labels based on type
[docs]def assign_magnet_labels(magnet, index1):
# adding labels for rectangular magnet
if magnet.__class__.__name__ == 'rectangular_magnet':
magnet.magnet_label = 'R%02d' % (index1)
index1 += 1
# adding labels for circular magnet
elif magnet.__class__.__name__ == 'circular_magnet':
if magnet.rads < 92.71721:
magnet.magnet_label = 'Blu'
elif 0.396 <= magnet.rads < 147.91658:
magnet.magnet_label = 'Gre'
elif 0.627 <= magnet.rads < 196.05124:
magnet.magnet_label = 'Yel'
elif magnet.rads >= 196.05124:
magnet.magnet_label = 'Mag'
return magnet, index1
# flagging unresolvable conflicts by recording them in file and assigning '0' placement order to them
[docs]def check_for_unresolvable_conflict(magnet, conflictFile, max_order, clusterNum, tileName):
# placement index checking and assigning placement order accordingly
if magnet.placement_index == None:
order = 0
with open(conflictFile, 'a') as fp:
conflict = magnet.__class__.__name__ + ' ' + str(int(magnet.index)) + ' is an unresolvable conflict,' + \
' detected in Cluster ' + str(clusterNum) + ', tile ' + str(tileName) + '\n'
fp.write(conflict)
else:
order = 1
for increment in range(max_order + 1):
if magnet.placement_index == max_order - increment:
order += increment
return order
# when having more than 1 placement orders, the magnets with 1st placement order are to be assigned any pickup direction
[docs]def add_pickupDirection(magnet, available_pickup):
# magnets with placement order of 1 are placed at first so can be placed from any pickup direction
if available_pickup == []:
if magnet.__class__.__name__ == 'circular_magnet':
available_pickup = ['TR', 'TL', 'RI', 'RO']
elif magnet.__class__.__name__ == 'rectangular_magnet':
available_pickup = ['I', 'O']
return magnet, available_pickup
# prioritization of pickup directions when more than one option is available for a magnet
[docs]def assign_preferable_pickupDirection(available_pickup):
if 'TR' in available_pickup:
available_pickup = []
available_pickup = 'TR'
elif 'TL' in available_pickup:
available_pickup = []
available_pickup = 'TL'
elif 'RO' in available_pickup:
available_pickup = []
available_pickup = 'RO'
elif 'RI' in available_pickup:
available_pickup = []
available_pickup = 'RI'
elif 'I' in available_pickup:
available_pickup = []
available_pickup = 'I'
elif 'O' in available_pickup: ### REMEMBER TO CHANGE Inwards to Toward and Outwards to Away ###
available_pickup = []
available_pickup = 'O'
return available_pickup
# angles required by the robotic arm to pick up and then put down the magnet in correct position
[docs]def calculate_pickup_putdown_angles(magnet, available_pickup):
#import ipdb; ipdb.set_trace()
azAngs = convert_radians_to_degrees(magnet.azAngs)
# rotation for pickup and putdown of circular magnets
if magnet.__class__.__name__ == 'circular_magnet':
if 'TR' in available_pickup:
magnet.rotation_pickup = 90
if azAngs < 90:
magnet.rotation_putdown = 90 - azAngs
elif azAngs >= 90:
magnet.rotation_putdown = 360 + (90 - azAngs)
elif 'TL' in available_pickup:
magnet.rotation_pickup = 270
if azAngs < 90:
magnet.rotation_putdown = 270 - azAngs
elif azAngs >= 90:
magnet.rotation_putdown = 270 - azAngs
elif 'RO' in available_pickup:
magnet.rotation_pickup = 180
if azAngs < 90:
magnet.rotation_putdown = 180 - azAngs
elif azAngs >= 90:
magnet.rotation_putdown = 180 - azAngs
elif 'RI' in available_pickup:
magnet.rotation_pickup = 0
if azAngs < 90:
magnet.rotation_putdown = 360 - azAngs
elif azAngs >= 90:
magnet.rotation_putdown = 360 - azAngs
# rotation for pickup and putdown of rectangular magnets
elif magnet.__class__.__name__ == 'rectangular_magnet':
magnet.rotation_pickup = 180
ang_azAngs = convert_radians_to_degrees(magnet.rectangular_magnet_input_orientation) + 270
#import ipdb; ipdb.set_trace()
if ang_azAngs < 180 and azAngs < 90:
magnet.rotation_putdown = (90 - azAngs) + (180 - ang_azAngs)
if 'I' in available_pickup:
magnet.rotation_putdown = magnet.rotation_putdown + 180
elif ang_azAngs < 180 and azAngs >= 90:
magnet.rotation_putdown = (450 - azAngs) - (180 + ang_azAngs)
if 'I' in available_pickup:
magnet.rotation_putdown = magnet.rotation_putdown + 180
elif ang_azAngs > 180 and azAngs < 90:
magnet.rotation_putdown = (90 - azAngs) - (ang_azAngs - 180)
if 'I' in available_pickup:
magnet.rotation_putdown = magnet.rotation_putdown - 180
elif ang_azAngs > 180 and azAngs >= 90:
magnet.rotation_putdown = (450 - azAngs) + (180 - ang_azAngs)
if 'I' in available_pickup:
magnet.rotation_putdown = magnet.rotation_putdown - 180
#print(magnet.rotation_putdown)
return magnet
# checking angle to make sure it is within the range of 0 to 360
[docs]def check_for_negative_twopi_angle(angle):
# if angle < 0:
# angle = 360 + angle
# elif angle > 360:
# angle = angle - 360
return angle % 360