自动驾驶—CARLA仿真(2)入门指南

CARLA 入门指南

CARLA 仿真器是一套面向自动驾驶(AD)及其他机器人应用的综合性合成训练数据生成解决方案。CARLA 能够模拟高度逼真的环境,复现现实世界中的城镇、城市和高速公路,以及在这些道路空间中行驶的车辆和其他物体。

此外,CARLA 仿真器也是一个出色的评估与测试平台。你可以在仿真环境中部署已训练好的自动驾驶智能体(agents),安全地测试和评估其性能与安全性,而无需承担任何对硬件设备或其他道路使用者的风险。

启动 CARLA 并连接客户端

CARLA 可通过命令行启动:Windows 系统使用可执行文件,Linux 系统使用 Shell 脚本。请先按照 Linux 或 Windows 的安装说明完成安装,然后在命令行中启动 CARLA:

bash 复制代码
cd /carla/root
./CarlaUE4.sh

若要通过 Python API 控制 CARLA,需将 Python 客户端连接到服务器的开放端口。客户端通过 client 和 world 对象控制仿真器。

python 复制代码
import carla
import random

# Connect to the client and retrieve the world object
client = carla.Client('localhost', 2000)
world = client.get_world()

client 对象用于维持与服务器的连接,并提供多种功能,如执行命令、加载或导出数据。你可以使用它加载其他地图,或重载当前地图(恢复初始状态)。

默认端口为 2000,你也可以指定任意可用端口;同时可通过输入计算机 IP 地址替代 localhost,从而实现 服务器与客户端分离部署------例如在一台配备高性能 GPU 的服务器上运行 CARLA 仿真,而在本地笔记本上运行 Python 客户端进行神经网络训练。这对 GPU 资源紧张的场景尤其有用。

注意:以下内容假设 CARLA 运行在默认的异步模式下。若启用了同步模式,部分代码行为可能有所不同。

加载地图

CARLA 地图的信息

在 CARLA API 中,world 对象提供了对仿真环境中所有元素的访问权限,包括地图、建筑物、交通灯、车辆和行人等。CARLA 服务器通常会加载一个默认地图(通常是 Town10)。若要在启动时指定其他地图,可使用 config.py 脚本:

bash 复制代码
python ./util/config.py -m Town04

也可在客户端通过 world 对象动态加载地图:

python 复制代码
client.load_world('Town04')

可看到仿真器中,地图已切换:

观察者(Spectator)导航

观察者(Spectator)是进入仿真的视觉窗口。默认情况下,当你在带显示器的电脑上运行 CARLA 服务器时,会自动弹出一个新窗口显示观察者视角(除非使用 -RenderOffScreen 命令行参数)。

观察者有助于可视化仿真过程:你可以熟悉所加载的地图,直观查看各项操作的效果(如添加车辆、改变天气、开关地图图层等),也便于调试。

你可以使用鼠标和键盘自由飞行观察者视角:

Q:向上移动(朝窗口顶部)

E:向下移动(朝窗口底部)

W:向前

S:向后

A:向左

D:向右

鼠标左键拖动:上下控制俯仰角(pitch),左右控制偏航角(yaw)

你也可以通过 Python API 访问和操控观察者:

python 复制代码
# Retrieve the spectator object
spectator = world.get_spectator()

# Get the location and rotation of the spectator through its transform
transform = spectator.get_transform()

location = transform.location
rotation = transform.rotation

# Set the spectator with an empty transform
spectator.set_transform(carla.Transform())
# This will set the spectator at the origin of the map, with 0 degrees
# pitch, yaw and roll - a good way to orient yourself in the map

添加非玩家角色(NPCs)

地图加载完成后,我们需要在仿真中添加车辆,以模拟真实交通环境中的其他道路使用者(即非玩家角色,NPCs)。

首先从蓝图库中选择所需车辆:

python 复制代码
# 获取蓝图库并筛选车辆蓝图
vehicle_blueprints = world.get_blueprint_library().filter('*vehicle*')

接着,利用地图预设的出生点(spawn points)放置车辆:

python 复制代码
# 获取地图的出生点
spawn_points = world.get_map().get_spawn_points()

# 随机在地图各处生成 50 辆车
for i in range(50):
    world.try_spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points))

此外,还需创建一辆作为仿真核心的"主车"(Ego Vehicle)------即未来由你的自动驾驶算法控制的车辆:

python 复制代码
ego_vehicle = world.spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points))

CARLA 还支持添加行人,以构建更真实的驾驶场景。在 CARLA 术语中,车辆和行人均称为"Actor"(参与者),具体详见

添加传感器

现代自动驾驶车辆通过多种车载传感器感知环境,如光学摄像头、光流相机、激光雷达(LiDAR)、毫米波雷达(RADAR)和加速度计等。CARLA 内置了多种传感器模型,可用于生成机器学习训练数据。传感器可安装在车辆上,也可固定在某一点(如模拟监控摄像头)。

