
我第一次下载CARLA压缩包的时候心里想得很简单解压、双击、进地图三步就能在虚拟城市里跑起来。结果实际情况是窗口闪了一下就没了命令行里蹦出一堆看不太懂的信息地图半天加载不出来最后发现是显卡驱动一直被某个旧版本按住没更新。这款开源自动驾驶仿真器对新人其实算不上友好但只要把运行链路里那几个关键点摸清楚后续用起来会顺手得多。这篇东西就是把我从零把CARLA跑通的过程、运营过程中的报错、以及跑通之后怎么上手玩按顺序完整记录下来给正卡在“初识-运行”这一步的朋友做个参考。先说清楚这篇文章的适用人群刚接触自动驾驶仿真、手头有还过得去的游戏显卡、想在本地把CARLA跑起来看看效果或者打算用它做感知、控制、数据集生成方向的研究。文章不会讲太深的理论重点放在“怎么能让它稳定跑起来”这件事上几乎每一个坑都是我实际遇到过并解决过的。1. CARLA到底是个什么东西一个自动驾驶专用仿真平台1.1 它的定位与典型应用场景CARLA全称是Car Learning to Act基于Unreal Engine 4打造属于开源自动驾驶仿真器早期由Intel Labs和Toyota Research Institute等机构推动现在社区活跃度非常高。你可以把它理解成一个装了虚拟城市道路的“驾驶练习场”里面有成套的城市路网、建筑、车辆、行人、天气系统以及摄像头、激光雷达、毫米波雷达、GPS、IMU这些车载传感器。它的核心价值在于解决三个问题。第一个是真实道路测试的成本和安全问题自动驾驶算法不能一上来就在马路上试撞一次的成本远高于在虚拟环境里跑几千公里。第二个是场景可重复性真实路测遇到的场景不可控但CARLA里可以精确控制天气、光照、交通流同一个场景可以反复跑一百遍。第三个是数据获取训练感知模型需要大量标注数据CARLA能直接输出带标签的深度图、语义分割结果、目标包围框省去人工标注的巨大工作量。所以你会看到搞感知算法的人拿它生成训练数据搞控制规划的人拿它验证决策逻辑搞仿真测试的人拿它做极端场景回归。它的定位不是某个垂直领域的物理仿真器而是面向自动驾驶全栈算法验证的综合仿真平台。1.2 为什么选择CARLA而不是其他仿真软件很多刚接触的人会被“仿真”这两个字带偏以为CARLA和CarSim、Factory IO、Solidworks里的热仿真是一类东西。实际上它们完全不在一个维度上。CARLA做的是“城市场景传感器模拟”强调环境渲染、交通流生成、传感器数据输出解决的是自动驾驶算法闭环验证的问题。CarSim这类工具专注车辆动力学能给出高保真的底盘响应、轮胎模型、悬架参数但不擅长渲染复杂的城市道路和行人交互。TurtleBot3配合Gazebo则面向室内移动机器人场景规模小传感器类型和自动驾驶也有明显差距。Factory IO是工业自动化产线仿真Solidworks热仿真、HFSS电磁仿真、Cadence电路仿真这些更是另一个领域的东西。选型逻辑其实很简单如果你的目标是训练和验证自动驾驶感知、规划、控制算法CARLA是目前开源生态里最均衡的选择之一。如果你要研究车辆底盘本身的物理响应CarSim才是主场。当然两者不是互斥的后面我会专门讲CARLA和CarSim联合仿真的思路这在实际工程里非常常见。2. 装之前先过一遍硬件与软件门槛2.1 硬件要求到底有多高我见过不少人在配置很一般的电脑上硬跑CARLA然后抱怨“卡死”“黑屏”“启动失败”。先摆一个残酷的现实CARLA本质是个基于UE4渲染的大型应用程序它对GPU的要求和玩一款3A游戏差不多。官方给的最低配置只能保证“能启动”离“好用”差得远。根据我的实测经验可以按下面这个标准自我检查硬件项最低能跑比较舒服备注CPU4核8核以上大量NPC车流时CPU压力很大内存8GB16GB以上低于8GB会在加载地图时爆内存显卡GTX 1050 Ti / 1650 4GBRTX 2060 6GB以上NVIDIA优先CUDA生态更顺显存4GB8GB以上显存不够会直接闪退或黑屏硬盘HDDSSD首次编译shader时SSD能省大量时间网络能下载宽带压缩包体量在20GB以上我自己的主力机是i7-10700 RTX 2060 6GB 32GB内存画质中档跑得比较稳。建议至少留100GB的SSD空间给解压后的工程和后续生成的仿真数据跑几轮数据采集就会发现磁盘涨得比你想象的快。2.2 软件环境Windows和Linux下的版本选择CARLA官方文档强烈推荐在Ubuntu下使用尤其是后续要接ROS 2、要做分布式训练、要长期跑仿真实验的情况Linux系统更稳定也不会被显卡驱动和系统更新折腾得够呛。Windows在最新版本里也支持适合快速体验和简单脚本开发但遇到奇怪问题的概率会高一些。版本选择上有一个重要认知CARLA的0.9.x系列是目前教程最丰富、社区资料最全的分支0.9.13、0.9.14、0.9.15这几个版本都是经过大量用户验证的稳定版。1.0系列采用了新的架构还在快速迭代功能更新快但坑也多。如果你是照着教程学我建议优先选0.9.15这样的经典版本等把整个流程跑通了再考虑尝鲜新版。还有一个非常容易忽略的坑不同版本对应的Python API版本不一样。比如0.9.13系列的Python接口一般对应Python 3.7到3.90.9.14和0.9.15系列更常用Python 3.8到3.10。装之前一定先看你下载的Release页面里标注的依赖信息否则后面前端窗口起来了Python端怎么都连不上很多人就卡在这一步。3. 从零把CARLA首次跑起来3.1 下载、解压与目录结构CARLA的发布包在GitHub的Release页面下载文件非常大下载前先确认网络稳定、磁盘空间足够。这个你按官方渠道获取就行没有太多捷径耐心等下载完成。拿到压缩包之后第一步是解压。Windows下直接解压zipLinux下用tar解压tar -xvf Carla_0.9.15.tar.gz解压出来的目录结构有几个关键部分。CarlaUE4或Carla目录是服务器主程序负责渲染和物理模拟PythonAPI目录存放Python客户端库和官方示例脚本carla目录里有C客户端库ImportAssets和Unreal/CarlaUE4这些是内容资源和引擎工程文件。搞清楚这几个目录的作用后面排查问题会方便很多。解压时有一个必须遵守的规则路径里不要出现中文、空格、特殊符号老老实实用纯英文路径。我在路径带中文的机器上遇到过UE4加载资源异常、Python脚本找不到模块、保存数据集路径乱码等问题全部换成英文路径后消失。这一步在最开始做掉能省掉后面一小时的折腾。3.2 第一步启动等它把地图世界加载出来进入CarlaUE4目录Windows下双击CarlaUE4.exe新版本可能叫Carla.exeLinux下在终端执行./CarlaUE4.sh如果新版没有这个脚本直接运行主程序二进制文件也可以启动方式本质上就是执行一个UE4打包程序。第一次启动会非常慢这是完全正常的。UE4需要编译shader缓存弹出的窗口可能会长时间停留在“Compiling shaders”或者黑屏状态硬盘灯一直亮着。这个阶段千万别急着关窗口也尽量不要占用大量系统资源让它慢慢编译。在SSD上这个过程可能三五分钟在机械硬盘上十分钟以上都算正常。启动慢的另一个原因是服务器端要初始化地图、加载资源、建立网络通信端口。CARLA的默认通信端口是TCP 2000启动完成后命令行会输出类似“Carla server running”的信息。看到这个输出说明服务器端基本起来了。CARLA主程序支持很多启动参数在命令行里加上-h或--help可以查看完整列表。常用的是这几个./CarlaUE4.sh -quality-levelLow # 低画质模式配置不够时保命 ./CarlaUE4.sh -windowed # 窗口模式便于调试 ./CarlaUE4.sh -carla-port3000 # 自定义端口避免冲突 ./CarlaUE4.sh -fps15 # 限制帧率降低资源占用我第一次跑的时候什么参数都不知道结果在地图加载完成后帧率低得没法看。后来用-quality-levelLow和-windowed组合在老机器上也能勉强跑起来做数据采集。3.3 确认运行成功的三个信号怎么判断CARLA“真的运行成功”了而不是光有个窗口我总结三个信号缺一个都说明链路没完全打通。第一个信号是屏幕上有完整的城市场景。正常情况是加载出类似俯视视角的城市能看到道路、建筑、车辆和交通标识牌视角可以在窗口里用鼠标移动。如果窗口是黑屏、蓝屏、或者崩溃闪退直接进下一章的排查。第二个信号是终端输出里有服务器启动成功的信息。CARLA服务端启动过程会打印地图加载、端口监听等信息其中如果有“Listening”或者“port 2000”这类字样说明服务器端网络层正常。第三个信号是Python客户端能连接上。在另一个终端窗口里执行python -c import carla; client carla.Client(localhost, 2000); client.set_timeout(5.0); world client.get_world(); print(world.get_map().name)如果输出一串地图名称比如Town10HD说明Python客户端库安装正确、服务器端口正常、客户端和服务端版本匹配这才是真正的“运行成功”。很多人以为窗口能开起来就是成功结果Python脚本一跑就报错其实问题就出在客户端连接这个环节没有验证过。4. 初识阶段最常见的“运行错误”与完整排查链路4.1 窗口一闪而过显卡驱动与UE4崩溃这是“初识-运行”阶段遇到最多的现象双击主程序后窗口闪一下就直接消失或者弹一个“UE4-CarlaUE4已崩溃”的对话框。网上搜“运行错误”能搜到大量类似问题但落到CARLA上优先级最高的是这几件事第一显卡驱动版本太旧。UE4渲染对显卡驱动有硬性要求老驱动经常导致程序直接崩溃退出。排查方法很简单先更新一次NVIDIA或AMD的驱动到最新稳定版再启动看看。我遇到的闪退案例里至少一半靠更新驱动解决。第二笔记本在运行高负载程序时默认用了核显而非独立显卡。这个特别坑窗口能开但进入场景后直接卡死或者渲染异常。在NVIDIA控制面板里把CarlaUE4.exe手动设置为“高性能NVIDIA处理器”运行问题立刻解决。第三缺少VC运行库。Windows版CARLA依赖Visual C Redistributable建议把2015到2022的x64版本都装一遍几十兆而已却能挡掉很大一部分闪退问题。第四路径包含中文或特殊字符。前面反复强调过DIRECTLY把CARLA目录移动到纯英文路径下再重新启动。如果以上都排查过仍然闪退去看CARLA的崩溃日志。Windows下日志一般在C:\Users\用户名\AppData\Local\CarlaUE4\Saved\Crashes目录Linux下在~/.config/或者工程目录的Saved/Crashes下面。日志里会记录崩溃点的详细信息把这些信息贴到社区搜索往往能定位到更具体的原因。4.2 Python API连不上版本与端口的坑窗口和服务端都运行正常但Python脚本一执行就报错这种情况基本都出在Python环境配置上。最常见的错误是import carla直接 ModuleNotFoundError。原因很简单你的Python解释器里没有安装CARLA的Python API库。解决方式有两种一是直接pip安装pip install carla二是在CARLA安装包的PythonAPI/carla/dist目录下找到对应你Python版本的.whl文件手动安装pip install carla-0.9.15-cp38-cp38-win_amd64.whl这里特别强调whl文件名里的cp38代表Python 3.8如果你的解释器是Python 3.10就得找cp310对应的文件混用会出现“is not a supported wheel on this platform”的报错。在Linux下还常见一个变体系统自带Python是3.8conda环境却用的是3.10两边环境完全隔离你在其中一个环境装了carla另一个环境里当然找不到。检查环境一致性最重要。另一个高频错误是脚本提示timeout或者“Failed to connect to server”。这种一般是服务器端没起来、端口不对、或者服务端版本和客户端版本不匹配。先确认服务端窗口已经加载出城市地图再检查端口号是否一致。如果你用-carla-port3000启动了服务端客户端这边连接端口也要改成3000python manual_control.py --port 3000还要注意每次运行完一次客户端脚本最好确认之前的进程已经退出否则多次连接会导致端口资源被占新客户端一直卡在等待状态。Windows下可以用任务管理器清理python进程Linux下用ps -ef | grep python找到残留进程后kill掉。4.3 启动缓慢/长时间卡在编译着色器缓存与IO问题很多人的机器配置明明不低但打开CARLA就是要黑屏很久甚至一度怀疑是卡死了。这个问题大概率出在UE4首次启动时编译shader缓存上。UE4引擎在首次运行时需要将大量材质和渲染效果编译成当前显卡能直接使用的缓存文件这个过程极吃硬盘IO。同样一台机器代码放在NVMe SSD上可能是两三分钟的事放在机械硬盘上可能要等十五分钟甚至更久中间看起来完全没反应其实是在疯狂读写。解决办法基本三个。一是把CARLA整个放到SSD上这是治本的办法。二是首次启动时尽量不要同时干其他重活让它专心编译。三是如果中途不小心关了进程缓存文件可能写一半损坏下次启动会重新编译。所以遇到长时间卡在这个阶段给足耐心别反复杀进程。还有一种情况是进入地图之后画面帧率极低、操作延迟严重。如果确认显卡型号不差可以先检查驱动是否更新再检查是否窗口模式被系统限制了刷新率。还可以用-quality-levelLow降低画面开销把资源留给仿真逻辑。4.4 命令行工具报“无法识别/禁止运行”PATH与执行策略问题跑CARLA的Python脚本时很多人会遇到Windows终端报“无法将‘python’或‘carla’识别为 cmdlet、函数、脚本文件或可运行程序的名称”或者是提示“因为在此系统上禁止运行脚本”然后脚本无法执行。这些其实不是CARLA本身的问题而是系统环境配置的问题。“无法识别python”的意思是Python解释器没有加入系统的PATH环境变量或者当前终端是在旧的PATH环境变量下启动的。解决方式是在系统设置里检查Python的安装路径有没有加入PATH加好之后重新打开终端。还有“无法识别carla”的情况大概率是你没有把Python的Scripts目录也加到PATH里导致pip装好的carla命令行工具找不到。“禁止运行脚本”是PowerShell执行策略的问题。默认情况下PowerShell可能不允许执行脚本文件你可以用以下命令修改当前用户级别的执行策略Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这个命令只是把执行策略调整为“允许本地脚本运行”属于Windows常规配置做完之后能正常执行Python脚本。如果做完还不行再看脚本本身有没有语法错误。顺便提醒一个很常见的低级坑GitHub上很多CARLA相关项目提供的是xxx.py脚本正确执行方式是python xxx.py不是直接写./xxx.py。在Windows下直接双击.py文件有时候会用记事本打开或者用错误的解释器执行导致一堆乱码报错。养成在终端里用python xxx.py执行脚本的习惯能避开很多莫名其妙的问题。4.5 Linux环境下缺少依赖库的报错在Ubuntu下跑CARLA启动时常常会报找不到某个动态库最常见的是libomp.so.5、libc、libcabi这些。我印象很深的是第一次在Ubuntu 20.04上运行直接提示找不到libomp.so.5装完之后又提示缺libc再装又缺别的典型的连锁依赖问题。有两条路可以走。一条是检查你的系统里有没有安装CARLA官方文档列出的基础依赖sudo apt update sudo apt install libomp5 libc-dev libcabi-dev另一条是用动态库排查命令看具体缺什么ldd CarlaUE4.sh或者直接运行CarlaUE4二进制并观察输出。缺失的库名会直接告诉你。这种问题不算难但要有耐心一个个补齐。另外一个Linux独有的大坑是显卡驱动没有正确安装导致报错内容指向OpenGL或Vulkan相关库这种一般需要先解决好驱动问题再继续。5. 跑通之后的第一批实战手动控制、交通流与数据采集5.1 用自带脚本手动开一辆车服务端起来之后CARLA包里其实带了不少官方示例脚本放在PythonAPI/examples目录下。最推荐先跑的是手动控制脚本python manual_control.py运行之后客户端会连接到本机2000端口在一堆车辆蓝图里选一辆车放置到地图上。窗口里可以用WASD控制油门、刹车和转向鼠标切换视角C键切换不同观察视角H键会显示完整操作帮助。我第一次跑通这个脚本时最大的感受是CARLA里的车辆模型做得相当细致仪表盘、后视镜、转向灯都有而且车辆动力学反馈比一般的游戏引擎要真实很多会明显感觉到轮胎打滑和车身侧倾。这个脚本非常适合用来熟悉CARLA的基本操作方式和车辆行为也为后续自己写控制逻辑打底。有一点要注意先启动服务端等地图加载完成再运行manual_control.py。如果脚本连接时服务端还在编译shader很容易出现连接超时。另外终端窗口不要关脚本需要保持在前台运行才能持续发送控制指令。5.2 一键生成满城NPC车流手动驾驶只是入门真正让CARLA看起来“活起来”的是交通流。CARLA包里有一个专门生成随机车流和行人的脚本python spawn_npc.py -n 80这条命令会在当前地图上生成80辆车它们会自动沿着道路行驶、遵守红绿灯、避让前方车辆。如果你想加行人还可以补充-w参数指定行人数量。行人会在人行道上走动个别行人还会横穿马路这对测试感知算法的鲁棒性特别有用。生成车流的底层逻辑是从CARLA的blueprint库中筛选出所有车辆蓝图然后从地图上合理的位置点sensor点或者行人可步行区域生成actor最后给每个车辆设置autopilot模式由服务器端的交通管理器统一调度。这个过程看起来很复杂其实服务器都替你封装好了。新手有一个容易踩的坑一上来就生成200辆车结果服务端fps掉到个位数电脑风扇狂转。这不是CARLA出问题了而是资源已经被吃满。建议先从30辆车开始等熟悉之后再逐步增加。如果你自己写脚本批量生成车辆也记得在结束的时候清理actor列表否则每次运行都会在场景里留一堆僵尸车影响下一次运行。5.3 接上传感器采集自动驾驶训练数据CARLA的灵魂不在画面而在它能输出各种传感器数据。下面这段代码展示了如何在车辆上挂载一个RGB相机和一个激光雷达并通过回调函数拿到数据import carla client carla.Client(localhost, 2000) client.set_timeout(10.0) world client.get_world() bp_lib world.get_blueprint_library() vehicle_bp bp_lib.filter(vehicle.tesla.model3)[0] spawn_point world.get_map().get_spawn_points()[0] vehicle world.spawn_actor(vehicle_bp, spawn_point) camera_bp bp_lib.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_transform carla.Transform(carla.Location(x1.5, z1.8)) camera world.spawn_actor(camera_bp, camera_transform, attach_tovehicle) def on_camera_image(image): image.save_to_disk(/tmp/carla_data/%06d.png % image.frame) camera.listen(on_camera_image)这段代码做的事情很直观连接服务器、创建车辆、挂载相机、设定相机安装位置车辆前方1.5米、高度1.8米、监听相机数据并保存到磁盘。CARLA里所有传感器都是actor它们可以附着在车辆上跟随车辆运动这是理解CARLA传感器框架的关键。除了RGB相机CARLA还提供了深度相机、语义分割相机、激光雷达、毫米波雷达、GPS、IMU等传感器。做感知模型训练时常用语义分割相机直接输出带类别标签的图像做三维目标检测时用激光雷达输出点云。传感器数据的时间戳和帧号是同步对齐的这个细节对多传感器融合非常有用也是CARLA在数据生成场景中特别受欢迎的原因。6. 从单机到联合CARLA与ROS 2、Simulink/CarSim的联动路径6.1 ROS 2环境下吃CARLA数据跑通了基础运行和示例脚本之后很多人下一个问题就是怎么把CARLA接进自己的算法框架在自动驾驶研发里ROS 2几乎是绕不开的中间层。CARLA官方和社区维护了ROS 2桥接包大致原理是起一个桥接节点把CARLA服务端的传感器数据转换成ROS 2的话题topic发布同时订阅/cmd_vel或/vehicle_control这类控制话题把外部控制指令发回给CARLA。用ros2 launch可以一键启动整套桥接ros2 launch carla_ros_bridge carla_ros_bridge.launch.py启动之后你会看到一系列话题被动态创建比如/carla/ego_vehicle/velocity、/carla/ego_vehicle/sensors/rgb_front、/carla/ego_vehicle/sensors/lidar。这时候CARLA就不再只是一个“画面好看的仿真器”了而是变成了一个持续输出真实传感器消息流的虚拟自动驾驶车辆你可以直接在Rviz里查看点云和图像也可以用已有的ROS 2感知算法直接消费这些话题。这套链路我强烈建议在熟悉基础运行之后再搭不然问题叠加起来很难排查。先从ros2 topic list确认话题存在再用ros2 topic echo查看具体数据格式一步步验证整条链路。桥接包版本需要和CARLA版本匹配这是个很容易被忽略的细节。6.2 用Simulink/CarSim接管车辆动力学的思路如果你做的是控制方向会很快发现CARLA默认的车辆动力学模型在激烈驾驶、湿滑路面、高速过弯等场景下不够“真实”。CarSim这类高保真车辆动力学软件正好弥补这个短板所以工程上常见CARLACarSim联合仿真CARLA负责场景渲染和传感器模拟CarSim负责车辆底盘动力学计算。联合仿真的基本架构是两边通过TCP或UDP交换数据CARLA把车辆当前的位置、速度、方向盘转角发送给CarSimCarSim基于高保真动力学模型计算出新的车辆状态再返回给CARLA。这样一来你在CARLA里看到的是漂亮的城市环境和传感器数据车辆行为却受CarSim精确控制。和Simulink连接时的思路类似Simulink里通过S-Function或者外部接口模块把控制指令发给CARLA Python客户端同时接收传感器数据。做联调时有两点实践经验可以分享先在单机上用简化模型验证通信链路再启用完整的CarSim动力学模型否则两边一起出问题时很难定位通信频率保持和CARLA服务器帧率一致比如20Hz对20Hz避免数据错位。这条路折腾程度明显比单独跑CARLA高不少但如果是做控制策略、车辆横向纵向算法验证投入产出比是值得的。先跑通基础再往上叠加永远是最稳的做法。以我个人的使用感受来说CARLA这套东西第一次跑起来确实没那么顺利关键是把运行链路上的每个环节都验证一遍服务端能启动、Python客户端能连接、传感器能出数据、脚本能正确执行。把这些基础打牢之后后续不管是生成数据集、跑感知模型还是接ROS 2、做联合仿真都会顺畅很多。如果你也是刚下载好压缩包准备第一次启动建议从低画质模式开始耐心等过shader编译用一个最简单的Python连接脚本验证链路然后一步步来。仿真世界里回报是实打实的一旦跑通你面对的就是一座可以做各种自动驾驶实验的虚拟城市。