飞控算法从入门到精通 · 106 · 软件在环仿真(SIL)原理与实践
从一次炸机说起
去年夏天,我在调试一款自研四旋翼的姿态控制器。代码在STM32上跑得挺顺,Pixhawk的log曲线也漂亮,PID参数调了三天,自稳模式悬停误差能压到±3厘米。信心满满地挂上电池,解锁,推油门——飞机离地不到半米,突然一个猛烈的横滚,桨叶直接削到地面,电机堵转,电调冒烟。
事后复盘,问题出在积分饱和。我的抗饱和逻辑在仿真里跑过,但那个仿真用的是MATLAB的连续模型,而实际飞控是离散的、带量化误差的、传感器有延迟的。更致命的是,我从来没在“真实代码”上跑过完整的飞行场景——直到它真的飞起来。
从那以后,我养成了一个习惯:任何飞控代码改动,必须先过软件在环仿真(SIL),再考虑硬件在环(HIL),最后才上真机。这不是流程,是保命。
软件在环仿真到底在仿什么
很多人把SIL理解成“在电脑上跑飞控代码”,这没错,但太粗糙。SIL的核心是用软件模拟整个闭环系统:飞控代码(你写的控制律、状态估计、导航逻辑)运行在模拟的MCU环境里,而飞机本身、传感器、执行器、甚至风场和地磁干扰,全部用数学模型替代。
关键区别在于:SIL跑的是你最终要烧进芯片的那份代码,不是简化版,不是MATLAB函数,不是Python原型。是C,是那个带volatile关键字、有中断优先级、有浮点精度陷阱的C代码。
我见过太多团队用Simulink生成代码做SIL,然后发现生成代码和手写代码行为不一致。如果你用手写C,SIL就必须编译成目标平