4、MAVProxy入门:安装与基本操作

好,咱们进入第四章。前面几章我们把仿真环境搭起来了,SITL 也能跑了。但你会发现——光有仿真器,你没法跟它交互。你没法切模式、没法看参数、没法发指令。这时候就需要一个「翻译官」。

MAVProxy 就是这个角色。它是个轻量级的地面站,更准确地说,它是一个 MAVLink 协议的转发与命令行工具。我个人习惯把它叫做「管道工」——它把仿真器、地面站、甚至多个外部设备串在一起。

核心理解: MAVProxy 不是用来替代 QGroundControl 或 Mission Planner 的。它是用来做底层调试、自动化脚本、多链路转发的。说白了,它是给开发者用的,不是给飞手用的。

4.1 安装 MAVProxy

安装其实很简单。MAVProxy 是 Python 包,直接用 pip 装就行。但我建议你装在 Python 虚拟环境里,别污染系统 Python。

# 创建虚拟环境(如果你还没做)
python3 -m venv ~/ardupilot_env
source ~/ardupilot_env/bin/activate

# 安装 MAVProxy
pip install mavproxy

# 验证安装
mavproxy.py --version

嗯,这里有个坑。我第一次装的时候直接 pip install mavproxy,结果发现缺了 pyserial 和 numpy。后来我习惯加一句:

pip install mavproxy pyserial numpy

装完之后,你可以在终端里敲 mavproxy.py 试试。如果看到类似 Ready to connect 的提示,说明装好了。

小提示: 如果你在 Windows 上用 WSL,记得把 USB 设备透传进去。不过咱们做仿真联调,不涉及真实硬件,所以问题不大。

4.2 MAVProxy 的桥梁作用

为什么说它是桥梁?你看这张图就明白了。

MAVProxy 桥梁架构图 SITL 仿真器 udp:127.0.0.1:14550 MAVProxy 命令行 + 转发 QGC / MavGCS udp:14550 MAVLink MAVLink 模块加载 param / console / map 脚本自动化 .py 脚本 / 批处理 多链路转发 UDP / TCP / 串口 MAVProxy 不产生数据,它只转发、转换、扩展 MAVLink 消息

你看,SITL 仿真器跑在 UDP 14550 端口上,MAVProxy 连上去之后,可以再开一个端口给 QGC。这样你就能同时用命令行和图形界面操作同一架飞机。我在项目里经常这么干——命令行调参数,QGC 看地图,两边互不干扰。

4.3 基本命令:连接与启动

启动 MAVProxy 并连接到 SITL 是最基本的操作。假设你已经启动了 SITL(上一章的内容),在另一个终端里执行:

# 先激活虚拟环境
source ~/ardupilot_env/bin/activate

# 连接 SITL
mavproxy.py --master=tcp:127.0.0.1:5760 --out=udp:127.0.0.1:14550

参数说明:

参数 含义 我的习惯
--master 指定 MAVLink 数据源(SITL 或串口) 仿真用 tcp,真机用串口
--out 指定输出端口(给地面站用) 习惯用 14550,跟 QGC 默认一致
--aircraft 指定日志/参数存储目录 每个机型建一个目录,方便管理

连接成功后,你会看到类似这样的输出:

Connect tcp:127.0.0.1:5760 source_system=255
Logging to mav.tlog
MAV> 

看到 MAV> 提示符,说明你已经连上了。这时候你可以开始敲命令了。

注意: 如果你同时开了多个 MAVProxy 实例,记得用 --source-system 参数区分,否则会冲突。我曾经在调试多机编队时踩过这个坑,两台飞机的消息混在一起,排查了半天。

4.4 模式切换

模式切换是飞控调试的日常操作。在 MAVProxy 里,切模式非常简单:

# 切换到 GUIDED 模式
MAV> mode guided

# 切换到 STABILIZE 模式
MAV> mode stabilize

# 切换到 LOITER 模式
MAV> mode loiter

每次切换后,MAVProxy 会返回当前模式确认:

GUIDED> Mode GUIDED

注意提示符变了——它会显示当前模式。这样你一眼就知道飞机在什么状态。

常用的模式有这些:

模式 用途 仿真中常用吗?
STABILIZE 手动增稳,飞手控制姿态 是,基础调试
ALT_HOLD 定高模式 是,高度控制测试
LOITER 悬停模式 是,位置控制测试
GUIDED 外部指令控制(航点、起飞、降落) 非常常用,自动化测试必备
AUTO 自动执行任务 是,任务规划验证
RTL 自动返航 是,安全机制测试

我个人建议:刚开始仿真时,先在 STABILIZE 模式下观察飞机响应,确认舵面、电机方向正确后,再切到 GUIDED 做自动化测试。别一上来就切 AUTO,万一任务写错了,飞机可能直接飞走。

4.5 参数查看与修改

ArduPilot 有上千个参数,MAVProxy 提供了高效的参数操作命令。

查看参数

# 查看单个参数
MAV> param show ARMING_CHECK

# 查看所有参数(慎用,会刷屏)
MAV> param show

# 按关键字搜索
MAV> param show *RATE*

# 查看参数默认值
MAV> param show ARMING_CHECK 1

输出示例:

ARMING_CHECK = 1.0 (0:Disabled, 1:Enabled)

修改参数

# 设置参数
MAV> param set ARMING_CHECK 0

# 设置后最好再查看确认
MAV> param show ARMING_CHECK

经验之谈: 仿真时我经常把 ARMING_CHECK 设为 0,省去各种前置检查。但真机千万别这么干——安全第一。另外,改完参数后记得 param save,否则重启后参数会丢失。

参数对比

有时候你需要对比当前参数和默认参数。MAVProxy 提供了 param diff 命令:

MAV> param diff

它会列出所有跟默认值不同的参数。这个命令我在调 PID 时经常用——改了一堆参数后,用 diff 看看自己到底动了哪些。

4.6 其他常用命令

除了连接、模式、参数,还有几个命令你几乎每天都会用到:

命令 作用 使用场景
arm throttle 解锁电机 仿真起飞前必须执行
disarm 锁定电机 测试结束后安全操作
rc 3 1500 设置遥控器通道值 模拟遥控器输入
status 查看飞控状态 快速检查连接、GPS、电池等
module load 加载扩展模块 加载 map、console 等
script 运行 Python 脚本 自动化测试

举个例子,仿真起飞的标准流程:

MAV> mode guided
MAV> arm throttle
MAV> takeoff 10

这三条命令就能让飞机解锁、起飞到 10 米高度。是不是很简单?

关键点: MAVProxy 的所有命令都可以写成脚本。你想想看,把一整套测试流程写成 .py 文件,每次跑仿真时一键执行——这才是开发效率的体现。

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 连接超时: 如果 MAVProxy 连不上 SITL,先确认 SITL 是否在运行,端口是否被占用。用 netstat -tuln | grep 5760 检查。
  • 参数不生效: 改完参数后,有些参数需要重启飞控才能生效。仿真中可以用 reboot 命令重启 SITL。
  • 模式切换失败: 如果切模式报错 Mode not available,检查一下当前飞行阶段是否允许该模式。比如还没解锁时,有些模式切不了。
  • 日志文件过大: MAVProxy 默认会记录所有 MAVLink 消息。长时间仿真后,mav.tlog 文件可能几个 G。我习惯在启动时加 --logfile= 指定日志路径,或者定期清理。

嗯,MAVProxy 的基本操作就这些。别小看这个命令行工具——它是我日常开发中使用频率最高的工具,没有之一。熟练了之后,你会发现它比任何图形界面都高效。