<?xml version="1.0"?>
<autopilot name="f16 Autopilot for Waypoint Navigation">
<!-- 基础自动驾驶属性 -->
<property>ap/attitude_hold</property>
<property>ap/altitude_hold</property>
<property>ap/active-waypoint</property>
<property>ap/altitude_setpoint</property>
<property>ap/heading-setpoint-select</property>
<property>ap/aileron_cmd</property>
<property>ap/heading_hold</property>
<property>ap/yaw_damper</property>
<!-- 航路点导航通道 -->
<channel name="AP Waypoint Navigation">
<!-- 选择航路点作为航向设定点 -->
<switch name="fcs/heading-setpoint-selector">
<default value="ic/psi-true-deg"/>
<test value="guidance/wp-heading-deg">
ap/heading-setpoint-select == 1
</test>
</switch>
<!-- 计算航向误差 -->
<pure_gain name="fcs/heading-true-degrees">
<input>attitude/heading-true-rad</input>
<gain>57.2957795</gain> <!-- 将弧度转换为度 -->
</pure_gain>
<summer name="fcs/heading-error">
<input>-fcs/heading-true-degrees</input>
<input>fcs/heading-setpoint-selector</input>
</summer>
<!-- 修正航向误差(处理360度问题) -->
<switch name="fcs/heading-error-bias-switch">
<default value="0.0"/>
<test value="360.0">
fcs/heading-error lt -180
</test>
<test value="-360.0">
fcs/heading-error gt 180
</test>
</switch>
<summer name="fcs/heading-corrected">
<input>fcs/heading-error-bias-switch</input>
<input>fcs/heading-error</input>
<clipto>
<min>-33</min>
<max>33</max>
</clipto>
</summer>
<!-- 将航向误差转换为控制命令 -->
<pure_gain name="fcs/heading-command">
<input>fcs/heading-corrected</input>
<gain>0.01745</gain> <!-- 将度转换为弧度 -->
</pure_gain>
<!-- 使用PI控制器生成滚转控制命令 -->
<pid name="fcs/heading-pi-controller">
<input>fcs/heading-command</input>
<kp>7.0</kp>
<ki>0.20</ki>
<kd>6.0</kd>
</pid>
<!-- 选择滚转控制命令输出 -->
<switch name="fcs/roll-command-selector">
<default value="0.0"/>
<test value="fcs/heading-pi-controller">
ap/heading_hold == 1
</test>
<output>ap/aileron_cmd</output>
</switch>
</channel>
<!-- 高度保持通道 -->
<channel name="AP Pitch Altitude Hold">
<!-- 计算高度误差 -->
<summer name="fcs/altitude-error">
<input>ap/altitude_setpoint</input>
<input>-position/h-sl-ft</input>
<clipto>
<min>-150</min>
<max>150</max>
</clipto>
</summer>
<!-- 使用滞后滤波器平滑高度误差 -->
<lag_filter name="fcs/alt-error-lag">
<input>fcs/altitude-error</input>
<c1>1</c1>
</lag_filter>
<!-- 计算垂直速度命令 -->
<fcs_function name="fcs/hdot-command">
<input>fcs/alt-error-lag</input>
<function>
<quotient>
<difference>
<value>45.0</value>
<quotient>
<property>position/h-sl-ft</property>
<value>833.33</value>
</quotient>
</difference>
<value>100.0</value>
</quotient>
</function>
</fcs_function>
<!-- 计算垂直速度误差 -->
<summer name="fcs/hdot-error">
<input>fcs/hdot-command</input>
<input>-velocities/h-dot-fps</input>
</summer>
<!-- 高度保持开关 -->
<switch name="fcs/ap-alt-hold-switch">
<default value="0.0"/>
<test value="fcs/hdot-error">
ap/altitude_hold == 1
</test>
</switch>
<!-- 使用积分器和比例增益生成俯仰控制命令 -->
<integrator name="fcs/integral">
<input>fcs/ap-alt-hold-switch</input>
<c1>0.001</c1>
</integrator>
<pure_gain name="fcs/proportional">
<input>fcs/ap-alt-hold-switch</input>
<gain>0.03</gain>
</pure_gain>
<summer name="fcs/control-summer">
<input>fcs/integral</input>
<input>fcs/proportional</input>
<clipto>
<min>-1.0</min>
<max>1.0</max>
</clipto>
</summer>
<pure_gain name="fcs/elevator">
<input>fcs/control-summer</input>
<gain>-1.0</gain>
<output>ap/elevator_cmd</output>
</pure_gain>
</channel>
-->
<!-- Yaw Damper偏航阻尼器 -->
<channel name="Yaw Damper">
<scheduled_gain name="ap/rudder_control">
<input>aero/beta-rad</input>
<table>
<independentVar lookup="row">velocities/ve-kts</independentVar>
<tableData>
30 0.00
60 -40.00
</tableData>
</table>
<gain>ap/yaw_damper</gain>
<clipto>
<min>-1.0</min>
<max>1.0</max>
</clipto>
<output>ap/rudder_cmd</output>
</scheduled_gain>
</channel>
</autopilot>
在分析你提供的F-16自动驾驶仪脚本时,我们可以看到它的结构和一些关键功能。确保飞机能够在定点飞行的过程中,以下是一些可能的原因以及改善建议,分析为什么飞机可能会转圈以及如何修正控制脚本。
可能原因
航向设定问题: 如果 ap/heading_hold 开关总是被激活,会导致飞机持续尝试修正航向,从而可能出现转圈的情况。请检查你的航向设定和误差修正逻辑。
PI控制器参数: 在fcs/heading-pi-controller的增益设置中,kp、ki、kd的值可能不合理,导致飞机在尝试纠正航向时反复超调,从而出现持续转动的问题。
航向选择逻辑: 可能是航向选择逻辑 (fcs/heading-setpoint-selector) 存在问题,导致飞机无法稳定在设定航向。
高度保持与航向保持的冲突: 如果高度保持和航向保持通道之间存在冲突,例如航向设定点和高度设定点不一致,会导致飞机不断调整而导致转动。
输入信号处理问题: 检查各个输入信号,确保它们在期望的范围内,并且正确反映了当前状态,没有信号噪声或干扰。
改善建议
航向设定稳定化:
调整 fcs/heading-pi-controller 的增益值,尝试降低 kp 和 kd,并且增加 ki 值,直至找到合适的控制效果。
确保 ap/heading_hold 只在特定条件下激活,比如通过高度和航向误差检查。
确保航向选择逻辑的有效性:
确保在选择航向时,ap/heading-setpoint-select 被正确设置。例如,确保它只在你希望飞机转向目标航向时激活。
增加调试和日志记录:
在代码中增加日志记录功能,输出每次计算的航向、高度以及控制指令,便于排查问题。
简单调试:
从简开始,首先确保飞机能在一个设定航向(如 0 度)飞行,并确认其航向保持的稳定性,再逐步加入更复杂的功能和逻辑。
加入死区或抗抖动设置:
在控制指令中加入小幅度的死区设置,避免由于微小的误差而造成不必要的调整。
验证各项设置:
确保所有的航路点和相关设置(例如 height setpoint 和航向 setpoint)在合理的范围之内,避免因为数据错误导致的飞行异常。
示例代码调整
保证导航逻辑和控制意图清晰。根据实际结果微调参数,确保控制系统是稳定的。以下是对航向控制部分的一个简化示例:
xml
<channel name="AP Waypoint Navigation">
<!-- 选择航路点 -->
<switch name="fcs/heading-setpoint-selector">
<default value="ic/psi-true-deg"/>
<test value="guidance/wp-heading-deg">ap/heading-setpoint-select == 1</test>
</switch>
<summer name="fcs/heading-error">
<input>-fcs/heading-true-degrees</input>
<input>fcs/heading-setpoint-selector</input>
</summer>
<!-- 计算和修正 -->
<switch name="fcs/heading-error-bias-switch">
<default value="0.0"/>
<test value="360.0">fcs/heading-error lt -180</test>
<test value="-360.0">fcs/heading-error gt 180</test>
</switch>
<summer name="fcs/heading-corrected">
<input>fcs/heading-error-bias-switch</input>
<input>fcs/heading-error</input>
<clipto><min>-10</min><max>10</max></clipto> <!-- 增加限制 -->
</summer>
<!-- PI 控制 -->
<pid name="fcs/heading-pi-controller">
<input>fcs/heading-corrected</input>
<kp>4.0</kp> <!-- 调低增益 -->
<ki>0.1</ki>
<kd>0.5</kd>
</pid>
<output>ap/aileron_cmd</output>
</channel>
总结来说,建议你再仔细检查控制参数,简化验证逻辑,确保控制系统的稳定性。通过逐步调试和微调你会找到最合适的参数设置,确保飞行器能够在预定航路上稳定飞行。