第二章:开发环境搭建——Python环境、pymavlink库安装、串口与UDP配置
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,地面站开发最怕什么?最怕环境没配好,折腾半天连不上飞控。我当年刚入行时,光装pymavlink就折腾了一下午,后来发现是Python版本不对。嗯,咱们今天把这些坑都填平。
2.1 Python环境准备
我个人习惯用Python 3.8到3.11之间的版本。为什么?因为pymavlink对3.12以上的支持还不够稳定,我在项目里踩过这个坑。你想想看,代码写好了,一运行报错说找不到模块,多闹心。
推荐用Anaconda或者Miniconda来管理环境。这样不同项目之间不会打架。
核心要求:
- Python版本:3.8 ~ 3.11(推荐3.10)
- 操作系统:Windows 10/11、Ubuntu 20.04+、macOS均可
- 包管理器:pip(Python自带)或conda
安装步骤很简单,去python.org下载安装包,或者用conda一键搞定。我个人推荐conda,因为后面装pymavlink时依赖库会自动处理。
# 用conda创建环境
conda create -n mavlink_env python=3.10
conda activate mavlink_env
# 或者直接用系统Python
python --version # 确认版本在3.8以上
小技巧: 如果你在Windows上,记得勾选「Add Python to PATH」。我曾经忘了勾,结果命令行里死活找不到python命令,折腾了半小时才发现。
2.2 pymavlink库安装
pymavlink是MAVLink协议的Python实现,说白了就是咱们和飞控对话的翻译官。安装它只需要一行命令,但有几个细节要注意。
pip install pymavlink
# 如果安装慢,用国内镜像
pip install pymavlink -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,验证一下:
python -c "from pymavlink import mavutil; print('pymavlink installed successfully')"
如果没报错,恭喜你,环境搭好了。如果报错说缺少什么库,别慌,多半是系统依赖没装全。
注意: 在Linux上,pymavlink依赖libxml2和libxslt。我曾经在Ubuntu上忘了装,结果解析MAVLink XML文件时一直报错。解决办法:
sudo apt-get install libxml2-dev libxslt1-dev
2.3 串口配置
地面站和飞控最常用的连接方式就是串口。说白了,就是一根USB线连到飞控的UART口上。但串口配置有几个关键参数,错了就连不上。
| 参数 | 常见值 | 说明 |
|---|---|---|
| 波特率 | 115200(常用)、57600、921600 | 飞控和地面站必须一致 |
| 数据位 | 8 | 固定值,别改 |
| 停止位 | 1 | 固定值 |
| 校验位 | 无(N) | MAVLink默认无校验 |
在Windows上,串口号通常是COM3、COM4这样的。在Linux上,是/dev/ttyUSB0或/dev/ttyACM0。怎么确认?插上飞控,看设备管理器(Windows)或运行ls /dev/tty*(Linux)。
# 用pymavlink打开串口
from pymavlink import mavutil
# 创建连接
master = mavutil.mavlink_connection(
device='COM3', # Windows用COM口,Linux用/dev/ttyUSB0
baud=115200
)
# 等待心跳包
master.wait_heartbeat()
print("飞控连接成功!")
避坑指南: 我曾经在调试时,串口线接触不良,导致心跳包时断时续。后来发现是USB转串口模块的驱动没装好。建议用FTDI或CP2102芯片的模块,稳定很多。
2.4 UDP配置
串口适合有线连接,但无人机飞远了怎么办?这时候就用UDP。说白了,UDP就是通过网络传MAVLink数据,延迟低、速度快。
UDP有两种模式:
- 客户端模式: 地面站主动连接飞控的IP和端口
- 服务器模式: 地面站监听端口,等飞控发数据过来
实际项目中,我常用服务器模式。因为飞控在空中,IP可能变化,地面站固定监听更靠谱。
# UDP服务器模式(地面站监听)
master = mavutil.mavlink_connection(
'udpin:0.0.0.0:14550' # 监听所有网卡,端口14550
)
# UDP客户端模式(地面站主动连接)
master = mavutil.mavlink_connection(
'udpout:192.168.1.100:14550' # 飞控IP和端口
)
关键点: UDP不保证数据一定到达。如果丢包严重,可以考虑用TCP。但TCP延迟高,实时性差。我一般用UDP,配合心跳包检测连接状态。
2.5 本章知识体系
下面这张图,是我画的环境搭建整体流程。你跟着走一遍,基本不会出问题。
2.6 验证环境
环境搭好了,怎么知道能不能用?写个简单的测试脚本,连上飞控看看心跳包。
from pymavlink import mavutil
import time
# 连接飞控(根据你的实际情况改参数)
master = mavutil.mavlink_connection('COM3', baud=115200)
# 等心跳
print("等待飞控心跳...")
master.wait_heartbeat(timeout=5)
print(f"收到心跳!系统ID: {master.target_system}")
# 请求数据流
master.mav.request_data_stream_send(
master.target_system,
master.target_component,
mavutil.mavlink.MAV_DATA_STREAM_ALL,
10, # 10Hz
1
)
# 读取几条消息
for i in range(5):
msg = master.recv_match(blocking=True)
if msg:
print(f"收到消息: {msg.get_type()}")
time.sleep(0.1)
print("环境验证通过!")
小提示: 如果没连真飞控,可以用模拟器。我常用ArduPilot的SITL模拟器,在电脑上跑一个虚拟飞控,调试起来特别方便。
好了,环境搭建就到这里。你跟着步骤走,应该半小时内能搞定。下一章咱们开始真正发指令,到时候你会觉得,嗯,前面这些折腾都值了。
公众号:蓝海资料掘金营,微信deep3321