资讯动态

CARLA与ROS自动驾驶仿真套件搭建指南:从环境配置到闭环控制

发布时间:2026/9/8 1:36:59 来源:尧图企业网站定制
简介针对Carla模拟器与ROS环境下的自动驾驶开发需求一套完整的纯追踪pure pursuit路径跟踪套件正适合正在研究无人车控制算法的高校学生与算法工程师。资源围绕Carla仿真场景中的车辆控制展开包含从路径加载、速度控制到转向执行的关键代码结构并附有配置与说明文件可直接运行体验。压缩包共10个文件主要有2个launch文件负责节点启动2个Python脚本实现核心控制逻辑2个pickle文件存放路径数据搭配xml参数配置、json设置、txt说明及markdown文档整体大小仅90KB轻巧便于阅读和二次开发。套件采用林肯MKZ2017车型模型速度控制器基于PID算法目标速度设定为12m/s路径分辨率可在self.resolution中调整默认0.2m转向控制器则使用纯追踪模型体现了完整的自动驾驶控制链路。内容预览显示其拥有清晰的pure_pursuit、config、launch、src等目录结构方便按模块学习。目前已有502人学习浏览是一份兼顾教学和实操的轻量级参考资料。 一提carla_simulation搞自动驾驶的应该都不陌生。我最早接触卡拉CARLA这套自动驾驶套件的时候心里其实带着问号一个基于虚幻引擎的开源模拟器加上ROS这个机器人中间件到底能玩出什么花后来在项目里真正把两者串起来跑通感知、规划、控制闭环之后才意识到这套组合的价值远不止“跑个Demo”。CARLA负责渲染出足够真实的道路、行人、车辆和传感器数据ROS负责把数据按标准消息分包分发再喂给算法。整条链路搭好之后你可以在没有实车的情况下验证绝大部分自动驾驶核心模块从相机目标检测到激光雷达聚类再到路径规划和控制指令下发。这篇文章就围绕carla_simulation本身把搭建ROS自动驾驶套件的环境准备、桥接原理、实操流程和踩坑记录完整讲一遍适合正在学ROS想找真实场景练习的新手也适合要给团队快速搭仿真平台的同学参考。1. 先搞清楚CARLA和ROS各自解决什么问题1.1 CARLA不是游戏模拟器很多人第一次打开CARLA会觉得它像个挺精良的“游戏”。确实它的底层是Unreal Engine画面真实感很强但它的核心定位是自动驾驶研发工具。CARLA提供了高度逼真的城市道路、交通信号灯、行人、非机动车和各种天气条件开发者可以用Python API控制地图加载、车辆生成、传感器挂载和场景切换。它解决了自动驾驶算法开发过程中的一个大难题实车测试成本高、场景复现难、危险工况不好模拟。对比大家熟悉的GazeboCARLA更偏“整车级”仿真。Gazebo擅长机器人传感器和物理环境适合做机械臂、移动底盘、多机器人系统而CARLA关心的是道路、车道线、车辆动力学、交通参与者之间的交互。如果你做的是自动驾驶小车自主导航仿真、车道保持、红绿灯识别这类任务CARLA会给你更接近真实道路的测试环境。这也是我后来选择它的主要原因传感器模型更精细渲染效果更好场景可编程性也更强。1.2 ROS在整套件里扮演的是“胶水层”CARLA本身有一套Python API直接写脚本当然能控制车辆、读传感器但问题是自动驾驶算法生态大多建立在ROS上。ROS提供了统一的节点通信机制、消息定义、话题发布订阅、坐标系变换等服务。你把CARLA接入ROS之后相机图像、激光雷达点云、GNSS定位、IMU姿态都能被包装成标准ROS消息算法节点只需要订阅话题不需要关心数据到底来自真实传感器还是虚拟世界。这种架构最大的好处是“算法复用”。比如你在CARLA里调试好的局部路径规划节点之后接到实车的感知话题上只要消息类型一致节点几乎不用改。ROS也自带Rviz、rviz 3D可视化、rqt工具能方便地检查传感器数据流和TF变换对排查问题非常友好。CARLA官方提供了carla_ros_bridge套件就是这个“胶水层”的标准实现一边和CARLA服务器通信另一边把所有数据输送成ROS话题同时还能接收ROS下发的控制指令。这套逻辑理清楚之后剩下的就是把环境配好、把launch文件跑起来。2. 搭建前的环境准备版本、系统、依赖一次配齐2.1 硬件和系统版本怎么选CARLA对硬件要求不低尤其是GPU。官方推荐至少6GB显存我实际跑下来4GB显存开低画质也能勉强运行但一开多相机和激光雷达就吃力了。CPU方面8核比较稳内存建议16GB以上否则加载城镇地图时容易爆内存。硬盘空间需要预留至少50GBCARLA本体加上依赖环境并不小。操作系统方面CARLA 0.9.x系列最稳的搭配是Ubuntu 18.04或20.04新版对Ubuntu 22.04的支持也在跟进。ROS发行版要跟系统匹配Ubuntu 20.04对应ROS NoeticROS1或ROS 2 FoxyUbuntu 22.04则对应ROS 2 Humble。官方ros-bridge仓库对不同CARLA版本有对应分支一定要选对。我自己常用的是CARLA 0.9.14配ROS Noetic整体比较成熟网上案例也多适合入门。组件推荐配置备注操作系统Ubuntu 20.04兼容性最稳GPUNVIDIA显卡显存≥6GB需要较新驱动CPU8核以上影响物理和渲染内存16GB以上加载地图吃内存CARLA版本0.9.14与ros-bridge分支匹配ROS版本Noetic / Foxy根据Ubuntu版本选择2.2 ROS安装鱼香ROS一键安装和手工安装都可以ROS安装是很多新手的第一道坎。如果不想在环境变量、依赖库、软件源这些问题上浪费时间可以试试鱼香ROS一键安装脚本。它会自动识别当前Ubuntu版本并安装对应的ROS发行版整个过程比手工翻官方教程快不少对于国内网络环境也比较友好。执行前建议先看一眼脚本内容再运行至少心里有数它要改哪些东西。wget http://fishros.com/install -O fishros . fishros脚本运行时会让你选择安装ROS版本、是否安装依赖等按提示操作即可。装完之后记得验证source /opt/ros/noetic/setup.bash roscore终端不报错并且能看到ROS master启动信息就说明基础环境OK了。当然手工安装也没什么问题官方wiki上的流程很清晰适合对每一行安装命令有强迫症的选手。无论哪种方式后面都要用到catkin_make或colcon build确保python3-catkin-tools或python3-colcon-common-extensions也已经装好。2.3 下载CARLA和桥接包版本匹配是关键CARLA本身需要从官方GitHub Release页面下载压缩包解压后目录里会有CarlaUE4.sh、PythonAPI等关键内容。记住CARLA不需要安装解压就能用但需要提前装好对应的依赖库比如libomp5、libpng等这些官方文档写得很清楚。接下来是ros-bridge。假设你用的是CARLA 0.9.14那就要克隆对应分支并放到catkin工作区里编译mkdir -p ~/carla-ros-bridge/src cd ~/carla-ros-bridge/src git clone --branch 0.9.14 https://github.com/carla-simulator/ros-bridge.git cd ~/carla-ros-bridge catkin_make编译过程中如果提示缺少依赖用rosdep install --from-paths src --ignore-src -r -y补装。这里最容易踩的坑就是版本不匹配CARLA是0.9.14bridge必须也是0.9.14分支版本差一位都可能报RPC错误或者话题压根不出现。所以下载前一定先确认版本号。3. 核心细节CARLA和ROS之间的桥接是怎么运作的3.1 ros-bridge把世界“翻译”成话题carla_ros_bridge的结构其实不复杂。它作为ROS节点运行通过CARLA Python API与CARLA服务器建立连接然后持续订阅CARLA世界里的传感器数据、地图信息、车辆状态再转换成对应ROS消息发布到话题上。反过来它也监听ROS侧的控制话题把里面的油门、刹车、转向等指令传回CARLA。理解这套机制的关键是要区分“CARLA服务器”和“ROS桥接节点”两个进程。CARLA服务器负责仿真计算和渲染桥接节点负责协议转换。它们之间走的是CARLA自有的RPC协议和ROS无关桥接节点和你的算法节点之间才是ROS话题通信。这种解耦设计让CARLA和ROS可以分别部署在不同机器上只要网络能通就能跑。启动之后你可以用rostopic list看到一批以/carla/开头的话题。这些话题名称、消息类型由桥接包的配置决定默认会覆盖主车传感器、其他交通参与者、地图对象、车辆控制等。最常用的几个话题我会在下一节列出来。3.2 传感器数据流与坐标系桥接包把CARLA中挂载的传感器映射成对应的ROS话题常用映射如下传感器ROS话题消息类型RGB相机/carla/ego_vehicle/rgb_front/imagesensor_msgs/Image激光雷达/carla/ego_vehicle/lidarsensor_msgs/PointCloud2GNSS/carla/ego_vehicle/gnsssensor_msgs/NavSatFixIMU/carla/ego_vehicle/imusensor_msgs/Imu车辆状态/carla/ego_vehicle/vehicle_statuscarla_msgs/CarlaVehicleStatus传感器能正常使用坐标系必须正确。CARLA里主车的坐标系会由桥接包发布为TF变换map是全局地图坐标系ego_vehicle是主车车身坐标系各传感器坐标系则挂在主车坐标系下面比如ego_vehicle/camera/rgb_front、ego_vehicle/lidar。如果你在Rviz里打开TF树看到这些变换层层连接就说明坐标系没有大问题。我遇到过一种情况激光雷达点云在Rviz里显示出来是歪的或者和相机图像对不上。仔细查了下发现是桥接包启动时没有加载正确的传感器位置参数导致雷达坐标系和相机坐标系之间的变换错了一位。解决方法是回到carla_ego_vehicle的配置文件里检查传感器挂载位置或者用rosrun tf tf_echo map ego_vehicle直接查看变换是否合理。这类问题在仿真平台上越早暴露越好至少比在实车上才发现强得多。3.3 车辆控制指令下发的完整链路控制链路和感知数据流正好反过来。算法算出期望的油门、刹车、方向盘转角之后会发布一条carla_msgs/CarlaEgoVehicleControl类型的消息到/carla/ego_vehicle/vehicle_control_cmd话题。桥接节点收到消息后调用CARLA Python API里的apply_control()方法把控制量下发到虚拟车辆上。这条消息的关键字段包括throttle、steer、brake、hand_brake、reverse和gear。其中throttle范围是0到1steer范围是-1到1负值代表左转。在仿真环境里控制频率也要尽量和实际使用保持一致通常10Hz到20Hz就够了太高只会增加CPU负担。很多新手在这里会犯一个错误只发布一次控制指令发现车辆不动就以为是桥接坏了。其实CARLA中车辆控制是“持续作用”的你不继续发油门车辆会因为动力学模型逐渐减速停止。最简单的验证方式是用rostopic pub -r 10按10Hz连续发布控制话题车就能跑起来。这个细节很基础但确实经常被忽略。4. 实操从零跑通一个最小自动驾驶仿真闭环4.1 启动CARLA服务器环境准备好之后第一步永远是启动CARLA服务器。进入CARLA解压目录执行cd path/to/CARLA ./CarlaUE4.sh -quality-levelLow -carla-rpc-port2000两个参数值得解释一下。-quality-levelLow会把画质降到最低减少GPU负载对需要快速迭代算法的场景非常有用如果你要验证传感器细节或做高逼真度的视觉训练数据再考虑Epic等级。-carla-rpc-port是CARLA服务器的RPC端口默认是2000如果本机运行多个CARLA实例可以通过改端口区分。启动后窗口会弹出等一会儿会出现车辆和街道场景。这时可以在另一个终端里运行cd path/to/CARLA/PythonAPI/carla python3 -c import carla; client carla.Client(localhost, 2000); print(client.get_server_version())能打印出版本号说明服务器正常可以继续下一步。4.2 启动ROS bridge并生成自车新开一个终端先source ROS环境再source catkin工作区source /opt/ros/noetic/setup.bash source ~/carla-ros-bridge/devel/setup.bash roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch这个launch文件的作用是同时启动桥接节点和一辆带传感器的示例自车。启动日志里会显示连接到了CARLA服务器并生成了主车、相机、雷达等对象。稍等片刻再开一个新终端运行rostopic list就能看到不少/carla/开头的消息。如果要手动生成更多车辆或行人可以用carla_spawn_objects节点或者在Python脚本里调用spawn_npc。刚开始建议先用示例自车熟悉流程再慢慢加场景复杂度。4.3 发控制指令、看传感器数据现在车已经存在但没有指令它是不会动的。我们用rostopic pub连续发布控制指令rostopic pub -r 10 /carla/ego_vehicle/vehicle_control_cmd carla_msgs/CarlaEgoVehicleControl header: seq: 0 stamp: now frame_id: throttle: 0.6 steer: 0.0 brake: 0.0 hand_brake: false reverse: false gear: 1 manual_gear_shift: false执行之后CARLA窗口里的主车应该会缓慢加速前进。想看传感器数据再开一个终端rqt_image_view /carla/ego_vehicle/rgb_front/image就能看到相机画面。如果装的是激光雷达也可以在Rviz里添加PointCloud2话题设置好固定坐标系为map或ego_vehicle看到点云在车辆周围变化。到这里一个最简单的“感知数据输出控制指令输入”闭环就通了后面把你的Autoware、local planner或者深度学习模型接上来都是在这条消息链路上做文章。5. 常见问题与排查技巧实录5.1 版本不匹配导致的黑屏和RPC报错CARLA和ros-bridge版本不对是出现频率最高的问题。典型症状是roslaunch后日志里出现RPC call failed、timeout或者CARLA窗口一直黑屏不加载地图。解决办法很直接先确认CARLA版本再确认bridge分支。# 在CARLA PythonAPI目录下 python3 -c import carla; print(carla.__version__) # 在ros-bridge目录下 git branch如果两边版本差得比较大就会在消息结构、API调用方式上不兼容。比较典型的例子是CARLA 0.9.12之前的传感器消息类型和0.9.13之后有变化强行混用就会出现话题缺失。不要迷信“最新版就是最好”优先选择社区资料最多的组合。5.2 时间同步和坐标错位CARLA服务器和ROS节点跑在不同机器或者ROS时间没有同步时容易出现传感器时间戳异常和TF预测失败。最简单的处理是在启动bridge时留意是否有/clock话题。CARLA bridge支持ROS time模式如果启用必须确保所有节点统一使用仿真时钟否则Rviz里的点云和地图会不断跳动。坐标错位通常和TF树有关。每次启动前可以先用rviz渲染TF确认map到ego_vehicle到各个传感器的变换是否连续。如果只有一个传感器不对优先检查配置里它的location和rotation是否与你想挂载的位置一致。我习惯在CARLA的Python脚本里先把所有传感器坐标打印出来再和TF树做对比基本能快速锁定问题。5.3 性能卡顿的优化思路CARLA跑着跑着越来越卡是很多人的痛点。结合我的经验优先级最高的几个优化手段分别是降低渲染画质、关闭动态光影、减少传感器数量、使用固定时间步长。其中固定时间步长尤其有用可以让仿真更稳定settings world.get_settings() settings.fixed_delta_seconds 0.1 settings.synchronous_mode True world.apply_settings(settings)同步模式下CARLA服务器每推进一步才继续下一帧算法能拿到稳定的时间间隔但也要求所有客户端和算法节点都按照这个节奏配合。如果发现车辆动作一顿一顿的可以把fixed_delta_seconds调大一点点或者打开CARLA服务器的异步模式具体得看你的算法实时性要求。我现在的固定做法是只要跑算法验证就开Low画质加同步模式留出CPU和GPU给感知节点。传感器能少挂就少挂比如先只保留前视相机和激光雷达等需要多传感器融合再逐步加这样调试速度会快很多。这套carla_simulation环境一旦稳定后面在上面做建图定位、路径规划、决策控制都会顺畅不少。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价