自动驾驶—CARLA仿真(5)Actors与Blueprints

在 CARLA 中,参与者(Actors) 是仿真中执行动作的元素,能够影响其他参与者。CARLA 的参与者包括:

  • 车辆(Vehicles)和行人(Walkers)
  • 传感器(Sensors)
  • 交通标志(Traffic Signs)和交通灯(Traffic Lights)
  • 观察者(Spectator)

蓝图(Blueprints)

蓝图是预定义的模型模板,包含动画和一系列属性,使用户能轻松将新参与者加入仿真。部分属性可修改,部分不可修改,例如:

  • 车辆颜色
  • 激光雷达(LiDAR)的通道数
  • 行人的行走速度等等。

所有可用蓝图及其属性均列在 蓝图库(Blueprint Library) 中。车辆和行人蓝图带有 generation 属性,标识其为新一代(gen2)或旧一代(gen1)资产。


管理蓝图库

carla.BlueprintLibrary 类包含一系列 carla.ActorBlueprint 元素,可通过 world 对象访问:

python 复制代码
blueprint_library = world.get_blueprint_library()

每个蓝图有唯一 ID 用于识别自身及由其生成的参与者。可通过以下方式查询蓝图:

python 复制代码
# 查找特定蓝图
collision_sensor_bp = blueprint_library.find('sensor.other.collision')

# 随机选择车辆蓝图
vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))

每个 carla.ActorBlueprint 包含若干 carla.ActorAttribute,可读取或设置:

python 复制代码
# 示例:若为两轮车,设为红色
if vehicle.get_attribute('number_of_wheels') == 2:
    vehicle.set_attribute('color', '255,0,0')

⚠️ 注意

  • 部分属性不可修改,请查阅蓝图库确认

可修改属性通常提供推荐值列表:

python 复制代码
for attr in blueprint:
    if attr.is_modifiable:
        blueprint.set_attribute(attr.id, random.choice(attr.recommended_values))

💡 自定义资产

用户可创建自己的车辆模型(参见资产教程),贡献者还可将新内容加入 CARLA。


参与者生命周期

⚠️ 重要提示

Python API 支持批量命令(batch commands),可在单帧内高效执行多个常见操作(如批量生成/销毁)。


生成(Spawning)

world 对象负责生成参与者并跟踪其状态。生成仅需两个要素:

  1. 一个蓝图(Blueprint)
  2. 一个 carla.Transform(指定位置与旋转)

world 提供两种生成方法:

  • spawn_actor():失败时抛出异常
  • try_spawn_actor():失败时返回 None
python 复制代码
transform = carla.Transform(carla.Location(x=230, y=195, z=40), carla.Rotation(yaw=180))
actor = world.spawn_actor(blueprint, transform)

⚠️ 坐标系注意

CARLA 使用 Unreal Engine 坐标系。carla.Rotation 构造函数参数顺序为 (pitch, yaw, roll),与 Unreal Editor 的 (roll, pitch, yaw) 不同。

碰撞检测:若指定位置存在静态物体或其他参与者,生成将失败。为避免此问题:

  • 车辆 :使用预设出生点

    python 复制代码
    spawn_points = world.get_map().get_spawn_points()
  • 行人 :使用人行道随机位置

    python 复制代码
    spawn_point = carla.Transform()
    spawn_point.location = world.get_random_location_from_navigation()

父子关联 :参与者可附加到另一参与者(常用于传感器)。通过 carla.AttachmentType 定义关联方式:

  • Rigid(刚性):相对位置固定(适合精确数据采集)
  • SpringArm(弹性):带缓冲移动
python 复制代码
# 将摄像头刚性附着到车辆
camera = world.spawn_actor(
    camera_bp, 
    relative_transform, 
    attach_to=my_vehicle, 
    attachment_type=carla.AttachmentType.Rigid
)

⚠️ 关键 :附加生成时,提供的 Transform 必须是相对于父参与者的局部坐标。

生成后,world 会将参与者加入全局列表,支持快速查询:

python 复制代码
actor_list = world.get_actors()
actor = actor_list.find(id)  # 按 ID 查找

# 打印所有限速标志位置
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
    print(speed_sign.get_location())

操作(Handling)

carla.Actor 主要通过 get()set() 方法管理:

python 复制代码
print(actor.get_acceleration())
print(actor.get_velocity())

# 移动参与者(Z轴升高10米)
location = actor.get_location()
location.z += 10.0
actor.set_location(location)

可禁用物理模拟以冻结参与者:

python 复制代码
actor.set_simulate_physics(False)

参与者还继承蓝图中的标签(Tags),主要用于语义分割传感器。

⚠️ 性能警告

大多数 set() 方法异步发送请求。若短时间内发送过多请求,会导致显著延迟(因仿真器每帧处理能力有限)。


销毁(Destruction)

Python 脚本结束时,参与者不会自动销毁!必须显式调用销毁

python 复制代码
destroyed_successfully = actor.destroy()  # 成功返回 True

⚠️ 注意 :销毁操作会阻塞仿真器直至完成。


参与者类型详解

传感器(Sensors)

传感器是生成数据流的特殊参与者(详见第 4 章 Sensors and Data)。典型工作流程:

python 复制代码
# 生成 RGB 摄像头并保存图像
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle)
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))

关键点:

  • 传感器也有蓝图,需配置属性
  • 通常附着于车辆以感知环境
  • 通过 listen() 注册回调函数(常用 Lambda 表达式处理数据)

观察者(Spectator)

由 Unreal Engine 提供,用于控制仿真窗口视角。可编程移动视角:

