
开车开过模拟器焊板子焊过仿真图但做自动驾驶仿真Carla 应该是最能让人“哇塞”一下的入门选择之一。我最初接触它的时候也是被项目标题里“初识-运行”这四个字拉回来的——没想着一步到位搞什么闭环控制只想赶紧把模拟器跑起来看看里面的车能不能动、传感器能不能出数据。这篇博文就围绕“Carla 初识 运行”展开从“这东西到底是干嘛的”一直讲到“把 Demo 跑通、把常见坑踩平”适合第一次接触 Carla、或者装了半天死活起不来的人。我自己就是在 Ubuntu 和 Windows 上都折腾过踩过编译的坑、环境变量的坑、版本不匹配的坑下面这些内容基本是“能跑就行”的完整路径。1. 初识 Carla先搞清楚它到底是什么1.1 它不是一个游戏而是一座可以拆开看的虚拟城市CarlaCar Learning to Act是一个开源的自动驾驶仿真平台基于 Unreal Engine 4 构建。它的核心价值在于你可以在虚拟城市里用代码控制车辆、行人、交通灯挂载摄像头、激光雷达、GPS、IMU 等传感器然后拿到完全可控的真值Ground Truth数据来训练或验证你的算法。和你在普通 PC 游戏里看到的“开车”完全不一样。游戏里你操控的是一辆车所有的物理反馈都是以娱乐为目的而在 Carla 里每一帧的状态——包括车辆的速度、油门开度、转向角度、传感器原始数据、物体的边界框——都是可以通过 API 读出来的。在游戏里你看到的是“风景”在 Carla 里你看到的是“可编程的数据流”。我从一个纯新手的角度分析Carla 吸引人的地方有三点免费且开源社区资料很多大多数问题搜一搜就能找到解决办法。场景足够复杂自带城区地图、乡村道路、高速公路等多种环境不是那种只有一条跑道的小 Demo。传感器模型丰富车端需要的核心传感器基本都覆盖了而且支持自定义。1.2 适合谁用以及它能帮你解决什么问题如果你是做自动驾驶算法、感知、规划控制相关研究或开发的Carla 一定绕不开。它在学术界和工业界的定位是在没有实车的情况下拿到接近真实的传感器输入和环境反馈。具体来说这几类人最需要它学生/科研人员需要大量数据集来做感知模型训练或者需要验证一个决策规划算法的效果。自动驾驶公司的算法工程师在做仿真回归测试、极端场景复现、软件在环SIL验证时Carla 是常用的平台之一。ROS/ROS2 开发者想在一个完整的仿真环境中测试自己的机器人控制逻辑Carla 有现成的 ROS Bridge。车联网、交通流仿真研究者Carla 支持批量生成车辆和行人可以模拟复杂的城市交通流。它解决的问题本质上就一句话把“实车路测”的前置成本降低把危险边缘场景变成可重复的安全实验。你可以在仿真里让前车急刹、让行人突然横穿马路、让摄像头在雨夜里拍出模糊图像这些在实车上很难安全复现的 Case在 Carla 里只是几行代码的事。2. 运行前的准备工作这步决定你后面顺不顺利2.1 硬件和系统环境的真实底线先说硬件。网上流传的官方最低配置是 8GB 内存、6GB 显存但我实测下来这个配置跑高画质会很吃力。我自己用的机器是 i7-10700 RTX 306012GB 32GB 内存跑 0.9.15 版本的 Carla1080p 分辨率中画质能稳定在 30 FPS 左右这个流畅度是可接受的。如果你想跑后面会提到的多传感器同步采集我强烈建议内存至少 16GB显存至少 8GB。因为在 Carla 里同时挂 4 个摄像头、2 个激光雷达实时数据量是非常大的显存不够直接会卡成“PPT”。配置项最低要求建议配置CPU4 核6 核以上主频越高越好GPUNVIDIA GTX 1060 6GBNVIDIA RTX 3060 12GB 或更高内存8GB16GB 以上磁盘空间30GB 安装空间SSD 固态硬盘预留 50GB操作系统Ubuntu 18.04 / Windows 10Ubuntu 20.04 / Windows 11系统方面Carla 官方对 Linux 的支持比 Windows 好一部分底层工具链在 Ubuntu 上更顺滑比如 ROS Bridge、Docker 部署等。但如果你只想快速跑个 DemoWindows 也能跑我两个平台都试过Windows 版的核心功能没有缺失只是编译扩展插件的时候会比较折腾。2.2 软件依赖与版本对应关系Carla 不同版本对应的依赖环境差别很大这个坑我刚开始确实踩过。以最常用的 0.9.x 版本系列为例0.9.10 及更早版本对应 Python 3.6/3.7UE4 版本为 4.24。0.9.11 ~ 0.9.13Python 3.7UE4 4.26。0.9.14 及以上Python 3.8 以上部分版本开始支持 3.9/3.10UE4 4.26。0.9.15 / 0.9.16目前社区使用较多的版本匹配 ROS2 Foxy / Humble。在动手安装之前先确认你自己的 Python 版本和 Carla 版本匹配。很多人在已经装好的环境里 import carla 失败十有八九是 conda 虚拟环境的 Python 版本和 Carla 自带 PythonAPI 编译版本不一致。我比较推荐从源码编译之前先试预编译包。下面两个包就能解决绝大多数“初识-运行”阶段的问题CarlaUE4.shLinux/CarlaUE4.exeWindows主程序启动仿真服务器。PythonAPI文件夹包含 Python 客户端库和示例脚本。至于依赖库Python 端只需要安装两个基础包numpy和Pygame。Pygame 是用来弹出窗口显示摄像头画面的实时渲染时用得上。3. 从下载到第一次启动完整实操记录3.1 下载与目录结构在 Carla 官网或 GitHub Releases下载对应系统的压缩包。解压之后你会看到这样的目录carla/ ├── CarlaUE4/ │ ├── CarlaUE4.sh # Linux 启动脚本 │ └── Content/ # 地图、场景资源 ├── PythonAPI/ │ ├── carla/ # Python 库 │ ├── examples/ # 官方示例脚本 │ └── util/ # 配置工具 ├── Tools/ │ └── 各种辅助工具 └── README.md我建议你把PythonAPI/carla这个目录直接加入 Python 路径或者在项目工程里做一个软连接方便后续写脚本时import carla。3.2 启动 Carla 服务器验证高保真画面第一次启动 NT 别急着跑脚本先把服务器拉起来。Linux 下打开终端执行cd ~/carla ./CarlaUE4.sh -quality-levelLow加-quality-levelLow是为了在低配机器上快速启动如果你显卡不错可以不加或者设置成High。Windows 下直接双击CarlaUE4.exe或者用命令行CarlaUE4.exe -quality-levelLow启动后会弹出一个类似游戏引擎的游戏窗口。如果你是第一次启动可能会有一个较长的加载时间因为要初始化整个3D场景。加载完成后你应该能看到一个城市俯视视野能用鼠标拖动视角按W/A/S/D可以在编辑器模式下移动观看。这时候按键盘上的Ctrl 1会把视角切换到你控制的车辆上方再用W/A/S/D或方向键就能控制车辆移动。这是 Carla 内建的简单手动驾驶模式没有物理踏板反馈但是用来快速测试地图和渲染状态足够了。3.3 用 Python 脚本跑通第一个自动驾驶示例服务器跑起来后另开一个终端进入PythonAPI/examples目录。先试官方自带的自动化控制脚本cd ~/carla/PythonAPI/examples python3 manual_control.py如果一切正常会弹出一个 Pygame 窗口里面显示实时摄像头画面。你可以用键盘控制车辆在虚拟城市里行驶。这个脚本是我觉得 Carla 所有示例里最适合“初识”阶段人看的它演示了如何创建 client、获取 world、生成车辆、挂载摄像头传感器、读取并显示图像数据。代码里每一步都有注释我建议你看完后再动手改比如把车辆换成自行车Carla 支持多种车辆型号、换一个天气、修改摄像头分辨率等。关于代码本身的关键逻辑我用一个最小示例来说明import carla import random # 连接服务器端口默认为 2000 client carla.Client(localhost, 2000) client.set_timeout(10.0) # 获取世界和地图 world client.get_world() town_map world.get_map() print(f加载地图: {town_map.name}) # 生成一辆随机车辆 vehicle_blueprints world.get_blueprint_library().filter(vehicle.*) spawn_points world.get_map().get_spawn_points() vehicle world.spawn_actor( random.choice(vehicle_blueprints), random.choice(spawn_points) ) # 让车辆自动驾驶Autopilot 模式 vehicle.set_autopilot(True) print(车辆已生成Autopilot 模式启动)跑了这段代码后你会发现车辆自己动起来了沿着地图上的道路行驶。Autopilot 模式内置了一个最简单的交通规则管理逻辑能识别红绿灯、停车标、限速牌。从“运行”的角度看这一步已经完整了你有了一个运行中的仿真环境、一辆能动的车、一套可读状态数据的 API。4. 核心细节解析运行 Demo 背后的机制4.1 Client-Server 架构一切皆可编程的底层原因Carla 用的是一个 Client-Server 架构。服务器CarlaUE4负责渲染、物理、传感器模拟它是一个重量级进程吃 GPU 和内存。客户端你的 Python 脚本通过网络协议默认 TCP端口 2000与服务器通信发送指令、读取数据。理清楚这件事非常关键你在代码里world client.get_world()并不是在本地创建了一个世界副本而是在告诉服务器“我要操作你世界里的某些东西”。这也意味着你随时可以在另一个进程里再启动一个客户端同时控制同一个服务器里的两辆车只需要注意别让两个进程互相抢同一个 actor。4.2 传感器系统与真值数据的获取方式Carla 的传感器是挂在 actor 上的常见的有sensor.camera.rgbRGB 相机输出图像数组。sensor.lidar.ray_cast激光雷达输出点云数据。sensor.other.imu惯性测量单元输出加速度、角速度。sensor.other.gnssGPS 定位数据。sensor.other.collision碰撞检测传感器返回碰撞信息。下面是我之前用过的一段“同时采集摄像头 雷达”的代码片段放在初识阶段已经比较有代表性camera_bp world.get_blueprint_library().find(sensor.camera.rgb) camera_bp.set_attribute(image_size_x, 1280) camera_bp.set_attribute(image_size_y, 720) camera_bp.set_attribute(fov, 90) camera world.spawn_actor(camera_bp, carla.Transform( carla.Location(x-5.0, z3.0), # 安装在车头前方 5 米、上方 3 米 carla.Rotation(pitch-10.0) ), attach_tovehicle) # 监听回调函数 def on_camera_image(image): # image 是 carla.Image # 可以转换 numpy 数组进行后续处理 array np.frombuffer(image.raw_data, dtypenp.uint8) array array.reshape((image.height, image.width, 4)) print(f收到一帧图像: {array.shape}) camera.listen(on_camera_image)这种基于注册回调的监听模式和 ROS 的订阅模型很像。如果你学习过 ROS上手会非常快。4.3 天气、地图切换与场景动态控制Carla 里可以动态改变天气包括晴天、多云、雨天、浓雾以及湿滑路面等参数。可以直接用现成的预设weather carla.WeatherParameters( cloudiness80.0, precipitation50.0, sun_altitude_angle30.0, fog_density5.0, wetness50.0 ) world.set_weather(weather)我在实际测试感知算法的时候会用这个来把模型逼到“极限”——比如把雾浓度调到 80 以上看看模型还能不能识别红绿灯。这种场景要是去实车测试得等天气非常被动在仿真里只需要一行代码。这就是仿真发散其实就是测试场景发散的价值。Carla 自带多个地图常见的包括Town01基础城镇道路简单适合初学。Town02小型社区有环形岛。Town03 / Town04更复杂的城区和郊区适合做规划算法实验。Town05高速公路场景。Town10HD更接近真实城市的高清地图。切换地图的代码也很简单client.load_world(Town05)需要注意的是切换地图后之前生成的所有 actor 都会被清空需要重新生成。5. 常见问题与排查技巧实录我在“初识-运行”阶段遇到的各种报错算是相当典型了。先整理成一个速查表后面再细说几个最让人抓狂的。问题现象可能原因解决方案ClientError: connection failed服务器没启动、端口被占用先跑CarlaUE4.sh再用netstat -an查 2000 端口ModuleNotFoundError: carlaPython 环境路径不对export PYTHONPATH$PYTHONPATH:~/carla/PythonAPI/carlaSegmentation faultPython 版本与 Carla 编译版本不一致换对应 Python 版本或重新编译 PythonAPI画面卡顿严重渲染画质过高、显卡显存不足加-quality-levelLow启动或调低分辨率无法生成车辆没有指定 spawn point或生成点被占用用world.get_map().get_spawn_points()随机选点5.1 Python 环境导致的连接失败如果你运行脚本时提示ModuleNotFoundError: carla别慌90% 是因为 Python 找不到 Carla 的库。解决办法是把 PythonAPI 目录加入环境变量export PYTHONPATH$PYTHONPATH:~/carla/PythonAPI/carla export PYTHONPATH$PYTHONPATH:~/carla/PythonAPI/carla/dist如果不想每次启动终端都手动输入可以写进~/.bashrc或者做成一个.sh脚本每次运行前先source一下。最重要的细节是carla库在 Windows 下还需要额外的 DLL 支持。如果你用 Windows 报ImportError去PythonAPI/util里找build.bat运行一下把 Carla 库编译成当前 Python 版本能用的形式。5.2 低配机器上的性能与稳定性问题低配机器跑 Carla 最容易遇到的问题就是显存爆掉主界面黑屏或闪退。我自己的排查思路是这样的先试-quality-levelLow和-windowed -ResX800 -ResY600降低分辨率和特效。CPU 占用异常高时把-carla-server-timeout调长一点。如果出现“运行错误”这类系统级报错先查显卡驱动是不是旧版本。Carla 对驱动版本较敏感建议至少跟到 NVIDIA 官方最新稳定版。还有一个通用经验关掉电脑里的其他 3D 应用。Carla 基于 UE4对显存占用很“贪婪”开着浏览器几十个标签页再加上一堆后台渲染同样配置下它会明显掉帧。5.3 版本与文档不一致的问题Carla 的文档更新速度比代码慢是常事。你在 GitHub 上看到一个写法结果在当前版本下报 API 错误很常见。我的建议是最好以官方下载包里的/PythonAPI/examples代码为参考。这些代码一定会和该版本 API 一致。遇到网上旧代码中用game相关的 API新版本已经废弃改用carla命名空间。官方论坛和 GitHub Issues 是最好的排错来源搜报错原文往往能直接找到答案。6. 从初识到进阶扩展玩法与性能优化经验6.1 从单机 Demo 到 ROS2 联合仿真跑通 PythonAPI 之后大多数人的下一步是和 ROS2 对接。Carla 官方维护了一个ros-bridge支持 ROS2 Foxy / Humble。启动方式大致是# 先启动 Carla 服务器 ./CarlaUE4.sh # 再启动 ros_bridge ros2 launch carla_ros_bridge carla_ros_bridge.launch.py启动成功之后你可以用ros2 topic list看到很多话题比如/carla/ego_vehicle/rgb_front车前方摄像头图像/carla/ego_vehicle/lidar激光雷达点云/carla/ego_vehicle/odometry车辆里程计/carla/ego_vehicle/control车辆控制指令很多做规划控制的人会在 ROS2 里写一个节点订阅/carla/ego_vehicle/odometry输出控制指令到/carla/ego_vehicle/control形成闭环。这是最标准的做法也是 Carla 和机器人生态结合最顺滑的地方。6.2 多传感器同步采集的经验真想用 Carla 做数据集的得注意传感器同步问题。Carla 提供了synchronous_mode在这种模式下服务器会在客户端请求时才会推进世界时间这样多路传感器就能对齐到同一帧。# 设置同步模式 settings world.get_settings() settings.synchronous_mode True settings.fixed_delta_seconds 0.05 # 20 FPS world.apply_settings(settings) # 每帧手动推进 world.tick()如果不设置同步模式多个传感器的回调可能来自不同时刻时间戳对不上。初识阶段可能看不出问题但一旦要训练深度模型数据的时空一致性就是生命线。6.3 性能优化技巧从“能跑”到“跑得爽”我自己实际跑数据时有几套优化组合后台运行时加-RenderOffScreen不弹窗口只做离屏渲染帧率马上上去不少。数据处理脚本用多进程一个进程负责传感器数据采集另一个进程做预处理或模型推理。减少静态车辆的生成数量、去掉不必要的路面积水反射效果吃 GPU 的大头其实不是几何模型而是光影和反射。用上车载实拍图并结合具体需求逐步调整这几个选项效率提升是非常明显的。7. 写在最后的个人体会回头看我第一次跑起 Carla 的时候其实只做了一件很简单的事下载、启动、跑通 manual_control。但那份“车终于动起来”的成就感到现在还挺有印象。后面再深入做传感器采集、ROS2 联调、极端天气测试每一次突破都是基于初识阶段打下来的基础。如果你现在卡在“安装很久但跑不起来”我的建议是换一条路直接下官方预编译包跑一次 Demo源码编译等你有明确需求再说。初识阶段不看过程只看结果。最后分享一个小技巧把manual_control.py里的分辨率改成你自己的显示器比例比如 1920x1080 或者 1280x720然后加一句vehicle.set_autopilot(True)你就可以挂机观察车辆在城市里自己开顺便看看数据面板里它在红绿灯前的刹车逻辑。理解这些细节才是真正从“会运行”走向“会仿真”的第一步。