3. 开发环境搭建:Python环境配置、pymavlink库安装、串口与UDP模拟测试环境搭建

做嵌入式开发这么多年,我有个习惯——拿到一个新项目,第一件事不是看代码,而是先把环境搭利索。环境不顺,后面全是坑。这一章咱们就把MAVLink开发需要用到的Python环境、pymavlink库,还有串口和UDP的模拟测试环境,一次性搞定。

说白了,你后面所有的消息解析、飞控通信、日志分析,都得跑在这个环境上。所以别嫌麻烦,跟着我一步步来。

3.1 Python环境配置

我建议你用Python 3.8以上版本。为什么?因为pymavlink从2.4.x开始,已经全面转向Python 3了。Python 2.7虽然在一些老项目里还能见到,但咱们做新开发,就别往回看了。

3.1.1 安装Python

Windows用户直接去python.org下载安装包。记得安装时勾选“Add Python to PATH”——这个选项我见过太多人漏掉了,结果命令行里敲python死活找不到。

Linux用户就简单了:

sudo apt update
sudo apt install python3 python3-pip python3-venv -y

macOS用户可以用Homebrew:

brew install python3

装完验证一下:

python3 --version

能看到版本号,就说明装好了。

3.1.2 创建虚拟环境

我个人强烈建议——每个项目都用独立的虚拟环境。以前我吃过亏,全局装了一堆库,版本冲突搞得头大。后来养成了习惯,新建项目先建虚拟环境。

# 创建虚拟环境
python3 -m venv mavlink_env

# 激活环境
# Linux/macOS:
source mavlink_env/bin/activate

# Windows:
mavlink_env\Scripts\activate

激活后,命令行前面会出现 (mavlink_env) 的提示。嗯,看到这个就对了。

小技巧: 我习惯在项目根目录下建虚拟环境,取名 .venv。这样既隐蔽,又不会跟项目文件混在一起。很多IDE也能自动识别。

3.2 pymavlink库安装

pymavlink是MAVLink协议在Python下的官方实现库。说白了,它就是咱们和飞控对话的翻译官——你把MAVLink消息发出去,它帮你编码;飞控发回来的数据,它帮你解码。

3.2.1 安装命令

激活虚拟环境后,直接pip安装:

pip install pymavlink

如果你需要图形化工具(比如mavgraph),可以装完整版:

pip install pymavlink[all]

装完验证:

python3 -c "import pymavlink; print(pymavlink.__version__)"

能打印出版本号,就说明安装成功了。

3.2.2 常见安装问题

我在项目里遇到过几次安装失败的情况,总结下来主要是这几个原因:

问题现象 原因 解决办法
编译错误,缺少Python.h 系统缺少Python开发头文件 sudo apt install python3-dev
找不到libxml2 缺少XML解析库 sudo apt install libxml2-dev libxslt1-dev
权限错误 在全局环境用pip安装 使用虚拟环境,或加 --user 参数
注意: 不要在系统全局Python里乱装库。我曾经有一次把系统Python搞崩了,重装了系统才恢复。虚拟环境是你的安全区,养成习惯。

3.3 串口与UDP模拟测试环境搭建

做MAVLink开发,你不可能每次都连真飞控调试。太麻烦了,而且容易炸机。所以我们需要搭建模拟环境——用软件模拟飞控,用虚拟串口或UDP通信。

3.3.1 整体架构

先看一张图,理清整个模拟环境的逻辑:

MAVLink模拟测试环境架构图 MAVLink 模拟测试环境架构 SITL 飞控模拟 ArduPilot SITL 虚拟串口 socat / com0com UDP 通信 127.0.0.1:14550 pymavlink 客户端 你的Python脚本 说明:SITL模拟飞控通过虚拟串口或UDP与pymavlink客户端通信, 无需真实硬件即可完成MAVLink消息的收发与解析测试。

