ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

飞控半实物仿真平台实战:实时性、信号联通与故障注入细节

飞控半实物仿真平台实战:实时性、信号联通与故障注入细节

搞飞控研发的人,对“半实物仿真”这四个字应该都不陌生。它一个非常关键的定位,就是在真机试飞之前,把真实的飞控计算机接入一个包含被控对象模型的实时仿真回路里,让控制律在实验室里先接受各种极端考验。这两年我在某型号项目中深度参与了这套测试平台的搭建和使用,从最初的架构设计到后续的故障排查,积累了不少一手经验。这篇内容是这个系列的第二篇,重点讲平台上手之后那些真正影响测试结果的核心细节:实时性怎么量化、模型和真实硬件之间的信号怎么打通、故障注入用例怎么设计才有效,以及那些不跑现场根本总结不出来的排查经验。如果你正在搭或者准备搭一套类似的半实物平台,这篇内容能帮你少踩一半的坑。

1. 这层“防线”到底防的是什么

1.1 半实物仿真的本质价值

先说一个简单的道理:飞机在天上飞,控制律出了问题是没有机会“重启”的。飞行控制系统从需求到上天,要经历一系列验证阶段。全数字仿真可以验证控制逻辑的数学正确性,但它有个天然缺陷——它跑在普通计算机上,感知不到真实硬件的时间约束、接口特性、电气特性。全实物试验倒是最真实,但代价高、风险大、周期长,而且很多故障场景根本不敢在真机上制造。

半实物仿真(Hardware-in-the-Loop,简称HIL)就夹在这两者中间。它把“真实的飞控计算机硬件”接进“虚拟的被控对象环境”中。飞控计算机端到端连接的是真实的传感器/执行机构接口,仿真机端实时解算飞机动力学模型、传感器模型和执行机构模型,把电气信号通过I/O接口送给飞控。这样一来,控制律代码跑在真实的处理器上,用真实的编译器产物,经过真实的引脚和线缆传输,面对的却是可以随意设置故障、随意改变气象条件的虚拟天空。

这套平台真正防住的风险有两种。第一种是控制律“逻辑级缺陷”,比如某个边界条件下状态机走错了分支、某个通道的增益在特定模态下异常放大。这种缺陷在纯数字仿真里很容易因为建模理想化而被掩盖,但在半实物环境下,真实的采样抖动、信号噪声、时序延迟会把这些缺陷激发出来。第二种是“软硬件匹配问题”,比如接口协议定义不一致、总线时序不满足要求、复位逻辑异常,这类问题只能让真实硬件连上仿真回路才能暴露。防线防的就是这两种问题带着隐患飞到天上去。

1.2 半实物平台和纯软件仿真、铁鸟试验的区别

很多刚接触这个领域的人会混淆几个概念。纯软件仿真(Model-in-the-Loop / Software-in-the-Loop)跑的模型和代码都还在普通计算机环境中,没有真实的硬件参与。铁鸟试验则是把真机的液压系统、机械机构、飞控计算机全部按真机布局装在一起进行综合试验,投入巨大、场地需求高,通常放在型号后期。半实物平台在三者中扮演的能力角色是“介于两者之间的全覆盖验证层”。

我用一个表格把这几个层级整理一下,方便你对照看:

验证层级飞控硬件被控对象模型实时性要求典型用途相对成本
纯软件仿真无(虚拟)高保真数学仿真无严格实时要求控制律快速迭代、回归低
半实物仿真真实飞控计算机实时模型(动力学+传感器+执行机构)硬实时接口验证、故障注入、边界测试中
铁鸟试验真实全套设备真实机械结构+部分模拟载荷严格实时全系统集成、机电联合调试极高

在型号研制流程里,半实物平台不是“有了更好”,而是“必须有”。它把大量测试项从昂贵、危险的试验场搬进了实验室,而且具备可重复性。同一个故障场景,今天注入是一模一样的结果,明天复现还是一模一样的结果,这对问题归零至关重要。

2. 实时仿真环境的核心不是“算得快”而是“算得准”

2.1 平台分层架构与各个节点的职责

一套标准的飞控半实物仿真测试平台,从大的层次上可以按信号走向分成五层:

第一层是实时仿真机,核心计算设备,解算飞机六自由度动力学模型、发动机模型、传感器模型、舵机模型。它必须运行在实时操作系统上,比如带实时补丁的Linux、VxWorks、或专用的实时目标机环境。普通Windows跑仿真模型不是不能用,但一旦遇上线程调度抖动、页面中断,模型步长就会跳变,测试结果的可信度就打了折扣。

