452 lines
12 KiB
XML
452 lines
12 KiB
XML
|
<?xml version="1.0"?>
|
||
|
|
||
|
<!-- UFO Autopilot -->
|
||
|
<!-- Copyright (c) 2022 Josh Davidson (Octal450) -->
|
||
|
|
||
|
<PropertyList>
|
||
|
|
||
|
<!-- Logic -->
|
||
|
<logic> <!-- Roll channel active -->
|
||
|
<input>
|
||
|
<or>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>wing-leveler</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>dg-heading-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>true-heading-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>nav1-hold</value>
|
||
|
</equals>
|
||
|
</or>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/roll-active</output>
|
||
|
</logic>
|
||
|
|
||
|
<logic> <!-- Basic pitch hold active -->
|
||
|
<input>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>pitch-hold</value>
|
||
|
</equals>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/pitch-hold-active</output>
|
||
|
</logic>
|
||
|
|
||
|
<logic> <!-- Pitch channel active -->
|
||
|
<input>
|
||
|
<or>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>vertical-speed-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>pitch-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>altitude-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>agl-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>gs1-hold</value>
|
||
|
</equals>
|
||
|
</or>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/pitch-active</output>
|
||
|
</logic>
|
||
|
|
||
|
<logic> <!-- Fpm channel active -->
|
||
|
<input>
|
||
|
<or>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>vertical-speed-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>altitude-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>agl-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>gs1-hold</value>
|
||
|
</equals>
|
||
|
</or>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/vs-active</output>
|
||
|
</logic>
|
||
|
|
||
|
<logic> <!-- Throttle channel active -->
|
||
|
<input>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/speed</property>
|
||
|
<value>speed-with-throttle</value>
|
||
|
</equals>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/throttle-active</output>
|
||
|
</logic>
|
||
|
|
||
|
<filter> <!-- Heading error computer -->
|
||
|
<name>Heading/Nav Error Deg</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>nav1-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/instrumentation/nav[0]/radials/target-auto-hdg-deg</property>
|
||
|
<offset>
|
||
|
<property>/orientation/heading-deg</property>
|
||
|
<scale>-1.0</scale>
|
||
|
</offset>
|
||
|
</input>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>true-heading-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/autopilot/settings/true-heading-deg</property>
|
||
|
<offset>
|
||
|
<property>/orientation/heading-deg</property>
|
||
|
<scale>-1.0</scale>
|
||
|
</offset>
|
||
|
</input>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>dg-heading-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/autopilot/settings/heading-bug-deg</property>
|
||
|
<offset>
|
||
|
<property>/orientation/heading-magnetic-deg</property>
|
||
|
<scale>-1.0</scale>
|
||
|
</offset>
|
||
|
</input>
|
||
|
<input>0</input>
|
||
|
<output>/autopilot/internal/heading-error-deg</output>
|
||
|
<period>
|
||
|
<min>-180</min>
|
||
|
<max>180</max>
|
||
|
</period>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Clamp glideslope target fpm -->
|
||
|
<name>G/S FPM Calc</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<input>/instrumentation/nav[0]/gs-rate-of-climb-fpm</input>
|
||
|
<output>/autopilot/internal/nav1-rate-of-climb-fpm</output>
|
||
|
<min>-10000</min>
|
||
|
<max>0</max>
|
||
|
</filter>
|
||
|
|
||
|
<!-- Roll Axis -->
|
||
|
<filter> <!-- Copy target roll angle, 0 by default for wingn leveller -->
|
||
|
<name>IT-CONTROLLER: Roll Deg/Wings Level</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>wing-leveler</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/autopilot/settings/target-roll-deg</input>
|
||
|
<output>/autopilot/internal/target-roll-deg</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Compute target roll angle from heading error -->
|
||
|
<name>IT-CONTROLLER: Heading</name>
|
||
|
<type>gain</type>
|
||
|
<gain>0.5</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<or>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>dg-heading-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>true-heading-hold</value>
|
||
|
</equals>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/heading</property>
|
||
|
<value>nav1-hold</value>
|
||
|
</equals>
|
||
|
</or>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/autopilot/internal/heading-error-deg</input>
|
||
|
<reference>0</reference>
|
||
|
<output>/autopilot/internal/target-roll-deg</output>
|
||
|
<min>-90</min>
|
||
|
<max>90</max>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Smooth engagement by syncing when disabled -->
|
||
|
<name>System Command: Roll Target Inactive Sync</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<not><property>/autopilot/internal/roll-active</property></not>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/orientation/roll-deg</input>
|
||
|
<output>/autopilot/internal/target-roll-deg</output>
|
||
|
<min>-90</min>
|
||
|
<max>90</max>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Aileron elevator controller -->
|
||
|
<name>System Command: Aileron</name>
|
||
|
<type>noise-spike</type>
|
||
|
<feedback-if-disabled>true</feedback-if-disabled>
|
||
|
<initialize-to>output</initialize-to>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/roll-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>
|
||
|
<expression>
|
||
|
<div>
|
||
|
<property>/autopilot/internal/target-roll-deg</property>
|
||
|
<value>90</value>
|
||
|
</div>
|
||
|
</expression>
|
||
|
</input>
|
||
|
<output>/controls/flight/aileron</output>
|
||
|
<max-rate-of-change>1.2</max-rate-of-change>
|
||
|
</filter>
|
||
|
|
||
|
<!-- Pitch Axis -->
|
||
|
<filter> <!-- Compute target fpm from altitude error -->
|
||
|
<name>IT-CONTROLLER: Altitude Capture/Hold</name>
|
||
|
<type>gain</type>
|
||
|
<gain>-20</gain>
|
||
|
<input>/position/altitude-ft</input>
|
||
|
<reference>/autopilot/settings/target-altitude-ft</reference>
|
||
|
<output>/autopilot/internal/target-fpm-alt</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Compute target fpm from agl error -->
|
||
|
<name>IT-CONTROLLER: AGL Capture/Hold</name>
|
||
|
<type>gain</type>
|
||
|
<gain>-20</gain>
|
||
|
<input>/position/altitude-agl-ft</input>
|
||
|
<reference>/autopilot/settings/target-agl-ft</reference>
|
||
|
<output>/autopilot/internal/target-fpm-agl</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Copy target pitch angle -->
|
||
|
<name>IT-CONTROLLER: Pitch Deg</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/pitch-hold-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/autopilot/settings/target-pitch-deg</input>
|
||
|
<output>/autopilot/internal/target-pitch-deg</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Select target vertical speed -->
|
||
|
<name>IT-CONTROLLER: Pitch Deg</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>altitude-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/autopilot/internal/target-fpm-alt</property>
|
||
|
</input>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>agl-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/autopilot/internal/target-fpm-agl</property>
|
||
|
</input>
|
||
|
<input>
|
||
|
<condition>
|
||
|
<equals>
|
||
|
<property>/autopilot/locks/altitude</property>
|
||
|
<value>gs1-hold</value>
|
||
|
</equals>
|
||
|
</condition>
|
||
|
<property>/autopilot/internal/nav1-rate-of-climb-fpm</property>
|
||
|
</input>
|
||
|
<input>/autopilot/settings/vertical-speed-fpm</input>
|
||
|
<output>/autopilot/internal/target-fpm</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Main fpm controller -->
|
||
|
<name>IT-CONTROLLER: FPM Hold</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/vs-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input> <!-- Reversed from UFO.cxx -->
|
||
|
<expression>
|
||
|
<rad2deg>
|
||
|
<asin>
|
||
|
<div>
|
||
|
<div>
|
||
|
<div>
|
||
|
<property>/autopilot/internal/target-fpm</property>
|
||
|
<value>60</value> <!-- Fps to fpm -->
|
||
|
</div>
|
||
|
<value>3.28084</value> <!-- Meters to feet -->
|
||
|
</div>
|
||
|
<max>
|
||
|
<product>
|
||
|
<property>/velocities/airspeed-kt</property>
|
||
|
<value>0.514444</value> <!-- Knots to meters/sec -->
|
||
|
</product>
|
||
|
<value>0.0000001</value> <!-- Prevent divide by 0 -->
|
||
|
</max>
|
||
|
</div>
|
||
|
</asin>
|
||
|
</rad2deg>
|
||
|
</expression>
|
||
|
</input>
|
||
|
<output>/autopilot/internal/target-pitch-deg</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Copy target pitch angle -->
|
||
|
<name>IT-CONTROLLER: Pitch Deg</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/pitch-hold-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/autopilot/settings/target-pitch-deg</input>
|
||
|
<output>/autopilot/internal/target-pitch-deg</output>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Smooth engagement by syncing when disabled -->
|
||
|
<name>System Command: Pitch Target Inactive Sync</name>
|
||
|
<type>gain</type>
|
||
|
<gain>1.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<not><property>/autopilot/internal/pitch-active</property></not>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>/orientation/pitch-deg</input>
|
||
|
<output>/autopilot/internal/target-pitch-deg</output>
|
||
|
<min>-90</min>
|
||
|
<max>90</max>
|
||
|
</filter>
|
||
|
|
||
|
<filter> <!-- Main elevator controller -->
|
||
|
<name>System Command: Elevator</name>
|
||
|
<type>noise-spike</type>
|
||
|
<feedback-if-disabled>true</feedback-if-disabled>
|
||
|
<initialize-to>output</initialize-to>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/pitch-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>
|
||
|
<expression>
|
||
|
<div>
|
||
|
<property>/autopilot/internal/target-pitch-deg</property>
|
||
|
<value>-90</value>
|
||
|
</div>
|
||
|
</expression>
|
||
|
</input>
|
||
|
<output>/controls/flight/elevator</output>
|
||
|
<max-rate-of-change>1.2</max-rate-of-change>
|
||
|
</filter>
|
||
|
|
||
|
<!-- Throttle Axis -->
|
||
|
<filter> <!-- Main throttle controller -->
|
||
|
<name>System Command: Throttle</name>
|
||
|
<type>noise-spike</type>
|
||
|
<feedback-if-disabled>true</feedback-if-disabled>
|
||
|
<initialize-to>output</initialize-to>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/throttle-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>
|
||
|
<expression>
|
||
|
<div>
|
||
|
<product>
|
||
|
<property>/autopilot/settings/target-speed-kt</property>
|
||
|
<value>0.514444</value> <!-- Knots to meters/sec -->
|
||
|
</product>
|
||
|
<max>
|
||
|
<property>/engines/engine[0]/speed-max-mps</property>
|
||
|
<value>0.0000001</value> <!-- Prevent divide by 0 -->
|
||
|
</max>
|
||
|
</div>
|
||
|
</expression>
|
||
|
</input>
|
||
|
<output>/controls/engines/engine[0]/throttle</output>
|
||
|
<max-rate-of-change>0.3</max-rate-of-change>
|
||
|
</filter>
|
||
|
|
||
|
<!-- Trim Axis -->
|
||
|
<filter> <!-- Centers all the trims otherwise the system can't work -->
|
||
|
<name>System Command: Trim</name>
|
||
|
<type>gain</type>
|
||
|
<gain>0.0</gain>
|
||
|
<enable>
|
||
|
<condition>
|
||
|
<property>/autopilot/internal/pitch-active</property>
|
||
|
</condition>
|
||
|
</enable>
|
||
|
<input>0</input>
|
||
|
<output>
|
||
|
<property>/controls/flight/aileron-trim</property>
|
||
|
<property>/controls/flight/elevator-trim</property>
|
||
|
<property>/controls/flight/rudder-trim</property>
|
||
|
</output>
|
||
|
<min>-1.0</min>
|
||
|
<max>1.0</max>
|
||
|
</filter>
|
||
|
|
||
|
</PropertyList>
|