Skip to content
LIBRARY
examples.WindTurbine.md

examples.WindTurbine

Horizontal-axis wind turbine nacelle with a spinning rotor and wind thrust.

frame_a is the yaw bearing at the tower top; the rotor axis is the local x-axis of frame_a. An internal Body carries the nacelle mass and inertia, and a second Body on a revolute rotor shaft carries the hub and blade inertia, so the spinning rotor exerts real gyroscopic moments on the supporting structure.

The wind blows horizontally with speed V_wind in the direction given by the input theta_w (angle in the horizontal plane, measured from the world x-axis toward the world z-axis). The rotor thrust acts along the rotor axis at the hub, with magnitude quadratic in the wind speed and scaled by the squared cosine of the misalignment angle between rotor axis and wind direction; no thrust is produced when the wind comes from behind the rotor plane. An aerodynamic torque proportional to the same alignment factor spins the rotor against a linear drag, giving a steady spin rate in constant wind.

The output sin_err is the sine of the heading error between the rotor axis and the wind direction about the vertical axis. It is zero when the rotor faces the wind, has the sign of the required yaw correction, and is free of angle wrapping, which makes it directly usable as the feedback signal of a yaw controller. Note that it also vanishes at 180 degrees misalignment, which is an unstable equilibrium of such a controller.

Visualizers for the tower, nacelle, hub, and three blades are included. The tower is drawn below frame_a down to the tower base.

This component extends from MultibodyComponents.Renderable

Usage

MultibodyComponents.examples.WindTurbine(render=true, color=[0.9, 0.9, 0.9, 1], specular_coefficient=1.5, m_nacelle=2000, I_nacelle=5e3, m_hub=500, I_hub_axial=200, I_hub_transverse=100, V_wind=12, rho_air=1.2, C_thrust=0.8, radius_rotor=5, tower_height=15, overhang=0.8, k_aero=2, d_rotor=150, blade_color=[0.85, 0.85, 0.9, 1], A_rotor=π * radius_rotor ^ 2)

Parameters:

NameDescriptionUnitsDefault value
rendertrue
color[0.9, 0.9, 0.9, 1]
specular_coefficient1.5
m_nacelleMass of the nacelle (including the tower share carried at the yaw bearing)kg2000
I_nacelleDiagonal moment of inertia of the nacellekg.m25e3
m_hubMass of the hub and bladeskg500
I_hub_axialMoment of inertia of hub and blades about the rotor axiskg.m2200
I_hub_transverseMoment of inertia of hub and blades transverse to the rotor axiskg.m2100
V_windWind speedm/s12
rho_airDensity of the air1.2
C_thrustThrust coefficient of the rotor0.8
radius_rotorRadius of the rotor discm5
tower_heightHeight of the tower from its base to the yaw bearing, used for renderingm15
overhangDistance from the yaw axis to the hub along the rotor axism0.8
k_aeroAerodynamic torque coefficient driving the rotor spin2
d_rotorLinear drag coefficient on the rotor spin150
blade_colorRGBA color of the blades[0.85, 0.85, 0.9, 1]

Connectors

  • frame_a - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • theta_w - This connector represents a real signal as an input to a component (RealInput)

  • sin_err - This connector represents a real signal as an output from a component (RealOutput)

Variables

NameDescriptionUnits
e_windUnit wind direction in the world frame
e_rotorRotor axis direction in the world frame
cos_alignCosine of the misalignment angle between rotor axis and wind
F_thrustRotor thrust magnitude

Behavior

Source