第二层是I/O接口与信号调理层。实时仿真机计算出的数据,要通过各类板卡变成真实的电压、电流、数字量、总线信号。比如模拟量输出通道要输出哪几个引脚是俯仰角速率信号,哪几个引脚是迎角传感器信号,量程是多少,是否需要电压变换。信号调理箱的作用就是把这些板卡信号和飞控的真实接口规范对齐,同时提供隔离保护,防止误接线烧坏昂贵的板卡。

第三层是被测对象,也就是真实的飞控计算机。它运行着实际装机使用的应用软件和底层驱动。这一层包含电源管理、激励信号输入、离散量输入输出、总线通信模块等。

第四层是监控与数据记录层。工程师需要实时观察关键状态变量、动态修改模型参数、注入故障、触发热线数据记录。典型的做法是一台上位机通过以太网或光纤连接实时仿真机,上位机跑监控界面、自动化测试脚本和数据库。

第五层是配线与接口适配层,这个环节看起来不起眼,实际上最容易出问题。从飞控的航插到仿真机板卡之间,要经过航插转接、线缆分线、信号定义映射。我见过太多项目因为线缆定义混乱导致调试几周无法推进,这一层必须有明确的接口控制文档支撑。

2.2 步长设定、负载率预算与抖动控制

实时仿真里最核心的三个量:步长、负载率、抖动。

步长(Simulation Step)是模型解算的最小时间单位,通常根据飞控的控制周期来确定。假设飞控内部的控制周期是1ms,那么仿真模型的主步长设置为1ms是常见做法,必要时使用更小步长,比如0.5ms,用来逼近快速动态过程。但“步长越小越好”是个误区。步长缩小一倍,同一个任务周期内需要执行的解算步数就多一倍,CPU负载率上升,反而可能导致超时和抖动。合理的步长选择方式是:确认飞控控制律的最快时间常数,再留出2到5倍的余量,然后实测负载率,最后做出决定。

负载率是指单个步长周期内CPU实际执行模型解算的时间占比。打个比方,一个1ms的步长周期就像一节45分钟的课,模型解算任务分配了30分钟,那负载率大约67%。工程上我习惯的经验阈值:常规工况下实时仿真机的负载率不要超过70%,峰值情况不建议超过85%。如果负载率长期逼近90%,遇到中断风暴或者其他偶发高优先级任务时,模型步长很容易超时,抖动随之而来。

抖动(Jitter)是实际任务触发时刻与理论触发时刻的偏差,直接反映实时系统的“节拍准不准”。测量方法很简单:把仿真机某个数字量输出通道配置成在每个步长开始时翻转电平,用示波器观察这个方波的周期和脉宽。理论步长如果是1ms,你看到方波周期稳定在1.000ms左右,抖动很小,说明实时性合格。如果周期忽大忽小,甚至出现明显的毛刺,就需要排查。

数据上,我一般要求主步长的周期抖动控制在±50微秒以内,极端情况下不超过±100微秒。超过这个范围,对于某些高频动态模型(比如结构模态接近仿真带宽的弹性机体模型),误差会被明显放大,测试结论容易失真。

在实际工程中,有一个容易踩的坑:把文件写入、打印日志、数据显示这类耗时不确定的操作直接放在实时任务里。例如,在实时线程中调用printf,表面上看只多了一行代码,实际执行时可能会触发控制台I/O阻塞,一次阻塞就是几毫秒,这在1ms步长下意味着直接失去好几个节拍。正确的做法是:实时任务里只做模型解算和信号交换,需要记录的数据先放到无锁缓冲区,再由低优先级的非实时线程负责缓冲区数据的落盘和上报。

3. 从模型到真实硬件,信号联通的每一步都是细节

3.1 模型信号与真实电气接口之间的“翻译”过程

仿真模型里的信号是数学量,比如迎角10度、角速率20度每秒。但这些量到了飞控的接口端就是实实在在的电压、电流和总线报文。中间的“翻译”过程要靠I/O配置和信号调理来实现。

举一个典型的例子。飞控上某个迎角传感器接口定义为模拟量输入,量程是0~5V,映射关系是0V对应-15度迎角,5V对应+45度迎角。那么仿真机模型计算出迎角10度,对应电压大小为(10-(-15))/(45-(-15))×5V≈2.083V,这个电压要通过模拟量输出通道精确送到飞控对应的引脚上。模型、I/O板卡、信号调理箱和飞控接口的映射关系,必须要在投产前全部以接口控制文档的形式固定下来。

