第1章:SITL环境搭建——把飞控搬进你的电脑

做无人机调参,最怕什么?

怕炸机。怕电池没电。怕GPS丢星。怕桨叶打到手。

所以,我们先用SITL——软件在环仿真。说白了,就是把飞控代码当成一个普通程序,在你的电脑上跑起来。没有硬件,没有桨叶,没有风险。我做了这么多年飞控,可以负责任地告诉你:SITL是调参效率最高的方式,没有之一。

本章目标:装好ArduPilot SITL、配好MAVProxy、连上Mission Planner。三件事做完,你的电脑就是一台虚拟无人机。

1.1 整体架构:SITL怎么工作的?

先看一眼整体流程。别急着敲命令,搞清楚数据怎么流,后面出错了你才知道去哪查。

SITL 环境数据流 ArduPilot SITL 模拟飞控固件 MAVProxy 数据转发/路由 Mission Planner 地面站/GUI 💡 数据流向 SITL 模拟传感器 → MAVProxy 转发 MAVLink 消息 → Mission Planner 显示仪表盘 UDP 14550 端口 飞控→地面站 TCP 5760 端口 MAVProxy 控制台 UDP 14551 端口 额外 GCS 连接 你的电脑 = 飞控 + 传感器 + 执行机构(全虚拟)

看到这个图你就明白了:SITL在最左边模拟飞控和传感器,MAVProxy在中间做路由转发,Mission Planner在最右边当你的仪表盘。三个进程通过UDP/TCP通信,全都在你一台机器上跑。

1.2 安装ArduPilot SITL

我建议你用Linux环境。Windows也能跑,但坑多。我个人习惯用Ubuntu 22.04 LTS,稳定,社区支持好。

1.2.1 克隆代码仓库

# 先装依赖
sudo apt update
sudo apt install git python3-pip python3-venv

# 克隆 ArduPilot 源码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 更新子模块(这一步比较慢,耐心等)
git submodule update --init --recursive

我的经验:子模块下载经常因为网络问题失败。如果你在墙内,建议用代理,或者直接去GitHub下载release包。我曾经在客户现场用手机热点拖了40分钟才下完,尴尬。

1.2.2 安装Python环境

# 创建虚拟环境(推荐)
python3 -m venv ardupilot_env
source ardupilot_env/bin/activate

# 安装 MAVProxy
pip install mavproxy

# 安装其他 Python 依赖
pip install -r requirements.txt

嗯,这里要注意:MAVProxy必须装在虚拟环境里,否则后面会跟系统Python包打架。我见过有人直接pip install全局装,结果跟ROS冲突,折腾了一下午。

1.2.3 编译SITL

# 以 Copter 为例
cd ardupilot
./waf configure --board sitl
./waf copter

# 验证安装
./Tools/autotest/sim_vehicle.py -v ArduCopter --map --console

如果看到MAVProxy控制台弹出来,地图上出现一架小飞机,恭喜你,SITL跑起来了。

⚠️ 常见问题:编译时提示缺少g++或cmake。别慌,apt install build-essential cmake就能解决。还有,waf编译不支持并行任务太多,我建议用 -j4,别贪心。

1.3 MAVProxy配置

MAVProxy是SITL和地面站之间的桥梁。说白了,它就是个MAVLink消息路由器。你想想看,没有它,Mission Planner根本收不到飞控的数据。

1.3.1 启动MAVProxy

上面那条命令其实已经自动启动了MAVProxy。但如果你想手动控制,可以这样:

# 手动启动 MAVProxy,连接 SITL 的 UDP 端口
mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:14550 --out udp:127.0.0.1:14551

参数说明:

参数 含义 我的建议
--master 连接SITL的地址 默认TCP 5760,别改
--out udp:14550 输出给Mission Planner Mission Planner默认监听这个端口
--out udp:14551 备用输出(比如QGC) 调试时很有用

1.3.2 常用MAVProxy命令

MAVProxy启动后,你会看到一个命令行界面。这里有几个我常用的命令:

# 查看当前模式
mode list

# 切换模式(比如切换到定高模式)
mode alt_hold

# 解锁(仿真环境随便玩)
arm throttle

# 起飞到10米高度
takeoff 1000  # 单位是厘米

# 查看参数
param show

# 修改参数
param set EKF_CHECK_THRESH 0.8

避坑指南:我曾经在仿真里忘了关EKF_CHECK_THRESH,结果模拟GPS飘了一下,飞控直接报错EKF方差过大,切不了模式。后来我习惯在SITL里先把EKF_CHECK_THRESH设到0.8,省得被误报打断调试。

1.4 Mission Planner连接

Mission Planner是Windows上的地面站。虽然它是Windows软件,但可以通过UDP连到Linux上的SITL。跨平台没问题。

1.4.1 下载与安装

去ArduPilot官网下载Mission Planner安装包。装好后,第一次启动会提示更新固件——别更新,我们用的是SITL,不需要刷硬件。

1.4.2 连接SITL

  1. 打开Mission Planner
  2. 右上角下拉框选择 UDP
  3. 端口填 14550(默认)
  4. 点击 Connect

如果一切正常,你会看到姿态仪表盘开始转动,地图上出现飞机位置。嗯,这时候你就能在Mission Planner里看到虚拟飞控的所有数据了。

连接成功的标志:HUD显示高度、空速、地速;地图上有蓝色箭头;右上角显示GPS状态为3D Fix。如果GPS显示No Fix,检查SITL是否在运行,或者端口是否被占用。

1.4.3 验证调参通道

连接成功后,试试在Mission Planner里修改一个参数,比如:

# 在MAVProxy控制台查看
param show RATE_ROLL_P

# 在Mission Planner里把RATE_ROLL_P从0.15改成0.20
# 然后在MAVProxy里确认
param show RATE_ROLL_P

如果两边数值同步,说明整个链路通了。你可以开始调参了。

⚠️ 端口冲突:如果你同时开了多个SITL实例,或者有其他地面站占用了14550端口,Mission Planner会连不上。我习惯用 netstat -an | grep 14550 检查端口占用。如果被占了,kill掉对应进程,或者换一个输出端口。

1.5 本章小结

到这,你的SITL环境就搭好了。我们做了三件事:

  • 装了ArduPilot SITL——虚拟飞控,能模拟传感器和动力学
  • 配了MAVProxy——消息路由,让数据在飞控和地面站之间流动
  • 连了Mission Planner——图形界面,让你能看到姿态、修改参数

这个环境就是你后面29章的实验平台。所有调参、试错、炸机(虚拟的),都在这里进行。没有成本,没有风险,随便折腾。