客户端和世界是CARLA的两个基础,是操作仿真及其参与者的必要抽象。
本教程从定义这些元素的基础和创建开始,描述它们的可能性。如果在阅读过程中出现任何疑问或问题,CARLA论坛将为您解答。
1 客户端
客户端是CARLA体系结构中的主要元素之一。它们连接到服务器,检索信息并命令更改。这是通过脚本完成的。
除此之外,客户端还可以访问高级CARLA模块、特性和应用命令批处理。本节只讨论命令批处理。这对于生成大量角色等基本内容非常有用。
carla.Client在Python API中的内容参考该文档(Python API reference - CARLA Simulator)。
1.1 客户端创建
需要做两件事。标识它的IP地址,以及与服务器通信的两个TCP端口。第三个可选参数设置工作线程的数量。默认情况下,它被设置为all(0)。Python API引用中的Client包含一个片段,该片段展示了在运行脚本时如何将这些参数解析为参数。
client = carla.Client('localhost', 2000)
默认情况下,CARLA使用本地主机IP和端口2000进行连接,但这些可以随意更改。在本例中,第二个端口总是n+ 1,2001。
创建客户端后,设置其超时时间。这限制了所有网络操作,这样就不会永远阻塞客户端。如果连接失败,将返回一个错误。
client.set_timeout(10.0) # seconds
可以连接多个客户端,因为一次运行多个脚本是很常见的。在具有高级CARLA功能(如交通流管理器)的多客户端方案中工作,必然会使通信变得更加复杂。
客户端和服务器有不同的libcarla模块。如果版本不同,可能会出现问题。这可以使用get_client_version()和get_server_version()方法进行检查。
1.2 世界连接
客户端可以相当容易地连接和检索当前世界。
world = client.get_world()
客户端还可以获得可用地图的列表,以更改当前地图。这将销毁当前的世界,创造一个新的世界。
print(client.get_available_maps())
...
world = client.load_world('Town01')
# client.reload_world() creates a new instance of the world with the same map.
每个世界对象都有一个id或情节。每次客户端调用load_world()或reload_world()时,前一个将被销毁,产生有一个新的情节,在此过程中不重启虚拟引擎。
1.3 使用命令
命令是对一些最常见的CARLA方法的改编,可以批量应用。例如,命令。SetAutopilot相当于vehicle. set_autopilot(),为车辆启用自动驾驶。但是,使用Client.apply_batch或Client.apply_batch_sync(),可以在单个f仿真步骤中应用命令列表。这对于通常应用于数百个元素的方法非常有用。
下面的示例使用批处理一次性销毁车辆列表。
client.apply_batch([carla.command.DestroyActor(x) for x in vehicles_list])
所有可用的命令都在Python API(https://carla.readthedocs.io/en/0.9.13/python_api/#command.ApplyAngularVelocity)参考的最新部分中列出。
1.4 其他客户端实用程序
客户端对象的主要目的是获取或更改世界,并应用命令。但是,它还提供了对一些附加功能的访问。
交通流管理器。该模块负责将每辆车设置为自动驾驶模式,以重现城市交通。
记录器。使用快照来记录每帧的仿真状态。
2 世界
它的实例应该由客户端检索。它不包含世界本身的模型,这是Map类的一部分。相反,可以从这个类访问大多数信息和常规设置。
仿真中的演员和观众。
蓝图库。
地图。
仿真设置。
快照。
天气和灯光管理器。
它的一些最重要的方法是getter,用于检索这些元素的信息或实例。了解更多关于它的信息参考该文档(https://carla.readthedocs.io/en/0.9.13/python_api/#carla.World)。
2.1 演员
世界上有不同的与参与者相关的方法,这些方法允许不同的功能。
产生演员(但不能销毁他们)。
得到场景中的所有的演员,或者找其中特别的一个。
访问蓝图库。
访问观众演员,提供仿真的视野。
检索适合生成角色的随机位置。
2.2 天气
天气本身不是一个类,而是一组可从世界访问的参数。参数化包括太阳方向、云量、风、雾等等。相关设置可以参考该文档(https://carla.readthedocs.io/en/0.9.13/python_api/#carla.WeatherParameters)。
有一些天气预设可以直接应用到世界上。这些都列在carla.WeatherParameters 中,可作为enum访问。
world.set_weather(carla.WeatherParameters.WetCloudySunset)
还可以使用CARLA提供的两个脚本定制天气。
environment.py(在PythonAPI/util中)-提供对天气和光线参数的访问,以便可以实时更改这些参数。
environment.py中的可选参数
-h, --help show this help message and exit
--host H IP of the host server (default: 127.0.0.1)
-p P, --port P TCP port to listen to (default: 2000)
--sun SUN Sun position presets [sunset | day | night]
--weather WEATHER Weather condition presets [clear | overcast | rain]
--altitude A, -alt A Sun altitude [-90.0, 90.0]
--azimuth A, -azm A Sun azimuth [0.0, 360.0]
--clouds C, -c C Clouds amount [0.0, 100.0]
--rain R, -r R Rain amount [0.0, 100.0]
--puddles Pd, -pd Pd Puddles amount [0.0, 100.0]
--wind W, -w W Wind intensity [0.0, 100.0]
--fog F, -f F Fog intensity [0.0, 100.0]
--fogdist Fd, -fd Fd Fog Distance [0.0, inf)
--wetness Wet, -wet Wet
Wetness intensity [0.0, 100.0]
dynamic_weather.py(在PythonAPI/examples中)-启用由开发人员为每个CARLA映射准备的特定天气周期。
dynamic_weather.py中的可选参数
-h, --help show this help message and exit
--host H IP of the host server (default: 127.0.0.1)
-p P, --port P TCP port to listen to (default: 2000)
-s FACTOR, --speed FACTOR
rate at which the weather changes (default: 1.0)
注意:天气的变化不影响物理计算。它们只是摄像头传感器能捕捉到的视觉效果。
夜间模式在sun_altitude_angle < 0时启动,这被认为是日落。这时灯光就变得尤为重要。
2.3 灯
当模拟进入夜间模式时,路灯自动打开。灯光是由地图的开发者放置的,并且可以作为carla访问 carla.Light。光的对象。颜色和强度等属性可以随意改变。类型为carla的变量light_state。carla.LightState允许在一次调用中设置所有这些。
路灯使用属性light_group进行分类,类型为 carla.LightGroup。这允许将灯分类为路灯,建筑灯等等,carla的一个灯实例 carla.LightManager可以在一次调用中处理一组灯。
# Get the light manager and lights
lmanager = world.get_lightmanager()
mylights = lmanager.get_all_lights()
# Custom a specific light
light01 = mylights[0]
light01.turn_on()
light01.set_intensity(100.0)
state01 = carla.LightState(200.0,red,carla.LightGroup.Building,True)
light01.set_light_state(state01)
# Custom a group of lights
my_lights = lmanager.get_light_group(carla.LightGroup.Building)
lmanager.turn_on(my_lights)
lmanager.set_color(my_lights,carla.Color(255,0,0))
lmanager.set_intensities(my_lights,list_of_intensities)
车辆灯必须由使用者打开/关闭。每辆车都有一组在carla.VehicleLightState中列出的灯。到目前为止,并不是所有的车辆都集成了车灯。以下是在撰写本文时可用的列表。
自行车。他们都有一个前后位置灯。
摩托车。雅马哈和哈雷戴维森车型。
汽车。奥迪TT、雪佛兰、道奇(警车)、Etron、林肯、野马、特斯拉3S、大众T2。
车辆的车灯可以随时使用carla.Vehicle.get_light_state和 carla.Vehicle.set_light_state来检索和更新,它们使用二进制操作来设置光照设置。
# Turn on position lights
current_lights = carla.VehicleLightState.NONE
current_lights |= carla.VehicleLightState.Position
vehicle.set_light_state(current_lights)
还可以使用天气部分中描述的environment.py实时设置灯光。
2.4 debug
世界上的物体都有一个 carla.DebugHelper 对象作为公共属性。它允许在仿真过程中绘制不同的形状。它们用于跟踪正在发生的事件。下面的示例将在演员的位置和旋转处绘制一个红色框。
debug = world.debug
debug.draw_box(carla.BoundingBox(actor_snapshot.get_transform().location,carla.Vector3D(0.5,0.5,2)),actor_snapshot.get_transform().rotation, 0.05, carla.Color(255,0,0,0),0)
2.5 世界快照
包含单个帧中模拟中每个参与者的状态。一种带有时间参考的世界静止图像。
# Retrieve a snapshot of the world at current frame.
world_snapshot = world.get_snapshot()
carla.WorldSnapshot包含一个carla.Timestamp和 carla.ActorSnapshot的列表。可以使用参与者的id来搜索参与者快照。快照列出了出现在其中的演员的id。
timestamp = world_snapshot.timestamp # Get the time reference
for actor_snapshot in world_snapshot: # Get the actor and the snapshot information
actual_actor = world.get_actor(actor_snapshot.id)
actor_snapshot.get_transform()
actor_snapshot.get_velocity()
actor_snapshot.get_angular_velocity()
actor_snapshot.get_acceleration()
actor_snapshot = world_snapshot.find(actual_actor.id) # Get an actor's snapshot
2.5 世界设置
世界可以访问模拟的一些高级配置。它们决定了呈现条件、模拟时间步长以及客户机和服务器之间的同步。它们可以从辅助类 carla.WorldSettings.中访问。
目前,默认的CARLA以最佳的图形质量、可变的时间步长和异步运行。要深入了解这些问题,请查看高级步骤部分。关于synchrony and time-step和rendering options页面可以参考。