python 复制代码
# 将观察者移至车辆正上方(俯视视角)
spectator = world.get_spectator()
transform = vehicle.get_transform()
spectator.set_transform(carla.Transform(
    transform.location + carla.Location(z=50),
    carla.Rotation(pitch=-90)
))

交通标志与交通灯

目前 CARLA 仅将 停车标志(Stop)、让行标志(Yield)和交通灯 视为参与者。其他 OpenDRIVE 标志通过 carla.Landmark 访问(非参与者,详见第 3 章 Maps and Navigation)。

  • 仿真启动时,系统根据 OpenDRIVE 文件自动生成交通标志/灯
  • 无法通过蓝图库生成(因不在蓝图库中)
  • ⚠️ 注意:CARLA 地图的 OpenDRIVE 文件不包含交通标志/灯,均由开发者手动放置

交通灯特性

  • 位于路口,有唯一 ID 和组 ID(同一路口的灯共享 pole ID)
  • 同组灯按顺序循环:当前绿灯 → 黄灯 → 红灯 → 下一盏灯激活(期间存在全红相位)
  • 可通过 API 控制状态与持续时间:
python 复制代码
# 将红灯强制变绿
if traffic_light.get_state() == carla.TrafficLightState.Red:
    traffic_light.set_state(carla.TrafficLightState.Green)
    traffic_light.set_green_time(4.0)  # 绿灯持续4秒

⚠️ 重要 :车辆仅在红灯时才会感知交通灯!


车辆(Vehicles)

carla.Vehicle 是特殊参与者,通过内部组件模拟轮式车辆物理,支持四类控制:

  1. 驾驶控制 (carla.VehicleControl)

    python 复制代码
    vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
  2. 物理控制 (carla.VehiclePhysicsControl)

    包含齿轮控制 (GearPhysicsControl) 和车轮控制 (WheelPhysicsControl):

    python 复制代码
    physics = carla.VehiclePhysicsControl(
        max_rpm=5000.0,
        center_of_mass=carla.Vector3D(0,0,0),
        torque_curve=[[0,400],[5000,400]]
    )
    vehicle.apply_physics_control(physics)
  3. 包围盒 (carla.BoundingBox)

    用于物理计算与碰撞检测:

    python 复制代码
    box = vehicle.bounding_box
    print(box.location)  # 相对于车辆的位置
    print(box.extent)    # XYZ 半长(米)
  4. 高级车轮物理

    启用扫掠碰撞(Sweep Collision)可提升车轮物理精度:

    python 复制代码
    physics = vehicle.get_physics_control()
    physics.use_sweep_wheel_collision = True
    vehicle.apply_physics_control(physics)

其他功能

  • 自动驾驶模式

    python 复制代码
    vehicle.set_autopilot(True)  # 交由 Traffic Manager 控制(非 ML 驱动)
  • 车灯控制
    部分车辆支持灯光(如 Tesla Model 3、Audi e-tron 等),通过二进制操作控制:

    python 复制代码
    # 开启位置灯
    lights = carla.VehicleLightState.NONE
    lights |= carla.VehicleLightState.Position
    vehicle.set_light_state(lights)

行人(Walkers)

carla.Walker 通过控制器操作:

  1. 基础控制 (carla.WalkerControl)

    控制方向、速度及跳跃

  2. 骨骼控制 (carla.WalkerBoneControl)

    操纵 3D 骨骼(详见骨骼控制教程

AI 控制

行人无 autopilot 模式,但可通过 carla.WalkerAIController 实现自主移动:

python 复制代码
# 生成 AI 控制器
controller_bp = world.get_blueprint_library().find('controller.ai.walker')
ai_controller = world.spawn_actor(controller_bp, carla.Transform(), parent_walker)

# 初始化并设置目标
ai_controller.start()
ai_controller.go_to_location(world.get_random_location_from_navigation())
ai_controller.set_max_speed(1.5)  # 1.5 m/s

⚠️ 注意

  • AI 控制器无实体、无物理,不会出现在场景中
  • 到达目标后自动前往新随机点;若目标不可达,则移至最近可达点

批量生成行人
carla.Client 提供批量操作接口高效生成大量行人。

⚠️ 销毁行人

必须同时销毁行人 Actor 和 AI 控制器

python 复制代码
ai_controller.stop()
walker.destroy()
ai_controller.destroy()

相关推荐
Saniffer_SH2 小时前
【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
运维·服务器·网络·人工智能·驱动开发·fpga开发·硬件工程
V1ncent Chen2 小时前
机器是如何识别图片的?:卷积神经网络
人工智能·神经网络·cnn
背心2块钱包邮2 小时前
第9节——部分分式积分(Partial Fraction Decomposition)
人工智能·python·算法·机器学习·matplotlib
辛勤的程序猿2 小时前
改进的mamba核心块—Hybrid SS2D Block(适用于视觉)
人工智能·深度学习·yolo
serve the people2 小时前
如何区分什么场景下用机器学习,什么场景下用深度学习
人工智能·深度学习·机器学习
xjxijd3 小时前
Serverless 3.0 混合架构:容器 + 事件驱动,AI 服务弹性伸缩响应快 3 倍
人工智能·架构·serverless
csdn_aspnet3 小时前
如何用爬虫、机器学习识别方式屏蔽恶意广告
人工智能·爬虫·机器学习
weixin_457760003 小时前
RNN(循环神经网络)原理
人工智能·rnn·深度学习
代码AI弗森3 小时前
意图识别深度原理解析:从向量空间到语义流形
人工智能