1. CARLA仿真基础:CARLA简介、安装与配置、核心概念与第一个仿真脚本
大家好,我是你们这趟CARLA之旅的向导。说实话,自动驾驶仿真这个领域,我摸爬滚打也有五六年了。从最早的VTD到后来的CARLA,踩过的坑比走过的路还多。今天咱们聊的CARLA,是我个人最偏爱的一个开源仿真器——它灵活、强大,而且社区活跃。你想想看,一个能让你在虚拟世界里随意摆弄传感器、车辆和行人的工具,是不是很酷?
1.1 CARLA是什么?为什么选它?
CARLA,全称是Car Learning to Act,一个开源的自动驾驶仿真平台。它基于Unreal Engine 4,所以画面渲染效果相当不错。我最早接触它是在2017年,那时候版本才0.8,功能远没现在这么全。但它的设计理念打动了我——模块化、可扩展、支持传感器仿真。
说白了,CARLA就是给你一个虚拟的“沙盒”。你可以在这个沙盒里搭建城市、布置车辆、添加行人,然后让自动驾驶算法在里面跑。它支持多种传感器:摄像头、激光雷达、毫米波雷达、GPS、IMU……几乎你能想到的,它都有。
核心优势:
- 开源免费:MIT协议,随便用,随便改
- 传感器丰富:RGB相机、深度相机、语义分割相机、LIDAR、RADAR等
- 场景灵活:支持多种地图、天气、交通流
- 接口友好:Python API,上手快
1.2 安装与配置——我踩过的坑,你别再踩了
安装CARLA,说简单也简单,说复杂也复杂。我建议你直接下载预编译的二进制包,别自己从源码编译——除非你特别享受等待的乐趣。我曾经有一次编译了整整一个下午,结果发现显卡驱动不兼容……嗯,从那以后我再也不折腾源码编译了。
系统要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 18.04 / Windows 10 | Ubuntu 20.04 / Windows 11 |
| 显卡 | NVIDIA GTX 1060 | NVIDIA RTX 3070 或更高 |
| 内存 | 16 GB | 32 GB |
| 硬盘 | 20 GB 空闲 | 50 GB SSD |
| Python | 3.7 | 3.8 或 3.9 |
⚠️ 避坑指南:我曾经在Ubuntu 22.04上装CARLA 0.9.13,结果死活连不上服务器。后来发现是Python版本太高,CARLA的API只支持到3.9。所以,老老实实用Ubuntu 20.04 + Python 3.8,这是最稳的组合。
安装步骤(以Ubuntu为例)
- 下载CARLA包:从官网或GitHub Release页面下载
- 解压:
tar -xzf CARLA_0.9.13.tar.gz - 安装Python依赖:
pip install carla - 启动CARLA服务器:
./CarlaUE4.sh
Windows用户更简单,直接双击运行CarlaUE4.exe就行。我第一次在Windows上跑的时候,还担心性能问题,结果发现只要显卡够好,Windows下的表现甚至比Linux还稳定。
1.3 核心概念——World、Actor、Sensor
CARLA里有三个核心概念,你必须要搞明白:World、Actor、Sensor。我刚开始学的时候,这三个东西绕了我好几天。说白了,它们的关系就像拍电影:
- World:就是整个电影片场。它包含了地图、天气、交通规则等所有环境信息。
- Actor:就是演员。车辆、行人、交通标志、路灯……所有能在场景里动或不动的东西,都是Actor。
- Sensor:就是摄像机。它附着在Actor上,用来采集数据。
💡 我的经验:在项目中,我习惯先把World对象拿到手,然后通过它来管理所有Actor和Sensor。World就像一个大管家,你问它要什么,它都能给你。
World
World是CARLA仿真的核心。它负责管理地图、天气、时间步长等。获取World很简单:
import carla
# 连接CARLA服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 获取World
world = client.get_world()
有了World,你就可以控制天气、加载地图、获取所有Actor列表。我记得有一次做多车协同仿真,需要同时控制5辆车,就是通过World来统一管理的。
Actor
Actor是场景中的实体。车辆、行人、交通灯、路障……都是Actor。创建Actor需要蓝图(Blueprint),蓝图就像Actor的“设计图纸”。
# 获取蓝图库
blueprint_library = world.get_blueprint_library()
# 选择一辆车
vehicle_bp = blueprint_library.find('vehicle.tesla.model3')
# 设置生成点
spawn_point = world.get_map().get_spawn_points()[0]
# 生成车辆
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
注意:每个Actor都有一个ID,是唯一的。你可以通过ID来查找和管理Actor。我在调试时经常用world.get_actors().filter('vehicle.*')来获取所有车辆。
Sensor
Sensor是CARLA最强大的部分。它附着在Actor上,用来采集环境数据。常见的传感器有:
- RGB相机:输出彩色图像
- 深度相机:输出深度图
- 语义分割相机:输出语义标签图
- LIDAR:输出点云数据
- RADAR:输出雷达目标列表
- GNSS:输出GPS坐标
- IMU:输出加速度和角速度
创建传感器的方式和Actor类似,但需要指定它要附着在哪个Actor上:
# 创建RGB相机蓝图
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '800')
camera_bp.set_attribute('image_size_y', '600')
camera_bp.set_attribute('fov', '90')
# 将相机附着在车辆上
camera = world.spawn_actor(camera_bp,
carla.Transform(carla.Location(x=1.5, z=2.4)),
attach_to=vehicle)
1.4 第一个仿真脚本——让车动起来
好了,理论知识讲完了。咱们来写第一个脚本。这个脚本的目标很简单:让一辆车在CARLA世界里自动行驶。
import carla
import random
import time
def main():
# 连接服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 获取World
world = client.get_world()
# 获取蓝图库
blueprint_library = world.get_blueprint_library()
# 选择一辆车
vehicle_bp = blueprint_library.filter('vehicle.*')[0]
# 获取一个生成点
spawn_points = world.get_map().get_spawn_points()
spawn_point = random.choice(spawn_points)
# 生成车辆
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
print(f'车辆已生成,ID: {vehicle.id}')
# 让车辆自动驾驶
vehicle.set_autopilot(True)
# 运行10秒
time.sleep(10)
# 清理
vehicle.destroy()
print('仿真结束')
if __name__ == '__main__':
main()
这个脚本虽然简单,但包含了CARLA仿真的核心流程:连接→获取World→选择蓝图→生成Actor→控制→清理。你想想看,如果把这个流程扩展一下,加上传感器、加上多辆车、加上场景控制,是不是就能做很多事了?
💡 我的建议:第一次运行脚本前,先手动启动CARLA服务器。等看到那个熟悉的城市画面后,再运行脚本。这样能避免很多连接问题。
1.5 知识体系总览
为了让你对本章内容有个整体把握,我画了一张图。这张图展示了CARLA仿真基础的核心逻辑:
这张图把本章的核心内容串起来了。你看到没?CARLA仿真器下面有三个核心概念:World、Actor、Sensor。每个概念下面又有具体的子项。搞懂了这张图,你就掌握了CARLA仿真的骨架。
好了,第一章的内容就到这里。说实话,这些基础概念虽然简单,但非常重要。我见过太多人一上来就急着跑复杂的仿真,结果连World和Actor的关系都没搞清楚,最后debug到崩溃。所以,别急,慢慢来。
可可精品资料库