CARLA与ROS自动驾驶仿真环境搭建指南:感知、规划与控制闭环实践
2026/9/8 1:36:31 网站建设 项目流程

简介:一套面向自动驾驶算法验证与机器人路径跟踪研究的ROS功能包,基于Carla模拟器实现纯跟踪(Pure Pursuit)控制,适合有ROS和Python基础、希望在仿真环境中验证横向控制效果的学习者与开发者,也可用于智能车相关课题的预研与课程设计参考。资源共10个文件,压缩包约90KB,包含launch启动配置、Python控制脚本、pickle参考路径数据,辅以xml/json参数文件及CMake构建配置,并配有txt/md说明文档;内容预览中的pure_pursuit、config、launch、src目录划分清晰,便于按模块定位代码与配置。功能实现上,包内整合了路径记录与解析部分,路径分辨率默认0.2m并且可调,速度控制采用PID且目标速度设为12m/s,转向控制则围绕pure pursuit算法展开;配套说明覆盖了Carla离屏渲染与ROS联合启动的关键流程,读者可借此理解仿真环境搭建、参数整定与二次开发切入点。目前已有502人学习下载,整个套件轻量易部署,适合课程实验、竞赛调试及课题预研等场景。 先说结论——如果你刚接触自动驾驶,没有资本和勇气拿真车上路,carla_simulation 这类基于 CARLA 和 ROS 的仿真套件,是目前最值得投入时间的方向。我把这套环境从零搭完、跑到自动驾驶小车在虚拟城市里自己拐弯避障以后,最大的感受是:它解决的不是"画面够不够逼真"的问题,而是让感知、规划、控制这一串算法终于有了可以反复折腾的试验田。这篇文章就围绕我实际搭建和应用这套套件的完整过程来写,适合刚入门自动驾驶仿真、以及想在 ROS 生态里跑通一套感知闭环的同学参考。

1. 为什么自动驾驶开发绕不开 CARLA 这类仿真环境

1.1 实车测试的门槛,比你想的高得多

很多人一开始对仿真的理解是"做个好看的动画给自己看",但我真正接触自动驾驶开发之后才意识到,仿真环境的核心价值在于:它能帮你把一辆车、一组传感器、一个可交互的交通场景,打包成一个能随时重置、随时注入故障、随时采集数据的实验室。

实车测试的代价,不只是买车的钱。场地、安全员、天气、交通流、传感器标定、数据标注、极端 corner case 的复现,每一项都是成本黑洞。我自己见过很多项目死在"算法在仿真里还行,上路就被场景多样性击穿"这个阶段。而 CARLA 从设计上就是奔着自动驾驶测试去的:它用虚幻引擎做渲染层,底层还带车辆动力学和物理引擎,不是那种简单摆几个方块的玩具环境。

1.2 CARLA 到底"仿真"了什么

把 carla_simulation 要点拆开,你会发现它模拟的不只是"车在马路上跑"这个表象:

  • 车身动力学:油门、刹车、方向盘输入会经过车辆模型换算成真实运动,你拿真实控制算法跑上去不会出现"加速度无限大"的失真;
  • 传感器模型:RGB 相机、深度相机、语义分割相机、激光雷达、IMU、GNSS,这些都有对应的 ROS 消息输出,可以直接喂给感知算法;
  • 场景要素:行人、其他车辆、红绿灯、路标、建筑、天气系统、一天中的光照变化;
  • 地图逻辑:街区道路用 OpenDRIVE 格式描述,车道线、红绿灯位置、限速信息都带语义属性,规划算法用的车道信息不再是"画出来的线段"。

1.3 它和 Gazebo 的区别在哪

很多做过机器人的人会问:我有 Gazebo,为什么还要用 CARLA?

Gazebo 更偏向"机器人"场景,适合机械臂、轮式小车、室内导航,建图、路径规划这些在 Gazebo 里跑得很成熟。但 Gazebo 对城市级道路、复杂交通流、高逼真图像渲染的支持比较弱,传感器图像做得不够真实。CARLA 正好补上这一块:当你的算法依赖相机图像特征、需要大量城市驾驶数据、要测试红绿灯和行人交互的时候,CARLA 是更合适的舞台。

所以如果你做的是扫地机器人,Gazebo 够用;但如果你做的是自动驾驶汽车,CARLA 这套仿真链路值得优先考虑。

2. 环境搭建:从 Ubuntu 到 CARLA+ROS 的完整链路

2.1 硬件门槛和系统版本选择