dyad
"""
Horizontal-axis wind turbine nacelle with a spinning rotor and wind thrust.

`frame_a` is the yaw bearing at the tower top; the rotor axis is the local
x-axis of `frame_a`. An internal `Body` carries the nacelle mass and inertia,
and a second `Body` on a revolute rotor shaft carries the hub and blade
inertia, so the spinning rotor exerts real gyroscopic moments on the
supporting structure.

The wind blows horizontally with speed `V_wind` in the direction given by the
input `theta_w` (angle in the horizontal plane, measured from the world x-axis
toward the world z-axis). The rotor thrust acts along the rotor axis at the
hub, with magnitude quadratic in the wind speed and scaled by the squared
cosine of the misalignment angle between rotor axis and wind direction; no
thrust is produced when the wind comes from behind the rotor plane. An
aerodynamic torque proportional to the same alignment factor spins the rotor
against a linear drag, giving a steady spin rate in constant wind.

The output `sin_err` is the sine of the heading error between the rotor axis
and the wind direction about the vertical axis. It is zero when the rotor
faces the wind, has the sign of the required yaw correction, and is free of
angle wrapping, which makes it directly usable as the feedback signal of a
yaw controller. Note that it also vanishes at 180 degrees misalignment, which
is an unstable equilibrium of such a controller.

Visualizers for the tower, nacelle, hub, and three blades are included. The
tower is drawn below `frame_a` down to the tower base.
"""
component WindTurbine
  extends MultibodyComponents.Renderable(color = [0.9, 0.9, 0.9, 1])
  frame_a = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 900, "y2": 1000}}}
  }
  "Wind direction angle in the horizontal plane, from the world x-axis toward the world z-axis"
  theta_w = RealInput() {
    "Dyad": {"placement": {"diagram": {"x1": 90, "x2": 190, "y1": 280, "y2": 380}}}
  }
  "Sine of the heading error between rotor axis and wind direction, about the vertical axis"
  sin_err = RealOutput() {
    "Dyad": {"placement": {"diagram": {"x1": 730, "x2": 830, "y1": 280, "y2": 380}}}
  }
  body = MultibodyComponents.Body(m = m_nacelle, I_11 = I_nacelle, I_22 = I_nacelle, I_33 = I_nacelle, render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 140, "x2": 240, "y1": 560, "y2": 660}}}
  }
  hub_offset = MultibodyComponents.FixedTranslation(r = [overhang, 0, 0], render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 265, "x2": 365, "y1": 460, "y2": 560}}}
  }
  thrust = MultibodyComponents.WorldForce(resolve_in_frame = ResolveInFrame.World(), scale = 3e-4, radius = 0.1) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 550, "y2": 650}}}
  }
  rotor_joint = MultibodyComponents.Revolute(n = [1, 0, 0], phi(initial = 0), w(initial = 0), render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 405, "x2": 505, "y1": 360, "y2": 460}}}
  }
  hub = MultibodyComponents.Body(m = m_hub, I_11 = I_hub_axial, I_22 = I_hub_transverse, I_33 = I_hub_transverse, render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 360, "y2": 460}}}
  }
  rotor_drive = RotationalComponents.Sources.TorqueSource() {
    "Dyad": {"placement": {"diagram": {"x1": 265, "x2": 365, "y1": 255, "y2": 355}}}
  }
  tower_vis = MultibodyComponents.CylinderVisualizer(color = color, render = render, length = tower_height, radius = 0.4, length_direction = [0, 1, 0], r_shape = [0, -tower_height, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 405, "x2": 505, "y1": 140, "y2": 240}}}
  }
  nacelle_vis = MultibodyComponents.BoxVisualizer(color = color, render = render, length = 3, width = 1.2, height = 1.2, length_direction = [1, 0, 0], r_shape = [-1.5, 0, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 240, "y2": 340}}}
  }
  hub_vis = MultibodyComponents.SphereVisualizer(color = color, radius = 0.6, render = render) {
    "Dyad": {"placement": {"diagram": {"x1": 650, "x2": 750, "y1": 550, "y2": 650}}}
  }
  blade1_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, 1, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 650, "x2": 750, "y1": 430, "y2": 530}}}
  }
  blade2_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, cos(2 * π / 3), sin(2 * π / 3)]) {
    "Dyad": {"placement": {"diagram": {"x1": 760, "x2": 860, "y1": 520, "y2": 620}}}
  }
  blade3_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, cos(4 * π / 3), sin(4 * π / 3)]) {
    "Dyad": {"placement": {"diagram": {"x1": 890, "x2": 990, "y1": 400, "y2": 500}}}
  }
  "Mass of the nacelle (including the tower share carried at the yaw bearing)"
  parameter m_nacelle::Mass = 2000
  "Diagonal moment of inertia of the nacelle"
  parameter I_nacelle::Inertia = 5e3
  "Mass of the hub and blades"
  parameter m_hub::Mass = 500
  "Moment of inertia of hub and blades about the rotor axis"
  parameter I_hub_axial::Inertia = 200
  "Moment of inertia of hub and blades transverse to the rotor axis"
  parameter I_hub_transverse::Inertia = 100
  "Wind speed"
  parameter V_wind::Velocity = 12
  "Density of the air"
  parameter rho_air::Real = 1.2
  "Thrust coefficient of the rotor"
  parameter C_thrust::Real = 0.8
  "Radius of the rotor disc"
  parameter radius_rotor::Length = 5
  "Height of the tower from its base to the yaw bearing, used for rendering"
  parameter tower_height::Length = 15
  "Distance from the yaw axis to the hub along the rotor axis"
  parameter overhang::Length = 0.8
  "Aerodynamic torque coefficient driving the rotor spin"
  parameter k_aero::Real = 2
  "Linear drag coefficient on the rotor spin"
  parameter d_rotor::Real = 150
  "RGBA color of the blades"
  parameter blade_color::Real[4] = [0.85, 0.85, 0.9, 1]
  "Unit wind direction in the world frame"
  variable e_wind::Real[3]
  "Rotor axis direction in the world frame"
  variable e_rotor::Real[3]
  "Cosine of the misalignment angle between rotor axis and wind"
  variable cos_align::Real
  "Rotor thrust magnitude"
  variable F_thrust::Real
  "Rotor disc area"
  final parameter A_rotor::Real = π * radius_rotor ^ 2
