Ubuntu 20.04部署CARLA 0.9.14:从打包版快速体验到编译版深度定制 1. 项目概述为什么选择在Ubuntu 20.04上部署CARLA 0.9.14如果你正在涉足自动驾驶仿真、机器人感知算法测试或者单纯想体验一下电影里那种逼真的虚拟城市驾驶环境那么CARLA绝对是你绕不开的一个名字。作为一个开源的自动驾驶仿真平台它提供了从传感器模拟、交通流控制到天气系统在内的一整套高保真环境。我选择Ubuntu 20.04和CARLA 0.9.14这个组合背后有几个很实际的考量。首先Ubuntu 20.04 LTS是一个长期支持版本系统稳定社区支持完善对于需要长期运行仿真实验的环境来说稳定压倒一切。其次CARLA 0.9.14是一个承上启下的重要版本它在渲染保真度、传感器模型和Python API的成熟度上达到了一个很好的平衡既不像早期版本功能缺失也不像某些新版本对硬件要求过于苛刻或存在未知的兼容性问题。这次部署的核心目标很明确快速上手并具备深度定制的能力。这对应着两种主流的部署方式打包版预编译版和编译版源码版。打包版就像你从软件商店下载的应用程序解压即用适合快速验证想法、跑通官方示例和进行算法原型测试。而编译版则需要你从源代码开始自己动手构建整个项目这过程虽然繁琐但带来的好处是巨大的——你可以修改引擎底层、添加自定义传感器、集成新的地图甚至调整物理参数真正将CARLA变成你自己的研究工具。很多人在初次接触时可能会被编译版的复杂依赖和漫长的编译时间劝退但相信我一旦你掌握了从打包版平滑过渡到编译版的完整路径你对这个仿真平台的理解和控制力将完全不在一个层次上。接下来我会带你走通这条从“开箱即用”到“深度掌控”的完整路径分享我踩过的每一个坑和总结出来的最佳实践。2. 环境准备与前置条件检查在开始安装任何软件之前打好地基是成功的一半。对于CARLA部署这个“地基”就是你的Ubuntu系统环境。很多人部署失败问题往往不是出在CARLA本身而是前置依赖没装对、没装全。2.1 系统与硬件要求首先确认你的系统是Ubuntu 20.04.6 LTS。你可以通过lsb_release -a命令查看。虽然理论上18.04或22.04也可能成功但20.04是CARLA官方文档明确测试和支持的版本能帮你避开大量未知的兼容性雷区。硬件是另一个硬性门槛。CARLA是一个基于Unreal Engine的图形密集型应用对显卡有较高要求GPU必须是一块独立的NVIDIA显卡。集成显卡包括Intel核显和AMD集显完全无法运行。建议是GTX 1070 / RTX 2060或更高性能的显卡以确保流畅运行。显存至少4GB6GB或以上更为理想。高分辨率、多传感器同时渲染会消耗大量显存。内存建议16GB以上。编译Unreal Engine时内存消耗巨大。存储空间你需要为CARLA预留至少100GB的可用磁盘空间。其中打包版大约占30GB而编译Unreal Engine和CARLA源码轻松会占用70GB以上。2.2 安装NVIDIA显卡驱动这是最关键的一步驱动版本不对后面一切白费。Ubuntu 20.04自带的nouveau开源驱动无法支持CARLA所需的图形计算。推荐方法使用系统自带的“附加驱动”工具这是最稳妥、最不容易出问题的方法。打开“软件和更新”应用。切换到“附加驱动”标签页。系统会自动检测你的NVIDIA显卡并列出可用的专有驱动版本。选择一个带有“proprietary, tested”标识的版本例如nvidia-driver-535。这个版本是经过Ubuntu官方测试的与系统内核兼容性最好。不要盲目追求最新版本新驱动可能带来未知问题。点击“应用更改”输入密码等待安装完成并重启系统。重启后打开终端运行nvidia-smi。如果能看到显卡信息、驱动版本和CUDA版本例如CUDA 12.2说明驱动安装成功。这里显示的CUDA版本是驱动内嵌的运行时库版本我们后续安装的CUDA Toolkit版本需要与之兼容。2.3 安装依赖库CARLA的运行和编译依赖大量的系统库和开发工具。一次性安装可以避免后续编译时频繁报错。打开终端执行以下命令更新软件源并安装基础编译工具和关键库sudo apt update sudo apt upgrade -y # 安装基础编译工具链 sudo apt install build-essential cmake clang-8 lld-8 g-7 -y # 安装Unreal Engine和CARLA所需的依赖 sudo apt install libvulkan1 python3-pip python3-dev python3-opencv -y sudo apt install libomp-dev libpng-dev libtiff5-dev libjpeg-dev -y sudo apt install wget software-properties-common gnupg2 -y # 安装图形和窗口系统相关库 sudo apt install xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev -y注意clang-8和lld-8是Unreal Engine 4.26CARLA 0.9.14使用的引擎版本指定的编译工具链。使用系统默认的gcc或更高版本的clang可能会导致编译失败。2.4 安装特定版本的CMake和Python环境CARLA 0.9.14的Python API客户端主要兼容Python 3.7/3.8。Ubuntu 20.04默认的Python 3.8正好合适我们不需要额外安装其他版本。但是CMake的版本至关重要。Ubuntu 20.04默认仓库的CMake版本3.16可能偏低而编译某些依赖如rpclib需要更高版本。建议安装3.22或以上版本。# 卸载旧版本cmake如果有 sudo apt remove --purge cmake -y # 下载并安装指定版本的CMake wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg /dev/null sudo apt-add-repository deb https://apt.kitware.com/ubuntu/ focal main sudo apt update sudo apt install cmake -y cmake --version # 确认版本号 3.22接下来为CARLA的Python API创建一个干净的虚拟环境是个好习惯可以避免包冲突。# 安装虚拟环境管理工具 sudo apt install python3-venv -y # 创建一个名为carla的虚拟环境位置可以自定义比如在/home/你的用户名下 cd ~ python3 -m venv carla-venv # 激活虚拟环境 source ~/carla-venv/bin/activate # 激活后命令行提示符前会出现 (carla-venv) # 升级pip并安装CARLA Python API的核心依赖 pip install --upgrade pip pip install numpy pygame networkx opencv-python至此你的系统基础环境已经准备就绪。我们可以先通过打包版快速进入CARLA的世界感受一下它的魅力。3. 打包版部署五分钟快速体验CARLA世界打包版是体验CARLA最快的方式它包含了预编译好的Unreal Engine项目、所有资产和Python API。你不需要编译任何东西下载、解压、运行一气呵成。3.1 下载与解压CARLA的打包版发布在GitHub的Release页面。由于文件很大约30GB建议使用wget命令在终端中下载这样支持断点续传比浏览器下载更稳定。# 进入一个空间充足的目录例如/home/你的用户名/Software cd ~/Software # 使用wget下载CARLA 0.9.14的打包版 wget https://github.com/carla-simulator/carla/releases/download/0.9.14/CARLA_0.9.14.tar.gz # 下载完成后解压 tar -xzvf CARLA_0.9.14.tar.gz解压后会得到一个名为CARLA_0.9.14的目录里面包含了运行所需的一切。3.2 运行服务器与客户端CARLA采用客户端-服务器架构。服务器Server负责运行仿真世界客户端Client通过Python脚本与服务器通信控制车辆、获取传感器数据等。第一步启动服务器在终端中进入解压目录直接运行启动脚本。cd ~/Software/CARLA_0.9.14 ./CarlaUE4.sh第一次运行会有一个着色器编译的过程需要等待几分钟。之后一个Unreal Engine的编辑器窗口会打开并加载Town地图。这个窗口就是CARLA服务器。不要关闭这个窗口最小化即可。第二步运行Python客户端示例打开另一个终端窗口我们需要在之前创建的虚拟环境中运行示例脚本。# 激活虚拟环境 source ~/carla-venv/bin/activate # 设置Python路径让解释器能找到CARLA自带的Python模块 export PYTHONPATH$PYTHONPATH:~/Software/CARLA_0.9.14/PythonAPI/carla/dist/carla-0.9.14-py3.8-linux-x86_64.egg # 进入示例脚本目录 cd ~/Software/CARLA_0.9.14/PythonAPI/examples # 运行一个简单的自动巡航示例 python3 automatic_control.py如果一切顺利你将看到服务器窗口中的场景里出现一辆车并在小镇中自动行驶。客户端终端会打印车辆的控制信息和传感器数据如果示例脚本开启了传感器。恭喜你你已经成功运行了CARLA3.3 打包版的使用限制与注意事项打包版虽然方便但有其局限性无法修改核心内容你不能修改地图、添加新的蓝图如特殊车辆或传感器、或者调整Unreal Engine的渲染和物理参数。Python API功能受限一些高级的API特别是与场景生成、批处理仿真相关的接口可能在打包版中无法使用或存在限制。资源路径固定所有资产路径都是硬编码的如果你想集成自己的3D模型或地图会非常困难。实操心得打包版最适合用于学习和初步算法验证。例如测试你的目标检测算法在CARLA虚拟摄像头下的表现或者熟悉Python API的基本用法。在运行示例时如果遇到ImportError: No module named carla请务必检查PYTHONPATH环境变量是否设置正确并且确认你激活的虚拟环境中的Python版本是3.8。另一个常见问题是服务器启动后客户端连接超时请检查是否有防火墙阻止了端口默认2000/TCP, 2001/TCP并确保客户端脚本中指定的服务器IP和端口默认localhost:2000是正确的。4. 编译版部署从源码构建你的专属仿真器当你需要修改CARLA、添加自定义功能或者进行大规模的自动化仿真实验时编译版是唯一的选择。这个过程分为两大核心部分编译Unreal Engine 4.26和编译CARLA源码。4.1 获取并编译Unreal Engine 4.26CARLA 0.9.14严格依赖Unreal Engine 4.26。你必须使用这个特定版本不能使用Epic Games启动器安装的默认版本或其他版本。第一步注册Epic Games账户并关联GitHub访问 Epic Games开发者门户 注册一个账户。在账户设置中将你的GitHub账户与之关联。接受Unreal Engine的许可协议。第二步克隆Unreal Engine仓库并切换分支我们将使用Epic官方推荐的克隆方式。# 创建一个目录用于存放UE4源码需要极大空间 cd ~ mkdir -p UnrealEngine_4.26 cd UnrealEngine_4.26 # 克隆UE4仓库速度可能较慢请耐心等待 git clone https://github.com/EpicGames/UnrealEngine.git -b 4.26 . # 注意-b 4.26 指定了分支最后的 . 表示克隆到当前目录第三步编译Unreal Engine这是最耗时的一步可能需要数小时取决于你的CPU核心数和磁盘速度。# 运行安装脚本下载必要的依赖 ./Setup.sh # 生成编译所需的Makefile等文件 ./GenerateProjectFiles.sh # 开始编译使用 make 命令-j 参数指定并行编译的作业数通常设为CPU核心数可以显著加快速度。 # 例如8核CPUmake -j8 make -j$(nproc)编译过程中请保持网络连接稳定。如果中途失败通常是因为依赖缺失或内存不足。可以尝试先运行make而不加-j参数进行单线程编译虽然慢但更容易定位错误。编译成功后你会在~/UnrealEngine_4.26/Engine/Binaries/Linux/目录下找到UnrealEditor等可执行文件。踩坑记录编译UE4最常见的错误是内存不足Out of Memory。如果机器内存小于32GB强烈建议在开始make之前创建一个足够大的交换文件swapfile。sudo fallocate -l 16G /swapfile # 创建16GB的交换文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 可以通过 free -h 命令确认swap已生效编译完成后可以关闭交换文件sudo swapoff /swapfile sudo rm /swapfile。4.2 获取并编译CARLA源码有了UE4.26我们现在可以编译CARLA本身了。第一步克隆CARLA仓库并获取资产cd ~ git clone https://github.com/carla-simulator/carla.git cd carla # 切换到0.9.14标签 git checkout tags/0.9.14 # 获取CARLA所需的额外资源地图、车辆模型等这是一个非常大的下载 ./Update.shUpdate.sh脚本会下载大约20GB的资产文件到Import目录请确保磁盘空间充足。第二步设置环境变量告诉构建系统你的UE4根目录在哪里。export UE4_ROOT~/UnrealEngine_4.26第三步编译CARLA客户端与服务器CARLA的编译使用一个自定义的Makefile。# 清理之前的构建如果是第一次可跳过 make clean # 编译CARLA客户端库Python API所依赖的C库 make PythonAPI # 编译CARLA服务器Unreal Engine项目 make launchmake launch会编译Unreal项目并最终启动编辑器。第一次编译同样需要很长时间。成功后Unreal Engine编辑器会打开并加载CARLA项目。第四步打包编译成果可选但推荐在编辑器里运行没问题后我们可以将其打包成一个独立的可分发版本类似于我们之前下载的打包版但这是基于你编译的源码。# 在CARLA源码目录下 make package这个命令会在./Dist目录下生成一个CARLA_0.9.14的打包文件夹。你可以将这个文件夹复制到任何地方运行无需再次编译。4.3 编译版的核心优势与定制入门编译版赋予了你“上帝视角”般的控制权修改地图你可以用Unreal Editor打开Unreal/CarlaUE4/Content/Carla/Maps/下的地图文件.umap随意添加、删除建筑、道路、植被。创建自定义蓝图在Content/Carla/Blueprints/下你可以复制现有的车辆或传感器蓝图修改其属性如碰撞体、网格模型、传感器参数创造出全新的智能体。修改C源码如果你需要改变仿真核心逻辑比如车辆动力学模型、天气系统算法或通信协议可以直接修改LibCarla/source/carla/下的C代码然后重新执行make PythonAPI和make launch。一个简单的定制例子添加一个简单的路标。在Unreal Editor中运行编译好的项目通过make launch启动。在内容浏览器中找到Carla/Static/Props/Traffic下的一个路标静态网格体。将其拖拽到地图视口中放置到路边。保存地图。现在这个新路标就成为了你仿真世界的一部分传感器可以检测到它。深度定制心得修改C代码是最高级的定制。例如如果你想在carla::sensor::data::Image数据结构中加入时间戳字段。你需要修改LibCarla/source/carla/sensor/data/Image.h头文件。修改对应的序列化/反序列化代码可能在s11n目录下。重新编译make PythonAPI。这会重新生成Python绑定.egg文件。在Python客户端中你就可以从图像数据里读取到这个自定义的时间戳了。这个过程需要对CARLA的源码结构有一定的了解建议从阅读官方文档和源码注释开始。5. Python API深度使用与自动化实践无论是打包版还是编译版我们与CARLA交互的主要桥梁都是Python API。掌握API的深度用法是实现自动化测试和复杂实验的关键。5.1 核心对象与生命周期管理CARLA Python API的核心对象包括World仿真的世界包含地图、天气、所有演员Actor的引用。Blueprint演员的模板定义了演员的属性如车型、传感器类型。Actor世界中任何可以放置的物体如车辆、行人、传感器、交通标志。车辆和传感器本身也是Actor。Sensor一种特殊的Actor用于收集数据如相机、激光雷达、雷达。Transform描述Actor在三维空间中的位置Location和旋转Rotation。一个健壮的客户端脚本应该妥善管理这些对象的生命周期import carla import random client carla.Client(localhost, 2000) client.set_timeout(10.0) # 设置连接超时 world client.get_world() blueprint_library world.get_blueprint_library() # 1. 生成车辆 vehicle_bp random.choice(blueprint_library.filter(vehicle.*)) spawn_point random.choice(world.get_map().get_spawn_points()) vehicle world.spawn_actor(vehicle_bp, spawn_point) # 2. 为车辆添加一个摄像头传感器 camera_bp blueprint_library.find(sensor.camera.rgb) camera_transform carla.Transform(carla.Location(x1.5, z2.4)) # 安装在车辆前方上方 camera world.spawn_actor(camera_bp, camera_transform, attach_tovehicle) # 3. 定义传感器回调函数用于处理每一帧数据 def camera_callback(image): # 将图像数据转换为numpy数组 array np.frombuffer(image.raw_data, dtypenp.uint8) array array.reshape((image.height, image.width, 4)) # BGRA格式 array array[:, :, :3] # 去掉Alpha通道变为BGR array array[:, :, ::-1] # BGR - RGB # 这里可以保存图像或进行实时处理 cv2.imshow(Camera, array) cv2.waitKey(1) # 4. 监听传感器数据 camera.listen(camera_callback) # ... 运行你的仿真逻辑例如让车辆自动驾驶一段路 ... # 5. 【重要】销毁Actor释放资源 camera.stop() camera.destroy() vehicle.destroy() print(所有Actor已清理。)5.2 同步模式与数据收集默认情况下CARLA服务器运行在异步模式它按照自己的节奏更新世界客户端随时可以发送请求。这对于交互式操作很方便但对于需要严格对齐多传感器数据帧的机器学习训练来说这是灾难性的。因为你的摄像头帧和激光雷达帧可能不是在同一仿真时刻捕获的。同步模式强制服务器等待客户端发送“下一帧”的指令从而确保所有传感器数据在同一时间戳被捕获。# 设置同步模式 settings world.get_settings() settings.synchronous_mode True # 启用同步模式 settings.fixed_delta_seconds 0.05 # 设置每帧的仿真时间步长20 FPS world.apply_settings(settings) # 在同步模式下必须由客户端驱动仿真 camera.listen(lambda image: queue.put(image)) # 将图像放入队列 for _ in range(100): # 仿真100帧 world.tick() # 发送“下一帧”指令 # 此时所有传感器的回调函数都会被触发数据对应于同一仿真时刻 image queue.get() # 处理图像...性能与稳定性技巧同步模式对性能有较大影响且如果客户端处理过慢导致world.tick()调用不及时仿真会“卡住”。务必确保你的数据处理流水线足够高效或者使用多线程/异步IO来处理传感器数据。另一个常见问题是内存泄漏长时间运行后即使销毁了ActorUnreal Engine端可能仍有残留。定期例如每运行1000次实验完全重启CARLA服务器是保持稳定的土办法但有效。5.3 构建自动化仿真流水线对于大规模算法测试如训练感知模型你需要一个自动化的流水线。其核心思想是编写一个脚本自动地、循环地执行“设置场景 - 运行仿真 - 收集数据 - 重置场景”的过程。def run_one_episode(world, episode_id): 运行一个仿真片段episode # 1. 重置世界清理上一轮的所有Actor actors world.get_actors() for actor in actors: if actor.type_id.startswith(vehicle.) or actor.type_id.startswith(sensor.): actor.destroy() # 2. 设置场景随机生成车辆、行人、天气 weather random.choice([carla.WeatherParameters.ClearNoon, carla.WeatherParameters.WetCloudyNoon]) world.set_weather(weather) # ... 生成主控车辆、其他交通车辆、行人 ... # 3. 添加传感器并启动数据记录 sensor_list [] # ... 创建并安装摄像头、激光雷达等传感器绑定数据保存回调 ... # 4. 运行仿真让主控车辆由AI或简单控制器驾驶一段距离/时间 for frame in range(500): # 仿真500帧 world.tick() # 同步模式下 # 控制车辆... # 可以在这里检查是否发生碰撞等终止条件 if has_collided(vehicle): break # 5. 清理并返回数据 for sensor in sensor_list: sensor.stop() sensor.destroy() # 返回本episode收集的数据路径或元信息 return {episode_id: episode_id, data_path: ..., weather: str(weather)} # 主循环 for i in range(1000): print(f开始第 {i} 个episode...) episode_result run_one_episode(world, i) # 将结果记录到日志或数据库 log_episode(episode_result)这个流水线可以部署到高性能服务器上7x24小时不间断运行批量生成用于训练和测试的仿真数据。6. 常见问题排查与性能优化指南即使按照步骤操作你也可能会遇到各种问题。这里汇总了一些高频问题和解决方案。6.1 部署与编译问题排查表问题现象可能原因解决方案运行./CarlaUE4.sh报错./CarlaUE4.sh: error while loading shared libraries: libvulkan.so.1: cannot open shared object fileVulkan图形库未安装。运行sudo apt install libvulkan1。编译UE4时make失败提示virtual memory exhausted: Cannot allocate memory物理内存和交换空间不足。按照前文指导创建大型交换文件16GB。编译CARLA时make PythonAPI失败提示cmake或clang相关错误。CMake版本过低或编译工具链不对。确保安装了CMake 3.22并使用clang-8和lld-8。检查UE4_ROOT环境变量是否正确指向UE4.26源码目录。Python客户端连接超时timeout: error: [Errno 110] Connection timed out服务器未启动或防火墙阻止或端口被占用。1. 确认./CarlaUE4.sh已成功启动并加载完地图。2. 检查客户端脚本中的IP和端口默认localhost:2000。3. 运行 netstat -tlnp导入carla模块失败ImportError: No module named carlaPython路径未设置正确。对于打包版设置PYTHONPATH到.egg文件。对于编译版确保在虚拟环境中运行并且make PythonAPI成功执行会在PythonAPI/carla/dist/下生成新的.egg文件。服务器窗口黑屏或闪退显卡驱动问题或OpenGL/Vulkan兼容性问题。1. 用nvidia-smi确认驱动已加载。2. 尝试以-opengl或-vulkan后端启动./CarlaUE4.sh -opengl。3. 可能是显存不足尝试在较低画质设置下运行。6.2 运行时性能优化技巧CARLA是资源消耗大户优化性能可以提升实验效率。服务器启动参数-quality-levelLow将图形质量设置为低。这是提升帧率最有效的方法对许多算法测试来说视觉保真度可以牺牲。-carla-server -fps20以无渲染的“服务器模式”运行不打开图形窗口并通过-fps限制最大仿真频率。这能极大节省GPU资源适用于纯数据生成的“无头模式”运行。-windowed -ResX800 -ResY600以窗口模式和小分辨率运行减少渲染负载。客户端优化减少不必要的传感器每个传感器尤其是摄像头和激光雷达都会带来额外的渲染和数据传输开销。只启用实验必需的传感器。降低传感器分辨率/频率将相机分辨率从800x600降到320x240将激光雷达的通道数channels从64降到32将传感器的频率fps从20降到10都能显著减轻负担。使用try-except和超时网络通信可能不稳定在发送RPC命令时使用client.set_timeout()并包裹try-except块避免脚本因单次请求失败而崩溃。批量操作使用client.apply_batch([carla.command])一次性执行多个生成或销毁命令比循环调用单次命令效率高得多。系统层面关闭不必要的桌面特效和后台应用。在BIOS中确保CPU运行在性能模式。对于数据生成任务考虑在无图形界面的Ubuntu Server系统上运行资源利用率更高。从打包版快速体验到编译版深度定制这条路径虽然前期投入的学习和配置成本较高但它为你打开了一扇通往自动驾驶仿真研究自由王国的大门。你能精确控制仿真环境中的每一个变量生成满足特定长尾场景的数据或是测试算法在极端条件下的鲁棒性。这种能力是使用预打包黑盒工具所无法比拟的。我个人的体会是初期遇到的每一个编译错误、运行时崩溃都是在帮你更深入地理解这个复杂系统的构成。当你第一次成功修改源码并看到仿真器按照你的预期运行时那种成就感会让你觉得所有折腾都是值得的。最后一个小建议善用版本控制Git来管理你对CARLA源码的修改并详细记录你的环境配置这能为未来的项目复现和团队协作省去无数麻烦。