以下示例将一个标准 RGB 摄像头安装到主车上以录制视频:

python 复制代码
# 定义摄像头相对于车辆的位置(车顶上方 1.5 米)
camera_init_trans = carla.Transform(carla.Location(z=1.5))

# 从蓝图库创建摄像头
camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')

# 将摄像头挂载到主车
camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=ego_vehicle)

随后,通过 listen() 方法启动数据记录。该方法接受一个回调函数,用于处理传感器数据(如保存到磁盘或传输至其他程序):

python 复制代码
# 使用 lambda 函数将图像保存为 PNG 文件
camera.listen(lambda image: image.save_to_disk('out/%06d.png' % image.frame))

CARLA 支持多种传感器类型,点击此处深入了解。


使用交通管理器驱动车辆

添加完车辆和传感器后,需通过 交通管理器(Traffic Manager) 让车辆动起来。该组件可控制车辆在地图道路上自主行驶,遵守交通规则,模拟真实道路行为。

python 复制代码
# 将所有车辆交由交通管理器控制
for vehicle in world.get_actors().filter('*vehicle*'):
    vehicle.set_autopilot(True)

现在,你的仿真已运行起来:多辆车在地图中行驶,其中一辆主车上的摄像头正在录制数据。这些数据可用于训练自动驾驶智能体。交通管理器还提供丰富的行为定制功能,详见文档

这是最基础的仿真设置。接下来,你可以深入探索 CARLA 提供的更多传感器和高级功能,以构建更精细、更真实的仿真场景。


设置主车(Ego Vehicle)

"主车"是 CARLA 仿真中的核心概念,通常指:

  • 安装传感器的车辆
  • 由你的自动驾驶算法控制的车辆

主车对提升仿真效率至关重要,例如:

  1. 大地图分块加载

    大型地图(如 Town12)采用分块设计,仅加载主车附近的区块以优化性能。

  2. 混合物理模式(Hybrid Physics Mode)

    当仿真包含大量交通车辆时,仅对主车附近的车辆计算物理,大幅节省计算资源。

如何定义主车?

在生成主车时,为其蓝图设置 role_name 属性为 'hero'

python 复制代码
ego_bp = world.get_blueprint_library().find('vehicle.lincoln.mkz_2020')
ego_bp.set_attribute('role_name', 'hero')
ego_vehicle = world.spawn_actor(ego_bp, random.choice(spawn_points))

选择地图

CARLA 内置多张精心设计的地图,涵盖城市、乡村、住宅区等多样环境,包含不同建筑风格和道路布局(从无标线乡道到多车道高速公路)。

地图 描述
Town01 小型简易城镇,含河流与多座桥梁
Town02 混合住宅与商业建筑的小城镇
Town03 较大的城区地图,含环岛与大型路口
Town04 山区小镇,含"8字形"无限高速公路
Town05 方格网状城镇,含十字路口与桥梁,支持多车道变道
Town06 多车道高速公路,含多个出入口及"密歇根左转"
Town07 乡村环境,窄路、玉米地、谷仓,极少红绿灯
Town08/09 Leaderboard 挑战赛专用"隐藏"地图
Town10 市中心城区,含摩天大楼、住宅区与海滨大道
Town11 未装饰的大地图
Town12 超大地图,含高层、住宅、乡村等多种区域

查看可用地图列表:

python 复制代码
client.get_available_maps()

加载指定地图:

python 复制代码
client.load_world('Town03_Opt')

选择车辆

CARLA 提供丰富的车辆模型库以构建多样化交通流。浏览车辆目录了解详情。

列出所有可用车辆蓝图:

python 复制代码
for bp in world.get_blueprint_library().filter('vehicle'):
    print(bp.id)
相关推荐
serve the people2 小时前
tensorflow 零基础吃透:RaggedTensor 的重载运算符
人工智能·tensorflow·neo4j
努力毕业的小土博^_^2 小时前
【生成式AI】Cross-Attention:多模态融合的神经网络桥梁(上篇)
人工智能·深度学习·神经网络·算法·机器学习·遥感
测试人社区-千羽2 小时前
自动化缺陷修复的建议生成:赋能软件测试新范式
运维·人工智能·自然语言处理·分类·数据挖掘·自动化·ux
serve the people2 小时前
tensorflow 如何使用 tf.RaggedTensorSpec 来创建 RaggedTensor
人工智能·python·tensorflow
大、男人2 小时前
python之知识图谱(Neo4j)
人工智能·知识图谱·neo4j
悦数图数据库2 小时前
国产图数据库:开启数据新“视”界 悦数科技
数据库·人工智能
AI优秘企业大脑2 小时前
增长智能体助力企业智慧转型
大数据·人工智能
啊巴矲2 小时前
小白从零开始勇闯人工智能Linux初级篇(Navicat Premium及MySQL库(安装与环境配置))
数据库·人工智能·mysql