1. 项目概述与核心价值
最近在折腾基于AirSim的无人机仿真研究,环境搭建这一步就卡住了不少人。Ubuntu 20.04 LTS作为长期支持版本,是很多实验室和开发者的首选系统,但在上面部署AirSim,尤其是要编译Unreal Engine 4(UE4),堪称一场“渡劫”。从显卡驱动的版本兼容性,到UE4源码编译时动辄上百G的磁盘空间和数小时的等待,再到AirSim插件编译中各种依赖库的缺失和版本冲突,每一步都可能让你从入门到放弃。我花了将近一周时间,反复重装系统、编译、排错,才最终把整个环境跑通。这篇文章就是把我踩过的所有坑、验证过的所有有效步骤,以及背后的原理梳理出来,目标是让你能按照这个指南,一次性成功搭建AirSim仿真环境,把宝贵的时间用在算法开发上,而不是无休止的环境配置上。
这个指南的核心价值在于“避坑”。网上能找到的官方或零散教程,往往只告诉你“要做什么”,但很少详细解释“为什么这么做”以及“做错了会怎样”。我会结合Ubuntu 20.04的系统特性、NVIDIA驱动与CUDA的版本耦合关系、UE4对系统组件的特定要求,以及AirSim自身的编译机制,把每一步操作背后的逻辑讲清楚。无论你是刚接触机器人仿真的研究生,还是希望快速搭建测试环境的工程师,这篇指南都能帮你绕过那些令人头疼的暗礁,直达目的地。
2. 环境搭建的整体思路与前置认知
在动手之前,我们必须对AirSim在Ubuntu下的运行架构有一个清晰的认知。AirSim不是一个独立的可执行文件,它本质上是一个Unreal Engine插件。因此,整个环境搭建分为三个层次,且环环相扣,顺序不能乱:
- 系统层:确保Ubuntu 20.04系统本身的基础环境就绪,重点是显卡驱动和基础开发工具链。显卡驱动不对,后面的一切3D渲染都是空谈。
- 引擎层:获取并编译Unreal Engine 4的源代码。这是最耗时、最吃资源的一步。UE4官方并不提供Linux的二进制发行版,我们必须从Epic Games的Git仓库拉取源码自行编译。这个过程对系统内存、磁盘空间、网络状况都有很高要求。
- 插件层:在编译好的UE4环境中,编译并集成AirSim插件。这一步需要配置AirSim的依赖(如rpclib),并生成最终的UE4项目文件。
整个流程的依赖关系是单向的:系统层支撑引擎层,引擎层支撑插件层。任何一个下层出现问题,上层都无法正常工作。常见的失败案例,比如虚幻编辑器能打开但场景一片黑,多半是显卡驱动问题;能编译UE4但编译AirSim时报链接错误,多半是依赖库版本或路径问题。理解了这个层次关系,在排查错误时就能有的放矢。
注意:强烈建议在一台干净的Ubuntu 20.04系统上开始。如果你已经尝试过多次并失败,残留的配置文件、旧版本库可能会带来难以排查的干扰。备份好个人数据后,重新安装系统往往是最高效的“重置”方式。
2.1 硬件与系统准备要点
你的硬件配置直接决定了编译体验和最终仿真性能。
- CPU与内存:编译UE4是一个极度消耗CPU和内存的过程。官方建议至少6核CPU和32GB内存。实测在8核CPU、16GB内存的机器上,编译过程会非常缓慢,且可能因内存不足而失败。如果内存不足,可以尝试创建一个足够大的swap交换分区(例如32GB),但这会显著降低编译速度(因为频繁的磁盘IO)。最理想的配置是12核以上CPU,64GB内存,这样编译过程会顺畅很多。
- 磁盘空间:这是另一个容易被低估的“杀手”。你需要为以下内容预留空间:
- UE4源代码:约8GB。
- 编译过程中的中间文件:约30GB。
- 编译完成后的引擎:约40GB。
- 一个基础的UE4空项目:约2GB。
- AirSim插件及依赖:约1GB。
- 因此,为整个环境预留150GB以上的可用磁盘空间是安全的选择。最好使用SSD,机械硬盘的编译速度会让你怀疑人生。
- 显卡:必须是NVIDIA显卡。AirSim的许多传感器仿真(如深度图、语义分割)依赖于CUDA进行GPU加速。AMD显卡在Linux下对UE4的支持非常有限,几乎无法正常运行。请确认你的显卡型号(如RTX 3060, RTX 4090等),这将决定你安装的驱动版本。
3. 系统层:显卡驱动与基础环境搭建
这是整个流程的基石,也是最容易出问题的一步。我们的目标是在Ubuntu 20.04上安装一个与CUDA Toolkit兼容的、稳定的NVIDIA驱动。
3.1 彻底清理旧驱动(关键第一步)
如果你之前安装过NVIDIA驱动,或者系统自带了nouveau开源驱动,第一步必须是彻底清理。
sudo apt purge *nvidia* *cuda* *cudnn* -y sudo apt autoremove -y sudo apt autoclean -y然后,禁用系统自带的nouveau驱动,它与NVIDIA专有驱动冲突。
# 编辑黑名单配置文件 sudo nano /etc/modprobe.d/blacklist-nouveau.conf在文件中添加以下两行:
blacklist nouveau options nouveau modeset=0保存退出后,更新initramfs并重启。
sudo update-initramfs -u sudo reboot重启后,验证nouveau是否被禁用。执行lsmod | grep nouveau,如果没有输出,则表示禁用成功。
3.2 选择合适的驱动安装方式
Ubuntu下安装NVIDIA驱动主要有三种方式,各有利弊:
使用
ubuntu-drivers自动安装(推荐给新手):# 安装工具 sudo apt install ubuntu-drivers-common -y # 检测并推荐驱动 ubuntu-drivers devices # 安装推荐版本(通常是带“recommended”标记的) sudo ubuntu-drivers autoinstall这种方式最简单,安装的驱动版本通常与当前系统内核兼容性最好。但它安装的可能不是最新版本,且对CUDA版本的支持可能不是最优的。
使用PPA仓库安装较新版本:
sudo add-apt-repository ppa:graphics-drivers/ppa -y sudo apt update # 再次查看可用的驱动版本,选择较新的,例如nvidia-driver-535 ubuntu-drivers devices sudo apt install nvidia-driver-535 -y这种方式可以安装比官方仓库更新的驱动,是平衡了新特性和稳定性的选择。
从NVIDIA官网下载.run文件手动安装(最灵活,但最复杂): 你需要去NVIDIA官网根据显卡型号和系统下载对应的驱动文件(如
NVIDIA-Linux-x86_64-550.90.07.run)。这种方式可以安装任何你想要的版本,但需要关闭图形界面(进入tty模式),且容易因与系统组件不匹配而导致安装失败或开机黑屏。除非你明确需要某个特定版本,否则不推荐新手使用。
我的选择与理由:对于AirSim和UE4,我推荐使用方式2(PPA)安装nvidia-driver-535。这是一个长期支持分支的版本,在Ubuntu 20.04上非常稳定,并且完美支持CUDA 11.x和12.x,兼容性覆盖了大多数深度学习框架和AirSim的需求。驱动版本太旧可能缺少新显卡的功能支持,太新则可能引入未知的稳定性问题。535是一个经过大量实践验证的“甜点”版本。
安装完成后,必须重启系统。
sudo reboot3.3 验证驱动安装成功
重启后,通过以下命令验证:
# 查看驱动版本和显卡信息 nvidia-smi你应该看到一个表格,显示了GPU型号、驱动版本、CUDA版本(这里显示的是驱动内建的最高支持CUDA版本,并非已安装的CUDA Toolkit)、GPU利用率等信息。如果这个命令能正常输出,恭喜你,驱动安装成功了。
# 查看当前正在使用的显卡渲染器(确保不是LLVMpipe等软件渲染) glxinfo | grep “OpenGL renderer”输出应类似“NVIDIA GeForce RTX 4060 Ti/PCIe/SSE2”,这表明3D渲染已由NVIDIA显卡硬件加速。
4. 引擎层:Unreal Engine 4源码编译
这是耗时最长、资源消耗最大的部分。请确保你已完成第3步,并且磁盘空间、内存充足。
4.1 注册Epic Games账户并关联GitHub
- 访问 Unreal Engine官网 ,注册一个Epic Games账户。
- 在账户设置中,关联你的GitHub账户。这是获取UE4源代码的必需步骤。
4.2 安装编译依赖
UE4编译需要一整套开发工具和库。Epic提供了一个安装脚本,但我们需要先确保一些基础工具到位。
# 安装Git和Python3(系统可能已自带,但确保版本) sudo apt install git python3 python3-pip -y # 安装编译所需的基础软件包 sudo apt install build-essential clang-11 lld-11 cmake ninja-build -y # 安装必要的库文件 sudo apt install libxinerama-dev libxcursor-dev libxrandr-dev libxss-dev libgl1-mesa-dev libfreetype6-dev libopenal-dev libsndfile-dev -y # 特别重要的库,缺少会导致编译失败 sudo apt install libpng-dev libjpeg-dev libogg-dev libvorbis-dev libatlas-base-dev libboost-all-dev -y实操心得:
libboost-all-dev这个包尤其重要,UE4的构建系统大量使用了Boost库。如果安装时提示找不到,可以尝试sudo apt install libboost1.71-dev(或对应版本)。另外,clang-11和lld-11是UE4在Linux上指定的编译器和链接器,必须安装。
4.3 获取UE4源代码
我们不直接克隆主仓库,而是使用Epic提供的“克隆工具”,它能更好地管理这个巨大的仓库。
# 创建一个专门的工作目录,路径不要有中文或空格 mkdir -p ~/UnrealEngine cd ~/UnrealEngine # 从GitHub克隆UE4仓库(使用你关联了Epic账户的GitHub账号) git clone https://github.com/EpicGames/UnrealEngine.git -b 4.27 cd UnrealEngine这里我们指定了-b 4.27分支。AirSim对UE4版本有要求,4.27是一个被广泛支持且稳定的版本。请勿使用最新的5.x版本,除非AirSim官方明确声明支持。
4.4 运行安装脚本并开始编译
# 运行安装脚本,它会下载剩余的二进制依赖(约数GB) ./Setup.sh # 这个过程可能很长,取决于你的网速。完成后,生成项目文件 ./GenerateProjectFiles.sh # 最后,开始编译UE4引擎本体。使用make命令,-j参数指定并行编译的线程数,通常设为CPU核心数 make -j $(nproc)这是最漫长的阶段,在性能足够的机器上可能需要1-2小时,在资源紧张的机器上可能需要6小时以上。你可以观察CPU使用率是否跑满来判断编译是否在正常进行。
踩坑记录:
- 网络问题:
./Setup.sh需要从Epic的服务器下载大量文件,国内网络环境可能很慢甚至失败。可以考虑使用网络代理工具,或在夜间网络通畅时进行。- 内存不足:编译过程中如果卡住,终端提示“killed”,通常是内存耗尽,系统杀掉了编译进程。除了增加物理内存,唯一办法就是增大swap空间,并减少
make -j的线程数(例如改为make -j4),但这会进一步延长编译时间。- 磁盘空间不足:编译中途失败,提示“No space left on device”。请务必在开始前确认磁盘空间大于150GB。
- 特定编译错误:如果遇到某个模块编译失败,可以尝试先执行
make ShaderCompileWorker,然后再重新执行make -j $(nproc)。有时模块间的依赖需要按顺序编译。
4.5 验证UE4编译成功
编译完成后,在~/UnrealEngine/Engine/Binaries/Linux/目录下,会生成一个名为UnrealEditor的可执行文件。
# 尝试运行虚幻编辑器 cd ~/UnrealEngine/Engine/Binaries/Linux/ ./UnrealEditor如果一切顺利,你将看到Unreal Engine 4的编辑器启动界面。第一次启动会进行一些初始化设置,完成后你就可以创建一个新项目了。请务必成功运行一次编辑器,确保引擎本身是完好可用的,然后再进行下一步。如果编辑器无法启动或闪退,请根据错误信息回溯检查,通常是驱动或依赖库的问题。
5. 插件层:AirSim编译与集成
现在,我们有了健康的UE4引擎,可以开始安装AirSim这个“大脑”了。
5.1 克隆与准备AirSim源码
建议将AirSim克隆到独立目录,而不是UE4引擎目录内。
# 退出UE4目录,回到用户主目录或你的工作区 cd ~ git clone https://github.com/microsoft/AirSim.git cd AirSimAirSim的版本需要与UE4版本匹配。克隆主分支通常对应最新的支持版本。为了与UE4 4.27匹配,我们可以切到一个稳定的发布标签。
# 查看与UE4.27兼容的标签,例如v1.8.1 git tag | grep 1.8 # 切换到该标签 git checkout v1.8.15.2 安装AirSim的Python依赖并构建
AirSim的构建过程由Python脚本驱动。
# 安装构建所需的Python包 pip3 install msgpack-rpc-python numpy pandas airsim # 运行构建脚本,它会自动检测UE4的安装路径 ./setup.sh这个setup.sh脚本会做几件事:
- 下载并编译AirSim的核心依赖库,如
rpclib(一个RPC库)。 - 提示你输入已编译的UE4引擎的路径。你需要输入之前编译成功的UE4根目录,例如
/home/yourusername/UnrealEngine。 - 在UE4引擎目录下创建插件符号链接,并编译AirSim插件。
注意:如果
setup.sh运行失败,最常见的原因是rpclib编译出错。你可以尝试手动编译它:cd AirSim ./setup.sh --skip-setup # 然后手动进入external/rpclib目录,按照其README进行编译 # 或者,使用系统包管理器安装(如果版本合适) # sudo apt install librpc-dev
5.3 创建并配置UE4项目
AirSim插件需要嵌入到一个UE4项目中才能运行。
- 启动UE4编辑器:通过之前验证过的
./UnrealEditor命令启动。 - 创建新项目:在启动器界面,选择“游戏” -> “空白”,项目设置选择“C++”(必须),选择一个合适的项目名称(例如
MyAirSimProject)和保存路径(不要放在UE4引擎目录或AirSim源码目录内),然后点击“创建”。 - 启用AirSim插件:项目创建后,在编辑器菜单栏,点击“编辑” -> “插件”。在插件搜索框中输入“AirSim”,你应该能看到“AirSim Plugin”。勾选其旁边的“启用”复选框,然后重启编辑器(根据提示)。
- 设置项目为AirSim模式:编辑器重启后,在“内容浏览器”中,右键点击空白处,选择“新建文件夹”,命名为
Settings。在Settings文件夹内右键,选择“新建” -> “AirSim” -> “Settings (json)”。这会创建一个名为settings.json的配置文件。 - 编辑配置文件:双击打开
settings.json,你可以配置仿真环境。一个最简单的能启动的配置如下:
这里将仿真模式设为“Car”。你也可以设为“Multirotor”来仿真无人机。更复杂的配置可以指定车辆/无人机型号、传感器套件、物理引擎参数等。{ “SeeDocsAt”: “https://github.com/Microsoft/AirSim/blob/master/docs/settings.md”, “SettingsVersion”: 1.2, “SimMode”: “Car” }
5.4 运行仿真与Python客户端测试
- 运行仿真:在UE4编辑器中,点击工具栏上的“播放”按钮。你应该能看到一个默认的空白场景,以及一辆车或一架无人机(取决于SimMode)。
- 使用Python API控制:打开一个新的终端。
如果一切正常,你应该能在UE4编辑器窗口中看到车辆根据Python脚本的指令做出响应(如前进、转向)。# 进入你的AirSim源码目录下的Python客户端示例目录 cd ~/AirSim/PythonClient/car # 运行一个简单的测试脚本,例如让车开动一下 python3 hello_car.py
6. 常见问题与排查技巧实录
即使按照步骤操作,也可能会遇到各种问题。这里记录了我遇到的一些典型问题及解决方法。
6.1 UE4编辑器启动崩溃或黑屏
- 症状:运行
./UnrealEditor后,程序崩溃或窗口黑屏无响应。 - 排查:
- 检查驱动:再次运行
nvidia-smi,确认驱动加载正常。尝试在终端中启动编辑器,查看是否有具体的错误输出。 - 检查OpenGL:运行
glxinfo | grep “OpenGL renderer”,确认使用的是NVIDIA硬件渲染,而不是“LLVMpipe”软件渲染。 - 使用Vulkan后端(尝试):编辑
~/.config/Epic/UnrealEngine/4.27/Engine/Config/Linux/LinuxEngine.ini,在[/Script/LinuxTargetPlatform.LinuxTargetSettings]部分添加DefaultGraphicsRHI=DefaultGraphicsRHI_Vulkan。但注意,AirSim对Vulkan的支持可能不完善。 - 禁用复合窗口管理器:如果你使用的是Ubuntu默认的GNOME桌面,可以尝试在启动编辑器前执行
export SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR=0。
- 检查驱动:再次运行
- 根本原因:99%是显卡驱动或图形环境兼容性问题。
6.2 AirSim插件编译失败
- 症状:运行
./setup.sh时,在编译rpclib或AirSim自身时出现编译错误(如undefined reference)。 - 排查:
- 检查UE4路径:确保
setup.sh脚本提示输入路径时,你输入的是绝对路径(如/home/user/UnrealEngine),并且该路径下确实有编译好的引擎。 - 检查C++编译器:确保系统默认的
g++和clang++版本符合要求。Ubuntu 20.04默认的gcc-9通常是没问题的。 - 手动编译依赖:如之前所述,尝试跳过自动设置,手动编译
rpclib。进入AirSim/external/rpclib目录,按照其CMakeLists.txt的指示进行编译安装。 - 查看详细日志:
setup.sh脚本通常会在AirSim/build或AirSim/external/rpclib/build目录下生成CMakeCache.txt和Makefile,查看编译终端输出的最后几行错误信息,通常是解决问题的关键。
- 检查UE4路径:确保
6.3 Python客户端无法连接到仿真器
- 症状:运行Python示例脚本(如
hello_car.py)时,提示连接超时或拒绝连接。 - 排查:
- 确认仿真器在运行:UE4编辑器必须处于“播放”模式(即仿真运行中)。
- 检查IP和端口:默认情况下,AirSim的RPC服务器运行在
localhost:41451。确保Python脚本中连接的是正确的地址(默认就是localhost)。如果你修改了settings.json中的ApiServerPort,Python脚本也需要相应修改。 - 检查防火墙:Ubuntu的防火墙(
ufw)可能会阻止本地回环端口的通信,但这种情况较少见。可以暂时禁用防火墙测试:sudo ufw disable(测试后记得启用)。 - 使用更简单的测试:尝试运行
AirSim/PythonClient/hello_drone.py或hello_car.py这些最基本的脚本,排除你自己代码的问题。
6.4 仿真画面卡顿或传感器数据延迟高
- 症状:仿真运行不流畅,或者通过API获取图像、激光雷达数据很慢。
- 排查:
- 查看GPU占用:在仿真运行时,在另一个终端运行
nvidia-smi -l 1,观察GPU利用率和显存占用。如果利用率很低但卡顿,可能是CPU瓶颈或设置问题。 - 降低图形设置:在UE4编辑器的“播放”模式下,点击“设置”->“引擎可扩展性设置”,将质量从“史诗”调至“高”或“中”。
- 优化AirSim设置:在
settings.json中,可以关闭不需要的传感器,或者降低传感器分辨率、采样频率。例如,深度相机和语义分割相机的计算开销很大。 - 使用“独立模式”运行:在UE4编辑器中,点击“文件”->“打包项目”->“Linux”,将项目打包成独立的可执行文件。然后用命令行运行这个可执行文件,通常性能会比在编辑器内“播放”更好,因为省去了编辑器的开销。
- 查看GPU占用:在仿真运行时,在另一个终端运行
整个环境搭建过程确实繁琐,但一旦成功,你就拥有了一个功能强大、可高度定化的机器人仿真平台。我个人的体会是,耐心和细致的日志阅读是关键。每次失败,终端输出的错误信息都是最好的线索。不要盲目重试,而是根据错误信息去搜索、去理解背后的原因。把这个环境搭建过程走通,本身也是对Linux系统管理、大型C++项目编译、游戏引擎架构的一次深刻学习。当你第一次用自己的Python代码控制虚幻世界中的无人机平稳起飞时,之前所有的折腾都是值得的。