这个环节里最烦杂的往往是“信号极性”和“量纲换算”。有些通道是单极性电压,有些是双极性差分电压,还有的是电流环信号。换算关系一旦写错,测试结果会出现系统性的偏差,而且不跑几个特定工况真发现不了。举个例子,某通道实际每伏对应25度每秒,接口文档里误写成20度每秒,那么当仿真模型真实输出200度每秒角速率时,飞控端收到的电压对应的是160度每秒。这种偏差不动声息,数据分析时要扑空很久。

我习惯的做法是建一张“IO映射总表”,包含通道号、信号名称、信号类型、物理量程、电气量程、增益系数、偏置、极性说明、关联线缆编号、关联航插孔位。模型开发人员、板卡配置人员、测试用例设计人员,全部以这同一张表为准。多人协作时,这张表放到版本管理里,任何改动都必须走变更流程。

3.2 接线、供电与上电时序的经验细节

硬件联调阶段,接线和供电的规范程度直接决定后面几个月的调试效率。

上电之前必须完成的工作是这样的:第一步,用万用表导通档逐一确认线缆两端孔位的对应关系,特别是航插转接部分,防止压错线。第二步,接线完成后,在所有供电节点测量对地电阻,确认没有短路。第三步,断开负载空载上电,测量各电源输出电压幅值是否在设计范围内。这几步很多人嫌麻烦跳过,但一旦出现短路烧板、电压异常烧芯片,返修成本远高于这几分钟的检查成本。

上电时序也非常讲究。包含飞控在内的整套设备,通常要求“先激励电、后逻辑电”。道理不难理解:先让传感器、舵机等外围执行机构获得工作电源,再让飞控的逻辑电路上电,避免飞控在上电瞬间读取到无意义的激励状态。反之,断电时则要先断逻辑电,再断激励电。这个时序可以通过时序控制盒或者手动操作流程来保证。项目初期如果没有严格按这个时序执行,很容易出现飞控上电瞬间总线异常报故障,排查了很久才发现是时序问题。

信号回灌和共地问题也要单独讲一下。半实物平台里,仿真机板卡地、飞控地、电源地、调理箱地需要有一个明确的共地策略。最稳妥的做法是:所有设备采用单点共地,防止多点接地形成地环路,地环路上的电流会产生压差,直接叠加到模拟量信号上,导致采集跳变。我在实际项目中处理过一个疑难问题:某路模拟量采样值存在50Hz正弦波动,经排查就是地环路引入的电源工频干扰,把该路信号的屏蔽层单端接地、设备重新共地后,波动完全消失。

4. 故障注入不是“随便弄坏一个信号”这么简单

4.1 故障注入的层次与具体手段

故障注入测试是做半实物仿真最有价值、也最有技术含量的部分。它要回答的问题是:当真实的传感器或执行机构发生某种故障时,飞控是否能在规定时间内检测并进入正确的降级或容错逻辑。

故障注入可以分三个层次来做。

第一层是模型级注入。在仿真模型中直接改变传感器/执行机构的输出属性。比如把某个角速率传感器的噪声方差瞬间增大100倍,或者让迎角信号突然跳到物理量程上限。这种方式的优点是无需改动硬件接线,可以批量、快速执行。局限是它模拟的是“信号层面”的异常,模拟不了真实的电气故障(比如线缆断开产生的浮空电平行为)。

第二层是链路级注入。在仿真机与飞控之间的线缆或调理箱上做文章,比如通过专用故障注入单元物理断开某路信号、把某路信号与电源短接、在信号回路上串联一个电阻或电容。这种方式可以产生更真实的硬件故障行为。比如,真实线缆断开时传感器信号线处于高阻状态,飞控端读取的电压值会漂移到意想不到的位置,这种“非理想故障特性”只有链路级注入才能模拟。

第三层是设备级注入。针对总线通信、供电等环节做故障设置,比如在CAN总线上周期性地注入错误帧、让某个供电支路出现微秒级的瞬断、或者模拟电磁干扰导致的串扰噪声。设备级注入对测试平台本身的复杂度要求较高,通常需要在总线路由和供电路由上预留故障注入节点。

软件层面也需要一个故障注入管理框架。核心功能包括:故障模型库(每种故障类型的参数化定义)、注入调度器(指定在哪个仿真时刻、持续多长时间、以什么时序注入故障)、自动判读接口(故障注入后自动检测飞控响应标志)。整个注入过程最好通过测试脚本控制,而不是靠人工在监控界面上手动触发,这样才能保证故障用例批量执行和可复现。

