3. Python 环境搭建:从零开始,把工具备齐

说实话,很多同学学飞控开发,第一步就卡在环境搭建上。不是 Python 装不上,就是库冲突,折腾半天连个串口都打不开。我当年刚接触 pymavlink 时也踩过不少坑,有一次在 Ubuntu 下因为 Python 版本没对齐,编译 mavlink 协议库花了整整一个下午。

这一章,咱们就把这些基础工具一次性搞定。你跟着我的步骤走,保证不绕路。

3.1 Python 解释器安装

我个人习惯用 Python 3.8 到 3.10 之间的版本。为什么?因为 pymavlink 对 3.11 以上的支持还不算完美,有些底层 C 扩展编译会报错。你想想看,飞控数据包解析如果因为 Python 版本问题出 bug,那排查起来可太痛苦了。

推荐版本:Python 3.9.13(稳定,兼容性好,社区支持最全)

安装步骤其实很简单:

  1. 去 python.org 下载对应操作系统的安装包
  2. 安装时 务必勾选 "Add Python to PATH"
  3. 安装完成后,打开终端验证:
python --version
Python 3.9.13

pip --version
pip 21.2.4 from ... (python 3.9)

注意:Windows 用户如果同时装了多个 Python 版本,建议用 py -3.9 来指定版本。我曾经见过有人因为 PATH 顺序问题,终端里敲 python 跑的是 2.7,折腾半天才发现。

3.2 PyCharm 安装与配置

编辑器这块,我推荐 PyCharm Community Edition(社区版,免费)。专业版虽然功能更多,但咱们做地面站开发,社区版完全够用。

为什么选 PyCharm?说白了,它的 远程调试 和 SSH 解释器 功能,对飞控开发来说太实用了。你可以在本地写代码,远程连到树莓派或者机载电脑上跑,调试效率翻倍。

安装完 PyCharm 后,我建议你做两件事:

  • 设置项目解释器:File → Settings → Project → Python Interpreter,选你刚装的 Python 3.9
  • 安装常用插件:.ignore(忽略文件)、Rainbow Brackets(彩虹括号,看嵌套代码时眼睛不累)

小技巧:PyCharm 的 Terminal 窗口默认用的是系统终端。我习惯把它改成 Windows Terminal 或 Git Bash,这样复制粘贴、路径补全都更顺手。设置路径:Settings → Tools → Terminal → Shell path。

3.3 pymavlink 库安装

这是咱们整个课程的核心库。pymavlink 是 MAVLink 协议的 Python 实现,负责解析和生成无人机与地面站之间的通信数据包。

安装命令很简单:

pip install pymavlink

但这里有个坑——Windows 用户 可能会遇到 mavnative 编译失败的问题。这是因为 pymavlink 底层用 C 扩展来加速协议解析,而 Windows 缺少 GCC 编译器。

解决办法有两种:

方案 操作 适用场景
方案一 安装 Visual Studio Build Tools,勾选 C++ 开发组件 需要完整编译能力
方案二 使用预编译 wheel 包:pip install pymavlink --only-binary :all: 快速安装,不求编译

我个人推荐 方案二。咱们做地面站监控,不需要自己编译 mavlink 协议,直接用官方预编译好的二进制包就行。省时间,少报错。

安装完成后,验证一下:

python -c "from pymavlink import mavutil; print('pymavlink imported successfully')"

如果没报错,恭喜你,环境已经搭好了大半。

3.4 虚拟串口模拟(socat)

这是很多初学者容易忽略的一步。你想想看,没有真实飞控的时候,怎么调试地面站代码?总不能每次都把无人机飞起来吧?

所以我们需要 虚拟串口。用软件在电脑上模拟出一对互相连接的串口,一个发给地面站,一个发给虚拟飞控。数据从一端进去,从另一端出来,完全模拟真实硬件行为。

在 Linux/macOS 下,我们用 socat 来实现:

# 安装 socat
sudo apt-get install socat   # Ubuntu/Debian
brew install socat           # macOS

# 创建一对虚拟串口
socat -d -d pty,raw,echo=0 pty,raw,echo=0

运行后会输出类似:

2024/01/15 10:30:45 socat[12345] N PTY is /dev/pts/3
2024/01/15 10:30:45 socat[12345] N PTY is /dev/pts/4

这时 /dev/pts/3 和 /dev/pts/4 就是一对虚拟串口。你往 pts/3 写数据,pts/4 就能读到,反之亦然。

Windows 用户注意:socat 在 Windows 上不太好用。我建议用 com0com(虚拟串口驱动)或者 Virtual Serial Port Emulator。安装后会在设备管理器里生成一对 COM 口,比如 COM3 和 COM4,用法和真实串口一模一样。

3.5 本章知识体系总览

下面这张图,把咱们这一章的核心逻辑串起来了。你一看就明白:

Python 环境搭建 · 知识体系 地面站开发环境就绪 Python 解释器 PyCharm IDE pymavlink 库 版本选择 PATH 配置 pip 验证 解释器设置 插件安装 终端配置 pip 安装 编译问题处理 导入验证 虚拟串口模拟(socat / com0com) 串口收发测试通过 提示:虚拟串口是调试利器,没有真实飞控也能完整测试地面站功能

3.6 快速验证:写个最小测试脚本

环境搭好之后,咱们写个简单脚本,验证整个链路是否通畅。这个脚本会通过虚拟串口发送一条 MAVLink 心跳包,然后读取回来。

# test_mavlink.py
import time
from pymavlink import mavutil

# 创建连接(用你 socat 生成的虚拟串口)
master = mavutil.mavlink_connection('/dev/pts/3', baud=57600)

# 发送心跳包
master.mav.heartbeat_send(
    mavutil.mavlink.MAV_TYPE_GCS,
    mavutil.mavlink.MAV_AUTOPILOT_INVALID,
    0, 0, 0
)

# 从另一端读取
time.sleep(0.5)
msg = master.recv_match(type='HEARTBEAT', blocking=True)
if msg:
    print(f"收到心跳包!系统类型: {msg.type}")
else:
    print("未收到心跳包,请检查虚拟串口配置")

运行这个脚本,如果打印出 "收到心跳包",说明你的 Python 环境、pymavlink 库、虚拟串口全部正常工作。嗯,到这里,咱们的准备工作就全部到位了。

避坑指南:我曾经在虚拟串口上吃过一个亏——socat 创建的串口默认没有设置波特率,而 pymavlink 连接时如果波特率不匹配,会一直收不到数据。解决办法是在 socat 命令里加上 link=/tmp/vserial 参数,或者用 stty -F /dev/pts/3 57600 手动设置。