relations
  connect(frame_a, body.frame_a, hub_offset.frame_a, tower_vis.frame_a, nacelle_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [{"x": 100, "y": 950}, {"x": 100, "y": 610}], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [{"x": 130, "y": 510}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [{"x": 250, "y": 190}], "E": -3},
        {"S": -3, "M": [], "E": 4},
        {"S": -3, "M": [{"x": 390, "y": 290}], "E": 5}
      ],
      "junctions": [{"x": 130, "y": 610}, {"x": 250, "y": 510}, {"x": 390, "y": 190}]
    }
  }
  connect(hub_offset.frame_b, rotor_joint.frame_a, thrust.frame_b, hub_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [{"x": 390, "y": 510}], "E": -1},
        {"S": -1, "M": [{"x": 390, "y": 410}], "E": 2},
        {"S": -1, "M": [{"x": 640, "y": 495}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [], "E": 4}
      ],
      "junctions": [{"x": 390, "y": 495}, {"x": 640, "y": 600}]
    }
  }
  connect(rotor_joint.frame_b, hub.frame_a, blade1_vis.frame_a, blade2_vis.frame_a, blade3_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [{"x": 520, "y": 480}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [], "E": -3},
        {"S": -3, "M": [{"x": 790, "y": 480}, {"x": 790, "y": 570}], "E": 4},
        {"S": -3, "M": [{"x": 740, "y": 450}], "E": 5}
      ],
      "junctions": [{"x": 520, "y": 410}, {"x": 640, "y": 480}, {"x": 740, "y": 480}]
    }
  }
  connect(rotor_drive.spline, rotor_joint.axis) {
    "Dyad": {"edges": [{"S": 1, "M": [{"x": 380, "y": 305}, {"x": 380, "y": 410}], "E": 2}]}
  }
  connect(rotor_drive.support, rotor_joint.support) {"Dyad": {"edges": [{"S": 1, "M": [{"x": 315, "y": 410}], "E": 2}]}}
  e_wind = [cos(theta_w), 0, sin(theta_w)]
  e_rotor = MultibodyComponents.resolve1(frame_a.R, [1, 0, 0])
  cos_align = MultibodyComponents.dot(e_rotor, e_wind)
  F_thrust = 0.5 * rho_air * C_thrust * A_rotor * V_wind ^ 2 * max(0, cos_align) ^ 2
  thrust.force_x = F_thrust * e_rotor[1]
  thrust.force_y = F_thrust * e_rotor[2]
  thrust.force_z = F_thrust * e_rotor[3]
  sin_err = MultibodyComponents.dot(MultibodyComponents.cross(e_rotor, e_wind), [0, 1, 0])
  rotor_drive.tau = k_aero * V_wind ^ 2 * max(0, cos_align) ^ 2 - d_rotor * rotor_joint.w
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/WindTurbine.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 150,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Horizontal-axis wind turbine nacelle with a spinning rotor and wind thrust.

`frame_a` is the yaw bearing at the tower top; the rotor axis is the local
x-axis of `frame_a`. An internal `Body` carries the nacelle mass and inertia,
and a second `Body` on a revolute rotor shaft carries the hub and blade
inertia, so the spinning rotor exerts real gyroscopic moments on the
supporting structure.

The wind blows horizontally with speed `V_wind` in the direction given by the
input `theta_w` (angle in the horizontal plane, measured from the world x-axis
toward the world z-axis). The rotor thrust acts along the rotor axis at the
hub, with magnitude quadratic in the wind speed and scaled by the squared
cosine of the misalignment angle between rotor axis and wind direction; no
thrust is produced when the wind comes from behind the rotor plane. An
aerodynamic torque proportional to the same alignment factor spins the rotor
against a linear drag, giving a steady spin rate in constant wind.

