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:
| Name | Description | Units | Default value |
|---|---|---|---|
render | – | true | |
color | – | [0.9, 0.9, 0.9, 1] | |
specular_coefficient | – | 1.5 | |
m_nacelle | Mass of the nacelle (including the tower share carried at the yaw bearing) | kg | 2000 |
I_nacelle | Diagonal moment of inertia of the nacelle | kg.m2 | 5e3 |
m_hub | Mass of the hub and blades | kg | 500 |
I_hub_axial | Moment of inertia of hub and blades about the rotor axis | kg.m2 | 200 |
I_hub_transverse | Moment of inertia of hub and blades transverse to the rotor axis | kg.m2 | 100 |
V_wind | Wind speed | m/s | 12 |
rho_air | Density of the air | – | 1.2 |
C_thrust | Thrust coefficient of the rotor | – | 0.8 |
radius_rotor | Radius of the rotor disc | m | 5 |
tower_height | Height of the tower from its base to the yaw bearing, used for rendering | m | 15 |
overhang | Distance from the yaw axis to the hub along the rotor axis | m | 0.8 |
k_aero | Aerodynamic torque coefficient driving the rotor spin | – | 2 |
d_rotor | Linear drag coefficient on the rotor spin | – | 150 |
blade_color | RGBA 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 severalFrame
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
| Name | Description | Units |
|---|---|---|
e_wind | Unit wind direction in the world frame | – |
e_rotor | Rotor axis direction in the world frame | – |
cos_align | Cosine of the misalignment angle between rotor axis and wind | – |
F_thrust | Rotor thrust magnitude | – |
Behavior
Source
"""
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"}
}
]
}
}
endFlattened Source
"""
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"}
}
]
}
}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses