3. 开发环境搭建:Python环境、Pymavlink库安装、QGroundControl地面站

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说白了,就是给你的电脑装上「听懂无人机说话」的能力。

我见过太多人,代码写得漂亮,结果卡在环境配置上。有一次我在现场调试,发现笔记本连不上飞控,折腾了半天——你猜怎么着?驱动装错了版本。嗯,这种坑咱们今天一次性填平。

3.1 Python 环境:选对版本,省一半心

Python 版本我建议用 3.8 到 3.10。为什么?Pymavlink 对 3.11 以上的支持还有点小毛病,我踩过这个坑。

注意:别用系统自带的 Python。Windows 用户去 python.org 下载安装包,安装时记得勾选「Add Python to PATH」。Mac 用户用 brew install python@3.9。Linux 用户用 apt 或 yum 都行,但别动系统自带的 2.7。

我个人习惯用虚拟环境。每个项目一个独立环境,互不干扰。来,跟着我做:

# 创建虚拟环境(Windows)
python -m venv drone_env

# 激活(Windows)
drone_env\Scripts\activate

# 激活(Mac/Linux)
source drone_env/bin/activate

# 检查版本
python --version
# 应该显示 Python 3.9.x 或 3.10.x

看到终端前面多了个 (drone_env) 前缀?成了。这就是你的无人机专属环境。

3.2 Pymavlink 安装:让电脑学会「说」MAVLink

Pymavlink 是 Python 和无人机之间的翻译官。无人机说 MAVLink 协议,Python 说对象和方法——Pymavlink 负责来回翻译。

安装其实就一行命令:

pip install pymavlink

但这里有个坑。我记得第一次装的时候,卡在 mavgen 编译上,报了一堆 C 语言的错。后来发现是缺了 future 库。所以保险起见,我建议你这样装:

pip install future
pip install pymavlink
小技巧:如果你在中国大陆,下载慢的话可以加国内镜像源:pip install pymavlink -i https://pypi.tuna.tsinghua.edu.cn/simple

装完之后验证一下:

python -c "from pymavlink import mavutil; print('Pymavlink 安装成功!')"

没报错?恭喜,你的电脑已经能听懂无人机说话了。

3.3 QGroundControl:地面站,无人机的「驾驶舱」

QGroundControl(简称 QGC)是开源地面站里的标杆。我自己的项目里,80% 的联调工作都靠它完成。

下载地址:http://qgroundcontrol.com/downloads

选你对应的系统版本就行。Windows 用户下载 .exe,Mac 用户下载 .dmg,Linux 用户下载 AppImage。

安装完第一次启动,你会看到这个界面:

QGC 主界面核心区域:

  • 左上角:通信状态指示灯(红/黄/绿)
  • 中间:地图区域(显示无人机位置和航点)
  • 右侧:遥测数据面板(高度、速度、电池等)
  • 底部:飞行模式切换和操作按钮

嗯,先别急着连飞控。咱们先看看 QGC 的通信设置。点击右上角的齿轮图标 → 进入「Comm Links」选项卡。这里你会看到默认的串口和 UDP 连接方式。

连接方式 适用场景 典型参数
串口(Serial) USB 直连飞控 波特率 57600 或 115200
UDP 局域网无线连接 本地端口 14550
TCP 远程连接 IP + 端口 5760

我个人习惯先用串口调试,稳定了再切 UDP。为什么?串口丢包率低,调试阶段少出幺蛾子。

3.4 三者的「三角关系」

Python、Pymavlink、QGC 这三者怎么配合?我画了张图,你看一眼就明白了:

开发环境三角关系图 开发环境三角关系 Python + Pymavlink 发送/解析 MAVLink 消息 QGC 地面站 可视化监控 & 手动控制 飞控硬件 Pixhawk / Cube / 其他 UDP/串口 串口 MAVLink 协议 💡 联调流程 Python 脚本 ↔ QGC 地面站 ↔ 飞控硬件,三者通过 MAVLink 协议双向通信

你看,Python 脚本和 QGC 都可以直接跟飞控通信。实际联调时,我通常开着 QGC 看状态,同时跑 Python 脚本发指令——两边互相印证,出问题一眼就能发现。

3.5 快速验证:让飞控「说话」

环境搭好了,咱们写个最简单的脚本,看看飞控有没有反应。先别连真机,用模拟器也行。

# test_connection.py
from pymavlink import mavutil
import time

# 连接到飞控(串口或 UDP)
# 串口示例:'/dev/ttyUSB0', 57600
# UDP 示例:'udp:127.0.0.1:14550'
connection = mavutil.mavlink_connection('udp:127.0.0.1:14550')

# 等待心跳包
print("等待飞控心跳...")
connection.wait_heartbeat()
print(f"收到心跳!系统 ID: {connection.target_system}")

# 请求一次数据流
connection.mav.request_data_stream_send(
    connection.target_system,
    connection.target_component,
    mavutil.mavlink.MAV_DATA_STREAM_ALL,
    1,  # 频率 1Hz
    1   # 开始发送
)

# 读取一条消息
msg = connection.recv_match(blocking=True)
print(f"收到消息: {msg.get_type()}")

print("环境验证通过!")
验证技巧:如果你没有真机,可以用 QGC 的模拟模式。在 QGC 里点击「应用设置」→「模拟」→ 选择「ArduCopter」→ 点击「开始模拟」。这样你的电脑上就多了一个虚拟飞控,IP 和端口跟真机一模一样。

跑一下这个脚本:

python test_connection.py

如果看到「收到心跳」和「收到消息」,恭喜——你的开发环境已经全线打通了。

3.6 避坑指南

我这些年攒了几个常见问题,列出来你留个心眼:

  • 串口权限问题(Linux/Mac):加用户到 dialout 组:sudo usermod -a -G dialout $USER,然后注销重登。
  • Windows 串口找不到:去设备管理器看端口号,一般是 COM3 或 COM4。驱动用 CP210x 或 CH340,别搞混。
  • QGC 连不上飞控:先检查波特率。Pixhawk 默认 57600,有些飞控是 115200。我遇到过三次都是波特率没对上。
  • Pymavlink 版本冲突:如果你同时用 ROS,注意 Pymavlink 版本别太新。2.4.8 是比较稳的版本。
重要提醒:第一次连真机时,一定不要装桨叶。我见过有人在地面站里误触了「解锁」,无人机直接在地上蹦跶——没装桨叶最多摔个跟头,装了桨叶就是安全事故。

好,环境搭完了。你现在手里有三样东西:一个能跑 Python 的终端、一个能听懂 MAVLink 的 Pymavlink、一个能看见无人机状态的 QGC。接下来咱们就可以真正开始「对话」了。