第二章:开发环境搭建——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 本章知识体系

下面这张图,是我画的环境搭建整体流程。你跟着走一遍,基本不会出问题。

开发环境搭建流程 Python 3.8~3.11 Anaconda / 原生安装 pymavlink库 pip install pymavlink 连接方式 串口 / UDP 串口配置 波特率115200 | 数据位8 | 停止位1 | 无校验 设备:COM3 / /dev/ttyUSB0 UDP配置 服务器模式:udpin:0.0.0.0:14550 客户端模式:udpout:IP:14550 ✅ 环境搭建完成

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