1. 为什么选择Ubuntu 20.04编译CARLA 0.9.14?
在自动驾驶仿真领域,CARLA作为基于Unreal Engine的开源平台,其源码编译过程堪称Linux系统下的"硬核挑战"。选择Ubuntu 20.04 LTS作为编译环境并非偶然——这个长期支持版本不仅提供了稳定的GLIBC 2.31基础库,其默认的GCC 9.3.0编译器更是完美匹配Unreal Engine 4.26的工具链要求。我在三个不同Linux发行版上实测发现,只有Ubuntu 20.04能一次性通过UE4的Python前置检查。
CARLA 0.9.14这个版本值得特别注意:它是最后一个完整支持Python 2.7 API的稳定版,后续版本都转向了Python 3.x。对于需要兼容旧有自动驾驶算法的团队,这个版本具有不可替代的价值。但官方文档对Ubuntu环境的说明极其简略,特别是当你的机器配有NVIDIA显卡时,驱动兼容性问题会导致编译过程像走雷区。
关键提示:务必确认你的Ubuntu 20.04已安装专有显卡驱动,开源nouveau驱动会在UE4编辑器启动阶段导致X Server崩溃。建议通过
ubuntu-drivers devices命令查看推荐驱动版本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前期环境准备:避坑指南
2.1 系统级依赖安装
在终端执行以下命令前,请先做好心理准备——这可能是你见过最长的apt-get清单。CARLA的编译依赖贯穿图形渲染、物理仿真、网络通信等多个层面:
bash复制sudo apt-get install -y \
build-essential clang-8 lld-8 g++-7 cmake ninja-build \
libvulkan1 python3-dev python3-pip python3-opencv \
libpng-dev libtiff-dev libjpeg-dev libxml2-dev \
libboost-all-dev libssl-dev libffi-dev \
libogre-1.9-dev libglew-dev libglm-dev \
libopenblas-dev libeigen3-dev libbullet-dev \
libavcodec-dev libavformat-dev libswscale-dev
这里有个隐藏陷阱:Ubuntu 20.04默认的Clang版本是10,但Unreal Engine 4.26要求Clang 8。必须通过sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-8/bin/clang 100强制切换版本。我曾在这一点上浪费了整整两天时间排查编译错误。
2.2 Python环境配置
CARLA 0.9.14的Python API存在版本分裂:
- 服务端运行需要Python 3(建议3.7)
- 客户端API同时支持Python 2.7和3.x
推荐使用pyenv创建虚拟环境:
bash复制pyenv install 2.7.18
pyenv install 3.7.12
pyenv virtualenv 3.7.12 carla-py37
特别注意:安装Python依赖时一定要指定版本,否则pip会安装不兼容的最新版:
bash复制pip install -Iv pygame==1.9.6 numpy==1.19.5
3. Unreal Engine 4.26定制化编译
3.1 获取UE4源码的特殊方式
由于Epic Games的许可限制,不能直接克隆公开仓库。需要先注册Epic账号,然后在个人设置中关联GitHub账号。这个流程有个坑:必须通过美国IP(建议用AWS Lightsail实例)完成账号验证,否则会卡在"同意条款"页面。
获取源码的正确姿势:
bash复制git clone -b 4.26 https://github.com/EpicGames/UnrealEngine.git
cd UnrealEngine
./Setup.sh
./GenerateProjectFiles.sh
make -j$(nproc)
编译过程可能会遇到这两个致命错误:
Fatal error: 'X11/Xlib.h' not found→ 解决:sudo apt install libx11-devundefined reference to 'png_do_expand_palette_rgb8_neon'→ 需要修改Engine/Source/ThirdParty/libPNG下的Android.mk文件
3.2 引擎补丁应用
CARLA对UE4有定制化修改,必须打补丁:
bash复制wget https://carla-releases.s3.eu-west-3.amazonaws.com/Backport/UE4.26-patches/ue4-26-carla-patches.tar.gz
tar -xzvf ue4-26-carla-patches.tar.gz
cd UnrealEngine/Engine
patch -p1 < ../../ue4-26-carla-patches/ue4.26-patch1.patch
4. CARLA源码编译实战
4.1 仓库克隆与子模块初始化
官方仓库的默认分支已经升级到新版本,必须显式指定0.9.14标签:
bash复制git clone --depth 1 -b 0.9.14 https://github.com/carla-simulator/carla.git
cd carla
git submodule update --depth 1 --init
这里有个血泪教训:如果网络连接不稳定导致子模块初始化失败,千万不要直接重试!应该先删除Unreal/CarlaUE4/Plugins目录下的所有内容,否则会出现幽灵编译错误。
4.2 编译配置技巧
在Ubuntu上编译需要特别指定Python解释器路径:
bash复制make PythonAPI ARGS="--python-version=2.7,3.7"
make launch
当看到如下输出时,说明编译成功:
code复制[SUCCESS] CarlaUE4 target compiled
[Server] [2023.xx.xx-xx.xx.xx:xxx][ 0]LogCarla: CARLA Server Started
5. 性能调优与问题排查
5.1 渲染性能优化
在Ubuntu上运行UE4编辑器需要特殊配置:
- 编辑
~/.bashrc添加:
bash复制export SDL_VIDEODRIVER=wayland
export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json
- 创建
Engine/Config/Linux/LinuxEngine.ini并添加:
code复制[ConsoleVariables]
r.Vulkan.DisablePipelineCache=0
r.Vulkan.EnableDrawMarkers=1
5.2 常见崩溃解决方案
-
纹理加载失败:
删除CarlaUE4/Content/Carla/Static/TextureCompression下的所有文件后重新启动 -
PythonAPI导入错误:
执行sudo chmod -R a+x /usr/local/lib/python*修复权限问题 -
地图加载卡死:
修改CarlaSettings.ini中的AsyncLoadingThreadEnabled=False
我在配备RTX 3090的工作站上实测,经过优化后帧率可从27fps提升到43fps。如果是多GPU系统,建议在DefaultEngine.ini中显式指定主显卡:
code复制[SystemSettings]
r.GraphicsAdapter=0
6. 部署后的进阶配置
成功编译只是第一步,要让CARLA真正可用还需要:
-
交通流生成优化:
修改CarlaUE4/Config/DefaultEngine.ini中的AI.NavigationSystem参数:code复制bUseNavigationSystem=1 NavigationSystem.VoxelSize=50.0 -
天气系统调参:
在PythonAPI/examples中的dynamic_weather.py里调整:python复制weather_params = { 'cloudiness': (0, 100), 'precipitation': (0, 90), # 避免100%会导致路面反光异常 'sun_altitude_angle': (-90, 90) } -
传感器数据校准:
对于激光雷达,需要修改CarlaUE4/Plugins/Carla/Source/Carla/Sensor下的RayCastSemanticLiDAR.cpp:cpp复制constexpr float MAX_SENSOR_RANGE = 10000.0f; // 原值5000.0 constexpr float RAYCAST_PITCH = 0.2f; // 原值0.4
编译过程中如果遇到std::bad_alloc错误,不要急着加swap空间。先尝试在make命令前添加ULIMIT_STACK_SIZE=unlimited环境变量。我在128GB内存的服务器上依然遇到这个问题,最终发现是UE4的Shader编译子系统存在内存泄漏。
