3. HITL硬件在环仿真

讲完了SITL纯软件仿真,咱们得聊聊更贴近实战的玩法——HITL(Hardware-in-the-Loop)。说白了,就是把真实的飞控硬件(比如Pixhawk)连到电脑上,让它在虚拟世界里飞。

我最早接触HITL时,心里也犯嘀咕:这不就是SITL加块板子吗?后来踩了坑才明白,两者差别大了去了。HITL能验证硬件驱动、传感器时序、甚至固件在真实MCU上的跑分表现。你想想看,SITL跑得再欢,也测不出I2C总线上的干扰问题。

一句话总结:SITL测逻辑,HITL测硬件。两者互补,缺一不可。

3.1 硬件在环的核心逻辑

HITL的原理其实不复杂。飞控板通过USB或串口连到PC,PC上跑着Gazebo或PX4的仿真环境。仿真器把传感器数据(IMU、GPS、气压计)通过MAVLink协议喂给飞控。飞控以为自己在真飞,实际上在虚拟世界里打转。

我习惯把HITL比作「飞行模拟器」——飞行员在模拟舱里操作,仪表盘上的数据都是假的,但操作杆的反馈是真的。HITL也一样,飞控输出的PWM信号被仿真器截获,换算成电机推力,再更新物理模型。

HITL 硬件在环仿真数据流 真实飞控硬件 Pixhawk / Cube MAVLink 桥接 mavlink-router / udp 仿真环境 Gazebo / jMAVSim 传感器数据反馈 关键区别: • SITL:飞控代码在PC上运行,不涉及真实硬件 • HITL:飞控代码在真实MCU上运行,传感器数据由仿真器注入 • 输出:HITL可以验证PWM输出、RC输入、SD卡日志等硬件接口

3.2 硬件连接与准备工作

动手之前,先把家伙事儿备齐。我列个清单,你照着准备就行。

硬件/软件 说明 备注
飞控板(Pixhawk 4 / Cube Orange) 刷好HITL专用固件 固件版本需与仿真器匹配
USB数据线 连接飞控与PC 建议用带屏蔽的线,抗干扰
QGroundControl 地面站,用于配置和监控 v4.2以上版本
Gazebo / jMAVSim 仿真环境 推荐Gazebo,模型更丰富
PX4 Firmware 源码编译或预编译固件 make px4_fmu-v5_hitl
注意:飞控板在HITL模式下,不要连接任何真实传感器(GPS、磁罗盘、气压计)。仿真器会模拟这些数据,真实传感器反而会干扰仿真结果。我曾经有一次忘了拔GPS,结果飞控在仿真里死活不肯解锁——查了半天才发现是真实GPS信号在捣乱。

3.3 HITL配置步骤

配置过程其实不复杂,但步骤顺序很重要。我习惯按这个流程走,基本一次过。

  1. 编译HITL固件
    cd ~/PX4-Autopilot
    make px4_fmu-v5_hitl
    
    编译完成后,固件在 build/px4_fmu-v5_hitl/px4_fmu-v5_hitl.px4。
  2. 刷写固件

    用QGC刷写。连上飞控,在「固件」页面选择「高级设置」→「自定义固件文件」,选中刚才编译好的 .px4 文件。刷完后飞控会自动重启。

  3. 配置HITL参数

    在QGC的参数列表中,修改以下关键参数:

    参数名 值 说明
    SYS_HITL 1 启用HITL模式
    COM_RC_IN_MODE 0 RC输入模式,HITL下通常用虚拟RC
    SIM_GPS1_ENABLE 1 启用仿真GPS
  4. 启动仿真环境
    make px4_sitl gazebo_iris
    注意:这里虽然用了 px4_sitl 命令,但实际启动的是Gazebo仿真器。飞控硬件会通过MAVLink连接到仿真器。
  5. 连接飞控与仿真器

    在QGC中,确认飞控已经通过USB连接。仿真器启动后,会自动在UDP端口14550上监听。飞控的HITL固件会主动向仿真器发送传感器数据请求。

  6. 验证连接

    在QGC的「状态」页面,查看GPS、姿态、气压计数据是否在跳动。如果数据稳定更新,说明HITL连接成功。

小技巧:我习惯在启动仿真器之前,先用 mavlink-router 把飞控的串口数据转发到UDP。这样即使仿真器崩溃,QGC还能保持连接,方便排查问题。

3.4 HITL与SITL的差异对比

很多新手会问:既然SITL那么方便,为什么还要折腾HITL?我直接给你列个对比表,看完就明白了。

对比维度 SITL HITL
运行平台 PC(Linux / macOS / Windows) 真实飞控硬件(STM32 / STM32H7)
传感器数据 完全由仿真器生成 仿真器生成,通过MAVLink注入飞控
执行器输出 仿真器直接计算电机模型 飞控输出真实PWM信号,仿真器捕获后计算
RC输入 键盘/手柄映射 真实RC接收机或虚拟RC
固件验证 验证算法逻辑 验证固件在真实MCU上的运行稳定性
调试难度 低,可直接GDB调试 中等,需通过SWD或串口日志
适用场景 算法开发、快速原型验证 硬件驱动测试、时序验证、系统集成测试

说白了,SITL是「软仿真」,适合在代码层面快速迭代。HITL是「硬仿真」,能暴露硬件相关的问题。我遇到过最典型的例子:SITL里跑得好好的航线,上了HITL就偏航。查了半天,发现是磁罗盘的I2C时序在真实硬件上有延迟,导致航向数据滞后。

我的建议:开发阶段先用SITL把算法逻辑调通,然后切换到HITL做硬件验证。两个都跑通了,再上真机试飞。这个流程能帮你省下不少炸机的钱。

3.5 常见问题与避坑指南

HITL配置过程中,有几个坑我替你们踩过了,直接说重点。

  • 飞控无法解锁:检查 SYS_HITL 参数是否设为1。如果没设,飞控会认为自己在真机上,检测不到GPS就会拒绝解锁。
  • 仿真器收不到飞控数据:确认USB线是否支持数据传输。有些充电线只能充电,不能传数据。我吃过这个亏,换了根线就好了。
  • 姿态数据跳动:检查飞控的固件版本是否与仿真器匹配。我建议都用最新稳定版,避免协议不兼容。
  • PWM输出异常:HITL模式下,飞控的PWM输出是真实的。如果接了电调或舵机,注意不要接动力电源,否则可能烧坏设备。
安全提醒:HITL虽然是在仿真,但飞控的PWM输出是真实存在的。如果你把飞控连到了电调和电机上,务必卸掉螺旋桨。我曾经见过有人忘了卸桨,仿真器一启动,电机直接转起来,差点伤人。

嗯,HITL的内容差不多就这些。记住一句话:SITL帮你把逻辑跑通,HITL帮你把硬件跑稳。两者结合,才是完整的仿真测试流程。