4.2 一个故障测试矩阵的搭建过程

搭建故障测试矩阵,要从需求出发反向设计。拿一套典型的飞行控制律来说,故障注入需求通常源自系统安全性分析(比如功能危险分析、故障树分析)中识别出的关键故障模式和相应的容错需求。每个需求必须转化为一条或多条可执行的仿真测试用例。

我的习惯是先列一个“故障模式×飞行阶段×飞控工作模态”的三维矩阵。故障模式包括:传感器卡死、传感器漂移、传感器噪声增大、执行机构卡死、执行机构效率下降、总线通信中断、总线数据超时、供电瞬断等。飞行阶段至少覆盖起飞滑跑、爬升、巡航、下降、着陆等典型工况。飞控工作模态包括:人工飞行、指令飞行、自动飞行、着陆拉起等。

一个具体用例可以这样设计。故障类型:左侧升降舵舵机位置反馈信号卡死在中位偏下2度的位置。故障注入时刻:飞机处于巡航平飞状态,飞控处于自动飞行模态。预期结果:飞控应在故障注入后400ms内检测到舵面位置反馈与指令不一致并给出故障标志,随后自动切换到备份控制通道,同时向地面站发送维护告警,飞机姿态变化保持在正常包线内。

执行这个用例后,需要采集的数据包括:故障标志出现时刻、飞控重构动作时刻、重构后飞机姿态的最大偏差、故障期间各舵面指令和反馈的偏差曲线。判读规则是:若飞控未能在预期时间内检测故障,或者切换后飞机姿态发散超限,则用例不通过,问题反馈给控制律团队定位修复。

故障注入测试的用例数量往往很大。一套完整的飞控系统,相关故障用例做到上千条很正常。如果没有自动化的用例管理和执行工具,单靠人工点鼠标,整个测试周期会拖得极其漫长。这也是为什么我在前面的架构里强调,平台必须配套一套自动化测试管理软件,至少要做到用例按批次执行、数据自动归档、报告自动生成。

5. 现场排查实录:那些非常耗时又必须解决的问题

5.1 三个典型的故障现象复盘

第一个问题出现在某个版本的模型上线后,仿真机主步长1ms,负载率约75%,但抖动已经超出指标,最大达到300微秒。排查过程并不复杂,先在实时任务里加了一个时间戳翻转脉冲,用示波器对比发现抖动是间歇性的,大约每1秒左右出现一次较大的周期抖动。进一步定位发现,监控上位机每1秒刷新一次图形界面,图形数据通过共享内存和实时仿真机交互,刷新瞬间占用了大量CPU时间片,实时任务被抢占。解决方案是物理隔离,监控数据交互改走单独的通信核,并且限制上位机图形刷新频率。

第二个问题是某路模拟量输入信号在特定工况下出现频繁跳变。从飞控端看,某个传感器电压在一个时间段内反复波动,仿佛是故障注入在生效,但实际并没有注入任何故障。用示波器在调理箱输出端测量,发现信号上有明显的毛刺叠加。排查发现是给传感器供电的开关电源纹波偏大,纹波通过电源线耦合到了信号线上。处理办法是给供电增加一级线性稳压滤波,并把信号线换成屏蔽双绞线,屏蔽层单端接地。

第三个问题最有代表性:某条测试用例第一次执行通过,一周后回归测试时结果无法复现,飞控响应时间差异达到100ms以上。这件事一开始让团队很困惑,因为参数没有改动。后来深挖发现,这周期间有一个仿真模型参数文件被无意中改过版本,但模型运行时的版本号记录没有跟数据归档做绑定,导致回看数据时完全没有意识到模型已经变了。从那以后,整个团队定了一条铁规矩:每次测试执行完成后,系统自动生成环境基线清单,包含模型版本、配置文件哈希值、实时仿真机软件版本、I/O板卡固件版本,全部和测试数据绑定存储。没有这套机制,测试数据的可追溯性就是空谈。

5.2 排查工具与日常巡检清单

半实物平台的排查,多数时候靠的是一台示波器、一个万用表和一个好的实时任务监控界面。示波器用来测关键信号的时序、抖动、毛刺;万用表用来做导通测试和电压测量;实时任务监控界面用来观察各任务的执行时间、超时次数、CPU占用率和中断统计。

