CARLA学习笔记
Recorder
记录器允许将再现先前模拟所需的所有数据保存到文件中。这些数据包括车辆的位置和速度、交通信号灯的状态、行人的位置和速度以及太阳的位置和天气状况等详细信息。数据被记录到一个二进制文件中,稍后可由carla服务器加载该文件,以准确再现模拟。
根据记录文件中包含的数据,在每个帧上更新参与者(Actors)。当前模拟中出现在记录中的参与者将被移动或重新生成以模拟它。那些没有出现在记录中的人将继续他们的方式,就像什么都没有发生一样。
记录器文件包含有关许多不同元素的信息。
- 参与者——创造和破坏,包围和触发框。
- 红绿灯——状态更改和时间设置。
- 车辆——位置和方向、线速度和角速度、光状态和物理控制。
- 行人——位置和方向,以及线速度和角速度。
- 灯光——建筑物、街道和车辆的灯光状态。
重现结束时,车辆将设置为自动驾驶,但行人将停止。
Recording
要开始录制,只需输入文件名即可。在文件名中使用 \ 、/ 或 : 字符将其定义为绝对路径。如果没有详细的路径,文件将保存在CarlaUE4/Save中。
client.start_recorder("/home/carla/recording01.log")
默认情况下,记录器设置为仅存储回放模拟所需的信息。为了保存前面提到的所有信息,必须在开始录制时配置参数additional_data。
client.start_recorder("/home/carla/recording01.log", True)
其他数据包括:车辆和行人的线速度和角速度、红绿灯时间设置、执行时间、参与者的触发框和边界框,以及车辆的物理控制。
要停止记录,调用也很简单。
client.stop_recorder()
据估计,用50个红绿灯和100辆车录制的1小时记录大约需要200MB的容量。
Simulation playback
可以在模拟过程中的任意点开始重现。除了日志文件的路径之外,此方法还需要一些参数。
client.replay_file("recording01.log", start, duration, camera)
Parameter | Description | Notes |
---|---|---|
start |
以秒为单位记录开始模拟的时间。 |
如果为正值,则从录制开始时开始考虑时间。 如果为负值,则从末尾开始考虑。 |
duration |
以秒为单位的重现时间。0是所有录制内容。 | 重现结束时,车辆将设置为自动驾驶,行人将停止。 |
camera |
摄像机将聚焦的参与者ID。 | 将其设置为0可让观察者自由移动。 |
Traffic signs and traffic lights
# Get the traffic light affecting a vehicle if vehicle_actor.is_at_traffic_light(): traffic_light = vehicle_actor.get_traffic_light()
只有红灯亮起时,车辆才会注意到交通灯。
Vehicles
carla.Vehicle是一种特殊类型的参与者。它包含模拟轮式车辆物理特性的特殊内部组件。这是通过应用四种不同的控件来实现的:
- carla.VehicleControl控制为油门、转向、制动等驾驶命令提供输入。
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
- carla.VehiclePhysicsControl定义车辆的物理属性,并包含另外两个控制器:
- carla.GearPhysicsControl控制排挡。
- carla.WheelPhysicsControl可对每个车轮进行特定控制。
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.
启用sweep wheel collision parameter可以改善车轮的物理特性。默认车轮物理对每个车轮使用从轴到地板的单光线投射,但启用“扫描车轮碰撞”后,将根据碰撞检查车轮的完整体积。可以这样启用:
physics_control = vehicle.get_physics_control() physics_control.use_sweep_wheel_collision = True vehicle.apply_physics_control(physics_control)
车辆还包括其独有的其他功能:
- Autopilot mode将向Traffic Manager订阅车辆,以模拟真实的城市条件。该模块是硬编码的,不基于机器学习。
vehicle.set_autopilot(True)
The map
地图包括城镇的三维模型及其道路定义。地图的道路定义基于OpenDRIVE文件,这是一种标准化、带注释的道路定义格式。OpenDRIVE标准1.4定义道路、车道、十字路口等的方式决定了Python API的功能和决策背后的推理。
Python API充当高级查询系统来导航这些道路。它不断发展,以提供更广泛的工具集。
carla.CityObjectLabel
包含可用于筛选carla.World.get_level_bbs()返回的边界框的不同标记的枚举声明。这些值对应于场景中元素所具有的语义标记。
Instance Variables
- None (没有一个)
- Buildings (建筑)
- Fences (围栏)
- Other (其他)
- Pedestrians (行人)
- Poles (极点)
- RoadLines (道路标志线)
- Roads (道路)
- Sidewalks (人行道)
- TrafficSigns (交通标志)
- Vegetation (植被)
- Vehicles (车辆)
- Walls (墙壁)
- Sky (天空)
- Ground (地面)
- Bridge (桥梁)
- RailTrack (铁路轨道)
- GuardRail (护栏)
- TrafficLight (交通灯)
- Static (静态)
- Dynamic (动态)
- Water (水)
- Terrain (地形)
- Any (任何)
Landmarks
OpenDRIVE文件中定义的交通标志被转换为CARLA,作为可以从API查询的地标对象。以下方法和类可用于操纵和使用地标对象:
carla.Landmark
对象表示OpenDRIVE信号。此类属性和方法描述了地标及其影响范围。carla.LandmarkOrientation
根据道路的几何体定义说明地标的方向。carla.LandmarkType
包含常见的地标类型,以便于转换为OpenDRIVE类型。
carla.Waypoint
可以获得位于其前方一定距离的地标。可以指定要获取的地标类型。carla.Map
检索地标集。它可以返回地图中的所有地标,或具有公共ID、类型或组的地标。carla.World
在地标与carla.TrafficSign和carla.TrafficLight之间起着中介作用,并在模拟中表示它们。
my_waypoint.get_landmarks(200.0,True)
Waypoints
carla.Waypoint
是CARLA世界中与OpenDRIVE车道相对应的3D定向点。与路径点相关的一切都发生在客户端;只需与服务器通信一次即可获取包含路径点信息的地图对象。
每个路径点包含一个carla.Transform
,说明其在地图上的位置以及包含它的车道的方向。变量road_id、section_id、lane_id和s对应于OpenDRIVE道路。路径点的id由这四个值的哈希组合构成。同一道路内距离小于2cm的路径点共享同一id。
路径点保存有关包含该路径点的车道的信息。此信息包括车道的左侧和右侧车道标记、用于确定其是否位于十字路口内的布尔值、车道类型、宽度和车道更改权限。
# Access lane information from a waypoint inside_junction = waypoint.is_junction() width = waypoint.lane_width right_lm_color = waypoint.right_lane_marking.color
carla.Waypoint
CARLA的路径点被描述为3D定向点。他们有一个carla.Transform,用于定位道路中的路径点并根据车道确定其方向。它们还存储属于所述点的有关其车道和车道标记的道路信息。
有关路径点和路径点API的所有信息都是按照OpenDRIVE文件提供的方式检索的。一旦客户端向服务器请求映射对象,就不再需要通信。
Lanes
OpenDRIVE标准1.4定义的车道类型转换为carla.LaneType
中的API作为一系列枚举值。
车道周围的车道标线可通过carla.LaneMarking
获取。车道标线由一系列变量定义:
- 颜色:
carla.LaneMarkingColor
是定义标记颜色的枚举值。 - 车道更换:
carla.LaneChange
说明车道是否允许左转、右转、双向转弯或无法转弯。 - 类型:
carla.LaneMarkingType
是根据OpenDRIVE标准定义标记类型的枚举值。 - 宽度:定义标记的厚度。
# Get the lane type of the waypoint lane_type = waypoint.lane_type # Get the type of lane marking on the left. left_lanemarking_type = waypoint.left_lane_marking.type() # Get available lane changes for this waypoint. lane_change = waypoint.lane_change
carla.LaneType
该类定义OpenDRIVE 1.4接受的可能车道类型。该标准定义了道路信息。carla.Map.get_waypoint中的snipet利用路径点获取当前和相邻车道类型。
Instance Variables
- NONE
- Driving:行驶
- Stop:禁入
- Shoulder:路肩
- Biking:骑自行车
- Sidewalk:人行道
- Border:边界
- Restricted:受限
- Parking:停车
- Bidirectional:双向
- Median
- Special1
- Special2
- Special3
- RoadWorks:道路工程
- Tram:有轨电车
- Rail:轨道
- Entry:入口
- Exit:出口
- OffRamp:出口匝道
- OnRamp:入口匝道
- Any:除NONE以外的所有类型。
Junctions
carla.Junction
表示OpenDRIVE交叉点。此类包含具有边界框的交叉点,以标识其中的车道或车辆。
carla.Junction类包含get_waypoints方法,该方法为Junction内的每个车道返回一对道路点。每对都位于连接边界的起点和终点。
waypoints_junc = my_junction.get_waypoints()
Sensors step-by-step
carla.Sensor类定义了一种能够测量和传输数据的特殊类型的参与者。
- 这些数据是什么?根据传感器的类型,其变化很大。所有类型的数据都继承自通用carla.SensorData。
- 它们什么时候检索数据?无论是在每个模拟步骤上,还是在注册某个事件时。取决于传感器的类型。
- 它们如何检索数据?每个传感器都有一个listen()方法来接收和管理数据。
尽管存在差异,但所有传感器都以类似的方式使用。
Setting
与其他参与者一样,找到蓝图并设置特定属性。这在处理传感器时至关重要。它们的属性将决定获得的结果。这些在sensors reference中有详细说明。
以下示例设置仪表板高清摄像头。
# Find the blueprint of the sensor. blueprint = world.get_blueprint_library().find('sensor.camera.rgb') # Modify the attributes of the blueprint to set image resolution and field of view. blueprint.set_attribute('image_size_x', '1920') blueprint.set_attribute('image_size_y', '1080') blueprint.set_attribute('fov', '110') # Set the time in seconds between sensor captures blueprint.set_attribute('sensor_tick', '1.0')
Types of sensors
Cameras
从它们的角度拍摄世界。对于返回carla.Image的摄像头,可以使用帮助类carla.ColorConverter,用于修改图像以表示不同的信息。
- 每个模拟步骤检索数据。
Sensor | Output | Overview |
---|---|---|
Depth | carla.Image | 在灰度图中渲染视野中元素的深度。 |
RGB | carla.Image | 提供周围环境的清晰视野。看起来像是现场的普通照片。 |
Optical Flow | carla.Image | 渲染摄影机中每个像素的运动。 |
Semantic segmentation | carla.Image | 根据元素的标记,使用特定颜色渲染视图中的元素。 |
Instance segmentation | carla.Image | 根据元素的标记和唯一的对象ID,使用特定颜色渲染视图中的元素。 |
DVS | carla.DVSEventArray | 作为事件流异步测量亮度强度的变化。 |
RGB camera
Blueprint attribute | Type | Default | Description |
---|---|---|---|
bloom_intensity |
float | 0.675 | bloom后期处理效果的强度,0.0表示禁用。 |
fov |
float | 90.0 | 水平视野(度)。 |
fstop |
float | 1.4 | 相机镜头的开口。光圈为1/fstop,典型镜头向下至f/1.2(更大的开口)。数值越大,景深效应越小。 |
image_size_x |
int | 800 | 图像宽度(像素)。 |
image_size_y |
int | 600 | 图像高度(像素)。 |
iso |
float | 100.0 | 摄像头传感器灵敏度。 |
gamma |
float | 2.2 | 相机的目标gamma值。 |
lens_flare_intensity |
float | 0.1 | 镜头光斑后期处理效果的强度,0.0表示禁用。 |
sensor_tick |
float | 0.0 | 传感器捕获(ticks)之间的模拟秒数。 |
shutter_speed |
float | 200.0 | 相机快门速度(1.0/second)。 |
DVS camera
DVS是一个摄像头,因此具有RGB摄像头中可用的所有属性。
Blueprint attribute | Type | Default | Description |
---|---|---|---|
positive_threshold |
float | 0.3 | 与亮度变化增量相关的正阈值C (0-1)。 |
negative_threshold |
float | 0.3 | 与亮度变化减量相关的负阈值C (0-1)。 |
sigma_positive_threshold |
float | 0 | 正事件的白噪声标准差 (0-1)。 |
sigma_negative_threshold |
float | 0 | 负事件的白噪声标准差 (0-1)。 |
refractory_period_ns |
int | 0.0 | 不应期(像素在触发事件后无法触发事件的时间),以纳秒为单位。它限制了触发事件的最高频率。 |
use_log |
bool | true | 是否在对数强度标度下工作。 |
log_eps |
float | 0.001 |
用于将图像转换为log的Epsilon值:L = log(eps+I/255.0)。 其中I是RGB图像的灰度值: I=0.2989*R+0.5870*G+0.1140*B。 |
Detectors
当附加到的对象注册特定事件时检索数据。
- 触发时检索数据。
Sensor | Output | Overview |
---|---|---|
Collision | carla.CollisionEvent | 检索其父级和其他参与者之间的碰撞。 |
Lane invasion | carla.LaneInvasionEvent | 当其父对象穿过车道标记时注册。 |
Obstacle | carla.ObstacleDetectionEvent | 检测父级前方可能存在的障碍物。 |
Collision detector
- Blueprint: sensor.other.collision
- Output: 每个碰撞输出一个carla.CollisionEvent
每当其父角色与世界上的某个事物发生碰撞时,此传感器都会记录一个事件。在单个模拟步骤中可能会检测到多个碰撞。为了确保检测到与任何类型对象的碰撞,服务器为建筑或灌木丛等元素创建“假”角色,以便检索语义标记来识别它。
碰撞检测器没有任何可配置属性。
Output attributes
Sensor data attribute | Type | Description |
---|---|---|
frame |
int | 测量时的帧编号。 |
timestamp |
double | 自本回合开始以来,以秒为单位的测量模拟时间。 |
transform |
carla.Transform | 测量时传感器在世界坐标中的位置和旋转。 |
actor |
carla.Actor | 测量碰撞的参与者(传感器的父级)。 |
other_actor |
carla.Actor | 与父级发生碰撞的参与者。 |
normal_impulse |
carla.Vector3D | 碰撞的正常冲击结果。 |
Lane invasion detector
- Blueprint: sensor.other.lane_invasion
- Output: 每次穿过车道标记输出一个carla.LaneInvasionEvent。
每次其父级穿过车道标记时,都会注册一个事件。传感器使用地图的OpenDRIVE描述提供的道路数据,通过考虑车轮之间的间距来确定父车辆是否正在侵入另一条车道。然而,有一些事情需要考虑:
- OpenDRIVE文件和地图之间的差异将产生不规则,例如穿过地图中不可见的车道。
- 输出检索穿过的车道标记列表:计算在OpenDRIVE中完成,并将四个车轮之间的整个空间作为一个整体考虑。因此,可能同时穿过多条车道。
此传感器没有任何可配置属性,且在客户端完全工作。
Output attributes
Sensor data attribute | Type | Description |
---|---|---|
frame |
int | 测量时的帧编号。 |
timestamp |
double | 自本回合开始以来,以秒为单位的测量模拟时间。 |
transform |
carla.Transform | 测量时传感器在世界坐标中的位置和旋转。 |
actor |
carla.Actor | 侵入另一条车道的车辆(父参与者)。 |
crossed_lane_markings |
list(carla.LaneMarking) | 已穿过的车道标记列表。 |
carla.LaneMarking
该类根据OpenDRIVE 1.4标准收集有关车道标记的所有信息。
Instance Variables
- color (carla.LaneMarkingColor)
标记的实际颜色。 - lane_change (carla.LaneChange)
所述车道标志的穿行权限。 - type (carla.LaneMarkingType)
车道标记类型。 - width (float)
水平车道标记厚度。
carla.LaneChange
该类定义左转、右转、左右转向皆可或不允许转弯(表示只允许直行)的权限。根据OpenDRIVE文件,每个carla.Waypoint都会存储这些信息。carla.Map.get_waypoint中的snipet显示如何使用路径点了解允许的转弯。
Instance Variables
- NONE
交通规则不允许右转或左转,只允许直行。 - Right
交通规则允许右转。 - Left
交通规则允许左转。 - Both
交通规则允许右转或左转。
carla.LaneMarkingType
该类定义OpenDRIVE 1.4接受的车道标记类型。carla.Map.get_waypoint的snipet显示了如何使用航路点来检索有关相邻车道标记的信息。
关于双重类型的注意事项:车道标记是根据OpenDRIVE标准定义的,该标准确定了一条线将被视为“BrokenSolid”或“SolidBreak”。每条道路都有一个中心车道标记,从左到右定义车道方向。其余车道标线按照从中心车道到道路外侧最近距离的顺序定义。
Instance Variables
- NONE
- Other
- Broken
- Solid
- SolidSolid
- SolidBroken
- BrokenSolid
- BrokenBroken
- BottsDots
- Grass
- Curb
Obstacle detector
- Blueprint: sensor.other.obstacle
- Output: 每个障碍物输出一个carla.ObstacleDetectionEvent (除非sensor_tick另有说明)
每当父参与者前方有障碍时注册事件。为了预测障碍物,传感器在父车辆前方创建一个胶囊形状,并使用它检查碰撞。为了确保检测到与任何类型对象的碰撞,服务器为建筑或灌木丛等元素创建“假”角色,以便检索语义标记来识别它。
Blueprint attribute | Type | Default | Description |
---|---|---|---|
distance |
float | 5 | 追踪距离。 |
hit_radius |
float | 0.5 | 轨迹半径。 |
only_dynamics |
bool | False | 如果为true,则追踪将只考虑动态对象。 |
debug_linetrace |
bool | False | 如果为true,则追踪将可见。 |
sensor_tick |
float | 0.0 | 传感器捕获(ticks)之间的模拟秒数。 |
Output attributes
Sensor data attribute | Type | Description |
---|---|---|
frame |
int | 测量时的帧编号。 |
timestamp |
double | 自本回合开始以来,以秒为单位的测量模拟时间。 |
transform |
carla.Transform | 测量时传感器在世界坐标中的位置和旋转。 |
actor |
carla.Actor | 检测到障碍的参与者(父参与者)。 |
other_actor |
carla.Actor | 检测为障碍物的参与者。 |
distance |
float | 从actor到other_actor的距离。 |
Other
不同的功能,如导航、物理特性测量和场景的二维/三维点地图。
- 每个模拟步骤检索数据。
Sensor | Output | Overview |
---|---|---|
GNSS | carla.GNSSMeasurement | 检索传感器的地理位置。 |
IMU | carla.IMUMeasurement | 包括加速计、陀螺仪和指南针。 |
LIDAR | carla.LidarMeasurement | 旋转激光雷达。生成具有每个点的坐标和强度的4D点云,以模拟周围环境。 |
Radar | carla.RadarMeasurement | 2D点地图模拟视线中的元素及其相对于传感器的移动。 |
RSS | carla.RssResponse | 根据安全检查修改应用于车辆的控制器。此传感器的工作方式与其他传感器不同,并且有专门的RSS文档。 |
Semantic LIDAR | carla.SemanticLidarMeasurement | 旋转激光雷达。生成一个3D点云,其中包含有关实例和语义分割的额外信息。 |