第三章 测试环境搭建:硬件在环(HIL)与软件在环(SIL)
各位工程师,大家好。这一章我们聊聊测试环境搭建。说实话,很多团队在飞控开发初期,都急着把代码往真飞机上怼。结果呢?炸机、烧板子、电机堵转……我见过太多惨痛的教训了。
所以,在飞控验证测试里,环境搭建是地基。地基不稳,后面全是白干。我个人习惯把测试环境分成两类:软件在环(SIL)和硬件在环(HIL)。这两者各有各的用处,咱们一个一个说。
核心观点:SIL 跑逻辑,HIL 跑接口。两者结合,才能覆盖从算法到硬件的全链路验证。
3.1 软件在环(SIL)测试环境配置
SIL 说白了,就是让飞控代码跑在一个虚拟的飞机模型上。你想想看,代码还没烧进板子,就能先跑一圈,多省事。我刚开始做飞控时,总觉得 SIL 是浪费时间,后来有一次在 SIL 里发现了一个积分饱和的 bug,要是真机试飞,估计就炸了。从那以后,我再也不敢跳过 SIL。
3.1.1 SIL 环境的核心组件
- 飞控代码:你写的控制算法、状态估计、导航逻辑。通常是 C/C++ 或 Python。
- 飞机模型:一个数学仿真模型,模拟四旋翼、固定翼或 VTOL 的动力学。我常用的是 PX4 的 SITL 框架,或者自己搭的 MATLAB/Simulink 模型。
- 通信接口:飞控代码和模型之间通过 UDP、共享内存或 socket 交换数据。比如飞控发油门指令,模型回传姿态和位置。
- 可视化工具:比如 Gazebo、FlightGear 或 JMAVSim。能看到飞机在虚拟世界里飞,心里踏实。
我的小技巧:SIL 环境里,时间可以加速。比如你想跑 10 分钟的飞行,可以设置 2 倍速,5 分钟就跑完了。但注意,加速后模型稳定性会变差,别问我怎么知道的……
3.1.2 SIL 环境搭建步骤(以 PX4 SITL 为例)
- 安装依赖:Ubuntu 20.04 上装 GCC、CMake、Python3、Gazebo 等。我建议用脚本一键安装,别手动一个个装,容易漏。
- 下载源码:
git clone https://github.com/PX4/PX4-Autopilot.git,然后切到稳定分支。 - 编译 SITL 目标:
make px4_sitl gazebo。第一次编译会下载模型和依赖,大概 10-20 分钟。 - 启动仿真:运行
./Tools/sitl_run.sh,或者直接用make px4_sitl gazebo_iris。 - 连接地面站:QGroundControl 会自动检测到 UDP 端口,你就能看到虚拟飞机了。
# 快速启动命令示例
cd ~/PX4-Autopilot
make px4_sitl gazebo_iris
# 等待终端输出 "INFO [simulator] Waiting for simulator to connect..."
# 然后打开 QGC,就能看到飞机了
注意:SIL 环境里,传感器噪声和真实硬件不一样。我曾经遇到过 SIL 里飞得好好的,上 HIL 就抖。原因是 SIL 的 IMU 噪声模型太理想了。所以,SIL 只能验证逻辑,不能验证硬件适配。
3.2 硬件在环(HIL)测试平台搭建
HIL 就比 SIL 重多了。你需要真实的飞控板、传感器、甚至执行器。但回报也大——你能验证硬件接口、实时性、以及代码在真实 MCU 上的表现。
我个人习惯,HIL 是飞控验证的「最后一道防线」。过了 HIL,我才敢说「这版固件可以上真机」。
3.2.1 HIL 平台的硬件组成
| 组件 | 说明 | 我常用的型号 |
|---|---|---|
| 飞控板 | 运行飞控固件的 MCU 板 | Pixhawk 4、CUAV V5+ |
| 仿真器 | 模拟传感器和执行器信号 | dSPACE、NI PXI、或者自研的 STM32 仿真板 |
| 信号接口 | PWM、I2C、SPI、UART、CAN 等 | 根据飞控板接口定制 |
| 上位机 | 运行仿真模型和监控软件 | 工控机 + MATLAB/Simulink |
3.2.2 HIL 环境搭建步骤
- 硬件连接:把飞控板通过串口或 USB 连接到仿真器。注意电源和地线,别接反了。我见过有人把 5V 和 GND 接反,板子直接冒烟。
- 配置仿真模型:在 MATLAB/Simulink 里搭建飞机动力学模型,并配置 I/O 接口。比如 PWM 输出对应油门,UART 接收 GPS 数据。
- 编译飞控固件:针对你的飞控板编译 HIL 版本。PX4 有专门的
px4_fmu-v5_hil目标。 - 烧录固件:用 QGC 或命令行烧录到飞控板。
- 启动仿真:先启动仿真器上的模型,再给飞控板上电。顺序反了可能会造成通信超时。
- 监控数据:用 QGC 或 MATLAB 的 Scope 查看姿态、位置、控制输出等。
# 编译 PX4 HIL 固件示例
cd ~/PX4-Autopilot
make px4_fmu-v5_hil
# 烧录到飞控板(通过 USB)
./Tools/upload.sh px4_fmu-v5_hil
关键点:HIL 测试中,仿真器的实时性至关重要。如果仿真步长不稳定,飞控会误判为传感器故障。我建议仿真器的实时周期控制在 1ms 以内,抖动不超过 10% 。
3.2.3 避坑指南
- 我曾经遇到过:HIL 里飞控一直报「传感器超时」。查了两天,发现是仿真器的 I2C 速率设置太快,飞控板跟不上。后来把速率降到 100kHz,问题解决。
- 我曾经遇到过:PWM 信号在 HIL 里正常,但真机上电机不转。原因是 HIL 里用的 PWM 频率是 50Hz,真机电机需要 400Hz。所以,HIL 的参数必须和真机一致。
- 我曾经遇到过:仿真模型里忘了加地磁干扰,结果 HIL 里航向一直漂。后来加了地磁模型,才复现了真机上的问题。
我的建议:HIL 测试不要只跑正常情况。一定要注入故障——比如 GPS 丢失、IMU 饱和、电机堵转。这些才是 HIL 的价值所在。你想想看,真机上你敢故意拔 GPS 天线吗?HIL 里随便拔。
3.3 SIL 与 HIL 的对比与选择
| 维度 | SIL | HIL |
|---|---|---|
| 硬件需求 | 仅需一台电脑 | 需要飞控板、仿真器等 |
| 实时性 | 非实时(可加速/减速) | 硬实时(必须与真实时间同步) |
| 验证范围 | 算法逻辑、控制律 | 硬件接口、实时性、故障注入 |
| 搭建成本 | 低(免费开源工具) | 高(仿真器几万到几十万) |
| 适用阶段 | 算法开发初期 | 固件发布前 |
嗯,这里要注意:不要以为 SIL 跑通了,HIL 就一定能过。我见过太多团队在 SIL 里调好了 PID,上 HIL 就发散。原因往往是 SIL 里忽略了传感器延迟和量化误差。所以,我的流程是:先 SIL 调逻辑,再 HIL 调接口,最后真机试飞。
总结一句话:SIL 让你放心写代码,HIL 让你放心飞真机。两者缺一不可。