Wind#
Overview#
PyFlyt supports various wind field models, as well as provides the capability for users to define their own wind field models.
Preimplemented Wind Models#
Several popular wind models are provided:
Lorem Ipsum
They can be initialized in the aviary
like so:
env = Aviary(..., wind_type="Lorem Ipsum")
Simple Custom Wind Modelling#
For simple, stateless wind models (models that do not have state variables), it is possible to simply define the wind model as a Python method.
Then, the wind model can be hooked to the aviary
using the register_wind_field_function
method.
The following is an example:
"""Implements a simple time invariant, stateless wind model."""
import numpy as np
from PyFlyt.core import Aviary
# define the wind field
def simple_wind(time: float, position: np.ndarray):
"""Defines a simple wind updraft model.
Args:
time (float): time
position (np.ndarray): position as an (n, 3) array
"""
# the xy velocities are 0...
wind = np.zeros_like(position)
# and the vertical velocity is dependent on the logarithmic of height
wind[:, -1] = np.log(position[:, -1])
return wind
# the starting position and orientations
start_pos = np.array([[0.0, 0.0, 1.0]])
start_orn = np.array([[0.0, 0.0, 0.0]])
# environment setup, attach the windfield
env = Aviary(start_pos=start_pos, start_orn=start_orn, render=True, drone_type="quadx")
env.register_wind_field_function(simple_wind)
# set the flight mode
env.set_mode(7)
# simulate for 1000 steps (1000/120 ~= 8 seconds)
for i in range(1000):
env.step()
env.disconnect()
More Complex Custom Wind Modelling#
To define custom wind models, refer the the example provided by the WindFieldClass
below:
- class PyFlyt.core.abstractions.WindFieldClass(np_random: None | Generator = None)#
Basic WindField class to implement custom wind field models.
- Example Usage:
>>> from PyFlyt.core import Aviary >>> from PyFlyt.core.abstractions import WindFieldClass >>> >>> # define the wind field >>> class MyWindField(WindFieldClass): >>> def __init__(self, my_parameter=1.0, np_random: None | np.random.Generator = None): >>> super().__init__(np_random) >>> self.strength = my_parameter >>> >>> def __call__(self, time: float, position: np.ndarray): >>> # simulate a thermal windfield, where the xy velocities are 0, >>> wind = np.zeros_like(position) >>> >>> # but the z velocity varies to the log of height, >>> wind[:, -1] = np.log(position[:, -1]) * self.strength >>> >>> # plus some noise, >>> wind += self.np_random.randn(*wind.shape) >>> >>> return wind >>> >>> # environment setup, attach the windfield, override the parameter `my_parameter` from the default >>> env = Aviary(..., wind_type=MyWindField, wind_options=dict(my_parameter=1.2)) >>> >>> # step as usual >>> ...
Default Attributes#
- property PyFlyt.core.abstractions.WindFieldClass.np_random#
dtype - np.random.RandomState
Required Methods#
- PyFlyt.core.abstractions.WindFieldClass.__init__(self, np_random: None | Generator = None)#
Initializes the wind_field.
- PyFlyt.core.abstractions.DroneClass.__call__(*args, **kwargs)#
Call self as a function.