Ubuntu 20.04下AirSim无人机仿真环境搭建全攻略与避坑指南
2026/8/4 7:42:37 网站建设 项目流程

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插件。因此,整个环境搭建分为三个层次,且环环相扣,顺序不能乱:

  1. 系统层:确保Ubuntu 20.04系统本身的基础环境就绪,重点是显卡驱动基础开发工具链。显卡驱动不对,后面的一切3D渲染都是空谈。
  2. 引擎层:获取并编译Unreal Engine 4的源代码。这是最耗时、最吃资源的一步。UE4官方并不提供Linux的二进制发行版,我们必须从Epic Games的Git仓库拉取源码自行编译。这个过程对系统内存、磁盘空间、网络状况都有很高要求。
  3. 插件层:在编译好的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驱动主要有三种方式,各有利弊:

  1. 使用ubuntu-drivers自动安装(推荐给新手)

    # 安装工具 sudo apt install ubuntu-drivers-common -y # 检测并推荐驱动 ubuntu-drivers devices # 安装推荐版本(通常是带“recommended”标记的) sudo ubuntu-drivers autoinstall

    这种方式最简单,安装的驱动版本通常与当前系统内核兼容性最好。但它安装的可能不是最新版本,且对CUDA版本的支持可能不是最优的。

  2. 使用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

    这种方式可以安装比官方仓库更新的驱动,是平衡了新特性和稳定性的选择。

  3. 从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 reboot

3.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

  1. 访问 Unreal Engine官网 ,注册一个Epic Games账户。
  2. 在账户设置中,关联你的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-11lld-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使用率是否跑满来判断编译是否在正常进行。

踩坑记录

  1. 网络问题./Setup.sh需要从Epic的服务器下载大量文件,国内网络环境可能很慢甚至失败。可以考虑使用网络代理工具,或在夜间网络通畅时进行。
  2. 内存不足:编译过程中如果卡住,终端提示“killed”,通常是内存耗尽,系统杀掉了编译进程。除了增加物理内存,唯一办法就是增大swap空间,并减少make -j的线程数(例如改为make -j4),但这会进一步延长编译时间。
  3. 磁盘空间不足:编译中途失败,提示“No space left on device”。请务必在开始前确认磁盘空间大于150GB。
  4. 特定编译错误:如果遇到某个模块编译失败,可以尝试先执行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 AirSim

AirSim的版本需要与UE4版本匹配。克隆主分支通常对应最新的支持版本。为了与UE4 4.27匹配,我们可以切到一个稳定的发布标签。

# 查看与UE4.27兼容的标签,例如v1.8.1 git tag | grep 1.8 # 切换到该标签 git checkout v1.8.1

5.2 安装AirSim的Python依赖并构建

AirSim的构建过程由Python脚本驱动。

# 安装构建所需的Python包 pip3 install msgpack-rpc-python numpy pandas airsim # 运行构建脚本,它会自动检测UE4的安装路径 ./setup.sh

这个setup.sh脚本会做几件事:

  1. 下载并编译AirSim的核心依赖库,如rpclib(一个RPC库)。
  2. 提示你输入已编译的UE4引擎的路径。你需要输入之前编译成功的UE4根目录,例如/home/yourusername/UnrealEngine
  3. 在UE4引擎目录下创建插件符号链接,并编译AirSim插件。

注意:如果setup.sh运行失败,最常见的原因是rpclib编译出错。你可以尝试手动编译它:

cd AirSim ./setup.sh --skip-setup # 然后手动进入external/rpclib目录,按照其README进行编译 # 或者,使用系统包管理器安装(如果版本合适) # sudo apt install librpc-dev

5.3 创建并配置UE4项目