先说你绕不开的硬性配置。我用的是 RTX 3060 显卡,跑 CARLA 0.9.13 开低画质模式还能保持 20 帧左右,开高画质就会掉到 10 帧以下。如果你手头的卡是 1060 级别,建议直接加-quality-level=Low参数启动,否则后面跑传感器流的时候帧率会让你怀疑人生。内存方面,16G 勉强能跑,32G 比较舒服,因为 CARLA 在加载地图时对内存的消耗很明显。

系统版本上,CARLA 从 0.9.x 系列开始对 Ubuntu 版本有不同的对应关系。我用的 Ubuntu 20.04 + CARLA 0.9.13 + ROS Noetic,这套组合在社区里被验证得最多,遇到问题基本都能搜到解决方案。如果你是 Ubuntu 22.04,那就走 CARLA 0.9.15 以上版本配 ROS 2 Humble 的路子,但 ROS 2 的桥接配置会比 ROS 1 多一些概念要理解。

2.2 怎么省事地把 ROS 装好

ROS 的安装本身不复杂,但对新手来说坑不少:源的选择、依赖冲突、Python 版本不匹配。很多人在装 ROS 这一步就已经消耗完了全部热情。社区里比较流行的是鱼香ROS 的一键安装脚本,我实际用下来确实省了很多手动配源的时间,尤其是刚装完系统、还不熟悉 apt 和软件源配置的阶段。

如果你更习惯一步一步来,官方流程也清晰:添加 ROS 源、添加密钥、更新索引、安装 ros-noetic-desktop-full、初始化 rosdep。最关键的坑点是 rosdep 那一步,国内网络环境下经常卡在读不完依赖索引,需要耐心重试或者手动补齐依赖。这里我的建议是:新手别在这上面硬磕,用一键脚本快速装完,先把主线跑通,后面有精力了再回头细究原理。

2.3 编译 CARLA ROS 桥接包的依赖陷阱

CARLA 官方提供 carla-ros-bridge,它把 ROS 和 CARLA 连接起来,把 CARLA 里的车辆状态、传感器数据、地图对象发布成 ROS 话题。这里依赖容易出问题的是carla_msgs和自定义消息的编译顺序。第一次编译时提示找不到carla_msgs,多半是消息包没有先编出来,需要按顺序来:

cd ~/carla-ros-bridge catkin_make -DCATKIN_WHITELIST_PACKAGES="carla_msgs" catkin_make -DCATKIN_WHITELIST_PACKAGES=""

第一行先只编译消息包,第二行再编译剩下的功能包。这个技巧是我踩完坑之后才明白的——catkin_make全量编译时,功能包依赖的自定义消息如果还没生成,include 阶段就会失败。

顺带提醒一句:CARLA 服务端版本和 ROS 桥接包的版本必须保持严格对应。我用的是 0.9.13 的桥接包去连 0.9.13 的服务端,中间试过 0.9.13 服务端配 0.9.12 桥接包,结果启动后传感器话题一个都不出来。

3. 拆开 carla_simulation 套件:车、传感器和地图怎么跑起来

3.1 Ego Vehicle 的控制链路

这套仿真里最核心的角色是 ego vehicle,也就是你要开发的"主角车"。CARLA ROS 桥接包会把车辆控制暴露成 ROS 话题,你要给车下指令,往/carla/ego_vehicle/vehicle_control_cmd发布carla_msgs/CarlaEgoVehicleControl消息即可。消息里包含油门、刹车、转向、挡位这些字段,和真实车辆的底盘控制指令很像。

启动时车辆默认不启用自动驾驶模式,需要手动调用客户端脚本让它进入 autopilot,或者自己写一个控制节点。我习惯用 CARLA 自带的 Python 客户端脚本来做场景初始化,比如指定生成点、天气、行人密度,然后让车进入 autopilot 模式,方便先观察整条路线的运行情况,再逐步替换成自己的控制逻辑。

3.2 传感器消息的三维世界

我常用的传感器组合是:前置 RGB 相机、64 线激光雷达、IMU、GNSS。桥接包启动后,各传感器的话题会按照配置好的名字发布出来,比如:

  • /carla/ego_vehicle/camera/rgb/front/image_color
  • /carla/ego_vehicle/lidar/lidar1/point_cloud
  • /carla/ego_vehicle/imu/imu
  • /carla/ego_vehicle/gnss/gnss

这些话题的消息类型和真实传感器标定后的 ROS 消息一致,意味着你模块里的感知代码几乎不需要大改就能在仿真里跑起来。这个"消息兼容性"才是 carla_simulation 最有价值的地方——它不是让你针对仿真重写一套感知代码,而是让你直接在仿真里验证那套将来要上真车的代码。

