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%的人都会犯的错
虚拟环境这东西,用对了是神器,用错了是灾难。我见过最典型的失误有三个:
- 忘记激活虚拟环境——装了一堆库,结果全装到系统里了,项目里还是空的。
- 虚拟环境跟项目目录混在一起——venv文件夹放在项目根目录,一不小心就提交到git里了。
- 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图把整个环境搭建的流程和关键节点画出来了。你可以对照着检查自己的环境有没有遗漏。
2.5 避坑指南:我的三条铁律
最后,分享三条我这些年总结出来的铁律。照着做,环境搭建这块基本不会出大问题。
- 铁律一:能用原生Linux就别用WSL2。实在要用,项目文件必须放在WSL2内部,别碰/mnt/c。
- 铁律二:每个项目独立虚拟环境,版本写死到requirements.txt。别偷懒用系统全局pip。
- 铁律三:环境搭好后,先跑一个最简单的mavlink收发测试,确认UDP端口、文件写入、Python版本都没问题,再开始正式干活。
💡 一个小技巧:在项目根目录放一个 setup.sh 脚本,把创建虚拟环境、安装依赖、验证环境三步自动化。这样换机器时跑一遍脚本就行,省心省力。