日常巡检方面,我整理了一个固定清单,每次试验前照着走一遍:

  • 检查所有供电电压是否在额定范围内,特别是飞控的激励电和逻辑电。
  • 检查地线连接是否可靠,机柜和设备之间是否有电位差。
  • 检查航插、线缆、转接盒的接插件是否紧固,防止接触不良引起偶发信号异常。
  • 检查实时仿真机CPU负载率、内存余量、磁盘剩余空间,确保长时间连续测试不会中途崩溃。
  • 用示波器抽查主步长翻转脉冲,确认抖动在指标内。
  • 检查故障注入箱的所有继电器通道处于默认状态(未注入),避免上个批次的故障残留影响本次测试。

这套清单看起来基础,但每一条背后都有血泪教训。接插件松动导致的偶发断线,是最隐蔽的问题之一。某个信号时好时坏,往往不是逻辑上的问题,而是某根插针没有压到位。用10分钟做导通测试,好过用3小时排查一个时有时无的异常信号。

6. 平台持续运行的团队协作与机制建设

6.1 版本管理与环境基线的强制要求

半实物仿真平台涉及的东西非常多:飞机模型、传感器模型、执行机构模型、飞控软件版本、实时仿真机配置、I/O映射表、故障注入定义、线缆定义、上位机测试工具。任何一个环节的改动都可能影响测试结论。如果没有严格的版本管理,时间一长就会陷入“现在的环境到底是哪个版本”无法确认的困局。

环境基线这个概念必须建立起来。一条完整的环境基线至少包括:模型代码的版本号和编译哈希值、配置文件版本、实时仿真机应用版本、I/O板卡固件版本、飞控软件版本、测试工具版本、线缆连接图版本、IO映射表版本。测试执行前,平台自动核对当前环境与计划使用基线的匹配度;测试执行后,把这条基线快照绑定到测试报告和原始数据中。

某公司在做一个型号的回归测试时,正是因为模型代码在某个深夜被同事用旧版本覆盖,第二天连续跑了六条用例全部异常,团队排查了一天半才发现是版本错位。有了基线自动核对功能后,类似问题在用例执行前就会被系统拦截,避免了大量无效劳动。

6.2 平台从“能跑通”到“可信赖”的几个关键动作

很多平台初步搭起来时,能打通几个正规模拟场景,大家就觉得已经完成了。但从工程实用的角度看,这只是起点。平台要真正成为研发流程的质量关卡,还要补齐几个关键能力。

第一个是回归测试的常态化。飞控软件更新频繁,每次更新都可能引入新的软件缺陷,因此每次飞控软件发布前,都必须把冒烟测试用例集自动跑一遍。冒烟用例不用多,覆盖各飞控模态下的基本功能即可,但必须保证在平台上是全自动执行、全自动判读的。改一个参数就重跑全量测试,人工来干既费时又容易漏项,自动化脚本是唯一的出路。

第二个是数据管理的规范化。一次完整的半实物测试会记录几十路信号、持续数小时,数据量轻松达到几十GB。数据要有统一的文件命名规范,包含用例编号、测试日期、环境基线编号、批次号。没有规范的数据管理,事后分析时找数据的时间比分析的时间还长。

第三个是跨团队的接口对接机制。建模团队、板卡配置团队、硬件保障团队、飞控软件团队、测试用例设计团队,每个团队负责的环节不同,但对同一套平台的接口理解必须一致。我建议每两周固定召开一次接口对齐会,协调解决IO映射变更、模型边界调整、故障定义新增等事项。这个会不用开太久,但必须坚持,否则接口漂移会在某个时间点集中爆发。

第四个是持续积累问题库。平台运行期间遇到的所有异常现象、排查过程、根因结论、预防措施,都统一记录到问题库中。这个库是团队最宝贵的资产之一。新人接手平台调试时,翻一翻问题库,能避免重复踩坑。团队能力不因人员流动而流失,这一点在长期项目中特别重要。

从我个人的实践看,半实物平台的搭建,技术方案的难度往往不是最大的,真正难的是把机制建设起来并严格执行。头一次搭平台时,我们花了大量精力在设备选型和模型调试上,后来才发现,花在接口文档、基线管理和问题库上的时间,带来的回报率是最高的。一个环境状态清晰、数据可追溯、用例可自动执行的平台,才真正称得上研发防线的核心节点。这个系列后面还会继续聊聊模型可信度评估和自动化测试脚本框架的设计思路,那些内容同样值得单独展开细说。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进