2、SITL软件在环仿真:启动SITL仿真、理解仿真参数、地面站连接与监控

好,咱们正式开始动手。上一章我们把环境搭好了,这一章就来跑第一个仿真——SITL。说白了,就是在一台电脑上模拟出一整架无人机,包括飞控、传感器、甚至物理模型。你不需要真飞机,也能调试代码、验证航线。

我个人习惯,每次开始新项目前,都会先跑一遍SITL,确保工具链是通的。这步要是卡住,后面真机调试会更痛苦。

2.1 启动SITL仿真

启动SITL其实就一行命令。但别小看它,背后PX4帮你做了很多事:编译飞控固件、启动仿真环境、连接地面站。我建议你从终端直接运行,这样能看到完整的启动日志,方便排查问题。

cd ~/PX4-Autopilot
make px4_sitl gazebo-classic

这条命令会做三件事:

  • 编译固件:把PX4源码编译成可在本机运行的仿真版本
  • 启动Gazebo:加载四旋翼模型和默认世界
  • 建立通信:在UDP端口14540上开放mavlink接口

等终端出现 Ready for takeoff! 字样,就说明仿真跑起来了。嗯,这里要注意,第一次编译会下载依赖,耗时比较长,大概10-20分钟。别急,去喝杯咖啡。

小技巧: 如果你只想快速验证飞控逻辑,不想开图形界面,可以用 make px4_sitl none_iris。这样只启动飞控进程,不加载Gazebo,启动速度会快很多。

2.2 理解仿真参数

仿真跑起来了,但你真的了解它在用什么参数吗?我在项目中遇到过好几次,同事在仿真里调得好好的,一上真机就炸,原因就是仿真参数和实机参数不一致。

SITL启动时,默认加载的参数文件在 ROMFS/px4fmu_common/init.d-posix/rcS 里。你可以通过环境变量覆盖这些参数。常用的几个:

环境变量 作用 默认值
PX4_HOME_LAT 设置仿真起飞点纬度 47.397742
PX4_HOME_LON 设置仿真起飞点经度 8.545594
PX4_SIM_SPEED_FACTOR 仿真速度倍率(1=实时) 1
PX4_ESTIMATOR 选择状态估计器(ekf2/lpe) ekf2

举个例子,你想让飞机从北京起飞,并且以2倍速运行仿真:

PX4_HOME_LAT=39.9042 PX4_HOME_LON=116.4074 PX4_SIM_SPEED_FACTOR=2 make px4_sitl gazebo-classic

为什么会用到速度倍率?我调试长航时航线时,经常设到5倍甚至10倍,这样原本1小时的飞行,12分钟就能跑完,效率提升很明显。

注意: 速度倍率设太高(比如超过10),仿真物理引擎可能不稳定,导致飞机异常抖动。我曾经吃过这个亏,调了一下午以为是控制参数问题,最后发现是倍率设太高了。

2.3 地面站连接与监控

仿真跑起来了,参数也理解了,接下来就是连接地面站。我个人推荐QGroundControl,它和PX4配合最默契,而且支持仿真自动发现。

连接步骤很简单:

  1. 启动QGroundControl(如果已经开着,重启一下)
  2. QGC会自动检测到本地的SITL仿真,弹出连接提示
  3. 点击连接,或者去「通信设置」手动添加UDP连接:目标主机 127.0.0.1,端口 14550

连接成功后,你会看到:

  • 地图上出现飞机图标,位置就是你设置的起飞点
  • 仪表盘显示姿态、高度、空速、电池等数据
  • 右上角状态栏显示「已连接」

这时候你可以试试:

  • 用鼠标拖拽地图上的飞机,给它一个目标点
  • 切换到「任务」模式,上传一条简单的航线
  • 观察终端里飞控打印的日志,看看mavlink消息是怎么交互的
核心要点: SITL + QGC 构成了一个完整的「开发-调试-验证」闭环。你可以在仿真里测试所有地面站功能,包括参数调整、航线规划、日志下载,这些操作和真机完全一致。

下面这张图展示了SITL仿真中各个组件的关系:

SITL 软件在环仿真架构 用户输入 make px4_sitl gazebo-classic PX4 飞控固件 姿态控制 · 导航 · 状态估计 Gazebo 仿真环境 物理引擎 · 传感器 · 模型 MAVLink 通信 UDP 14540 · 消息协议 QGroundControl 地面站 UDP 14550 · 监控 · 航线 · 调参 说明: 飞控通过MAVLink与Gazebo交换传感器和作动器数据,同时通过另一个MAVLink通道与地面站通信。 用户只需一条命令,即可启动整个仿真链路。

从这张图可以看得很清楚:PX4飞控和Gazebo仿真器通过MAVLink双向通信,飞控发送电机指令,Gazebo返回传感器数据。同时飞控还通过另一个MAVLink通道连接地面站,供你监控和干预。

我个人习惯,在仿真里会先做这几件事来验证环境是否正常:

  • 检查姿态数据是否随模型晃动而变化
  • 手动切到「位置模式」,推油门看看飞机是否离地
  • 查看日志里的传感器数据,确认没有异常跳变

如果这些都正常,恭喜你,你的SITL环境已经就绪,可以开始真正的开发调试了。