2. 环境搭建的坑:WSL2与原生Linux的差异、依赖库版本冲突、Python虚拟环境配置失误

环境搭建这件事,说简单也简单,说坑也真坑。我见过太多人在这一步卡了两三天,最后发现是WSL2的某个小特性跟原生Linux不一样。今天咱们就把这些坑一个个捋清楚。

核心观点:环境搭建不是「装好就能用」,而是「装对才能用」。WSL2、依赖库、虚拟环境,这三块但凡有一个出问题,后面的数据采集全白搭。

2.1 WSL2 vs 原生Linux:你以为的「一样」其实不一样

很多同学图方便,直接在Windows上用WSL2跑SITL。我个人习惯是能用原生Linux就用原生,但如果你非要用WSL2,下面这几个差异你必须知道。

对比项 WSL2 原生Linux 影响
网络模式 NAT转换,默认不桥接 直接使用主机网络 UDP广播、mavlink端口映射容易丢包
文件系统 /mnt/c 跨文件系统性能差 原生ext4 日志写入速度慢,高频率采集会丢数据
USB直通 需要额外配置usbipd 原生支持 连接真实飞控或数传模块时麻烦
实时性 无实时内核支持 可安装RT内核 高精度时间戳采集会有偏差
systemd 默认不启用 默认启用 某些服务管理脚本会报错

⚠ 我曾经踩过的坑:有一次在WSL2上跑SITL,日志文件写入速度只有原生Linux的1/3。查了半天才发现,是因为我把工作目录放在了/mnt/c下。后来把项目移到WSL2内部文件系统(~/目录),问题就解决了。

为什么会这样?WSL2的跨OS文件系统(DrvFs)性能远不如原生ext4。你想想看,每次读写都要经过Windows和Linux两层转换,高频数据采集时肯定扛不住。

2.2 依赖库版本冲突:一个版本不对,整个环境崩掉

SITL依赖的库太多了——mavlink、dronekit、pymavlink、numpy、opencv……每个库又有自己的版本要求。我建议你记住一个原则:不要用系统全局的pip安装,否则迟早出事。

举个例子,pymavlink 2.4.x 和 2.5.x 在解析某些mavlink消息时行为不一样。如果你用系统pip装了2.5.0,但某个旧项目需要2.4.8,那你就得来回卸载重装。我在项目中遇到过这种问题,折腾了整整一个下午。

💡 我的做法:每个项目单独建一个虚拟环境,然后在项目根目录放一个requirements.txt,把依赖库的精确版本写死。比如:

# requirements.txt 示例
pymavlink==2.4.8
dronekit==2.9.2
numpy==1.21.0
opencv-python==4.5.3.56
matplotlib==3.4.2

安装时直接跑:

pip install -r requirements.txt

这样不管你在哪个机器上部署,环境都是一模一样的。说白了,版本锁定是解决依赖冲突最笨但最有效的方法。

2.3 Python虚拟环境配置失误:90%的人都会犯的错

虚拟环境这东西,用对了是神器,用错了是灾难。我见过最典型的失误有三个:

  1. 忘记激活虚拟环境——装了一堆库,结果全装到系统里了,项目里还是空的。
  2. 虚拟环境跟项目目录混在一起——venv文件夹放在项目根目录,一不小心就提交到git里了。
  3. Python版本不匹配——系统默认是Python 3.8,但SITL需要3.9+,结果各种import报错。

正确做法:

  • 虚拟环境统一放在 ~/venvs/ 目录下,按项目命名(如 ~/venvs/sitl_env)
  • 创建时指定Python版本:python3.9 -m venv ~/venvs/sitl_env
  • 激活后第一时间检查:which python 和 python --version
  • 把虚拟环境路径加到 .gitignore 里

⚠ 注意:如果你用WSL2,虚拟环境一定要创建在WSL2内部文件系统(~/目录),不要放在/mnt/c下。否则跨文件系统的性能问题会导致pip安装极慢,甚至超时报错。

2.4 一张图看懂环境搭建的完整流程

下面这张SVG图把整个环境搭建的流程和关键节点画出来了。你可以对照着检查自己的环境有没有遗漏。

SITL环境搭建流程与常见坑点 SITL环境搭建流程与常见坑点 选择操作系统 WSL2 原生Linux ⚠ 常见坑点 • 网络NAT导致UDP丢包 • 跨文件系统写入性能差 创建Python虚拟环境 安装依赖库(版本锁定) 验证环境(跑测试脚本)

2.5 避坑指南:我的三条铁律

最后,分享三条我这些年总结出来的铁律。照着做,环境搭建这块基本不会出大问题。

  • 铁律一:能用原生Linux就别用WSL2。实在要用,项目文件必须放在WSL2内部,别碰/mnt/c。
  • 铁律二:每个项目独立虚拟环境,版本写死到requirements.txt。别偷懒用系统全局pip。
  • 铁律三:环境搭好后,先跑一个最简单的mavlink收发测试,确认UDP端口、文件写入、Python版本都没问题,再开始正式干活。

💡 一个小技巧:在项目根目录放一个 setup.sh 脚本,把创建虚拟环境、安装依赖、验证环境三步自动化。这样换机器时跑一遍脚本就行,省心省力。