Example #1
0
def _penalty_shoot(my_pose,
                   ball_info,
                   control_target,
                   kick_enable,
                   target_pose,
                   kick_power=1.0):
    # PK用のシュートアクション
    # kick_enable is Falseで、ボールの近くまで移動する
    # kick_enable is True で、シュートする

    KICK_POWER = kick_power
    SHOOT_TARGET = target_pose
    DRIBBLE_POWER = 0.5

    angle_ball_to_target = tool.get_angle(ball_info.pose, SHOOT_TARGET)
    trans = tool.Trans(ball_info.pose, angle_ball_to_target)
    tr_my_pose = trans.transform(my_pose)

    random_num = Observer.random_zero_one()
    if random_num == 0:
        target_goal_side = Field.goal_pose('their', 'upper')
    else:
        target_goal_side = Field.goal_pose('their', 'lower')

    angle_to_target_side = tool.get_angle(my_pose, target_goal_side)

    # ロボットがボールの裏側に回ったらcan_kick is True
    can_kick = False
    if tr_my_pose.x > -0.2 and math.fabs(tr_my_pose.y) < 0.05:
        can_kick = True

    avoid_ball = True  # ボールを回避する
    new_goal_pose = Pose2D()
    if can_kick and kick_enable:
        # ボールをける
        avoid_ball = False

        # ボールの前方に移動する
        new_position = trans.inverted_transform(Pose2D(0, 0, 0))
        new_goal_pose = new_position
        new_goal_pose.theta = angle_to_target_side
        # ドリブルとキックをオン
        control_target.dribble_power = DRIBBLE_POWER
        control_target.kick_power = KICK_POWER
    else:
        Observer.update_random_zero_one()
        # ボールの裏に移動する
        new_position = trans.inverted_transform(Pose2D(-0.1, 0, 0))
        new_goal_pose = new_position
        new_goal_pose.theta = angle_ball_to_target
        # ドリブルとキックをオフ
        control_target.kick_power = 0.0
        control_target.dribble_power = 0.0

    # パスを追加
    control_target.path = []
    control_target.path.append(new_goal_pose)

    return control_target, avoid_ball