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 参数 |
3.3 串口与UDP模拟测试环境搭建
做MAVLink开发,你不可能每次都连真飞控调试。太麻烦了,而且容易炸机。所以我们需要搭建模拟环境——用软件模拟飞控,用虚拟串口或UDP通信。
3.3.1 整体架构
先看一张图,理清整个模拟环境的逻辑:
你看,整个架构其实就三层:模拟飞控(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端口。
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}")
3.4 环境验证清单
最后,给你一个自检清单。每完成一项就打个勾:
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| Python环境 | python3 --version |
显示 3.8+ |
| 虚拟环境 | which python3 |
路径指向虚拟环境目录 |
| pymavlink | pip show pymavlink |
显示版本信息 |
| SITL启动 | sim_vehicle.py |
控制台和地图窗口正常 |
| UDP连接 | 运行测试脚本 | 收到心跳包 |
| 串口连接 | 运行串口测试脚本 | 收到心跳包 |
全部通过?那你的开发环境就彻底搭好了。后面咱们就可以正式开始写代码,跟飞控“对话”了。