Ubuntu 20.04源码编译Carla 0.9.4:从环境配置到UE4集成的完整指南

Ubuntu 20.04源码编译Carla 0.9.4:从环境配置到UE4集成的完整指南
1. 项目概述与核心价值如果你正在自动驾驶仿真、数字孪生或者机器人研究领域摸索那么“Carla”这个名字你一定不陌生。它是一个基于虚幻引擎Unreal Engine构建的开源自动驾驶仿真平台提供了高度逼真的城市环境、灵活的传感器模拟和丰富的交通流是算法开发和验证的利器。然而官方提供的预编译版本往往功能受限或者与你的特定研究需求比如修改底层物理、添加自定义传感器不匹配。这时从源码编译就成了必经之路。今天要聊的就是在Ubuntu 20.04 LTS这个相对稳定且社区支持完善的系统上从零开始手动编译Carla 0.9.4版本的全过程。为什么是0.9.4因为这个版本在功能完整性和社区资源之间取得了不错的平衡既包含了关键的多传感器同步、天气系统又避开了最新版可能存在的未知兼容性问题。整个流程会涉及三个核心部分Ubuntu基础环境搭建、Anaconda Python环境管理以及最重量级的UE4.21.2引擎源码编译与集成。听起来很复杂别怕这篇指南会像“保姆”一样带你走过每一个坑解释每一个命令背后的原因分享我踩过雷后总结出的独家技巧。无论你是刚接触Linux的研究生还是需要搭建定制化仿真环境工程师这篇超过5000字的详实记录都能让你少走至少一周的弯路。2. 环境准备与系统基础配置编译Carla尤其是集成UE4对系统环境有比较严格的要求。Ubuntu 20.04 LTS是一个理想的选择因为它长期支持软件源稳定且被UE4官方文档明确支持。我们首先需要一个干净、强健的系统基础。2.1 操作系统安装与初始设置假设你已经完成了Ubuntu 20.04的安装。这里有几个关键点必须检查它们直接影响后续编译的成败系统更新与升级安装后第一件事更新软件源并升级所有包。这能确保你拥有最新的系统库和安全性补丁。sudo apt update sudo apt upgrade -y注意-y参数表示自动确认但在生产服务器上建议去掉仔细查看要升级的包列表。开发者工具安装编译离不开构建工具链。安装以下基础包是必须的sudo apt install build-essential cmake git wget software-properties-common curl -ybuild-essential: 包含GCC、G、make等核心编译工具。cmake: 跨平台的自动化构建系统许多依赖项用它构建。git: 版本控制用于拉取Carla和UE4源码。其余是常用工具。磁盘空间检查这是最容易忽略但后果最严重的一点。完整编译UE4和Carla需要预留至少150GB的可用磁盘空间。UE4引擎源码本身巨大编译中间文件更是占用惊人。使用df -h命令检查你的主目录或目标安装目录所在分区的空间。Swap空间设置如果你的物理内存小于16GB例如8GB在编译UE4这种大型项目时极有可能因内存不足而崩溃。强烈建议设置足够大的Swap空间虚拟内存。对于16GB物理内存设置8-16GB的Swap是合理的对于8GB内存建议设置16-32GB。# 检查现有Swap sudo swapon --show # 如果不足可以创建一个Swap文件例如16GB sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 为了永久生效需要将配置写入 /etc/fstab echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab2.2 显卡驱动与CUDA安装Carla的渲染依赖GPUUE4编辑器也需要GPU加速。NVIDIA显卡是首选因为其对Linux和深度学习生态支持最好。安装NVIDIA驱动Ubuntu 20.04自带的nouveau开源驱动性能不足且可能与CUDA冲突。推荐使用官方驱动。方法一推荐通过系统工具# 添加显卡驱动PPA sudo add-apt-repository ppa:graphics-drivers/ppa -y sudo apt update # 查看推荐的驱动版本 ubuntu-drivers devices # 安装推荐版本通常是带‘-server’或版本号最高的 sudo apt install nvidia-driver-version -y # 例如sudo apt install nvidia-driver-470 -y安装完成后必须重启系统。方法二使用CUDA Toolkit内置驱动如果你确定要安装特定版本的CUDA其安装包可能包含对应版本的驱动。验证驱动安装重启后运行nvidia-smi。如果看到显卡信息、驱动版本和CUDA版本即使显示的是驱动支持的最高CUDA版本不代表已安装说明驱动安装成功。安装CUDA ToolkitCarla的某些功能如深度学习的传感器后处理可能需要CUDA。UE4编译本身不强制要求但为了一致性建议安装。Carla 0.9.4官方推荐CUDA 10.0或10.1。考虑到兼容性我们选择CUDA 10.1。访问NVIDIA CUDA Toolkit Archive找到10.1的runfile安装包。根据你的系统选择例如cuda_10.1.105_418.39_linux.run。下载后执行sudo sh cuda_10.1.105_418.39_linux.run安装选项是关键在安装界面务必取消勾选驱动安装Driver因为我们已经安装了驱动。只安装CUDA Toolkit和Samples。配置环境变量将以下内容添加到~/.bashrc末尾export PATH/usr/local/cuda-10.1/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}然后执行source ~/.bashrc。使用nvcc --version验证安装。实操心得驱动安装失败是高频问题。如果重启后卡在登录界面循环或黑屏可以尝试在GRUB引导时进入“高级选项”选择“恢复模式”然后在根shell中卸载驱动sudo apt purge nvidia-*并重新安装。另外CUDA安装时一定要仔细看选项重复安装驱动可能导致系统不稳定。3. Anaconda环境配置与管理Python是Carla客户端API和许多工具脚本的语言。使用Anaconda或Miniconda管理Python环境是明智之举它可以完美隔离不同项目所需的、可能存在冲突的Python包版本。3.1 Anaconda安装与基础配置下载与安装访问Anaconda官网下载适用于Linux的Python 3.7版本安装脚本Carla 0.9.4对Python 3.7支持较好。在终端中执行bash Anaconda3-2020.02-Linux-x86_64.sh按照提示进行阅读许可协议按q跳过输入yes同意选择安装路径默认即可最后在询问“是否初始化conda”时选择yes。这会将conda加入你的shell启动脚本。重启终端或执行source ~/.bashrc使conda命令生效。运行conda --version验证。配置conda镜像源国内用户必做为了加速包下载建议更换为国内镜像源如清华源。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes同时也建议配置pip的镜像源在用户目录创建~/.pip/pip.conf写入[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn3.2 为Carla创建专属虚拟环境隔离环境可以避免污染系统Python也方便管理。conda create -n carla python3.7 -y conda activate carla创建并激活了一个名为carla的虚拟环境Python版本为3.7。环境激活与不激活的区别当你激活一个conda环境conda activate carla后你的终端会话中的PATH环境变量被修改使得该环境下的Python解释器和安装的包成为默认。同时终端提示符通常会显示环境名如(carla) userhost:~$。不激活时你使用的是base环境或系统Python。对于Carla我们后续的所有Python相关操作都应在激活的carla环境中进行。3.3 安装Carla Python客户端依赖Carla提供了一个Python客户端库用于通过脚本与仿真服务器通信。在carla环境中安装其依赖(carla) pip install pygame numpy注意这里只安装最基础的。Carla主项目编译完成后会生成一个.egg文件那个才是完整的客户端库需要再用pip安装到环境中。注意事项有些教程会在这里安装carla包pip install carla这是错误的。那是PyPI上的一个无关包。我们需要的carla包是从源码编译生成的。4. 虚幻引擎4.21.2源码获取与编译这是整个流程中最耗时、最容易出错的部分。UE4的源码编译对系统配置、依赖库版本非常敏感。4.1 注册Epic Games账户并获取源码访问Epic Games官网注册一个账户。登录后进入Unreal Engine的GitHub仓库页面。你需要将你的Epic账户与GitHub账户关联以获得访问私有仓库UnrealEngine的权限。关联成功后你可以使用Git克隆UE4的源码。注意必须克隆特定的4.21.2标签版本。git clone --depth 1 --branch 4.21.2-release https://github.com/EpicGames/UnrealEngine.git ~/UnrealEngine_4.21.2--depth 1: 只克隆最近一次提交节省时间和空间。--branch 4.21.2-release: 指定克隆4.21.2版本。目标路径可以根据你的磁盘情况调整。4.2 安装UE4编译所需依赖UE4提供了一个便捷的脚本来安装大部分依赖。进入引擎源码目录并运行cd ~/UnrealEngine_4.21.2 ./Setup.sh这个脚本会检查并安装所需的编译工具、库文件如mono、clang等。它会运行很长时间请耐心等待。4.3 执行源码编译依赖安装完成后开始真正的编译过程./GenerateProjectFiles.sh makeGenerateProjectFiles.sh会生成Makefile等构建文件。make命令则开始编译整个引擎。这个过程极其漫长在性能较好的机器上如8核16线程CPU32GB内存可能需要2-4小时在普通笔记本上可能超过6小时。编译过程中的监控与问题预判内存与Swap使用htop命令监控内存和Swap使用情况。如果Swap使用率持续很高说明物理内存不足编译速度会急剧下降甚至可能因内存耗尽OOM而失败。这就是为什么之前强调要设置足够大的Swap。CPU与温度编译是CPU密集型任务风扇会高速运转。确保散热良好。错误日志如果编译中途报错仔细阅读错误信息。常见的失败原因包括磁盘空间不足。某个依赖库缺失或版本不对尽管运行了Setup.sh但某些系统特定库可能仍需手动安装。网络问题导致某些模块下载失败UE4会下载一些第三方二进制文件。4.4 验证UE4编译成功编译完成后在~/UnrealEngine_4.21.2/Engine/Binaries/Linux/目录下应该会生成UE4Editor可执行文件。你可以尝试运行它cd ~/UnrealEngine_4.21.2/Engine/Binaries/Linux/ ./UE4Editor如果UE4编辑器能够成功启动可能会出现一个项目选择或创建窗口说明引擎编译成功。第一次启动可能会进行一些着色器编译稍等即可。踩坑实录编译失败时不要慌张。首先查看终端输出的最后几十行错误信息。一个常见错误是libudev版本问题。Ubuntu 20.04默认的libudev版本较高而UE4 4.21.2可能需要兼容旧版本。解决方案之一是安装libudev1的兼容包或创建符号链接但这需要根据具体错误信息搜索解决方案。另一个方法是尝试完全清理后重新GenerateProjectFiles.sh和make。5. Carla 0.9.4源码编译与集成有了健康的UE4环境编译Carla就相对直接了但步骤依然不少。5.1 获取Carla源码使用git克隆Carla 0.9.4版本的源码git clone --depth 1 --branch 0.9.4 https://github.com/carla-simulator/carla.git ~/carla cd ~/carla--branch 0.9.4确保我们获取正确的版本。5.2 更新子模块与资产下载Carla依赖一些子模块如LibCarla和大量的3D资产车辆、行人模型、纹理等。./Update.sh这个命令会初始化并更新git子模块。下载预编译的二进制依赖对于0.9.4主要是LibCarla和Python客户端库的预编译版本但为了从源码编译我们后续会覆盖这部分。下载“资产包”Assets。这是最大的一部分可能有几十GB。它会从AWS S3等存储下载。确保网络通畅如果中断可以重新运行此命令它会尝试续传。5.3 设置UE4引擎路径Carla的构建系统需要知道我们编译好的UE4引擎在哪里。通过设置环境变量来实现export UE4_ROOT~/UnrealEngine_4.21.2最好将这一行也添加到你的~/.bashrc中以便后续使用。5.4 编译LibCarlaLibCarla是Carla的核心C库负责仿真逻辑、传感器数据生成和客户端-服务器通信。make LibCarla这会在carla/目录下编译LibCarla。如果一切顺利你会在输出目录看到相关的.a和.so文件。5.5 编译CarlaUE4编辑器目标这是将Carla插件和内容编译到UE4编辑器中的关键步骤。make CarlaUE4Editor这个过程会调用UE4的构建系统UnrealBuildTool将CarlaUE4项目位于carla/Unreal/CarlaUE4/编译成一个可供UE4编辑器加载的模块。同样这需要一段时间。5.6 编译Python API客户端虽然我们之前用Update.sh下载了预编译的Python客户端但为了确保与我们从源码编译的服务器完全兼容最好也自己编译一次。make PythonAPI这个命令会在carla/PythonAPI/carla/dist/目录下生成一个.egg文件例如carla-0.9.4-py3.7-linux-x86_64.egg。这个文件就是完整的Carla Python客户端库。将其安装到我们的conda环境中(carla) pip install ~/carla/PythonAPI/carla/dist/carla-0.9.4-py3.7-linux-x86_64.egg安装成功后在Python中import carla应该不再报错。5.7 启动Carla仿真服务器现在所有组件都已就绪。你可以启动Carla服务器了。cd ~/carla ./CarlaUE4.sh或者指定分辨率和质量预设./CarlaUE4.sh -quality-levelLow -resx800 -resy600如果一切成功你应该能看到UE4编辑器窗口打开并加载一个名为“Carla”的地图同时终端中会显示服务器正在监听某个端口默认2000等待客户端连接。6. 测试与验证编译成功与否需要用实际连接来测试。6.1 基础连接测试保持Carla服务器./CarlaUE4.sh在运行状态。打开另一个终端激活carlaconda环境运行Python解释器或脚本import carla import random # 连接到本地服务器 client carla.Client(localhost, 2000) client.set_timeout(10.0) # 设置超时 # 获取世界对象 world client.get_world() # 打印当前地图的所有生成点Spawn Points spawn_points world.get_map().get_spawn_points() print(fNumber of spawn points: {len(spawn_points)}) # 获取蓝图库 blueprint_library world.get_blueprint_library() # 找一辆车的蓝图 vehicle_bp random.choice(blueprint_library.filter(vehicle.*)) # 在一个随机生成点生成车辆 if spawn_points: spawn_point random.choice(spawn_points) vehicle world.spawn_actor(vehicle_bp, spawn_point) print(fSpawned {vehicle.type_id} at {spawn_point.location}) # 记得销毁actor否则会内存泄漏 vehicle.destroy()如果这段代码能成功运行没有报错并且服务器终端有相应的生成日志那么恭喜你从源码编译的Carla环境已经完全工作6.2 运行官方示例Carla源码中提供了丰富的Python示例脚本位于carla/PythonAPI/examples/目录下。你可以运行一个简单的例子来测试更多功能(carla) cd ~/carla (carla) python PythonAPI/examples/manual_control.py这个脚本会生成一辆车并允许你用键盘WASD进行简单控制。如果窗口弹出并能控制车辆移动说明传感器渲染、物理模拟、客户端-服务器通信整个链条都是通的。7. 常见问题排查与优化技巧即便按照步骤也可能遇到各种问题。这里记录一些高频问题和解决方案。7.1 编译阶段问题问题现象可能原因解决方案./Setup.sh或make过程中报错Unable to find ‘mono’Mono运行时未正确安装或版本不匹配。运行sudo apt install mono-devel mono-complete安装完整Mono套件。UE4编译失败错误信息包含std::bad_alloc物理内存和Swap空间均耗尽。增加Swap空间如前文所述并尝试在编译时使用make -j 核心数限制并行编译任务数例如make -j 4。make CarlaUE4Editor失败提示UnrealBuildTool错误UE4引擎路径未正确设置或UE4本身编译不完整。确认UE4_ROOT环境变量指向正确的、已成功编译的UE4目录。尝试在UE4目录下重新运行make确保引擎完整。make PythonAPI失败提示Python相关错误Conda环境未激活或环境中缺少某些头文件。1. 确保在carlaconda环境中操作。2. 安装Python开发包conda install python-dev或sudo apt install python3.7-dev。7.2 运行阶段问题问题现象可能原因解决方案运行./CarlaUE4.sh后崩溃或闪退显卡驱动问题、OpenGL/Vulkan兼容性问题或资产缺失。1. 用nvidia-smi确认驱动加载。2. 尝试以-opengl或-vulkan参数启动./CarlaUE4.sh -opengl。3. 检查carla/Unreal/CarlaUE4/Content/下的资产文件是否完整重新运行./Update.sh。Python客户端连接超时 (timeout)Carla服务器未启动或防火墙阻止了端口。1. 检查服务器终端是否在运行并无报错。2. 检查端口是否被占用netstat -tulpnimport carla报ImportErrorPython客户端egg文件未正确安装或安装到了错误的Python环境。1. 确认当前Python环境 (which python) 是conda的carla环境。2. 重新执行pip install ...egg命令并注意egg文件的完整路径和名称。服务器运行后帧率极低默认图形设置过高或运行在集成显卡上。1. 以低质量预设启动./CarlaUE4.sh -quality-levelLow。2. 确保UE4编辑器使用的是独立显卡NVIDIA。对于笔记本可能需要配置NVIDIA Prime。7.3 性能与使用优化无头模式运行对于不需要可视化界面的服务器例如只用于数据生成可以使用无头模式大幅节省资源。./CarlaUE4.sh -RenderOffScreen -benchmark -fps10-RenderOffScreen禁用渲染-benchmark配合-fps控制仿真帧率。自定义编译选项如果只需要特定功能可以调整Carla的编译脚本避免编译不需要的模块加快编译速度。但这需要对构建系统有一定了解。资产管理carla/Import目录下的资产包非常庞大。如果磁盘空间紧张在确认编译运行无误后可以考虑删除carla/Unreal/CarlaUE4/Content中某些不常用的地图资产但务必备份。从源码编译Carla无疑是一次漫长的旅程它涉及操作系统、驱动、编程环境、游戏引擎和仿真框架等多个层面的知识。成功完成一次后你不仅得到了一个可高度定制的Carla环境更对整个仿真软件栈有了深刻的理解。这份理解在后续进行自定义传感器开发、修改物理参数或集成其他算法时会成为你最宝贵的财富。当你在自己的代码中成功生成第一辆自动驾驶汽车并在逼真的虚拟城市中行驶时之前所有繁琐的配置和漫长的等待都是值得的。