3.3 地图、天气和场景自由度

CARLA 提供多个城镇地图,每个城镇的复杂度不同。Town01 适合练手,道路简单、场景干净;Town03 和 Town05 有更多弯道、交叉口和环岛,适合测试规划算法;Town10 的城市感更强,高楼密集,对图像感知算法的干扰更多。

天气系统也很有用,可以随时把晴天调成雨天、大雾、夜晚,而且这些改变是实时生效的。我做过一个实验:同一个感知模型在晴天测一遍,再切到黄昏和大雾天测一遍,检测率下降非常明显。这就是 CARLA 这类仿真器的独特价值——真实世界里你没法让天气随叫随到,但仿真里可以。

场景自动生成的接口也能控制交通流密度和行人数量。把行人密度调高之后,决策规划算法的"刹车率"会明显上升,这对我分析算法的保守程度很有帮助。

4. 时间同步问题:ROS 与 CARLA 数据对齐的真实痛点

4.1 为什么数据会"各说各话"

热词里"自动驾驶时间同步"被频繁搜索,说明这是很多人绕不开的坎。CARLA 和 ROS 各自有独立的时钟:CARLA 服务端跑的是自己的仿真时间,ROS 节点默认用的是系统时间。如果你不管这件事,相机图像、激光雷达点云、车辆状态这些数据的"时间戳"会对不上,感知层做多传感器融合时,点云和图像可能差了几十毫秒甚至更多,融合结果自然乱七八糟。

4.2 同步模式和固定步长的选择

CARLA 支持两种运行模式:异步模式和同步模式。异步模式下,CARLA 服务端自由地更新仿真世界,ROS 节点想什么时候取数据就什么时候取;同步模式下,CARLA 必须等待外部指令才会往前推进一帧。

做感知融合实验时,建议用同步模式 + 固定时间步长。这样所有传感器数据都来自同一帧,从源头保证对齐。我用的配置里,步长fixed_delta_seconds设为 0.05,也就是每步推进 50 毫秒。对应 20Hz 的控制频率,比较接近真实车辆底盘的控制周期。

4.3 让 ROS 使用仿真的时钟

关键的操作是让 ROS 节点的时间基准切换到仿真时间,也就是把use_sim_time置为 true。在 launch 文件里这样加:

<param name="/use_sim_time" value="true"/>

同时,在启动 carla_ros_bridge 时指定同步模式参数:

<arg name="synchronous_mode" value="true"/> <arg name="fixed_delta_seconds" value="0.05"/>

这样配合下来,你从/clock话题读到的就是 CARLA 的仿真时间,所有传感器消息的时间戳都以这个为基准。第一次跑通之后,我在 RVIZ 里把相机图像和激光雷达点云叠加到一起,轮廓终于严丝合缝地对上了,之前那种"点云比图像偏晚一截"的错位感彻底消失。

每次启停之间要确保 CARLA 服务端完全退出再重新启动。我之前因为上一个进程没退干净,新起的桥接包有时候能连上、有时候连不上,反复排查半天才发现是端口 2000 被残留进程占着。

5. 跑通一个自动驾驶 Demo 的完整流程

5.1 启动 CARLA 服务端

先启动 CARLA 服务端,这一步控制台会有很多 UE4 的日志输出,属于正常现象。为了让资源开销可控,我的启动命令是这样的:

cd /opt/carla ./CarlaUE4.sh -quality-level=Low

等看到控制台出现类似 "CARLA server is listening on port 2000" 的日志,表示服务端就绪。这一步多等一会儿,加载地图需要时间,不要一看到窗口就以为能连上。

5.2 启动 ROS 端的桥接包

新开一个终端,先加载 ROS 环境,再启动桥接包:

source ~/catkin_ws/devel/setup.bash roslaunch carla_ros_bridge carla_ros_bridge.launch

这个 launch 会自动连上本地的 2000 端口。如果连接失败,优先检查 CARLA 是否完全启动、端口是否被占用。启动成功后,终端会持续打印话题注册信息,说明 CARLA 里的对象正在注册成 ROS 话题。

5.3 启动车辆控制,让车先跑起来

我想先用 autopilot 确认整套链路的通畅性,于是用 Python 脚本设置 ego vehicle 生成位置然后开启自动驾驶:

