def __init__(self, drones=1, wind=[0, 0, 0], obstacles=0, bounds=[(- 32000), 32000, (- 32000), 32000, 0, 150], size=1.5, max_height=122, max_speed=22.34, acc=7, M=25.0, G=9.81):
    self.drones = drones
    self.wind = wind
    self.size = size
    self.G = G
    self.max_height = max_height
    self.max_speed = max_speed
    self.acc_vert = acc
    self.acc_vert_eff = (acc + G)
    self.acc_hor = acc
    self.obstacles = 0
    self.obstacles_size = 40
    self.time_elapsed = 0
    self.bounds = bounds
    np.random.seed(0)
    init_state = np.random.random((drones, 10))
    init_state[:, :2] -= 0.5
    init_state[:, :2] *= (bounds[1] * 2)
    init_state[:, 2:] = 0.0
    for i in range(len(init_state)):
        vecs = [64000.0, 64000.0]
        while ((vecs[0] > bounds[1]) or (vecs[0] < bounds[0]) or (vecs[1] > bounds[3]) or (vecs[1] < bounds[2])):
            vecs = np.random.standard_normal(2)
            mags = np.linalg.norm(vecs)
            vecs /= mags
            vecs *= 16000
            vecs += init_state[i, :2]
        init_state[i, 3:5] = vecs
    if (obstacles > 0):
        np.random.seed(1)
        obs_state = np.random.random((obstacles, 3))
        obs_state[:, :3] -= 0.5
        obs_state[:, :2] *= (bounds[1] * 2)
        obs_state[:, 2] *= (bounds[5] * 2)
    self.init_state = np.asarray(init_state, dtype=float)
    self.M = (M * np.ones(self.init_state.shape[0]))
    self.state = self.init_state.copy()
    self.state[:, 6] = self.wind[0]
    self.state[:, 7] = self.wind[1]
    self.state[:, 8] = self.wind[2]
def __init__(self, drones=1, wind=[0, 0, 0], obstacles=0, bounds=[(- 32000), 32000, (- 32000), 32000, 0, 150], size=1.5, max_height=122, max_speed=22.34, acc=7, M=25.0, G=9.81):
    self.drones = drones
    self.wind = wind
    self.size = size
    self.G = G
    self.max_height = max_height
    self.max_speed = max_speed
    self.acc_vert = acc
    self.acc_vert_eff = (acc + G)
    self.acc_hor = acc
    self.obstacles = 0
    self.obstacles_size = 40
    self.time_elapsed = 0
    self.bounds = bounds
    np.random.seed(0)
    init_state = np.random.random((drones, 10))
    init_state[:, :2] -= 0.5
    init_state[:, :2] *= (bounds[1] * 2)
    init_state[:, 2:] = 0.0
    for i in range(len(init_state)):
        vecs = [64000.0, 64000.0]
        while ((vecs[0] > bounds[1]) or (vecs[0] < bounds[0]) or (vecs[1] > bounds[3]) or (vecs[1] < bounds[2])):
            vecs = np.random.standard_normal(2)
            mags = np.linalg.norm(vecs)
            vecs /= mags
            vecs *= 16000
            vecs += init_state[i, :2]
        init_state[i, 3:5] = vecs
    if (obstacles > 0):
        np.random.seed(1)
        obs_state = np.random.random((obstacles, 3))
        obs_state[:, :3] -= 0.5
        obs_state[:, :2] *= (bounds[1] * 2)
        obs_state[:, 2] *= (bounds[5] * 2)
    self.init_state = np.asarray(init_state, dtype=float)
    self.M = (M * np.ones(self.init_state.shape[0]))
    self.state = self.init_state.copy()
    self.state[:, 6] = self.wind[0]
    self.state[:, 7] = self.wind[1]
    self.state[:, 8] = self.wind[2]