def optimal_value_strategy(s, action_list): actions_consequences = [] rotations = [] for action in action_list: if action.name is "none": rotation = 0 else: # optimize action rotation, _ = heinrich_test(s, action, False, iterations=20) rotations += [rotation] # apply optimized rotation s.pose.rotate(rotation) actions_consequences.append( Sim.simulateAction(action, s, num_particles=30)) # restore previous rotation s.pose.rotate(-rotation) # Decide best action selected_action_idx = Sim.decide_minimal(actions_consequences, s) return selected_action_idx, rotations[selected_action_idx]
def direct_kick_strategy_cool(s, action_list, take_best=False): actions_consequences = [] rotations = [] fastest_action_dir = None fastest_action_idx = 0 for idx, action in enumerate(action_list): if action.name is "none": rotation = 0 else: # optimize action a0 = minimal_rotation(s, action, 1) a1 = minimal_rotation(s, action, -1) if np.abs(a0) < np.abs(a1): rotation = a0 else: rotation = a1 if np.abs(rotation) > 3: print( "WARNING: in direct_kick_strategy_cool no kick found after rotation {0}." .format(rotation)) rotations += [rotation] # apply optimized rotation s.pose.rotate(rotation) actions_consequences.append( Sim.simulateAction(action, s, num_particles=30)) # restore previous rotation s.pose.rotate(-rotation) if action.name is not "none": if fastest_action_dir is None or np.abs(rotation) < np.abs( fastest_action_dir): fastest_action_dir = rotation fastest_action_idx = idx # Decide best action if take_best: selected_action_idx = Sim.decide_minimal(actions_consequences, s) return selected_action_idx, rotations[selected_action_idx] else: # print fastest_action_idx, selected_action_idx return fastest_action_idx, fastest_action_dir
def direct_kick_strategy(s, action_list): turn_speed = math.radians(5.0) action_dir = 0 turn_direction = 0 while True: # turn towards the direction of the action s.pose.rotate(action_dir) # Simulate Consequences actions_consequences = [ Sim.simulateAction(action, s, num_particles=30) for action in action_list ] # Decide best action selected_action_idx = Sim.decide_minimal(actions_consequences, s) # restore the previous orientation s.pose.rotate(-action_dir) if selected_action_idx != 0: break elif np.abs(action_dir) > math.pi: print( "WARNING: in direct_kick_strategy no kick found after rotation {0}." .format(action_dir)) break else: # decide on rotation direction once if turn_direction == 0: attack_direction = attack_dir.get_attack_direction(s) turn_direction = np.sign( attack_direction.angle()) # "> 0" => left, "< 0" => right # set motion request action_dir += turn_direction * turn_speed return selected_action_idx, action_dir
def minimal_rotation(s, action, turn_direction): turn_speed = math.radians(5.0) action_dir = 0 none = a.Action("none", 0, 0, 0, 0) none_actions_consequences = Sim.simulateAction(none, s, num_particles=30) while True: # turn towards the direction of the action s.pose.rotate(action_dir) # Simulate Consequences actions_consequences = Sim.simulateAction(action, s, num_particles=30) # Decide best action selected_action_idx = Sim.decide_minimal( [none_actions_consequences, actions_consequences], s) # restore the previous orientation s.pose.rotate(-action_dir) if selected_action_idx != 0: break elif np.abs(action_dir) > math.pi: # print("WARNING: in minimal_rotation no kick found after rotation {0}.".format(action_dir)) break else: # decide on rotation direction once if turn_direction == 0: attack_direction = attack_dir.get_attack_direction(s) turn_direction = np.sign( attack_direction.angle()) # "> 0" => left, "< 0" => right # set motion request action_dir += turn_direction * turn_speed return action_dir