你看,整个架构其实就三层:模拟飞控(SITL)、通信通道(串口/UDP)、你的Python客户端。搞清楚这个,后面就好办了。

3.3.2 安装ArduPilot SITL

SITL(Software In The Loop)是ArduPilot的软件仿真环境。它跑在你的电脑上,行为跟真实飞控几乎一样。

# 克隆ArduPilot代码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 安装依赖
git submodule update --init --recursive
./Tools/environment_install/install-prereqs-ubuntu.sh -y

# 编译SITL
./waf configure --board sitl
./waf copter

编译完成后,启动SITL:

# 启动四旋翼SITL,使用UDP端口14550
sim_vehicle.py -v ArduCopter --console --map

你会看到一个控制台窗口和一个地图窗口弹出来。飞控已经跑起来了,默认监听UDP 14550端口。

经验之谈: 我第一次跑SITL时,等了半天没反应。后来发现是防火墙把UDP端口拦了。如果你也遇到连不上的情况,先检查防火墙。

3.3.3 虚拟串口搭建

有时候你想模拟真实的串口通信场景,而不是用UDP。这时候就需要虚拟串口。

Linux/macOS用户: 用socat创建一对虚拟串口

# 安装socat
sudo apt install socat

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

# 输出示例:
# 2024/01/15 10:30:45 socat[12345] N PTY is /dev/pts/2
# 2024/01/15 10:30:45 socat[12345] N PTY is /dev/pts/3

这样你就得到了一对虚拟串口 /dev/pts/2 和 /dev/pts/3。往一个口写数据,另一个口就能读到。你可以把SITL连到一个口,pymavlink连到另一个口。

Windows用户: 用com0com工具

下载安装com0com后,在命令行里配置:

# 创建COM3和COM4的虚拟串口对
installport Com3 Com4

3.3.4 UDP模拟测试

UDP方式更简单,也是我最常用的方式。SITL默认已经开了UDP 14550端口,我们直接用pymavlink连上去就行。

写一个简单的测试脚本:

# test_udp_connection.py
from pymavlink import mavutil
import time

# 连接到SITL的UDP端口
master = mavutil.mavlink_connection('udp:127.0.0.1:14550')

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

# 请求数据流
master.mav.request_data_stream_send(
    master.target_system,
    master.target_component,
    mavutil.mavlink.MAV_DATA_STREAM_ALL,
    10,  # 10Hz
    1
)

# 读取10条消息
for i in range(10):
    msg = master.recv_match(blocking=True)
    if msg:
        print(f"收到消息: {msg.get_type()}")
    time.sleep(0.1)

print("测试完成!")

运行它:

python3 test_udp_connection.py

如果看到心跳包和消息输出,恭喜你——环境搭建成功了!

3.3.5 串口模拟测试

如果你用的是虚拟串口,连接方式稍微改一下:

# test_serial_connection.py
from pymavlink import mavutil

# 连接到虚拟串口(Linux示例)
master = mavutil.mavlink_connection('/dev/pts/2', baud=115200)

# 或者Windows
# master = mavutil.mavlink_connection('COM3', baud=115200)

master.wait_heartbeat()
print(f"串口连接成功!系统ID: {master.target_system}")
注意: 串口通信一定要确认波特率匹配。SITL默认串口波特率是115200,如果你设成57600,两边就聊不到一块去。我刚开始学的时候犯过这个错,查了半天才发现是波特率没对上。

3.4 环境验证清单

最后,给你一个自检清单。每完成一项就打个勾:

检查项 验证方法 预期结果
Python环境 python3 --version 显示 3.8+
虚拟环境 which python3 路径指向虚拟环境目录
pymavlink pip show pymavlink 显示版本信息
SITL启动 sim_vehicle.py 控制台和地图窗口正常
UDP连接 运行测试脚本 收到心跳包
串口连接 运行串口测试脚本 收到心跳包

全部通过?那你的开发环境就彻底搭好了。后面咱们就可以正式开始写代码,跟飞控“对话”了。