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(稳定,兼容性好,社区支持最全)
安装步骤其实很简单:
- 去 python.org 下载对应操作系统的安装包
- 安装时 务必勾选 "Add Python to PATH"
- 安装完成后,打开终端验证:
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 本章知识体系总览
下面这张图,把咱们这一章的核心逻辑串起来了。你一看就明白:
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 手动设置。