1. 项目概述:为什么需要一份全平台AirSim部署指南?
如果你正在研究无人机、自动驾驶或者机器人仿真,AirSim这个名字你一定不陌生。它是由微软开源的一个基于虚幻引擎(Unreal Engine)的仿真平台,专门为人工智能研究设计,能提供高保真的物理和视觉模拟。简单来说,它就是一个极其逼真的“数字沙盘”,你可以在这里面训练你的无人机算法,而不用担心炸机或者撞坏真车。
听起来很美好,对吧?但几乎所有新手,包括我当年,在第一步“环境搭建”上就栽了跟头。官方文档虽然详尽,但更像一份“说明书”,它默认你已经具备了从源码编译大型C++项目、处理各种依赖冲突、以及在不同操作系统间切换自如的能力。现实是,在Windows上可能因为一个Visual Studio版本不对而编译失败,在Linux上可能因为一个Python包冲突而无法启动,在macOS上可能因为权限问题卡在某个步骤。网上的教程又往往只针对单一平台,或者某个特定版本,时效性差,步骤缺失,让你在无数个“ERROR”和“Command not found”中反复横跳。
这就是我写这份指南的初衷。我花了大量时间,在Windows 10/11、Ubuntu 20.04/22.04以及macOS Monterey/Ventura上反复折腾,踩遍了几乎所有能踩的坑。这份指南的目标,是为你提供一份真正可操作、全平台覆盖、附带深度避坑解析的AirSim部署手册。无论你手头是游戏本、Linux服务器还是MacBook,都能找到对应的、经过验证的路径,把AirSim环境稳稳当当地跑起来。我们不仅要“搭起来”,更要明白每一步“为什么”要这么做,以及出了问题“怎么办”。
2. 核心思路与方案选型:源码编译 vs 预编译二进制
在开始动手之前,我们必须先做一个关键决策:从源码编译,还是使用预编译的二进制文件?这个选择直接决定了后续所有步骤的复杂度和潜在风险。
2.1 两种路径的深度对比
很多教程一上来就让你git clone然后cmake,但这未必是最优解。我们来彻底分析一下:
方案一:从源码编译(官方推荐路径)
- 优点:
- 灵活性最高:你可以修改AirSim的核心代码,定制传感器模型、物理参数,甚至集成自己的算法模块。这是做深度研究和二次开发的必经之路。
- 版本可控:你可以锁定到某个特定的Git提交(commit),确保实验环境完全可复现,避免因上游更新引入的不兼容问题。
- 学习价值:完整走一遍编译流程,能让你深刻理解AirSim的架构(客户端-服务器模型,基于RPC的通信),对后续调试有巨大帮助。
- 缺点:
- 过程极其复杂:涉及安装巨型依赖(如完整版Unreal Engine,动辄几十GB)、配置编译工具链(CMake, VS Build Tools, Make)、解决海量的依赖库冲突。一个环节出错,前功尽弃。
- 耗时漫长:下载UE源码和编译AirSim本身,在普通机器上可能需要数小时,对网络和硬件都是考验。
- 平台差异巨大:三个平台的编译工具和依赖管理方式完全不同,维护三份不同的排查手册成本很高。
方案二:使用预编译的二进制版本(社区简化路径)
- 优点:
- 开箱即用:下载后,几乎只需要配置Python环境就能运行,极大降低了入门门槛。
- 快速验证:如果你只是想快速验证想法、跑通官方示例,或者进行高层级的算法测试(不修改仿真内核),这是最快的方式。
- 规避编译难题:完美避开了所有编译相关的依赖和错误。
- 缺点:
- 功能受限:通常无法修改仿真引擎内部的设置,也无法与特定版本的UE项目深度集成。
- 版本滞后:二进制版本往往对应某个固定的AirSim和UE版本,可能无法使用最新的特性。
- 平台兼容性存疑:预编译的二进制文件对系统库版本可能有特定要求,在非标准系统上可能无法运行。
2.2 我的选择与建议
经过实践,我建议分阶段采用不同策略:
- 对于初学者和快速原型验证者:优先使用预编译二进制。你的首要目标是“看到飞机飞起来”,建立直观感受和信心。我们会在指南中提供稳定的二进制获取和配置方法。
- 对于研究者和深度开发者:必须掌握源码编译。这是你工作的基础。本指南将重点详述Windows/Linux下的源码编译流程,因为这是最主流、问题最多的场景。macOS的编译因其生态特殊性,会单独给出关键提示。
无论选择哪条路,接下来的环境准备都是共通的,尤其是Python环境,它是与AirSim交互的主要接口。
3. 全平台基础环境准备:构筑稳定的基石
在接触AirSim或UE之前,我们需要先搭建一个坚固的“地基”——Python开发环境。这一步做不好,后面会麻烦不断。
3.1 Python环境配置:强烈建议使用Conda
为什么是Conda(或Miniconda)而不是系统自带的Python或纯粹的pip?
- 环境隔离:AirSim依赖特定的Python包(如
msgpack-rpc-python,airsim)。用Conda可以创建一个专属的虚拟环境,避免与系统或其他项目的Python包发生冲突。想象一下,你另一个项目需要TensorFlow 2.15,但AirSim的某个依赖只兼容NumPy 1.19,没有隔离就是灾难。 - 包管理优势:Conda不仅能管理Python包,还能管理非Python的二进制依赖(在某些情况下),比pip更强大。
- 跨平台一致性:Conda在Windows、Linux、macOS上的行为高度一致,减少了平台切换的学习成本。
实操步骤(以Windows为例,Linux/macOS命令几乎相同):
- 安装Miniconda:去官网下载对应你操作系统和架构(通常是64位)的Miniconda安装包。安装时,务必勾选“Add Miniconda3 to my PATH environment variable”。虽然官方不推荐,但对于新手来说,这能避免后续在命令行中找不到
conda命令的困扰。 - 创建专属环境:打开终端(Windows用Anaconda Prompt或PowerShell,Linux/macOS用系统终端)。
激活后,你的命令行提示符前通常会显示# 创建一个名为airsim_env的Python环境,指定Python版本为3.8(AirSim兼容性好) conda create -n airsim_env python=3.8 # 激活环境 conda activate airsim_env(airsim_env),表示你已进入该环境。
3.2 关键依赖安装:不止是pip install airsim
在虚拟环境中,安装AirSim的Python客户端库:
pip install airsim但请注意,这个airsim库只是一个客户端。它提供了用于与AirSim仿真器(服务器)通信的Python API。仿真器本身(即那个有图形界面的程序)还需要另外获取。
重要提示:
pip install airsim可能会尝试编译一些C++扩展。如果失败,通常是因为缺少C++编译工具链。在Windows上,你需要安装Visual Studio 2019或2022的“使用C++的桌面开发”工作负载;在Linux上,需要g++和cmake;在macOS上,需要Xcode Command Line Tools。如果编译失败,可以尝试使用预编译的wheel,或者暂时忽略,因为我们后续主要通过二进制或源码获取仿真器。
3.3 平台特异性准备
Windows:
- 安装Visual Studio:这是编译AirSim或UE项目的硬性要求。请安装Visual Studio 2019或2022的社区版(免费)。在安装程序中,必须勾选“使用C++的桌面开发”工作负载,以及右侧细节中的“Windows 10/11 SDK”和“C++ CMake tools for Windows”。这大约会占用10-20GB空间,但必不可少。
- 安装Git:从git-scm.com下载并安装。这用于克隆代码仓库。
Linux (以Ubuntu 22.04为例):
- 打开终端,更新包列表并安装基础工具:
sudo apt update sudo apt install git build-essential cmake clang-format libgl1-mesa-dev -y- Unreal Engine依赖:UE编译需要更多库。可以提前安装一部分:
sudo apt install mono-devel mono-complete dotnet-sdk-6.0 libxinerama-dev libxcursor-dev libxrandr-dev libwayland-dev libvulkan1 mesa-vulkan-drivers vulkan-utils -y- Python环境:系统自带Python3,但如前所述,强烈建议使用Conda隔离。
macOS:
- 安装Xcode Command Line Tools:在终端运行
xcode-select --install。这是编译任何原生代码的基础。 - 安装Homebrew:这是一个强大的包管理器。访问brew.sh按指引安装。
- 通过Homebrew安装基础工具:
brew install git cmake- 注意:macOS上编译UE和AirSim挑战最大,对系统版本、Xcode版本、磁盘格式(APFS)都有要求。若非必须,在macOS上使用预编译二进制是更明智的选择。
- 安装Xcode Command Line Tools:在终端运行
4. 方案A实战:获取与运行预编译二进制版本
对于大多数想快速上手的用户,这是最推荐的起点。
4.1 寻找可靠的二进制发布
AirSim官方不直接提供打包好的仿真器二进制文件。但社区和某些研究项目会提供。一个经典且稳定的来源是“AirSim NeurIPS 2019 挑战赛”的发布包。虽然版本稍旧(基于AirSim 1.2和UE 4.18),但非常稳定,包含了完整的Windows和Linux二进制文件以及示例场景。
- 获取地址:你可以通过搜索引擎查找 “AirSim NeurIPS 2019 Binaries” 找到发布页面。通常是一个GitHub的Release页面,提供Windows (
.zip) 和 Linux (.tar.gz) 的下载链接。 - 下载与解压:下载对应你操作系统的压缩包,解压到一个路径不含中文和空格的目录,例如
D:\AirSim_Bin或~/Projects/AirSim_Bin。
4.2 运行与测试
解压后,目录里会有一个可执行文件(Windows下是.exe, Linux下是.sh或直接可执行文件)。
- Windows:双击
AirSimNH.exe(具体名称可能略有不同,例如Blocks.exe)。你会看到虚幻引擎的启动画面,然后进入一个包含多个方块(Blocks)的默认场景。这就是你的仿真世界! - Linux:在终端中,进入解压目录,给执行脚本添加权限并运行:
如果直接是可执行文件,则chmod +x ./AirSimNH.sh ./AirSimNH.sh./<文件名>。
首次运行关键检查:
- 程序是否能正常启动并显示3D场景?
- 在场景中,你能用鼠标右键拖动视角、用WASD移动吗?
- 打开终端,激活之前创建的Conda环境 (
conda activate airsim_env),运行一个简单的Python脚本来测试连接。
创建一个名为test_connection.py的文件,内容如下:
import airsim import time # 连接到仿真器。默认是本地主机(localhost)和端口41451 client = airsim.VehicleClient() client.confirmConnection() # 获取无人机状态 state = client.getMultirotorState() print(f"无人机位置: {state.kinematics_estimated.position}") print("连接成功!AirSim环境已就绪。")保存后,在终端运行python test_connection.py。如果看到输出了无人机的位置信息(可能都是0,因为还没起飞),恭喜你,客户端与仿真器的通信成功了!
4.3 预编译版本的局限性认知
使用二进制版本,你相当于运行了一个“黑盒”。你无法:
- 修改场景中的物理属性(如重力、风力模型)。
- 添加或自定义传感器(如激光雷达的扫描线数、相机的畸变模型)。
- 将其与你自己的UE项目集成。 当你的实验需要超越官方示例提供的功能时,就必须转向源码编译。
5. 方案B实战:从源码编译AirSim(Windows/Linux重点)
这是硬核玩家的道路。我们将流程分解为两大步:首先搭建Unreal Engine(UE)这座“工厂”,然后编译AirSim这个“定制化产品”。
5.1 阶段一:搭建Unreal Engine编译环境
UE是AirSim运行的基石。我们必须从Epic Games的源码编译它。
获取Epic Games账户和GitHub权限:
- 注册一个Epic Games账户(免费)。
- 访问 unrealengine.com,点击“获取”按钮,关联你的GitHub账户。Epic会邀请你加入他们的GitHub组织。接受邀请(检查GitHub注册邮箱)。这个过程可能需要几分钟到几小时。
克隆UE源码仓库:
- 打开终端或Git Bash,找一个空间充足的磁盘(至少需要100GB剩余空间)。
- 运行以下命令。注意,
<version>替换为你需要的版本。AirSim对不同UE版本有兼容性要求,请查阅AirSim官方文档的README.md。通常,较新的AirSim主分支要求UE 4.27或5.0+。这里以UE 4.27为例。
# 克隆指定版本的UE源码,使用 --depth 1 可以加快克隆速度 git clone -b 4.27 https://github.com/EpicGames/UnrealEngine.git --depth 1 cd UnrealEngine运行设置脚本:
- Windows:运行
Setup.bat。这个脚本会下载大量的依赖二进制文件(约10GB),并验证你的环境。 - Linux:运行
./Setup.sh。它会检查并安装所有必要的系统依赖。 - macOS:运行
./Setup.sh。
- Windows:运行
生成项目文件并编译:
- Windows:运行
GenerateProjectFiles.bat,然后用Visual Studio打开生成的UE4.sln解决方案文件。在VS中,将解决方案配置设为“Development Editor”,平台设为“Win64”,然后右键点击“UE4”项目选择“生成”。这是一个漫长的过程,可能需要2-4小时,取决于你的CPU和硬盘速度。 - Linux:运行
./GenerateProjectFiles.sh,然后make。同样需要很长时间。 - macOS:运行
./GenerateProjectFiles.sh,然后用Xcode打开生成的UE4.xcworkspace进行编译。
避坑指南:
- 网络问题:
Setup阶段下载依赖可能因网络超时失败。可以尝试配置命令行代理,或使用一些网络加速工具。 - 磁盘空间:确保目标盘有充足空间(建议200GB以上)。编译中间文件巨大。
- 内存不足:编译UE是内存大户,建议至少有16GB物理内存。如果内存不足,可能会在链接(Linking)阶段失败。
- 权限问题(Linux/macOS):确保你对克隆的目录有读写权限,避免使用
sudo运行脚本,这可能导致后续文件所有权混乱。
- Windows:运行
5.2 阶段二:编译并集成AirSim
UE编译成功后,你就可以编译AirSim插件了。
克隆AirSim源码:
# 切换到你的工作目录,不要放在UE目录里面 cd /path/to/your/workspace git clone https://github.com/microsoft/AirSim.git cd AirSim使用编译脚本: AirSim提供了一个非常方便的脚本
build.cmd(Windows) 或build.sh(Linux/macOS)。- Windows:在AirSim目录下,打开“x64 Native Tools Command Prompt for VS 2019/2022”(这是关键!它设置了VS的编译环境变量)。然后运行:
build.cmd - Linux/macOS:在终端中,确保已激活正确的编译环境,然后运行:
./build.sh
这个脚本会自动检测你的UE安装路径(通常是通过环境变量
UE4_ROOT),并调用CMake生成项目,然后进行编译。- Windows:在AirSim目录下,打开“x64 Native Tools Command Prompt for VS 2019/2022”(这是关键!它设置了VS的编译环境变量)。然后运行:
集成到UE项目: 编译完成后,会在
AirSim/Unreal/Plugins目录下生成AirSim插件文件夹。你需要将这个文件夹复制到你的UE项目的Plugins目录下。- 如果你有现成的UE项目,直接复制即可。
- 如果你想创建一个新的空白项目来测试,可以先在UE编辑器中创建一个“空白”或“基础”项目(例如命名为
MyAirSimProject)。然后关闭UE编辑器,将AirSim插件文件夹复制到MyAirSimProject/Plugins/下。重新打开UE项目,它会提示你重新编译插件,点击确认。
运行测试:
- 在UE编辑器中,打开
文件 -> 新建关卡,或使用默认关卡。 - 从内容浏览器中,找到
AirSim -> Blueprints -> BP_FlyingPawn,将其拖放到场景中。 - 点击“运行”按钮。如果一切正常,你将进入仿真视图,并可以通过Python客户端进行控制。
- 在UE编辑器中,打开
5.3 macOS编译的特殊考量
在macOS上编译UE和AirSim,除了上述步骤,还需特别注意:
- 系统版本与Xcode:UE对macOS和Xcode版本有严格配对要求。例如,UE 4.27可能需要Xcode 13.x和macOS Monterey。务必在Epic的官方文档中查证兼容性矩阵。
- 磁盘格式:必须使用APFS格式的磁盘。不区分大小写的APFS也可以。
- 编译目标:在Xcode中编译时,确保目标架构是
x86_64(Intel芯片)或arm64(Apple Silicon)。对于M系列芯片,AirSim和UE的兼容性仍在不断改进中,可能会遇到更多问题。 - 资源消耗:macOS上编译UE同样消耗巨大资源,且散热可能成为瓶颈,导致编译速度慢甚至失败。
给macOS用户的务实建议:如果你的主要目的是使用AirSim进行AI算法研究,而非UE开发,可以优先考虑在macOS上运行Linux虚拟机(如VMware Fusion/Parallels Desktop),然后在虚拟机中按照Linux指南部署。或者,直接使用远程的Linux服务器。这比在macOS原生环境上硬扛编译要高效和稳定得多。
6. 连接PX4与QGC:实现软硬件在环仿真
让AirSim中的无人机飞起来,除了仿真环境本身,还需要一个“大脑”——飞控软件。PX4是目前最流行的开源飞控软件,而QGroundControl (QGC) 是它的地面站。将它们与AirSim连接,就构成了硬件在环(HITL)或软件在环(SITL)仿真的核心。
6.1 PX4 SITL环境搭建
我们主要在Linux环境下进行PX4 SITL仿真,因为其工具链最完善。Windows可以通过WSL2获得类似的体验。
克隆PX4固件:
git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot--recursive参数至关重要,因为PX4有很多子模块。安装依赖(以Ubuntu为例): PX4提供了一个非常方便的脚本:
bash ./Tools/setup/ubuntu.sh这个脚本会安装Gazebo、ROS(如果需要)、编译工具链等所有依赖。根据网络情况,可能需要较长时间。
编译SITL固件:
make px4_sitl_default这将会编译出一个用于在本地计算机上运行的PX4飞控程序。
6.2 配置AirSim与PX4通信
AirSim通过UDP与PX4 SITL通信。你需要告诉AirSim PX4的地址和端口。
修改AirSim设置文件: 在你的UE项目目录下(或二进制版本的运行目录下),找到
Settings.json文件(如果不存在,可以创建一个)。添加或修改以下配置:{ "SettingsVersion": 1.2, "SimMode": "Multirotor", "Vehicles": { "PX4": { "VehicleType": "PX4Multirotor", "UseSerial": false, "UseTcp": false, "UdpIp": "127.0.0.1", "UdpPort": 14560, "ControlPort": 14580 } } }这配置了AirSim监听本地回路(127.0.0.1)的14560端口,等待PX4的连接。
启动PX4 SITL并连接到AirSim: 在PX4-Autopilot目录下,使用一个特殊的target来启动,它会使用AirSim的仿真模型而不是默认的Gazebo模型。
make px4_sitl none_iris或者,更明确地指定通信端口:
PX4_SIM_HOST_ADDR=127.0.0.1 ./build/px4_sitl_default/bin/px4 -s etc/init.d-posix/rcS -i 0如果连接成功,你会在PX4的终端输出中看到与AirSim建立连接的消息。
6.3 使用QGroundControl进行监控与控制
- 下载并运行QGC:从QGroundControl官网下载对应你操作系统的版本,直接运行即可。
- 连接:QGC默认会自动通过UDP探测本地运行的SITL实例。如果没自动连接,你可以手动添加连接,协议选UDP,端口号通常为14550。
- 操作:连接成功后,你可以在QGC中看到飞机的状态、电池、姿态等信息。你可以通过QGC进行起飞、降落、模式切换(如定高、位置)等任务,也可以通过我们之前写的Python脚本,利用AirSim的API进行更复杂的控制。
至此,一个完整的、包含高保真视觉仿真(AirSim)、飞控软件(PX4 SITL)和地面站(QGC)的无人机仿真环境就全部打通了。
7. 疑难杂症排查与性能优化实录
环境搭建过程中,你几乎一定会遇到各种错误。下面是我总结的一些高频问题及其解决方案。
7.1 编译类错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
CMake Error: Could not find a package configuration file... | CMake找不到Unreal Engine的路径。 | 设置环境变量UE4_ROOT,指向你的UE安装目录(包含Engine文件夹的目录)。在Windows的编译命令行中,这个变量通常由“x64 Native Tools Command Prompt”自动设置。 |
fatal error C1083: Cannot open include file: 'CoreMinimal.h' | 编译AirSim时,头文件路径错误。 | 确保在正确的终端中运行build.cmd(Windows必须用VS的x64本机工具命令提示符)。检查AirSim/CMakeLists.txt中UE4_ROOT的查找逻辑。 |
LINK : fatal error LNK1104: cannot open file 'xxx.lib' | 链接器找不到Unreal Engine的库文件。 | UE编译可能不完整。确保UE已成功编译了“Development Editor”配置。检查UE4_ROOT/Engine/Source/Programs下的相关库是否存在。 |
git submodule update失败 | 网络问题,无法克隆子模块。 | 为Git配置代理,或手动修改.gitmodules文件中的URL为国内镜像源(如果存在),然后执行git submodule sync和git submodule update --init --recursive。 |
7.2 运行类错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| AirSim二进制启动后崩溃或黑屏 | 显卡驱动问题,或DirectX/Vulkan支持问题。 | 更新显卡驱动到最新版本。尝试在Settings.json中设置"RpcEnabled": true并关闭图形界面运行(-opengl4或-vulkan命令行参数试试,取决于二进制编译选项)。 |
Python客户端连接超时 (TimeoutError) | AirSim仿真器未启动,或端口被占用,或Settings.json配置错误。 | 1. 确认仿真器已成功启动并加载完场景。2. 检查Settings.json中ApiServerPort(默认41451)是否与客户端连接端口一致。3. 检查防火墙是否阻止了本地回环通信。 |
| PX4 SITL无法连接AirSim | 端口不匹配,或PX4编译选项不对。 | 1. 确认AirSim设置中的UdpPort(14560) 与启动PX4时指定的端口一致。2. 确保使用none_iris或类似的“无外部仿真器”target启动PX4,它才会主动连接AirSim。 |
| 帧率过低,运行卡顿 | 场景复杂,硬件性能不足。 | 1. 在AirSim设置中降低渲染质量:"ViewMode": "NoDisplay"可以完全关闭渲染窗口,极大提升性能,适用于纯数据采集。2. 降低分辨率,关闭抗锯齿、阴影等特效。3. 确保使用独立显卡运行程序(笔记本注意电源模式)。 |
7.3 性能优化心得
- 无头模式(Headless):对于不需要可视化,只进行算法测试和数据收集的场景,在启动命令中加入
-RenderOffScreen(Windows)或直接使用-opengl4配合-nullrhi(Linux)可以大幅提升性能,将资源全部用于物理和传感器仿真。 - 传感器配置:在
Settings.json中,每个传感器(如相机、激光雷达)的仿真都非常消耗资源。只启用你实验必需的传感器,并合理设置更新频率(CaptureSettings中的SimFrequency),不要盲目使用高频。 - 使用简单的场景:官方的“Blocks”场景已经相对轻量。避免在初期使用超大型、高细节的定制场景。
- Linux性能通常更好:由于更轻量级的系统开销和高效的进程调度,同样的硬件在Linux下运行AirSim仿真,帧率和稳定性往往优于Windows。
环境搭建从来不是一帆风顺的,它本身就是对耐心和解决问题能力的一次演练。这份指南提供了主干道和常见的路障地图,但实际路上可能还有新的坑。当你遇到未列出的错误时,请善用搜索引擎,仔细阅读终端输出的错误日志(通常关键信息就在最前面几行),并查阅AirSim、Unreal Engine、PX4的官方GitHub仓库的Issues页面,你很可能找到前人留下的解决方案。记住,成功搭建并运行起整个仿真链条的那一刻,你对这个系统的理解就已经超越了绝大多数人。接下来,你就可以在这个高保真的数字世界里,尽情放飞你的算法了。