AirSim插件需要嵌入到一个UE4项目中才能运行。

  1. 启动UE4编辑器:通过之前验证过的./UnrealEditor命令启动。
  2. 创建新项目:在启动器界面,选择“游戏” -> “空白”,项目设置选择“C++”(必须),选择一个合适的项目名称(例如MyAirSimProject)和保存路径(不要放在UE4引擎目录或AirSim源码目录内),然后点击“创建”。
  3. 启用AirSim插件:项目创建后,在编辑器菜单栏,点击“编辑” -> “插件”。在插件搜索框中输入“AirSim”,你应该能看到“AirSim Plugin”。勾选其旁边的“启用”复选框,然后重启编辑器(根据提示)。
  4. 设置项目为AirSim模式:编辑器重启后,在“内容浏览器”中,右键点击空白处,选择“新建文件夹”,命名为Settings。在Settings文件夹内右键,选择“新建” -> “AirSim” -> “Settings (json)”。这会创建一个名为settings.json的配置文件。
  5. 编辑配置文件:双击打开settings.json,你可以配置仿真环境。一个最简单的能启动的配置如下:
    { “SeeDocsAt”: “https://github.com/Microsoft/AirSim/blob/master/docs/settings.md”, “SettingsVersion”: 1.2, “SimMode”: “Car” }
    这里将仿真模式设为“Car”。你也可以设为“Multirotor”来仿真无人机。更复杂的配置可以指定车辆/无人机型号、传感器套件、物理引擎参数等。

5.4 运行仿真与Python客户端测试

  1. 运行仿真:在UE4编辑器中,点击工具栏上的“播放”按钮。你应该能看到一个默认的空白场景,以及一辆车或一架无人机(取决于SimMode)。
  2. 使用Python API控制:打开一个新的终端。
    # 进入你的AirSim源码目录下的Python客户端示例目录 cd ~/AirSim/PythonClient/car # 运行一个简单的测试脚本,例如让车开动一下 python3 hello_car.py
    如果一切正常,你应该能在UE4编辑器窗口中看到车辆根据Python脚本的指令做出响应(如前进、转向)。

6. 常见问题与排查技巧实录

即使按照步骤操作,也可能会遇到各种问题。这里记录了我遇到的一些典型问题及解决方法。

6.1 UE4编辑器启动崩溃或黑屏

  • 症状:运行./UnrealEditor后,程序崩溃或窗口黑屏无响应。
  • 排查
    1. 检查驱动:再次运行nvidia-smi,确认驱动加载正常。尝试在终端中启动编辑器,查看是否有具体的错误输出。
    2. 检查OpenGL:运行glxinfo | grep “OpenGL renderer”,确认使用的是NVIDIA硬件渲染,而不是“LLVMpipe”软件渲染。
    3. 使用Vulkan后端(尝试):编辑~/.config/Epic/UnrealEngine/4.27/Engine/Config/Linux/LinuxEngine.ini,在[/Script/LinuxTargetPlatform.LinuxTargetSettings]部分添加DefaultGraphicsRHI=DefaultGraphicsRHI_Vulkan。但注意,AirSim对Vulkan的支持可能不完善。
    4. 禁用复合窗口管理器:如果你使用的是Ubuntu默认的GNOME桌面,可以尝试在启动编辑器前执行export SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR=0
  • 根本原因:99%是显卡驱动或图形环境兼容性问题。

6.2 AirSim插件编译失败

  • 症状:运行./setup.sh时,在编译rpclib或AirSim自身时出现编译错误(如undefined reference)。
  • 排查
    1. 检查UE4路径:确保setup.sh脚本提示输入路径时,你输入的是绝对路径(如/home/user/UnrealEngine),并且该路径下确实有编译好的引擎。
    2. 检查C++编译器:确保系统默认的g++clang++版本符合要求。Ubuntu 20.04默认的gcc-9通常是没问题的。
    3. 手动编译依赖:如之前所述,尝试跳过自动设置,手动编译rpclib。进入AirSim/external/rpclib目录,按照其CMakeLists.txt的指示进行编译安装。
    4. 查看详细日志setup.sh脚本通常会在AirSim/buildAirSim/external/rpclib/build目录下生成CMakeCache.txtMakefile,查看编译终端输出的最后几行错误信息,通常是解决问题的关键。

6.3 Python客户端无法连接到仿真器

  • 症状:运行Python示例脚本(如hello_car.py)时,提示连接超时或拒绝连接。
  • 排查
    1. 确认仿真器在运行:UE4编辑器必须处于“播放”模式(即仿真运行中)。
    2. 检查IP和端口:默认情况下,AirSim的RPC服务器运行在localhost:41451。确保Python脚本中连接的是正确的地址(默认就是localhost)。如果你修改了settings.json中的ApiServerPort,Python脚本也需要相应修改。
    3. 检查防火墙:Ubuntu的防火墙(ufw)可能会阻止本地回环端口的通信,但这种情况较少见。可以暂时禁用防火墙测试:sudo ufw disable(测试后记得启用)。
    4. 使用更简单的测试:尝试运行AirSim/PythonClient/hello_drone.pyhello_car.py这些最基本的脚本,排除你自己代码的问题。

6.4 仿真画面卡顿或传感器数据延迟高

  • 症状:仿真运行不流畅,或者通过API获取图像、激光雷达数据很慢。
  • 排查
    1. 查看GPU占用:在仿真运行时,在另一个终端运行nvidia-smi -l 1,观察GPU利用率和显存占用。如果利用率很低但卡顿,可能是CPU瓶颈或设置问题。
    2. 降低图形设置:在UE4编辑器的“播放”模式下,点击“设置”->“引擎可扩展性设置”,将质量从“史诗”调至“高”或“中”。
    3. 优化AirSim设置:在settings.json中,可以关闭不需要的传感器,或者降低传感器分辨率、采样频率。例如,深度相机和语义分割相机的计算开销很大。
    4. 使用“独立模式”运行:在UE4编辑器中,点击“文件”->“打包项目”->“Linux”,将项目打包成独立的可执行文件。然后用命令行运行这个可执行文件,通常性能会比在编辑器内“播放”更好,因为省去了编辑器的开销。

整个环境搭建过程确实繁琐,但一旦成功,你就拥有了一个功能强大、可高度定化的机器人仿真平台。我个人的体会是,耐心和细致的日志阅读是关键。每次失败,终端输出的错误信息都是最好的线索。不要盲目重试,而是根据错误信息去搜索、去理解背后的原因。把这个环境搭建过程走通,本身也是对Linux系统管理、大型C++项目编译、游戏引擎架构的一次深刻学习。当你第一次用自己的Python代码控制虚幻世界中的无人机平稳起飞时,之前所有的折腾都是值得的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询