The output `sin_err` is the sine of the heading error between the rotor axis
and the wind direction about the vertical axis. It is zero when the rotor
faces the wind, has the sign of the required yaw correction, and is free of
angle wrapping, which makes it directly usable as the feedback signal of a
yaw controller. Note that it also vanishes at 180 degrees misalignment, which
is an unstable equilibrium of such a controller.

Visualizers for the tower, nacelle, hub, and three blades are included. The
tower is drawn below `frame_a` down to the tower base.
"""
component WindTurbine
  parameter render::Boolean = true
  parameter color::Real[4] = [0.5, 0.5, 0.5, 1.0]
  parameter specular_coefficient::Real = 1.5
  frame_a = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 900, "y2": 1000}}}
  }
  "Wind direction angle in the horizontal plane, from the world x-axis toward the world z-axis"
  theta_w = RealInput() {
    "Dyad": {"placement": {"diagram": {"x1": 90, "x2": 190, "y1": 280, "y2": 380}}}
  }
  "Sine of the heading error between rotor axis and wind direction, about the vertical axis"
  sin_err = RealOutput() {
    "Dyad": {"placement": {"diagram": {"x1": 730, "x2": 830, "y1": 280, "y2": 380}}}
  }
  body = MultibodyComponents.Body(m = m_nacelle, I_11 = I_nacelle, I_22 = I_nacelle, I_33 = I_nacelle, render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 140, "x2": 240, "y1": 560, "y2": 660}}}
  }
  hub_offset = MultibodyComponents.FixedTranslation(r = [overhang, 0, 0], render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 265, "x2": 365, "y1": 460, "y2": 560}}}
  }
  thrust = MultibodyComponents.WorldForce(resolve_in_frame = ResolveInFrame.World(), scale = 3e-4, radius = 0.1) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 550, "y2": 650}}}
  }
  rotor_joint = MultibodyComponents.Revolute(n = [1, 0, 0], phi(initial = 0), w(initial = 0), render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 405, "x2": 505, "y1": 360, "y2": 460}}}
  }
  hub = MultibodyComponents.Body(m = m_hub, I_11 = I_hub_axial, I_22 = I_hub_transverse, I_33 = I_hub_transverse, render = false) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 360, "y2": 460}}}
  }
  rotor_drive = RotationalComponents.Sources.TorqueSource() {
    "Dyad": {"placement": {"diagram": {"x1": 265, "x2": 365, "y1": 255, "y2": 355}}}
  }
  tower_vis = MultibodyComponents.CylinderVisualizer(color = color, render = render, length = tower_height, radius = 0.4, length_direction = [0, 1, 0], r_shape = [0, -tower_height, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 405, "x2": 505, "y1": 140, "y2": 240}}}
  }
  nacelle_vis = MultibodyComponents.BoxVisualizer(color = color, render = render, length = 3, width = 1.2, height = 1.2, length_direction = [1, 0, 0], r_shape = [-1.5, 0, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 530, "x2": 630, "y1": 240, "y2": 340}}}
  }
  hub_vis = MultibodyComponents.SphereVisualizer(color = color, radius = 0.6, render = render) {
    "Dyad": {"placement": {"diagram": {"x1": 650, "x2": 750, "y1": 550, "y2": 650}}}
  }
  blade1_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, 1, 0]) {
    "Dyad": {"placement": {"diagram": {"x1": 650, "x2": 750, "y1": 430, "y2": 530}}}
  }
  blade2_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, cos(2 * π / 3), sin(2 * π / 3)]) {
    "Dyad": {"placement": {"diagram": {"x1": 760, "x2": 860, "y1": 520, "y2": 620}}}
  }
  blade3_vis = MultibodyComponents.CylinderVisualizer(color = blade_color, render = render, length = radius_rotor, radius = 0.15, length_direction = [0, cos(4 * π / 3), sin(4 * π / 3)]) {
    "Dyad": {"placement": {"diagram": {"x1": 890, "x2": 990, "y1": 400, "y2": 500}}}
  }
  "Mass of the nacelle (including the tower share carried at the yaw bearing)"
  parameter m_nacelle::Mass = 2000
  "Diagonal moment of inertia of the nacelle"
  parameter I_nacelle::Inertia = 5e3
  "Mass of the hub and blades"
  parameter m_hub::Mass = 500
  "Moment of inertia of hub and blades about the rotor axis"
  parameter I_hub_axial::Inertia = 200
  "Moment of inertia of hub and blades transverse to the rotor axis"
  parameter I_hub_transverse::Inertia = 100
  "Wind speed"
  parameter V_wind::Velocity = 12
  "Density of the air"
  parameter rho_air::Real = 1.2
  "Thrust coefficient of the rotor"
  parameter C_thrust::Real = 0.8
  "Radius of the rotor disc"
  parameter radius_rotor::Length = 5
  "Height of the tower from its base to the yaw bearing, used for rendering"
  parameter tower_height::Length = 15
  "Distance from the yaw axis to the hub along the rotor axis"
  parameter overhang::Length = 0.8
  "Aerodynamic torque coefficient driving the rotor spin"
  parameter k_aero::Real = 2
  "Linear drag coefficient on the rotor spin"
  parameter d_rotor::Real = 150
  "RGBA color of the blades"
  parameter blade_color::Real[4] = [0.85, 0.85, 0.9, 1]
  "Unit wind direction in the world frame"
  variable e_wind::Real[3]
  "Rotor axis direction in the world frame"
  variable e_rotor::Real[3]
  "Cosine of the misalignment angle between rotor axis and wind"
  variable cos_align::Real
  "Rotor thrust magnitude"
  variable F_thrust::Real
  "Rotor disc area"
  final parameter A_rotor::Real = π * radius_rotor ^ 2
relations
  connect(frame_a, body.frame_a, hub_offset.frame_a, tower_vis.frame_a, nacelle_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [{"x": 100, "y": 950}, {"x": 100, "y": 610}], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [{"x": 130, "y": 510}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [{"x": 250, "y": 190}], "E": -3},
        {"S": -3, "M": [], "E": 4},
        {"S": -3, "M": [{"x": 390, "y": 290}], "E": 5}
      ],
      "junctions": [{"x": 130, "y": 610}, {"x": 250, "y": 510}, {"x": 390, "y": 190}]
    }
  }
  connect(hub_offset.frame_b, rotor_joint.frame_a, thrust.frame_b, hub_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [{"x": 390, "y": 510}], "E": -1},
        {"S": -1, "M": [{"x": 390, "y": 410}], "E": 2},
        {"S": -1, "M": [{"x": 640, "y": 495}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [], "E": 4}
      ],
      "junctions": [{"x": 390, "y": 495}, {"x": 640, "y": 600}]
    }
  }
  connect(rotor_joint.frame_b, hub.frame_a, blade1_vis.frame_a, blade2_vis.frame_a, blade3_vis.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [{"x": 520, "y": 480}], "E": -2},
        {"S": -2, "M": [], "E": 3},
        {"S": -2, "M": [], "E": -3},
        {"S": -3, "M": [{"x": 790, "y": 480}, {"x": 790, "y": 570}], "E": 4},
        {"S": -3, "M": [{"x": 740, "y": 450}], "E": 5}
      ],
      "junctions": [{"x": 520, "y": 410}, {"x": 640, "y": 480}, {"x": 740, "y": 480}]
    }
  }
  connect(rotor_drive.spline, rotor_joint.axis) {
    "Dyad": {"edges": [{"S": 1, "M": [{"x": 380, "y": 305}, {"x": 380, "y": 410}], "E": 2}]}
  }
  connect(rotor_drive.support, rotor_joint.support) {"Dyad": {"edges": [{"S": 1, "M": [{"x": 315, "y": 410}], "E": 2}]}}
  e_wind = [cos(theta_w), 0, sin(theta_w)]
  e_rotor = MultibodyComponents.resolve1(frame_a.R, [1, 0, 0])
  cos_align = MultibodyComponents.dot(e_rotor, e_wind)
  F_thrust = 0.5 * rho_air * C_thrust * A_rotor * V_wind ^ 2 * max(0, cos_align) ^ 2
  thrust.force_x = F_thrust * e_rotor[1]
  thrust.force_y = F_thrust * e_rotor[2]
  thrust.force_z = F_thrust * e_rotor[3]
  sin_err = MultibodyComponents.dot(MultibodyComponents.cross(e_rotor, e_wind), [0, 1, 0])
  rotor_drive.tau = k_aero * V_wind ^ 2 * max(0, cos_align) ^ 2 - d_rotor * rotor_joint.w
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/WindTurbine.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 150,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses