
1. 项目概述为什么我们需要UE4与AirSim的组合如果你对无人机、自动驾驶或者机器人仿真感兴趣那么“UE4 AirSim”这个组合对你来说绝对是一个绕不开的黄金搭档。我最初接触这个组合是为了给一个无人机视觉算法项目搭建一个可控、可重复、且成本低廉的测试环境。在现实世界里让无人机带着昂贵的传感器飞个几百次来调试代码不仅风险高、成本大还受天气和场地限制。而AirSim这个由微软开源的仿真平台恰好提供了高保真的物理和视觉仿真环境其底层渲染引擎就是大名鼎鼎的虚幻引擎4UE4。简单来说UE4负责把场景画得跟真的一样——光影、材质、天气效果AirSim则负责在UE4创造的这个世界里模拟出无人机或汽车的物理模型、传感器摄像头、激光雷达、IMU等数据并提供一个API接口让你能用Python、C等代码像控制真机一样控制仿真器里的智能体。从零部署这套环境听起来就是下载、安装、编译几步但实际走一遍你会发现从操作系统选择、驱动版本、虚幻引擎版本兼容性到编译选项、路径设置处处是“坑”。这篇指南就是把我踩过的这些坑填平手把手带你搭建一个能跑起来的、稳定的UE4AirSim仿真环境让你能把精力集中在算法开发上而不是和环境搏斗。2. 环境搭建前的核心决策与准备在动手敲命令之前有几个关键的决策点直接决定了后续工作的顺利程度。盲目开始很可能在几个小时后遇到无法解决的编译错误不得不推倒重来。2.1 操作系统选择为什么强烈推荐Ubuntu 20.04网络上关于AirSim的教程会提到Windows和Linux。对于UE4开发Windows有官方编辑器看似友好。但对于AirSim尤其是结合机器人操作系统ROS进行开发时Ubuntu 20.04 LTS是目前社区验证最充分、坑最少的平台。原因有三点驱动与兼容性AirSim对NVIDIA显卡的依赖很深Ubuntu下的驱动管理和CUDA工具链更为成熟和稳定。Windows下各种运行时库如VC Redistributable的版本冲突是隐形杀手。编译工具链UE4和AirSim的源码编译需要特定的GCC版本如7或8。在Ubuntu上通过apt管理多个GCC版本非常方便。而在Windows上你可能需要折腾Visual Studio的特定组件和Windows SDK过程更复杂。ROS生态绝大多数机器人算法研究都基于ROSROS1 Noetic或ROS2 Foxy。ROS在Ubuntu上的支持是最原生的。虽然Windows也有ROS支持但完善度和社区资源远不及Ubuntu。注意Ubuntu 22.04或更新的版本并非不能装但你需要面对更新的系统库与UE4/ AirSim所需的老版本依赖之间的冲突。例如可能需要手动降级某些库这引入了不必要的复杂度。因此对于生产或稳定的研究环境Ubuntu 20.04是最稳妥的起点。2.2 硬件要求你的显卡够用吗这不是一个轻量级的仿真。UE4渲染高精度场景非常消耗资源。显卡GPU必须是一块NVIDIA独立显卡。AirSim的某些传感器仿真如深度图和UE4的高质量渲染都需要CUDA支持。入门级如GTX 1060 6GB可以运行简单场景但建议至少RTX 2060或以上显存6GB是底线8GB或更多会让你在运行复杂城市场景时更从容。内存RAM16GB是起步32GB推荐。编译UE4引擎本身就是一个内存吞噬兽16GB内存可能在编译时出现卡死。运行一个中等规模的UE4地图加上AirSim占用10GB以上内存是常事。存储SSD必须使用固态硬盘SSD。UE4引擎源码、二进制文件以及项目资产非常庞大动辄上百GB。机械硬盘的读写速度会严重拖慢编译和编辑器加载速度。CPU四核八线程以上的现代处理器即可编译速度和多任务处理会更流畅。2.3 软件版本锁定避免“版本地狱”这是避坑的核心UE4、AirSim、ROS、CUDA、驱动之间存在着复杂的依赖关系。随意使用最新版本大概率会失败。NVIDIA驱动与CUDA首先安装合适的NVIDIA驱动。对于Ubuntu 20.04建议通过系统“软件和更新”的“附加驱动”选项卡选择一个稳定的专有驱动版本例如nvidia-driver-470。然后安装CUDA Toolkit。AirSim通常与CUDA 10.x或11.x兼容较好。一个已验证的组合是驱动版本470CUDA 11.4。安装后务必运行nvidia-smi确认驱动和CUDA版本信息。虚幻引擎4UE4不要使用最新的UE5AirSim目前截至我撰写时官方主要支持UE4.27。这是一个长期支持版本稳定性和兼容性最好。我们将从Epic Games的GitHub仓库克隆并编译这个特定版本。AirSim克隆其GitHub主分支master即可但需要注意其子模块的更新。有时主分支可能包含实验性功能如果想求稳可以checkout到一个较近的稳定发布tag。ROS选择ROS NoeticROS1或ROS2 Foxy。两者AirSim都有支持。ROS1的生态更成熟教程更多ROS2是未来趋势。本指南以ROS Noetic为例因为它与Ubuntu 20.04是官方配对。3. 步步为营从零开始的完整部署流程现在我们假设你有一台安装了Ubuntu 20.04的电脑并已经换好了国内软件源以加速下载。让我们开始实战。3.1 第一步奠定基础——系统依赖与ROS安装打开终端我们首先安装一系列基础编译工具和库。# 1. 更新软件包列表并升级现有软件 sudo apt update sudo apt upgrade -y # 2. 安装核心编译工具和依赖 sudo apt install -y build-essential cmake clang-8 lld-8 g-7 gcc-7 curl git unzip python3-dev python3-pip # 设置gcc-7和g-7为默认版本如果系统有更高版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 sudo update-alternatives --install /usr/bin/g g /usr/bin/g-7 70 # 3. 安装ROS Noetic完整桌面版 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-noetic-desktop-full # 4. 初始化rosdep并设置环境变量 sudo rosdep init rosdep update echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc # 5. 安装ROS构建工具和常用包 sudo apt install -y python3-rosinstall python3-rosinstall-generator python3-wstool python3-catkin-tools sudo apt install -y ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-tf2-sensor-msgs # 安装geographiclib数据集为mavros提供地理信息支持 sudo apt install -y ros-noetic-geographic-msgs wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh chmod x install_geographiclib_datasets.sh sudo ./install_geographiclib_datasets.sh实操心得rosdep update这一步可能会因为网络问题失败。如果遇到可以尝试更换手机热点或者修改/etc/hosts文件添加raw.githubusercontent.com的可用IP地址。这是部署ROS时的经典“坑点”。3.2 第二步编译虚幻引擎4.27这是最耗时也最容易出错的一步。我们采用源码编译以获得对AirSim的最佳支持。# 1. 创建引擎安装目录建议放在空间充足的SSD分区 mkdir -p ~/UnrealEngine cd ~/UnrealEngine # 2. 克隆指定版本的UE4源码使用--depth1加快克隆速度 git clone --depth 1 -b 4.27 https://github.com/EpicGames/UnrealEngine.git cd UnrealEngine # 3. 运行安装脚本下载必要的依赖和组件 ./Setup.sh # 4. 生成项目文件并开始编译这将花费1-4小时取决于你的CPU和内存 ./GenerateProjectFiles.sh make # 或者使用多核编译加速 make -j$(nproc)关键避坑点内存不足如果编译过程中系统卡死大概率是内存不足。可以尝试不使用-j$(nproc)全核编译而是用make -j4减少并行任务数。最根本的解决方法是增加物理内存或创建足够大的swap交换分区。网络超时./Setup.sh会下载大量依赖确保网络稳定。如果某些组件下载失败脚本可能会报错需要根据错误信息重试或手动下载放置到指定位置。权限问题整个流程不需要sudo在用户目录下操作即可。如果之前用sudo运行过相关命令可能导致文件权限混乱需要清理后重来。编译成功后你会在~/UnrealEngine/Engine/Binaries/Linux/目录下找到UnrealEditor可执行文件。可以运行./UnrealEditor测试引擎是否正常启动。3.3 第三步集成核心——编译与配置AirSimUE4准备好后我们来安装“大脑”AirSim。# 1. 克隆AirSim源码到主目录 cd ~ git clone https://github.com/microsoft/AirSim.git cd AirSim # 2. 更新子模块重要 git submodule update --init --recursive # 3. 使用AirSim提供的脚本编译 ./setup.sh ./build.shsetup.sh脚本会检查你的环境并安装一些必要的Python包如msgpack-rpc-python。build.sh则会调用CMake和make来编译AirSim。这个过程比编译UE4快得多。编译完成后关键一步是将AirSim集成到UE4中。AirSim编译产物是一个UE4插件。我们需要将其复制到UE4的项目或引擎目录。# 假设你的UE4源码在 ~/UnrealEngine # 将编译好的AirSim插件复制到UE4的插件目录 cp -r ~/AirSim/Unreal/Plugins/AirSim ~/UnrealEngine/Engine/Plugins/Marketplace/ # 注意有些教程建议复制到项目目录复制到引擎插件目录可以使其对所有UE4项目可用。3.4 第四步创建并运行你的第一个仿真项目现在所有组件都已就位让我们创建一个UE4项目来测试。启动UE4编辑器cd ~/UnrealEngine/Engine/Binaries/Linux ./UnrealEditor首次启动会较慢需要初始化着色器等。创建新项目在启动器界面选择“游戏” - “空白”选择“C”项目必须选择CBlueprint Only项目无法使用AirSim插件设置好项目名称例如MyAirSimProject和存储路径点击“创建”。启用AirSim插件项目创建并打开后点击菜单栏的“编辑” - “插件”。在插件窗口的搜索框输入“AirSim”你应该能看到“AirSim”插件勾选其旁边的“启用”复选框然后根据提示重启编辑器。添加载具编辑器重启后在内容浏览器中右键点击选择“新建文件夹”命名为AirSim。然后再次右键点击AirSim文件夹选择“新建基本资产” - “AirSim” - “车辆设置”。这会创建一个vehicle_setting.json文件。你可以用文本编辑器打开它配置无人机或汽车的参数但默认配置即可运行。打开示例地图AirSim自带了一些示例地图。我们需要将这些地图文件复制到我们的项目里。# 在终端中进入你的项目目录的Content文件夹 cd ~/Documents/Unreal\ Projects/MyAirSimProject/Content # 从AirSim源码复制示例地图 cp -r ~/AirSim/Unreal/Environments/Blocks/ .回到UE4编辑器在内容浏览器中你应该能看到一个Blocks文件夹里面有一个Blocks地图。双击打开它。运行仿真点击编辑器顶部的“播放”按钮。如果一切正常你将看到无人机视角的仿真窗口。此时仿真已经运行并启动了一个本地API服务器默认在localhost:41451。3.5 第五步使用Python API进行控制测试仿真环境运行起来了但我们还需要验证能否通过代码控制它。安装AirSim Python客户端库pip install msgpack-rpc-python pip install airsim # 或者直接安装AirSim源码中的客户端库推荐版本匹配 cd ~/AirSim pip install ./PythonClient编写一个简单的测试脚本创建一个名为test_drone.py的文件。import airsim import time # 连接到仿真器 client airsim.MultirotorClient() client.confirmConnection() # 解锁并起飞 client.enableApiControl(True) client.armDisarm(True) client.takeoffAsync().join() # 飞到10米高 client.moveToZAsync(-10, 5).join() # 在AirSim中Z轴向下为负 # 悬停5秒 time.sleep(5) # 降落并上锁 client.landAsync().join() client.armDisarm(False) client.enableApiControl(False) print(测试完成)运行测试确保UE4编辑器正在运行Blocks地图并处于“播放”模式。然后在终端运行python3 test_drone.py你应该能看到仿真窗口中的无人机自动起飞、爬升、悬停、然后降落。恭喜你整个UE4AirSim环境部署成功4. 实战中常见问题与深度排查指南即使按照步骤操作你也可能遇到各种问题。下面是我在多次部署中遇到的典型问题及其解决方案。4.1 UE4编译失败内存不足与版本冲突问题现象make编译过程中系统卡死、黑屏或报错internal compiler error: Killed (program cc1plus)。原因分析这是典型的内存包括Swap空间不足。编译UE4的某些模块如ShaderCompiler需要消耗大量内存。解决方案增加Swap空间如果物理内存不足一个大的Swap文件可以救命。# 创建一个16GB的swap文件 sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 永久生效编辑/etc/fstab添加一行/swapfile none swap sw 0 0减少并行编译任务不使用make -j$(nproc)改用make -j2或make -j4降低内存峰值需求。分模块编译如果知道是哪个模块出错可以尝试单独编译它例如make ShaderCompilerWorker。问题现象编译时报错提示某些头文件找不到或C语法错误。原因分析系统自带的GCC版本过高或过低与UE4 4.27不兼容。UE4 4.27通常需要GCC 7或8。解决方案确保已按照2.1节设置gcc-7和g-7为默认版本并使用gcc --version和g --version确认。4.2 AirSim插件无法启用或导致编辑器崩溃问题现象在UE4插件列表中找不到AirSim或启用后重启编辑器崩溃。原因分析插件未正确复制AirSim插件文件夹没有放在正确的Plugins目录下。必须放在项目的Plugins/或引擎的Plugins/Marketplace/下。编译环境不匹配在Windows上编译的插件不能用在Linux的UE4上反之亦然。必须用同一台机器、同一套环境编译的UE4和AirSim插件。UE4版本不匹配AirSim插件是针对特定UE4版本如4.27编译的。如果你用的UE4是4.26或5.0大概率会崩溃。解决方案检查插件路径。对于项目MyProject正确路径是MyProject/Plugins/AirSim/。彻底删除旧的插件文件夹重新从你编译的~/AirSim/Unreal/Plugins/AirSim复制。确保UE4版本严格为4.27。在UE4编辑器的“帮助”-“关于虚幻编辑器”中查看版本。4.3 Python客户端连接失败问题现象运行Python脚本时报错airsim.exceptions.TimeoutError: “ping” call timed out。原因分析AirSim的API服务器没有启动或者网络连接有问题。排查步骤确认仿真器在运行UE4编辑器必须处于“播放”模式。窗口标题会显示“已播放”。检查API服务器端口默认是localhost:41451。你可以用netstat命令检查端口是否在监听。netstat -tulpn | grep 41451检查防火墙Ubuntu的UFW防火墙可能会阻止本地回环连接但通常不会。可以暂时关闭防火墙测试sudo ufw disable测试后记得启用sudo ufw enable。检查车辆设置确保项目Content/AirSim文件夹下有settings.json文件并且配置正确。一个最简单的settings.json如下{ SettingsVersion: 1.2, SimMode: Multirotor }4.4 传感器数据异常或无法获取问题现象能控制无人机但获取的图像是全黑、全白或者激光雷达点云是空的。原因分析传感器在settings.json中未正确启用或者Python API调用方式不对。解决方案在settings.json中显式启用传感器{ SettingsVersion: 1.2, SimMode: Multirotor, Vehicles: { Drone1: { VehicleType: SimpleFlight, Sensors: { cam1: { SensorType: 2, // 2 对应相机 Enabled: true, CaptureSettings: [ { ImageType: 0, // 0Scene, 1Depth, 2Segmentation Width: 640, Height: 480 } ] }, lidar1: { SensorType: 6, // 6 对应激光雷达 Enabled: true } } } } }在Python代码中正确请求数据# 获取场景图像 responses client.simGetImages([airsim.ImageRequest(cam1, airsim.ImageType.Scene)]) img_rgb np.frombuffer(responses[0].image_data_uint8, dtypenp.uint8) img_rgb img_rgb.reshape(responses[0].height, responses[0].width, 3) cv2.imshow(Scene, img_rgb) cv2.waitKey(1) # 获取激光雷达数据 lidar_data client.getLidarData(lidar_namelidar1) if len(lidar_data.point_cloud) 0: points np.array(lidar_data.point_cloud, dtypenp.float32).reshape(-1, 3) print(fGot {len(points)} lidar points.)5. 性能调优与进阶配置环境搭起来只是第一步要让仿真流畅运行并服务于你的具体项目还需要一些调优。5.1 提升仿真运行帧率仿真速度FPS直接影响到控制算法的测试效率。降低UE4渲染质量在编辑器播放模式下点击“设置”-“引擎可扩展性设置”将质量从“史诗”调到“高”或“中”。这对帧率提升非常明显。关闭不必要的后期处理在项目设置中搜索“后期处理”可以关闭运动模糊、镜头光晕等耗资源的效果。使用简单的环境Blocks环境很简单。如果你从Marketplace下载了高精度的城市场景帧率会大幅下降。对于算法测试初期用简单场景即可。调整AirSim的时钟速度在settings.json中可以设置ClockSpeed参数。大于1可以加快仿真时间但物理步长不变可能影响稳定性小于1可以减慢。这主要用于配合外部系统如硬件在环。5.2 与ROS/ROS2进行通信AirSim内置了ROS/ROS2的桥接功能这是将仿真集成到机器人系统生态的关键。编译ROS桥接包cd ~/AirSim # 对于ROS1 (Noetic) ./setup.sh ./build.sh --ros # 注意这个--ros参数这会在~/AirSim/ros/下生成devel或install目录。配置并运行在settings.json中启用ROS{ SettingsVersion: 1.2, Ros: { RosVersion: ROS1, // 或 ROS2 RosNamespace: , UseRosTime: false } }启动UE4仿真。在新的终端中source ROS工作空间并启动AirSim的ROS节点source ~/AirSim/ros/devel/setup.bash roslaunch airsim_ros_pkg airsim_node.launch现在你应该能在ROS中看到/airsim_node/发布的各种话题如/airsim_node/Drone1/imu、/airsim_node/Drone1/camera等也可以通过服务调用控制无人机。5.3 使用自定义3D模型和环境AirSim不仅限于无人机和方块世界。导入自定义无人机/车辆模型你需要一个FBX或静态网格体模型。在UE4编辑器中将其导入到你的项目。然后你需要创建一个继承自Pawn的蓝图类并为其添加AirSim插件提供的运动组件如SimpleFlight或Car。最后在settings.json的VehicleType中指定你的蓝图路径。这个过程涉及一定的UE4蓝图知识。构建或导入自定义环境你可以使用UE4的地形工具手动创建也可以从Quixel Bridge或虚幻商城下载免费/付费的高质量3D场景。将场景地图保存为.umap文件并在启动AirSim时指定该地图。部署UE4与AirSim的过程就像在组装一台精密的仪器。每一个环节的版本对齐和配置正确都至关重要。这套环境一旦搭建成功就会成为一个无比强大的算法沙盒。你可以安全地测试疯狂的飞行控制算法、训练基于视觉的神经网络、验证多机协同策略而无需担心炸机、撞车或法律风险。虽然初期部署会遇到挑战但这份投入绝对是值得的。当你看到自己的代码第一次在逼真的虚拟世界里控制无人机翱翔时那种成就感就是最好的回报。如果在部署中遇到了本指南未覆盖的奇怪问题不妨去AirSim的GitHub Issues页面搜索一下很可能已经有先驱者为你填好了坑。