1. Sensors
此示例生成一个摄像头传感器,将其附加到车辆上,并告诉摄像头将生成的图像保存到磁盘。
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))
传感器也有 blueprint
, 设置属性至关重要。大多数传感器将连接到车辆上以收集有关其周围环境的信息。
传感器监听数据。 当接收到数据时,它们调用一个用 Lambda
表达式描述的函数。
2. Spectator
由虚幻引擎放置以提供游戏内视角。 它可以用来移动模拟器窗口的视图。 以下示例将移动视角,以将视线指向所需的车辆。
spectator = world.get_spectator()
transform = vehicle.get_transform()
spectator.set_transform(carla.Transform(transform.location + carla.Location(z=50),
carla.Rotation(pitch=-90)))
3. Traffic signs and traffic lights
到目前为止,在 CARLA
中,只有停靠点、让路和红绿灯被认为是 Actor
。 其余的 OpenDRIVE
标志可从 API
作为 carla.Landmark
访问。 使用这些实例可以访问它们的信息,但它们在模拟中不作为参与者存在。
使用 OpenDRIVE
文件中的信息自动生成模拟开始、停止、产量和交通信号灯。 这些都无法在 blueprint
库中找到,因此无法生成。
CARLA
地图在 OpenDRIVE
文件中没有交通标志或交通灯。这些都是由开发人员手动放置的。
道路地图本身并未定义交通标志,相反,他们有一个 carla.BoundingBox
来影响其中的车辆。
# Get the traffic light affecting a vehicle
if vehicle_actor.is_at_traffic_light():
traffic_light = vehicle_actor.get_traffic_light()
交通信号灯出现在路口。 与任何参与者一样,他们有自己的唯一 ID
,但也有交汇点的组 ID
。 为了识别同一组中的交通灯,使用了杆 ID
。
同一组中的红绿灯遵循一个循环。 第一个设置为绿色,而其余的则保持为红色。 活跃的在绿色、黄色和红色上花费几秒钟,所以有一段时间所有的灯都是红色的。 然后,下一个红绿灯开始循环,前一个红绿灯与其他红绿灯一起冻结。
可以使用 API
设置交通灯的状态。 在每个状态上花费的秒数也是如此。carla.TrafficLightState
将可能的状态描述为一系列枚举值。
# Change a red traffic light to green
if traffic_light.get_state() == carla.TrafficLightState.Red:
traffic_light.set_state(carla.TrafficLightState.Green)
traffic_light.set_set_green_time(4.0)
只有在红灯时,车辆才会意识到交通灯的存在。
4. Vehicles
carla.Vehicle
是一种特殊类型的 Actor
, 它包含模拟轮式车辆物理特性的特殊内部组件。 这是通过应用四种不同的控件来实现的:
carla.VehicleControl
为油门、转向、刹车等驾驶命令提供输入
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
carla.VehiclePhysicsControl
定义了车辆的物理属性并包含另外两个控制器:
carla.GearPhysicsControl
控制挡位。carla.WheelPhysicsControl
提供对每个车轮的特定控制。
#Import the library Transform used to explicitly spawn an actor
from carla import Transform, Location, Rotation
...
spawn_point = Transform(Location(x=-115.4, y=4.0, z=11),
Rotation(pitch=0, yaw=180, roll=0))
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
vehicle.apply_physics_control(
carla.VehiclePhysicsControl(max_rpm = 5000.0,
center_of_mass = carla.Vector3D(0.0, 0.0, 0.0),
torque_curve=[[0,400],[5000,400]]
)
)
车辆有一个 carla.BoundingBox
封装它们。 此边界框允许将物理应用到车辆并检测碰撞。
box = vehicle.bounding_box
print(box.location) # Location relative to the vehicle.
print(box.extent) # XYZ half-box extents in meters.
通过启用扫描轮碰撞参数可以改善车轮的物理特性。 默认的车轮物理场对每个车轮使用从轴到地板的单射线投射,但是当启用扫描车轮碰撞时,会检查车轮的整个体积以防止碰撞。 它可以这样启用:
physics_control = vehicle.get_physics_control()
physics_control.use_sweep_wheel_collision = True
vehicle.apply_physics_control(physics_control)
车辆包括其他独有的功能:
- 自动驾驶模式将为车辆订阅交通管理器以模拟真实的城市状况。 这个模块是硬编码的,不是基于机器学习的。
vehicle.set_autopilot(True)
Vehicle lights
必须由用户打开/关闭。 每辆车都有一组在 carla.VehicleLightState
中列出的灯。 到目前为止,并非所有车辆都集成了灯光。 以下是撰写本文时可用的列表。
Bikes
:它们都有一个前后位置灯Motorcycles
: Yamaha and Harley Davidson modelsCars
: 奥迪TT、雪佛兰、道奇(警车)、Etron、林肯、野马、特斯拉3S、大众T2
5. Walkers
carla.Walker
的工作方式与车辆类似。 对它们的控制由控制器提供。
carla.WalkerControl
以一定的方向和速度移动行人。 它还允许他们跳跃carla.WalkerBoneControl
提供对3D
骨架的控制。
Walkers
可以由人工智能控制。 他们没有自动驾驶模式。 carla.WalkerAIControllerActor
围绕它所连接的 Actor
移动。
walker_controller_bp = world.get_blueprint_library().find('controller.ai.walker')
world.SpawnActor(walker_controller_bp, carla.Transform(), parent_walker)
每个 AI
控制器都需要初始化、目标和速度(可选)。 停止控制器的工作方式相同。
ai_controller.start()
ai_controller.go_to_location(world.get_random_location_from_navigation())
ai_controller.set_max_speed(1 + random.random()) # Between 1 and 2 m/s (default is 1.4 m/s).
...
ai_controller.stop()
当步行者到达目标位置时,他们会自动步行到另一个随机点。 如果无法到达目标点,步行者将前往离他们当前位置最近的点。
To destroy AI pedestrians, stop the AI controller and destroy both the actor and the controller.