2. 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分钟就能跑完,效率提升很明显。
2.3 地面站连接与监控
仿真跑起来了,参数也理解了,接下来就是连接地面站。我个人推荐QGroundControl,它和PX4配合最默契,而且支持仿真自动发现。
连接步骤很简单:
- 启动QGroundControl(如果已经开着,重启一下)
- QGC会自动检测到本地的SITL仿真,弹出连接提示
- 点击连接,或者去「通信设置」手动添加UDP连接:目标主机
127.0.0.1,端口14550
连接成功后,你会看到:
- 地图上出现飞机图标,位置就是你设置的起飞点
- 仪表盘显示姿态、高度、空速、电池等数据
- 右上角状态栏显示「已连接」
这时候你可以试试:
- 用鼠标拖拽地图上的飞机,给它一个目标点
- 切换到「任务」模式,上传一条简单的航线
- 观察终端里飞控打印的日志,看看mavlink消息是怎么交互的
下面这张图展示了SITL仿真中各个组件的关系:
从这张图可以看得很清楚:PX4飞控和Gazebo仿真器通过MAVLink双向通信,飞控发送电机指令,Gazebo返回传感器数据。同时飞控还通过另一个MAVLink通道连接地面站,供你监控和干预。
我个人习惯,在仿真里会先做这几件事来验证环境是否正常:
- 检查姿态数据是否随模型晃动而变化
- 手动切到「位置模式」,推油门看看飞机是否离地
- 查看日志里的传感器数据,确认没有异常跳变
如果这些都正常,恭喜你,你的SITL环境已经就绪,可以开始真正的开发调试了。