1
0
Fork 0

Moved two generic JSBSim systems from their aircraft into the shared directory.

This commit is contained in:
Anders Gidenstam 2014-03-05 23:02:04 +01:00
parent 026fbdafbe
commit 41965a8631
2 changed files with 1196 additions and 0 deletions

View file

@ -0,0 +1,245 @@
<!--
Airship added/virtual mass model for JSBSim.
Copyright (C) 2008 - 2014 Anders Gidenstam (anders(at)gidenstam.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-->
<system name="added-mass">
<documentation>
This system computes forces and moments due to added/virtual mass.
The model is based on
[Max M. Munk, "Aerodynamic forces on airship hulls", NACA report 184, 1924]
and the introduction in
[Christopher J. Atkinson, Robert G. Urso, "Modeling of Apparent Mass Effects
for the Real-Time Simulation of a Hybrid Airship", AIAA Modeling and
Simulation Technologies Conference, Aug 2006].
Usage:
Define the following properties:
aero/constants/volume-ft3
aero/constants/length-diameter-ft2 (length^2 + diameter^2)
aero/constants/added-mass/k-axial
aero/constants/added-mass/k-traverse
aero/constants/added-mass/k-rotational
aero/constants/added-mass/tweak-factor (1.0 is the standard value)
Define the following external forces:
<force name="added-mass-bx" frame="BODY">
<location unit="">
{ AERORP }
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="added-mass-by" frame="BODY">
<location unit="">
{ AERORP }
</location>
<direction>
<x> 0.0 </x>
<y> 1.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="added-mass-bz" frame="BODY">
<location unit="">
{ AERORP }
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z> 1.0 </z>
</direction>
</force>
<force name="added-mass-pitch[0]" frame="BODY">
<location unit="">
<x> AERORP X </x>
<y> AERORP Y </y>
<z> AERORP Z - 0.3048 </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="added-mass-pitch[1]" frame="BODY">
<location unit="M">
<x> AERORP X </x>
<y> AERORP Y </y>
<z> AERORP Z + 0.3048 </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="added-mass-yaw[0]" frame="BODY">
<location unit="M">
<x> AERORP X </x>
<y> AERORP Y - 0.3048 </y>
<z> 0.0 </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="added-mass-yaw[1]" frame="BODY">
<location unit="M">
<x> AERORP X </x>
<y> AERORP Y + 0.3048 </y>
<z> 0.0 </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
</documentation>
<channel name="startup">
<!-- Allow the vehicle state to stabilize. -->
<fcs_function name="aero/added-mass/active">
<function>
<min>
<property> aero/constants/added-mass/tweak-factor </property>
<max>
<value> 0.0 </value>
<difference>
<property> simulation/sim-time-sec </property>
<value> 2.0 </value>
</difference>
</max>
</min>
</function>
</fcs_function>
</channel>
<channel name="translational">
<fcs_function name="aero/added-mass/force-bx-lbs">
<function>
<product>
<property> aero/added-mass/active </property>
<property> atmosphere/rho-slugs_ft3 </property>
<property> aero/constants/added-mass/k-axial </property>
<property> aero/constants/volume-ft3 </property>
<property> accelerations/udot-ft_sec2 </property>
</product>
</function>
<output> external_reactions/added-mass-bx/magnitude </output>
</fcs_function>
<fcs_function name="aero/added-mass/force-by-lbs">
<function>
<product>
<property> aero/added-mass/active </property>
<property> atmosphere/rho-slugs_ft3 </property>
<property> aero/constants/added-mass/k-traverse </property>
<property> aero/constants/volume-ft3 </property>
<property> accelerations/vdot-ft_sec2 </property>
</product>
</function>
<output> external_reactions/added-mass-by/magnitude </output>
</fcs_function>
<fcs_function name="aero/added-mass/force-bz-lbs">
<function>
<product>
<property> aero/added-mass/active </property>
<property> atmosphere/rho-slugs_ft3 </property>
<property> aero/constants/added-mass/k-traverse </property>
<property> aero/constants/volume-ft3 </property>
<property> accelerations/wdot-ft_sec2 </property>
</product>
</function>
<output> external_reactions/added-mass-bz/magnitude </output>
</fcs_function>
</channel>
<channel name="rotational">
<fcs_function name="aero/added-mass/pitch-moment-lbsft">
<function>
<product>
<property> aero/added-mass/active </property>
<value> 0.05 </value>
<property> atmosphere/rho-slugs_ft3 </property>
<property> aero/constants/added-mass/k-rotational </property>
<property> aero/constants/volume-ft3 </property>
<property> aero/constants/length-diameter-ft2 </property>
<property> accelerations/qdot-rad_sec2 </property>
</product>
</function>
</fcs_function>
<fcs_function name="aero/added-mass/yaw-moment-lbsft">
<function>
<product>
<property> aero/added-mass/active </property>
<value> 0.05 </value>
<property> aero/constants/added-mass/k-rotational </property>
<property> atmosphere/rho-slugs_ft3 </property>
<property> aero/constants/volume-ft3 </property>
<property> aero/constants/length-diameter-ft2 </property>
<property> accelerations/rdot-rad_sec2 </property>
</product>
</function>
</fcs_function>
<pure_gain name="aero/added-mass/pitch-moment-force-lbs[0]">
<input> aero/added-mass/pitch-moment-lbsft </input>
<gain>-0.5</gain>
<output> external_reactions/added-mass-pitch[0]/magnitude </output>
</pure_gain>
<pure_gain name="aero/added-mass/pitch-moment-force-lbs[1]">
<input> aero/added-mass/pitch-moment-lbsft </input>
<gain>0.5</gain>
<output> external_reactions/added-mass-pitch[1]/magnitude </output>
</pure_gain>
<pure_gain name="aero/added-mass/yaw-moment-force-lbs[0]">
<input> aero/added-mass/yaw-moment-lbsft </input>
<gain>-0.5</gain>
<output> external_reactions/added-mass-yaw[0]/magnitude </output>
</pure_gain>
<pure_gain name="aero/added-mass/yaw-moment-force-lbs[1]">
<input> aero/added-mass/yaw-moment-lbsft </input>
<gain>0.5</gain>
<output> external_reactions/added-mass-yaw[1]/magnitude </output>
</pure_gain>
</channel>
</system>

View file

@ -0,0 +1,951 @@
<?xml version="1.0"?>
<!--
Hydrodynamics section for JSBSim.
Copyright (C) 2008 - 2014 Anders Gidenstam (anders(at)gidenstam.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-->
<system name="hydrodynamics">
<documentation>
This system computes forces and moments due to the hull's interaction
with water, both hydrostatic and hydrodynamic, with respect to the
hydrodynamic reference point (HRP).
The coordinate frame used to define the forces and moments is similar to
the body frame but is always aligned with the water surface (which is
assumed to be horizontal). Forces can also be defined in a "wind" frame.
The forces are split into the channels:
- Fbx - body forward.
- Fby - body right.
- Fbz - local up (the same as -Z in the local frame).
- Drag - opposing the relative water flow.
- Side - 90 degrees right from the relative water flow in the surface plane.
The moments are split into the hydrodynamic body frame channels
(with the same sense as the normal body frame moments):
- Pitch
- Yaw
- Roll
The properties determining the location and orientation of the hull
w.r.t the the water surface and stream are:
- hydro/height-agl-ft - Height of the hydrodynamic reference point
over the water surface.
- hydro/beta-deg - angle between the hull's velocity vector throught
the water and its longitudal axis.
Analogous to aerodynamics/beta-deg.
- hydro/pitch-deg - angle between the hull longitudal axis and the
water surface (ground plane).
- hydro/roll-deg - angle between the hull traverse axis and the
water surface (ground plane).
- hydro/v-fps - The hull's total speed relative the water.
Usage:
Include this system in your aircraft.
Define the following properties in a system of your aircraft:
- Hydrodynamics reference point:
<property value="...">metrics/hydro-rp-x-in</property>
<property value="...">metrics/hydro-rp-y-in</property>
<property value="...">metrics/hydro-rp-z-in</property>
- Functions computing the forces in the hydrodynamic body frame
- hydro/fbx-lbs
- hydro/fby-lbs
- hydro/fbz-lbs
Alternative force inputs in the water frame
- hydro/fdrag-lbs
- hydro/fside-lbs
Unused properties also have to be declared (and set to zero).
- Functions computing the moments in the hydrodynamic body frame.
FIXME: Yaw is applied in the standard body frame.
- hydro/yaw-moment-lbsft
- hydro/pitch-moment-lbsft
- hydro/roll-moment-lbsft
Define the following external forces in the main FDM file of your aircraft:
<force name="hydro-X" frame="LOCAL">
<location unit="M">
{ HRP }
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="hydro-Y" frame="LOCAL">
<location unit="M">
{ HRP }
</location>
<direction>
<x> 0.0 </x>
<y> 1.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="hydro-Z" frame="LOCAL">
<location unit="M">
{ HRP }
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z>-1.0 </z>
</direction>
</force>
<force name="hydro-pitch[0]" frame="LOCAL">
<location unit="M">
<x> HRP X - 0.3048 </x>
<y> HRP Y </y>
<z> HRP Z </z>
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z>-1.0 </z>
</direction>
</force>
<force name="hydro-pitch[1]" frame="LOCAL">
<location unit="M">
<x> HRP X + 0.3048 </x>
<y> HRP Y </y>
<z> HRP Z </z>
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z>-1.0 </z>
</direction>
</force>
<force name="hydro-yaw[0]" frame="BODY">
<location unit="M">
<x> HRP X </x>
<y> HRP Y - 0.3048 </y>
<z> HRP Z </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="hydro-yaw[1]" frame="BODY">
<location unit="M">
<x> HRP X </x>
<y> HRP Y + 0.3048 </y>
<z> HRP Z </z>
</location>
<direction>
<x> 1.0 </x>
<y> 0.0 </y>
<z> 0.0 </z>
</direction>
</force>
<force name="hydro-roll[0]" frame="LOCAL">
<location unit="M">
<x> HRP X </x>
<y> HRP Y - 0.3048 </y>
<z> HRP Z </z>
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z>-1.0 </z>
</direction>
</force>
<force name="hydro-roll[1]" frame="LOCAL">
<location unit="M">
<x> HRP X </x>
<y> HRP Y + 0.3048 </y>
<z> HRP Z </z>
</location>
<direction>
<x> 0.0 </x>
<y> 0.0 </y>
<z>-1.0 </z>
</direction>
</force>
</documentation>
<!-- Inputs -->
<!-- Environment -->
<property value="0.0">hydro/environment/water-level-ft</property>
<property value="1.9736403">hydro/environment/rho-slug_ft3</property>
<property value="0.0">hydro/environment/current-from-north-fps</property>
<property value="0.0">hydro/environment/current-from-east-fps</property>
<property value="40.0">hydro/environment/waves-from-deg</property>
<property value="0.0">hydro/environment/wave-amplitude-ft</property>
<property value="150.0">hydro/environment/wave-length-ft</property>
<!-- Model parameters -->
<!-- HRP location. Must be defined.
- metrics/hydro-rp-x-in
- metrics/hydro-rp-y-in
- metrics/hydro-rp-z-in
- metrics/hydro-beam-ft
- metrics/hydro-length-ft
-->
<!-- Input forces in the hydrodynamic body frame.
All must be defined by the aircraft. -->
<!--
Forces in the hydrodynamic body frame
- hydro/fbx-lbs
- hydro/fby-lbs
- hydro/fbz-lbs
Alternative force inputs in the water frame
- hydro/fdrag-lbs
- hydro/fside-lbs
-->
<!-- Input moments in the hydrodynamic body frame.
FIXME: Yaw is applied in the standard body frame.
- hydro/yaw-moment-lbsft
- hydro/pitch-moment-lbsft
- hydro/roll-moment-lbsft
-->
<channel name="Environment">
<fcs_function name="hydro/environment/rho-lbs_ft3">
<function>
<product>
<value>32.174049</value>
<property>hydro/environment/rho-slug_ft3</property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/environment/gravity-ft_sec2">
<function>
<quotient>
<property>inertia/weight-lbs</property>
<property>inertia/mass-slugs</property>
</quotient>
</function>
</fcs_function>
</channel>
<channel name="Environment - Waves">
<fcs_function name="hydro/environment/wave/relative-heading-rad">
<description>
The difference in heading between the hull and the wave.
</description>
<function>
<difference>
<sum>
<value>3.1415927</value>
<product>
<value>0.017453293</value>
<property>hydro/environment/waves-from-deg</property>
</product>
</sum>
<property>attitude/psi-rad</property>
</difference>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/hull-x-factor">
<description>
The result of dot(Dwave, (1,0)), i.e. the cosine of the angle
between the wave heading and the hull heading.
</description>
<function>
<cos>
<property>hydro/environment/wave/relative-heading-rad</property>
</cos>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/hull-y-factor">
<description>
The result of dot(Dwave, (0,1)), i.e. the sine of the angle
between the wave heading and the hull heading.
</description>
<function>
<sin>
<property>hydro/environment/wave/relative-heading-rad</property>
</sin>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/hull-angular-frequency-rad_sec">
<description>
Hull speed in the wave's direction expressed in the wave's
angular frequency.
</description>
<function>
<product>
<value>6.2831853</value>
<quotient>
<sum>
<product>
<property>hydro/vbx-fps</property>
<property>hydro/environment/wave/hull-x-factor</property>
</product>
<product>
<property>hydro/vby-fps</property>
<property>hydro/environment/wave/hull-y-factor</property>
</product>
</sum>
<max>
<value>0.001</value>
<property>hydro/environment/wave-length-ft</property>
</max>
</quotient>
</product>
</function>
</fcs_function>
<integrator name="hydro/environment/wave/hull-angular-offset-rad">
<description>
The hull's angular offset at its present position.
</description>
<input>hydro/environment/wave/hull-angular-frequency-rad_sec</input>
<c1>1.0</c1>
</integrator>
<fcs_function name="hydro/environment/wave/angular-frequency-rad_sec">
<description>
The angular frequency of the wave.
</description>
<function>
<sum>
<!-- Deep water gravity wave. -->
<product>
<value>-1.0</value> <!-- Note: Set to 0 to make the waves stationary. -->
<pow>
<quotient>
<product>
<value>6.2831853</value>
<property>hydro/environment/gravity-ft_sec2</property>
</product>
<max>
<value>0.001</value>
<property>hydro/environment/wave-length-ft</property>
</max>
</quotient>
<value>0.5</value>
</pow>
</product>
<!-- Mix in hull-angular-offset-rad to simplify uses below. -->
<quotient>
<property>hydro/environment/wave/hull-angular-offset-rad</property>
<property>simulation/sim-time-sec</property>
</quotient>
</sum>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/wave-number-rad_ft">
<description>
The wave number of the wave.
</description>
<function>
<quotient>
<value>6.2831853</value>
<max>
<value>0.001</value>
<property>hydro/environment/wave-length-ft</property>
</max>
</quotient>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/level-change-ft">
<description>
The water level change due to the waves. Guessed.
Integrated over -0.5 * hydro-length-ft to 0.5 * hydro-length-ft.
</description>
<function>
<quotient>
<sum>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<sin>
<difference>
<product>
<value>0.5</value>
<property>metrics/hydro-length-ft</property>
<property>hydro/environment/wave/hull-x-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</sin>
</product>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<sin>
<difference>
<product>
<value>-0.5</value>
<property>metrics/hydro-length-ft</property>
<property>hydro/environment/wave/hull-x-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</sin>
</product>
</sum>
<product>
<property>hydro/environment/wave/hull-x-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
<property>hydro/hull-length-ft</property>
</product>
</quotient>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/level-at-hrp-ft">
<description>
The water level change at the HRP location. For debugging.
</description>
<function>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<cos>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</cos>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/level-fwd-ft">
<description>
The water level change at 0.5 * metrics/hydro-length-ft forward of
the HRP location.
</description>
<function>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<cos>
<difference>
<product>
<value>0.5</value>
<property>metrics/hydro-length-ft</property>
<property>hydro/environment/wave/hull-x-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</cos>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/environment/wave/level-aft-ft">
<description>
The water level change at 0.5 * metrics/hydro-length-ft aft of
the HRP location.
</description>
<function>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<cos>
<difference>
<product>
<value>-0.5</value>
<property>metrics/hydro-length-ft</property>
<property>hydro/environment/wave/hull-x-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</cos>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/orientation/wave-pitch-trim-change-deg">
<description>
The pitch trim change due to the waves. Guessed.
</description>
<!-- deltaTrim = atan2(water line at bow - water line at stern, LWL) -->
<function>
<product>
<value>57.29578</value>
<atan2>
<difference>
<property>hydro/environment/wave/level-fwd-ft</property>
<property>hydro/environment/wave/level-aft-ft</property>
</difference>
<property>metrics/hydro-length-ft</property>
</atan2>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/orientation/wave-roll-trim-change-deg">
<description>
The roll trim change due to the waves. Guessed.
</description>
<!-- deltaTrim =
atan2(water line at starboard side - water line at port side, beam)
-->
<function>
<product>
<value>57.29578</value>
<atan2>
<difference>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<cos>
<difference>
<product>
<value>-0.5</value>
<property>metrics/hydro-beam-ft</property>
<property>hydro/environment/wave/hull-y-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</cos>
</product>
<product>
<property>hydro/environment/wave-amplitude-ft</property>
<cos>
<difference>
<product>
<value>0.5</value>
<property>metrics/hydro-beam-ft</property>
<property>hydro/environment/wave/hull-y-factor</property>
<property>hydro/environment/wave/wave-number-rad_ft</property>
</product>
<product>
<property>hydro/environment/wave/angular-frequency-rad_sec</property>
<property>simulation/sim-time-sec</property>
</product>
</difference>
</cos>
</product>
</difference>
<property>metrics/hydro-beam-ft</property>
</atan2>
</product>
</function>
</fcs_function>
</channel>
<channel name ="Hull position">
<fcs_function name="hydro/height-agl-ft">
<documentation>
Distance between the hydrodynamic reference point and the water surface.
Not completely correctly computed yet.
</documentation>
<function>
<difference>
<sum>
<property> position/h-sl-ft </property>
<product>
<value> -0.083333333 </value>
<difference>
<property> metrics/hydro-rp-x-in </property>
<property> inertia/cg-x-in </property>
</difference>
<sin>
<property> attitude/pitch-rad </property>
</sin>
</product>
<product>
<value> 0.083333333 </value>
<difference>
<property> metrics/hydro-rp-z-in </property>
<property> inertia/cg-z-in </property>
</difference>
<cos>
<property> attitude/pitch-rad </property>
</cos>
</product>
</sum>
<property> hydro/environment/water-level-ft </property>
</difference>
</function>
</fcs_function>
</channel>
<channel name ="Hull orientation">
<fcs_function name="hydro/true-course-rad">
<!-- The course made good by the hull. -->
<function>
<atan2>
<sum>
<property>velocities/v-east-fps</property>
<property>hydro/environment/current-from-east-fps</property>
</sum>
<sum>
<property>velocities/v-north-fps</property>
<property>hydro/environment/current-from-north-fps</property>
</sum>
</atan2>
</function>
</fcs_function>
<fcs_function name="hydro/true-course-deg">
<!-- The course made good by the hull. -->
<function>
<product>
<value> 57.29578 </value>
<property> hydro/true-course-rad </property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/pitch-deg">
<function>
<product>
<value> 57.29578 </value>
<property> attitude/pitch-rad </property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/roll-deg">
<function>
<product>
<value> 57.29578 </value>
<property> attitude/roll-rad </property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/alpha-rad">
<function>
<sum>
<property>attitude/pitch-rad</property>
<atan2>
<property>velocities/v-down-fps</property>
<property>hydro/v-fps</property>
</atan2>
</sum>
</function>
</fcs_function>
<fcs_function name="hydro/alpha-deg">
<function>
<product>
<value> 57.29578 </value>
<property> hydro/alpha-rad </property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/tmp/beta-rad">
<!-- Needed to normalize the beta range to +/-PI. -->
<function>
<difference>
<property> hydro/true-course-rad </property>
<property> attitude/psi-rad </property>
</difference>
</function>
</fcs_function>
<fcs_function name="hydro/beta-rad">
<function>
<sum>
<property>hydro/tmp/beta-rad</property>
<product>
<lt>
<property>hydro/tmp/beta-rad</property>
<value>-3.1415927</value>
</lt>
<value>6.2831853</value>
</product>
<product>
<gt>
<property>hydro/tmp/beta-rad</property>
<value>3.1415927</value>
</gt>
<value>-6.2831853</value>
</product>
</sum>
</function>
</fcs_function>
<fcs_function name="hydro/beta-deg">
<function>
<product>
<value> 57.29578 </value>
<property> hydro/beta-rad </property>
</product>
</function>
</fcs_function>
</channel>
<channel name ="Hull velocity">
<fcs_function name="hydro/v-fps">
<function>
<pow>
<sum>
<pow>
<sum>
<property> velocities/v-north-fps </property>
<property> hydro/environment/current-from-north-fps </property>
</sum>
<value> 2.0 </value>
</pow>
<pow>
<sum>
<property> velocities/v-east-fps </property>
<property> hydro/environment/current-from-east-fps </property>
</sum>
<value> 2.0 </value>
</pow>
</sum>
<value> 0.5 </value>
</pow>
</function>
</fcs_function>
<fcs_function name="hydro/v-kt">
<function>
<product>
<value> 0.5924838 </value>
<property> hydro/v-fps </property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/vbx-fps">
<function>
<product>
<cos>
<property>hydro/beta-rad</property>
</cos>
<property>hydro/v-fps</property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/vby-fps">
<function>
<product>
<sin>
<property>hydro/beta-rad</property>
</sin>
<property>hydro/v-fps</property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/qbar-psf">
<function>
<product>
<value> 0.50 </value>
<property>hydro/environment/rho-slug_ft3</property>
<property>hydro/v-fps</property>
<property>hydro/v-fps</property>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/qbar-u-psf">
<function>
<product>
<value> 0.50 </value>
<property>hydro/environment/rho-slug_ft3</property>
<property>hydro/vbx-fps</property>
<abs><property>hydro/vbx-fps</property></abs>
</product>
</function>
</fcs_function>
<fcs_function name="hydro/qbar-v-psf">
<function>
<product>
<value> 0.50 </value>
<property>hydro/environment/rho-slug_ft3</property>
<property>hydro/vby-fps</property>
<abs><property>hydro/vby-fps</property></abs>
</product>
</function>
</fcs_function>
</channel>
<!-- Implementation of forces and moments below. -->
<channel name="Implementation Force X (north)">
<fcs_function name="hydro/X/force-lbs">
<function>
<sum>
<product>
<cos>
<property> attitude/psi-rad </property>
</cos>
<property> hydro/fbx-lbs </property>
</product>
<product>
<sin>
<property> attitude/psi-rad </property>
</sin>
<property> hydro/fby-lbs </property>
</product>
<product>
<value> -1.0 </value>
<cos>
<property> hydro/true-course-rad </property>
</cos>
<property> hydro/fdrag-lbs </property>
</product>
<product>
<value> -1.0 </value>
<sin>
<property> hydro/true-course-rad </property>
</sin>
<property> hydro/fside-lbs </property>
</product>
</sum>
</function>
<output> external_reactions/hydro-X/magnitude </output>
</fcs_function>
</channel>
<channel name="Implementation Force Y (east)">
<fcs_function name="hydro/Y/force-lbs">
<function>
<sum>
<product>
<sin>
<property> attitude/psi-rad </property>
</sin>
<property> hydro/fbx-lbs </property>
</product>
<product>
<cos>
<property> attitude/psi-rad </property>
</cos>
<property> hydro/fby-lbs </property>
</product>
<product>
<value> -1.0 </value>
<sin>
<property> hydro/true-course-rad </property>
</sin>
<property> hydro/fdrag-lbs </property>
</product>
<product>
<cos>
<property> hydro/true-course-rad </property>
</cos>
<property> hydro/fside-lbs </property>
</product>
</sum>
</function>
<output> external_reactions/hydro-Y/magnitude </output>
</fcs_function>
</channel>
<channel name="Implementation Force Z (up)">
<summer name="hydro/Z/force-lbs">
<input> hydro/fbz-lbs </input>
<output> external_reactions/hydro-Z/magnitude </output>
</summer>
</channel>
<channel name="Implementation Pitch Moment">
<pure_gain name="hydro/pitch-moment/force-lbs[0]">
<input> hydro/pitch-moment-lbsft </input>
<gain> 0.5</gain>
<output> external_reactions/hydro-pitch[0]/magnitude </output>
</pure_gain>
<pure_gain name="hydro/pitch-moment/force-lbs[1]">
<input> hydro/pitch-moment-lbsft </input>
<gain>-0.5</gain>
<output> external_reactions/hydro-pitch[1]/magnitude </output>
</pure_gain>
</channel>
<channel name="Implementation Roll Moment">
<pure_gain name="hydro/roll-moment/force-lbs[0]">
<input> hydro/roll-moment-lbsft </input>
<gain> 0.5</gain>
<output> external_reactions/hydro-roll[0]/magnitude </output>
</pure_gain>
<pure_gain name="hydro/roll-moment/force-lbs[1]">
<input> hydro/roll-moment-lbsft </input>
<gain>-0.5</gain>
<output> external_reactions/hydro-roll[1]/magnitude </output>
</pure_gain>
</channel>
<channel name="Implementation Yaw Moment">
<pure_gain name="hydro/yaw-moment/force-lbs[0]">
<input> hydro/yaw-moment-lbsft </input>
<gain> 0.5</gain>
<output> external_reactions/hydro-yaw[0]/magnitude </output>
</pure_gain>
<pure_gain name="hydro/yaw-moment/force-lbs[1]">
<input> hydro/yaw-moment-lbsft </input>
<gain>-0.5</gain>
<output> external_reactions/hydro-yaw[1]/magnitude </output>
</pure_gain>
</channel>
</system>