import carla client = carla.Client('localhost', 2000) world = client.get_world() blueprint_library = world.get_blueprint_library() vehicle_bp = blueprint_library.filter('vehicle.tesla.model3')[0] spawn_point = world.get_map().get_spawn_points()[5] vehicle = world.spawn_actor(vehicle_bp, spawn_point) vehicle.set_autopilot(True)

脚本执行后,车开始在城里行驶,RVIZ 里能看到车辆位姿和传感器数据的刷新。

5.4 在 RVIZ 里验证数据闭环

最后打开 RVIZ,添加相机图像、点云、车辆的 TF 坐标、GNSS 轨迹等显示项,这一瞬间你会真正感受到"自动驾驶仿真"这个说法意味着什么:图像、点云、定位信息全部在同一个界面里实时刷新,仔细看的话,车辆转弯的时候点云里的建筑轮廓也会跟着转。

我当时跑出来的效果是:车在自己沿车道行驶,前方有车辆并线时,激光雷达点云里能清楚看到前方物体的轮廓变化,图像里也能看到刹车灯亮起。这个闭环跑通之后,再做感知算法替换、规划参数调整就变得顺理成章了。

6. 常见问题排查与从仿真到实车的经验迁移

6.1 几个高频问题的实际排查思路

我把实际操作中遇到的问题整理成一个简表,这些问题在社区里几乎每周都会有人问一遍:

现象常见原因解决思路
桥接包连不上 CARLA服务端未就绪或端口占用等日志稳定后重试;检查 2000 进程
传感器话题不出现桥接包版本与 CARLA 版本不对应严格匹配版本号
RVIZ 里点云和图像对不齐时间不同步开启 synchronous_mode 并设置 use_sim_time
帧率极低画质太高启动时加低画质参数,降低传感器频率
carla_msgs 编译报错自定义消息未先行编译按白名单分步编译
车辆不动autopilot 未开启或 spawn 失败确认生成点有效、设置 autopilot

排查的原则是先确认底层链路通不通:CARLA 客户端能连、能生成车辆,说明服务端正常;桥接包能打印话题,说明 ROS 侧正常;剩下的问题基本集中在版本、时间、资源这三个维度。

6.2 从仿真到实车迁移时容易踩的差异点

很多人在仿真里跑爽了,觉得上真车"应该也差不多",这个想法很危险。CARLA 的车辆动力学模型确实比一般游戏真实得多,但它仍然不等于任何一款真车。具体来说,有三个差异最值得关注:

  • 传感器噪声模型:CARLA 的激光雷达默认点云很干净,而真实雷达有强度波动、噪点和丢点,你可以在 CARLA 的传感器设置里加大噪声参数,让数据更接近真实;
  • 通信与控制延迟:仿真里话题传输几乎无延迟,真实车上的 CAN 总线和 ROS 节点通信有几十毫秒的延迟,规划控制写好后建议在仿真里加上一个人工延迟环节,提前适应;
  • 时间戳来源:真车上各传感器有自己的硬件时间戳,不像仿真里统一由模拟时钟提供,这要求你的融合模块从第一天起就不要假设所有消息时间戳完全对齐。

6.3 结合 SLAM 和导航方向去扩展使用

热词里看到了很多关于 ROS SLAM 建图和自主导航的搜索,这两件事和 CARLA 结合其实很有搞头。CARLA 里车辆的定位默认是"上帝视角"给的,所以你如果只做规划控制,完全不需要 SLAM;但如果你想练"从零建图再到定位",可以把 CARLA 的定位数据故意关掉,只保留激光雷达和 IMU/GNSS 原始数据,然后跑一遍 LOAM、LIO-SAM 这类算法,结果可以用 CARLA 的 ground truth 做量化评估。

我做过一个练习:在 CARLA 里同一段路线开着同一辆车跑十圈,把 radar 数据录成 rosbag,然后分别用不同 SLAM 算法重建地图,再和 CARLA 导出的高精地图对比误差。这个流程要是放在实车上,光场地和油费就是一大笔钱,但在仿真里成本几乎为零,这就是 carla_simulation 这类套件最大的好处。

根据我自己的经验,如果你是初学者,建议先把第 5 节的闭环完整跑通,然后在 Timer 里换传感器配置,再去读桥接包的源码。等这套流程玩熟了,你会发现 CARLA 的 API 文档、ROS 的话题结构、以及各类算法的调试方式都在你脑子里形成了体系,这时候再接触实车项目,你至少不会因为"仿真和实车不一样"而手足无措。仿真不会代替实车,但它能让你的实车之路走得更稳、更从容。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询