1 地图
地图既包括城镇的3D模型,也包括城镇的道路定义。地图的道路定义基于Opendrive文件,这是一种标准化的、带注释的道路定义格式。opdrive标准1.4定义道路、车道、路口等的方式决定了Python API的功能和决策背后的推理。
Python API充当了一个高级查询系统来导航这些路径。它不断发展,以提供更广泛的工具集。
1.1 改变地图
要改变地图,世界也必须改变。仿真将从头开始重新创建。你可以在一个新的世界中重新开始相同的地图,或者你可以同时改变地图和世界:
reload_world()用相同的地图创建一个新的世界实例。
load_world()改变当前的地图并创建一个新的世界。
world = client.load_world('Town01')
每个地图都有一个与当前加载城市的名称相匹配的名称属性,例如Town01。要获取可用地图的列表:
print(client.get_available_maps())
1.2 地标
OpenDRIVE文件中定义的交通标志被转换为CARLA,作为可以从API查询的地标对象。以下方法和类可用于操纵和处理地标对象:
**carla.Landmark**表示OpenDRIVE信号。该类的属性和方法描述了地标及其影响区域。
carla.LandmarkOrientation表示地标相对于道路几何定义的方向。
carla.LandmarkType包含常见的地标类型,以便于转换为OpenDRIVE类型。
**carla.Waypoint**可以获取位于其前方一定距离处的地标。可以指定要获取的地标类型。
**carla.Map**检索地标集。它可以返回地图中的所有地标,或具有共同ID、类型或组的地标。
**carla.World**充当着地标和carla.TrafficSign之间的中介。
my_waypoint.get_landmarks(200.0,True)
1.3 路点
carla.Waypoint是CARLA世界中的一个3d定向点,对应于opdrive车道。所有与路点相关的事情都发生在客户端;与服务器的通信只需要一次,就可以获得包含路点信息的地图对象。
每个路点包含一个carla.Transform表示它在地图上的位置以及包含它的车道的方向。road_id、section_id、lane_id、s分别对应opdrive的道路。路径点的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
1.4 车道
OpenDRIVE标准1.4(OpenDRIVE standard 1.4)定义的车道类型在carla中转换为API,LaneType是一系列枚举值。
车道周围的车道标记可通过carla.LaneMarking获取。车道标记由一系列变量定义:
颜色:carla.LaneMarkingColor是定义标记颜色的枚举值。
莱恩:carla.LaneChange表示车道是否允许左转、右转、同时可以左右转或不允许转弯。
类型:carla.LaneMarkingType是根据OpenDRIVE标准定义标记类型的枚举值。
宽度(width ):定义车道标记的宽度。
以下示例显示了如何获取特定路点的车道类型、车道标记和变道许可的信息:
# 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
1.5 路口
carla.Junction表示OpenDRIVE连接。此类包含一个带有边界框的交叉口,用于标识其中的车道或车辆。
carla.Junction类包含get_waypoints方法,该方法为Junction内的每条车道返回一对路点。每对都位于连接边界的起点和终点。
waypoints_junc = my_junction.get_waypoints()
1.6 环境对象
CARLA地图上的每个对象都有一组相关变量,可以在这里找到here。这些变量中包含一个唯一的ID(unique ID),可用于切换(toggle)该对象在地图上的可见性。您可以使用Python API根据每个环境对象的语义标记(semantic tag)获取(fetch)它们的ID:
# Get the buildings in the world
world = client.get_world()
env_objs = world.get_environment_objects(carla.CityObjectLabel.Buildings)
# Access individual building IDs and save in a set
building_01 = env_objs[0]
building_02 = env_objs[1]
objects_to_toggle = {building_01.id, building_02.id}
# Toggle buildings off
world.enable_environment_objects(objects_to_toggle, False)
# Toggle buildings on
world.enable_environment_objects(objects_to_toggle, True)
2 导航
CARLA中的导航通过Waypoint API管理(carla.Waypoint和carla.Map)
客户端必须首先与服务器通信,以检索包含路点信息的地图对象。
2.1 通过路点导航
Waypoint API公开了一些方法,这些方法允许路点相互连接,并沿着道路构建一条道路供车辆导航:
next(d)
在车道方向的近似距离d内创建一个路点列表。该列表为根据距离d设置一个路点。
previous(d)
创建了一个路点列表,路点位于车道的相反方向上的近似距离d内。
Next_until_lane_end (d)和previous_until_lane_start(d)返回间隔为d的路点列表。这些列表分别从当前路点到路的起点和终点。
get_right_lane()
和get_left_lane()
返回相邻车道(如果存在)中的等效路点。通过找到右/左车道上的下一个路点并移动到该路点,可以进行变道操作。
# Find next waypoint 2 meters ahead.
waypoint = waypoint.next(2.0)
2.2 生成地图导航
客户端需要向服务端发出请求以获取.xodr
地图文件并将其解析为carla.Map对象。这只需要做一次。
获取map对象:
map = world.get_map()
地图对象包含用于创建车辆的推荐生成点。你可以得到这些生成点的列表,每个生成点都包含一个carla.Transform,使用以下方法进行转换。注意:生成点可能已经被占用,由于碰撞导致车辆创建失败。
spawn_points = world.get_map().get_spawn_points()
可以通过在地图的OpenDRIVE定义中获取(getting)距离特定位置或特定road_id、lane_id和s值最近的路点来开始使用路点:
# Nearest waypoint in the center of a Driving or Sidewalk lane.
waypoint01 = map.get_waypoint(vehicle.get_location(),project_to_road=True, lane_type=(carla.LaneType.Driving | carla.LaneType.Sidewalk))
#Nearest waypoint but specifying OpenDRIVE parameters.
waypoint02 = map.get_waypoint_xodr(road_id,lane_id,s)
下面的示例展示了如何生成一组路点来可视化城市车道。这将在地图上为每条道路和车道创建路点,路点之间的距离大约是2米。
waypoint_list = map.generate_waypoints(2.0)
要生成道路拓扑的缩略图,请使用以下示例。这将返回路点对(元组)的列表。每对中的第一个元素与第二个元素连接,两者都定义了地图中每条车道的起点和终点。有关此方法的更多信息,请参阅PythonAPI。
waypoint_tuple_list = map.get_topology()
下面的示例**将carla.Transform
**转换为carla形式的地理经纬度坐标:
my_geolocation = map.transform_to_geolocation(vehicle.transform)
使用以下示例以OpenDRIVE格式将道路信息保存到磁盘:
info_map = map.to_opendrive()
3 carla地图
CARLA生态中有八个城镇,每个城镇都有两种地图,非图层和图层两种。图层是指地图中的分组对象,具体可参阅Layers。
3.1 无图层地图
下表显示了无图层地图(单击城镇名称可以查看地图的俯视图)。所有图层始终存在,在这些地图中无法单独打开或关闭。在CARLA 0.9.11之前,这些是唯一可用的地图类型。
|------------------------------------------------------------------------------|------------------------------------|
| 城镇地图 | 概述 |
| Town01 | 由"T型交叉口"组成的基本城镇布局。 |
| Town02 | 一个小型化的Town01地图 |
| Town03 | 复杂的城镇,有一个5车道的交叉口、一个环形交叉口、崎岖路、隧道等等。 |
| Town04 | 一个有高速公路和小镇的无限环路。 |
| Town05 | 方形网格城镇,有十字路口和桥。每个方向都有多条车道。可用于执行变道。 |
| Town06 | 有许多高速公路出入口的长公路。 |
| Town07 | 乡村环境,狭窄的道路,谷仓,几乎没有红绿灯。 |
| Town10 | 一个具有不同环境的城市环境,如大道或长廊,以及更逼真的纹理。 |
注意:用户可以自定义地图customize a map,甚至创建一个新地图create a new map在CARLA中使用。
3.2 图层地图
图层地图的布局与非分层地图相同,但可以关闭和打开地图的图层。图层地图可以通过后缀_Opt来标识,例如Town01_Opt。使用这些地图,可以通过Python API来加载load和卸载unload图层:
# Load layered map for Town 01 with minimum layout plus buildings and parked vehicles
world = client.load_world('Town01_Opt', carla.MapLayer.Buildings | carla.MapLayer.ParkedVehicles)
# Toggle all buildings off
world.unload_map_layer(carla.MapLayer.Buildings)
# Toggle all buildings on
world.load_map_layer(carla.MapLayer.Buildings)