Ubuntu 22.04源码编译CARLA 0.9.15:从环境配置到仿真验证全流程指南

Ubuntu 22.04源码编译CARLA 0.9.15:从环境配置到仿真验证全流程指南 1. 项目概述与核心价值如果你正在自动驾驶仿真、机器人感知算法测试或者游戏开发领域摸爬滚打那么对CARLA这个名字一定不会陌生。它是一个开源的、基于虚幻引擎构建的自动驾驶仿真平台提供了高度逼真的城市环境、丰富的传感器模型和灵活的API是算法验证和系统测试的利器。官方虽然提供了预编译的二进制包但直接通过源码编译安装CARLA尤其是在Ubuntu 22.04这样的主流LTS系统上能给你带来完全不同的掌控感。这不仅仅是安装一个软件更像是在亲手搭建一个属于你自己的、高度可定制的数字试验场。你可以自由地修改引擎底层、调整物理参数、集成自定义的传感器甚至为特定研究目的打上补丁。对于开发者、研究人员和学生来说从源码构建意味着你不再是一个“用户”而是成为了平台的“共建者”。这个过程虽然比直接下载安装包要复杂一些但每一步的配置、每一个依赖的解决都会让你对CARLA的架构有更深刻的理解为后续的深度开发和问题排查打下坚实的基础。这篇教程就是带你走通这条从源码到可运行仿真世界的完整路径避开我踩过的那些坑。2. 环境准备与系统基础配置在动手编译之前一个干净、稳定且配置得当的Ubuntu系统是成功的基石。CARLA 0.9.15对系统资源要求不低尤其是对显卡和内存。2.1 系统更新与基础依赖安装首先确保你的Ubuntu 22.04系统是最新的。打开终端执行以下命令进行系统更新和升级sudo apt update sudo apt upgrade -y更新完成后我们需要安装一系列编译和运行CARLA所必需的基础工具和库。这些依赖涵盖了从C编译器、构建工具到多媒体库等各个方面。sudo apt install -y \ build-essential \ clang-14 \ lld-14 \ g-11 \ cmake \ ninja-build \ libvulkan1 \ python3-dev \ python3-pip \ python3-setuptools \ libpng-dev \ libtiff-dev \ libjpeg-dev \ libogg-dev \ libvorbis-dev \ libopenal-dev \ libssl-dev \ libncurses5-dev \ libbz2-dev \ libreadline-dev \ libsqlite3-dev \ libgdbm-dev \ liblzma-dev \ tk-dev \ libffi-dev \ libxml2-dev \ libxslt-dev \ git \ wget \ curl \ unzip \ pkg-config这里有几个关键点需要注意编译器选择CARLA 0.9.15官方推荐使用clang-14和lld-14作为编译器和链接器它们在编译Unreal Engine大型项目时通常比GCC有更好的性能和兼容性。同时我们也安装了g-11作为备用。Python环境CARLA的客户端API和很多工具脚本都依赖Python。我们安装了Python3的开发包和pip为后续安装Python依赖做好准备。多媒体库libvulkan1是Vulkan图形API的库对于现代图形渲染至关重要。libpng,libtiff,libjpeg等是图像处理库。注意安装过程中如果遇到某些包无法找到可能是你的软件源列表需要更新。可以尝试先运行sudo apt update再安装。2.2 NVIDIA显卡驱动与CUDA工具包安装CARLA的渲染严重依赖GPU因此正确安装NVIDIA驱动和CUDA是必须的。这一步是很多新手最容易出错的地方。首先移除系统上可能存在的旧版NVIDIA驱动避免冲突sudo apt purge -y *nvidia* *cuda* *cudnn* sudo apt autoremove -y然后添加官方的NVIDIA驱动PPA仓库并安装推荐版本的驱动。对于Ubuntu 22.04NVIDIA 535系列驱动是一个稳定且兼容性好的选择。sudo add-apt-repository ppa:graphics-drivers/ppa -y sudo apt update sudo apt install -y nvidia-driver-535安装完成后必须重启系统以使新驱动生效。sudo reboot重启后在终端输入nvidia-smi来验证驱动是否安装成功。你应该能看到类似下面的输出显示了你的GPU型号、驱动版本和CUDA版本驱动内嵌的。接下来安装CUDA工具包。CARLA 0.9.15官方测试并推荐使用CUDA 11.8。我们使用NVIDIA官方提供的网络安装方式。wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run在安装界面中你需要进行一些选择接受许可协议。在组件选择页面取消勾选“Driver”因为我们已经单独安装了驱动。只保留CUDA Toolkit 11.8和CUDA Demo Suite等选项。继续安装。安装完成后需要将CUDA路径添加到环境变量中。编辑你的~/.bashrc文件echo export PATH/usr/local/cuda-11.8/bin${PATH::${PATH}} ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}} ~/.bashrc source ~/.bashrc最后验证CUDA安装nvcc --version应该显示版本为11.8。2.3 虚幻引擎源码获取与编译CARLA是基于Unreal Engine 4.26构建的因此我们必须先编译这个特定版本的引擎。这是整个过程中最耗时的一步可能需要数小时取决于你的CPU核心数和磁盘速度。首先注册一个Epic Games账户如果还没有并关联你的GitHub账户。这是下载UE源码所必需的。然后克隆Unreal Engine的仓库。注意我们指定4.26这个发布标签。# 创建一个专门的工作目录是个好习惯 mkdir -p ~/carla-dev cd ~/carla-dev # 克隆UE4源码 (此仓库巨大约几十GB请确保网络稳定和磁盘空间充足) git clone --depth 1 --branch 4.26 https://github.com/EpicGames/UnrealEngine.git cd UnrealEngine运行引擎自带的设置脚本它会下载一些必要的二进制组件。./Setup.sh接下来是编译引擎。使用-j参数可以指定并行编译的作业数通常设置为你的CPU逻辑核心数以加快速度。例如对于8核CPU./GenerateProjectFiles.sh make -j 8这个过程会编译整个Unreal Engine包括编辑器。你可以去喝杯咖啡或者处理其他事情。编译成功后在~/carla-dev/UnrealEngine/Engine/Binaries/Linux/目录下会生成UnrealEditor等可执行文件。实操心得编译UE4是资源消耗大户。确保你的系统有足够的交换空间Swap如果物理内存小于32GB建议将交换空间设置到16GB以上否则可能在编译链接阶段因内存不足而失败。可以使用sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile命令临时创建一个16GB的交换文件。3. CARLA 0.9.15 源码获取与依赖处理有了虚幻引擎的基础我们现在可以开始处理CARLA本身了。3.1 克隆CARLA仓库与更新子模块CARLA的主仓库并不包含所有必要的代码它使用Git子模块来管理一些关键的依赖项如ROS2桥接、地图素材等。cd ~/carla-dev git clone --branch 0.9.15 https://github.com/carla-simulator/carla.git cd carla克隆完成后极其关键的一步是更新子模块。很多编译错误都源于子模块没有正确初始化。git submodule update --init --recursive这个命令会拉取所有子模块的代码可能需要一些时间。完成后你的carla目录下会多出Unreal/CarlaUE4/Plugins等文件夹及其内容。3.2 Python依赖环境配置CARLA提供了丰富的Python客户端API。我们需要创建一个独立的Python虚拟环境来管理这些依赖避免污染系统Python环境。# 安装虚拟环境管理工具 sudo apt install -y python3-venv python3-wheel # 在carla目录下创建虚拟环境 python3 -m venv .venv # 激活虚拟环境 source .venv/bin/activate激活后你的命令行提示符前会出现(.venv)字样。接下来安装CARLA Python客户端所需的依赖。CARLA源码中提供了一个requirements.txt文件。pip install --upgrade pip pip install -r requirements.txt注意事项requirements.txt中的pygame库在某些系统上可能因为SDL2的依赖问题安装失败。如果遇到可以尝试先安装系统级的SDL库sudo apt install -y libsdl2-2.0-0 libsdl2-image-2.0-0 libsdl2-mixer-2.0-0 libsdl2-ttf-2.0-0然后再运行pip install命令。4. 源码编译CARLA的核心流程准备工作全部就绪现在进入最核心的编译环节。CARLA的编译分为两部分1) 编译Unreal Engine下的CarlaUE4项目2) 编译Python API客户端和其他的工具。4.1 编译CarlaUE4项目Unreal Editor部分首先我们需要让CARLA项目知道我们编译好的Unreal Engine在哪里。通过设置一个环境变量来实现。# 如果你还在carla目录下先退回上级目录 cd ~/carla-dev export UE4_ROOT~/carla-dev/UnrealEngine然后运行CARLA提供的构建脚本。这个脚本会调用Unreal Engine的构建系统来编译整个CarlaUE4项目。cd carla ./Update.shUpdate.sh脚本会执行一系列操作生成Visual Studio项目文件在Linux下是Makefile、下载额外的资产如果首次运行、并触发编译。编译输出的目标包括CarlaUE4Editor编辑器和CarlaUE4独立游戏。这个编译过程同样非常耗时。你可以在命令后添加-j参数来指定并行任务数。./Update.sh -j 8编译成功的标志是在~/carla-dev/carla/Unreal/CarlaUE4目录下生成了Binaries文件夹并且里面有Linux子目录包含CarlaUE4Editor等可执行文件。4.2 编译Python API与工具LibCarla部分CARLA的Python客户端需要与仿真服务器即上面编译的UE4项目通信这部分通信库叫做LibCarla是用C编写的需要通过CMake编译出Python可导入的模块。确保你还在carla目录下并且Python虚拟环境是激活状态。# 进入LibCarla的源码目录 cd ~/carla-dev/carla # 运行编译Python API的脚本 make PythonAPI这个make PythonAPI命令会使用CMake配置LibCarla的构建。编译出适用于当前Python环境我们的.venv的carla扩展模块例如libcarla.so。将该模块安装到虚拟环境的site-packages目录中。编译完成后你可以在虚拟环境中测试是否成功导入python -c “import carla; print(‘CARLA Python API导入成功版本’, carla.__version__)”如果成功打印出版本信息应该是0.9.15那么恭喜你Python客户端部分也搞定了。4.3 导入必要资产与地图CARLA的空项目需要地图和3D模型资产才能运行。官方提供了一些示例地图如Town01, Town02等。我们需要运行一个脚本来导入这些资产。cd ~/carla-dev/carla ./ImportAssets.sh这个脚本会将Unreal/CarlaUE4/Content/Carla/Import目录下的资产文件导入到Unreal项目中。这个过程可能会下载一些额外的资源包。5. 运行测试与基础功能验证编译安装的最后一步就是让整个系统跑起来看看我们的劳动成果。5.1 启动CARLA服务器Unreal Editor启动CARLA服务器有两种主要方式通过Unreal Editor启动或者运行打包后的独立版本。对于开发和测试使用Editor更灵活因为可以实时查看日志、调试。cd ~/carla-dev/carla/Unreal/CarlaUE4 # 通过我们编译的UE4编辑器来打开CarlaUE4项目 ~/carla-dev/UnrealEngine/Engine/Binaries/Linux/UnrealEditor $PWD/CarlaUE4.uproject第一次启动可能会进行着色器编译需要等待一段时间。启动后你看到的将是Unreal Editor的界面里面打开了CARLA项目。你可以点击工具栏上的“播放”Play按钮来运行仿真。此时一个默认的空白地图或你之前导入的地图的仿真窗口应该会打开。这就是CARLA的服务器端它现在正在等待客户端连接。5.2 运行Python客户端示例脚本打开一个新的终端窗口在这个窗口里我们将运行Python客户端来连接服务器。cd ~/carla-dev/carla source .venv/bin/activate # 运行一个简单的示例脚本比如生成一些车辆和行人 python3 PythonAPI/examples/generate_traffic.py -n 20 -w 10这个命令会尝试连接到本地127.0.0.1默认端口2000的CARLA服务器并在场景中生成20辆车和10个行人。如果一切正常你应该能在Unreal Editor的仿真窗口中看到车辆和行人在道路上移动。5.3 基础功能验证清单为了确保安装是完整可用的建议按顺序进行以下验证验证项目操作命令/步骤预期结果服务器启动在终端1运行./CarlaUE4.sh -opengl(在Unreal/CarlaUE4目录下) 或通过Editor启动出现仿真窗口无崩溃命令行显示服务器就绪信息。Python API导入在终端2运行python -c “import carla”无报错正常退出。客户端连接在终端2运行python3 PythonAPI/examples/automatic_control.py脚本开始运行尝试连接服务器并在连接成功后生成一辆由AI控制的车辆在Town01地图中行驶。传感器数据运行python3 PythonAPI/examples/manual_control.py出现一个PyGame窗口显示从 ego vehicle 摄像头获取的实时画面可以用键盘WASD控制车辆。6. 常见编译与运行问题深度排查即便按照步骤操作也难免会遇到各种问题。这里我整理了一些编译和运行CARLA时最常见的“坑”及其解决方案。6.1 编译阶段典型错误问题1Update.sh编译失败报错与std::filesystem相关。现象编译过程中出现大量错误提示namespace “std” has no member “filesystem”或类似信息。根因CARLA 0.9.15 的某些代码需要C17标准而编译环境默认的C标准可能较低。std::filesystem是C17的特性。解决方案需要确保编译时启用了C17。编辑文件Unreal/CarlaUE4/Source/CarlaUE4/CarlaUE4.Build.cs在PublicDefinitions部分添加“HAS_CXX171”。如果问题依旧尝试在Unreal/CarlaUE4目录下执行make clean后重新运行./Update.sh。问题2编译LibCarla (make PythonAPI) 时找不到libpng等库。现象CMake配置或编译失败错误信息为Could NOT find PNG(或TIFF,JPEG等)。根因系统缺少这些库的开发文件头文件和链接库。我们之前安装的是libpng-dev如果安装的是libpng只有运行时库就会出这个问题。解决方案确认已安装对应的-dev包。运行sudo apt install -y libpng-dev libtiff-dev libjpeg-dev。问题3虚幻引擎编译失败内存不足 (Out of memory)。现象编译进程被杀死系统变得卡顿dmesg日志显示Out of memory: Kill process。根因编译Unreal Engine尤其是链接Linking阶段需要消耗大量内存。物理内存不足时如果交换空间也不够系统会终止进程。解决方案增加交换空间如之前所述创建一个足够大的交换文件16GB或以上。减少并行编译任务运行./Update.sh时不加-j参数或使用-j 2、-j 4减少并行度降低瞬时内存需求。使用gold链接器在make命令前设置LDFLAGS”-fuse-ldgold”有时gold比默认的ld链接器更节省内存。但需先安装binutils-gold。6.2 运行阶段典型错误问题1启动CarlaUE4Editor时崩溃报错与Vulkan相关。现象编辑器启动后立即崩溃日志中可能有Vulkan driver、Vulkan device等错误。根因显卡驱动不兼容、Vulkan运行时库缺失或损坏。解决方案再次确认NVIDIA驱动已正确安装 (nvidia-smi正常工作)。安装Vulkan工具和验证层sudo apt install -y vulkan-tools vulkan-validationlayers。尝试以OpenGL模式启动绕过Vulkan./CarlaUE4.sh -opengl。虽然性能可能稍差但兼容性更好。问题2Python客户端无法连接服务器报timeout错误。现象运行示例脚本时长时间卡在connecting to 127.0.0.1:2000...最后超时。根因服务器未启动这是最常见的原因。端口被占用2000端口可能被其他程序占用。防火墙阻止虽然本地连接一般不会但某些SELinux或严格防火墙设置可能影响。解决方案确认服务器已启动检查Unreal Editor仿真窗口是否在运行或独立服务器进程是否存在。检查端口运行netstat -tulpn | grep :2000查看2000端口状态。指定正确的IP和端口在Python脚本中创建客户端时可以显式指定client carla.Client(‘127.0.0.1’, 2000)。问题3导入carla模块成功但运行时提示ImportError: libcarla.so找不到。现象import carla成功但调用具体函数如carla.Client()时失败。根因Python找到了carla包但包内的C扩展模块动态链接库加载失败因为其依赖的库不在系统链接器路径中。解决方案将CARLA的库路径添加到LD_LIBRARY_PATH环境变量中。这通常需要在激活虚拟环境后设置。cd ~/carla-dev/carla source .venv/bin/activate export LD_LIBRARY_PATH$LD_LIBRARY_PATH:$(pwd)/PythonAPI/carla/dist/$(ls PythonAPI/carla/dist/ | grep py)/lib # 然后再次运行你的Python脚本更一劳永逸的方法是将这行export命令添加到虚拟环境的激活脚本~/.venv/bin/activate末尾。6.3 性能优化与日常使用建议启动加速首次启动或切换地图后Unreal Engine需要编译着色器这会非常慢。耐心等待完成后续启动会快很多。可以将编译好的着色器缓存目录 (~/.config/Epic/UnrealEngine) 备份以后重装系统或更换设备时可以恢复。内存管理CARLA仿真非常消耗内存尤其是开启多个传感器和高品质渲染时。关闭不必要的后台程序监控内存使用情况。如果运行大型仿真32GB内存是推荐的起点。使用Docker可选如果你需要频繁重置环境或在多台机器上部署可以考虑使用CARLA官方提供的Docker镜像。但这属于“使用”而非“源码编译”的范畴对于深度开发源码环境仍是必要的。版本控制你的carla源码目录就是一个Git仓库。在进行任何自定义修改前考虑创建一个新的分支 (git checkout -b my-feature)方便管理和回溯。从源码编译CARLA就像完成一次精密的数字模型拼装。每一个依赖的解决每一个编译错误的排查都让你对这座“数字城市”的基石有了更具体的认知。当看到第一辆由你亲手构建的系统驱动的虚拟汽车在街道上跑起来时那种成就感远非直接点击安装包可比。这个过程赋予你的不仅仅是使用CARLA的能力更是定制它、扩展它、乃至在它之上构建新世界的可能性。