第1章:SITL环境搭建——把飞控搬进你的电脑
做无人机调参,最怕什么?
怕炸机。怕电池没电。怕GPS丢星。怕桨叶打到手。
所以,我们先用SITL——软件在环仿真。说白了,就是把飞控代码当成一个普通程序,在你的电脑上跑起来。没有硬件,没有桨叶,没有风险。我做了这么多年飞控,可以负责任地告诉你:SITL是调参效率最高的方式,没有之一。
本章目标:装好ArduPilot SITL、配好MAVProxy、连上Mission Planner。三件事做完,你的电脑就是一台虚拟无人机。
1.1 整体架构:SITL怎么工作的?
先看一眼整体流程。别急着敲命令,搞清楚数据怎么流,后面出错了你才知道去哪查。
看到这个图你就明白了: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
- 打开Mission Planner
- 右上角下拉框选择 UDP
- 端口填 14550(默认)
- 点击 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章的实验平台。所有调参、试错、炸机(虚拟的),都在这里进行。没有成本,没有风险,随便折腾。