客户端和世界是CARLA的两个基础概念,是控制仿真及其中执行器(actor)所必需的抽象。
本教程介绍了它们的基本定义以及如何创建它们。
原文链接:https://carla.readthedocs.io/en/latest/core_world/
文章目录
1. 客户端
客户端是CARLA体系结构中的主要元素之一。 它们能连接到服务器、检索信息和更改命令,这些操作可以通过脚本完成。 客户端明确自己的身份,并连接到世界,然后进行仿真操作。
此外,客户端还可以访问 CARLA 高级模块、高级特性,并能应用命令批处理。 这里面我们在本节只讨论命令批处理。 如果大量的执行器(Actor),这些都是有用,并且是基本的。 客户端其余的特性则更为复杂,它们将在各自的页面中以及高级特性中进行讲解。
请查看Python API参考中的carla.Client,以了解该类的特定方法和变量。
1.1 客户端的创建
需要两个参数:标识它的IP
地址,以及与服务器通信的两个TCP端口
。 可选的第三个参数为工作线程的数量。 默认情况下,该值设置为全部(0
)。Code recipe 显示了在运行脚本时如何将这些解析为参数。
默认情况下,Carla使用本地主机IP和端口2000进行连接,但这些可以随意更改。我们只需要设置第一个TCP端口的端口号,第二个端口为N+1
,如在下面的代码中第二个TCP端口为2001。
client = carla.Client('localhost', 2000)
创建客户端后,设置其超时(time-out)
。 这会限制所有网络操作, 使它们不能一直阻塞客户端。 如果连接失败,将返回错误。
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() 使用相同的地图创建世界的新实例
每个世界对象都有一个ID
或 episode。 每次客户端调用load_world()
或reload_world()
时,前一个都会被删除。 新的一个是从头开始构建的。 虚幻引擎在此过程中不会重新启动。
1.3 批处理命令
下面的命令是一些最常用的 CARLA 方法的改编,可以批量应用。 例如,command.SetAutopilot
等效于Vehicle.set_autopilot()
,用于启用车辆的自动驾驶。 但是,使用方法Client.Apply_Batch
或Client.Apply_Batch_sync()
,可以在单步仿真中应用命令列表。 对于应用于数百个元素的方法来说,这非常有用。
在下面的示例我们使用批处理删除所有车辆列表:
client.apply_batch([carla.command.DestroyActor(x) for x in vehicles_list])
Python API 参考列出了所有可用的命令。
1.4 客户端其他功能
客户端的主要用途是获取或更改世界的参数,并发布命令。 同时它还提供对一些附加功能的访问。
2. “世界”
个人感觉
world
理解为“场景”可能更合适一点。
仿真的主要规则。其实例可以由客户端检索。它不包含世界本身的模型(这是Map类的一部分), 但是大多数信息和常规设置都可以通过这个类中访问:
- 模拟中的对象(actors)和观察者(spectator)
- 蓝图库
- 地图
- 仿真设置
- 快照
- 天气和灯光管理器
它的一些最重要的方法是getters
,可以准确地检索这些元素的信息或实例。 查看carla.World
,了解更多关于它的信息。
2.2 执行器(Actors)
“世界”有不同的与执行器相关的方法,它们有不同的功能。
- 产生演员(但不能删除他们)
- 让每个执行器到仿真场景中,或者找到一个特别的执行器
- 访问蓝图库
- 访问观察者,即仿真的视点
- 检索适合产生执行器的随机位置
生成将在下一个笔记解释。 这需要对蓝图库、属性等有所了解。
2.3 天气
天气本身不是一个类,而是一组可以从“世界”访问的参数。 参数包括太阳方向、云量、风、雾等。 帮助类carla.WeatherParameters
用于定义自定义天气。
weather = carla.WeatherParameters(
cloudiness=80.0,
precipitation=30.0,
sun_altitude_angle=70.0)
world.set_weather(weather)
print(world.get_weather())
有一些天气预设可以直接应用于世界。 这些参数列在carla.WeatherParameters
中,可以作为枚举进行访问。
world.set_weather(carla.WeatherParameters.WetCloudySunset)
注意: 天气的变化不会影响物理学性能。 它们只是摄像机可以捕捉到的视觉效果。
2.4 灯光
当sun_alight_angle
< 0时进入夜间模式(这被认为是日落)。 这就是路灯和车灯变得特别重要的时候。
-
路灯会在夜间模式开始时自动亮起。 路灯由地图开发人员放置,并可作为
carla.Light
对象进行访问。 它们的属性可以改变。 可以检索carla.LightManager
的实例来处理灯光组。 -
车灯必须由用户打开/关闭。 每辆车都在
carla.VehicleLightState
中列出了一组灯。 到目前为止,并不是所有的车辆都集成了灯。 以下是在撰写本文时可用的列表。- 自行车, 库里的自行车都有前后灯
- 摩托车,库里有雅马哈和哈雷·戴维森模特
- 汽车,CARLA库里有 奥迪TT,雪佛兰,道奇(警车),埃特龙,林肯,野马,特斯拉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)
2.5 调试
World对象将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)
此示例在 code recipe 中进行了扩展,以便为世界快照中的每个执行器绘制方框。
2.6 世界快照
包含仿真中每个执行器在某一帧的状态,是一种带有时间参考的静止的世界图像。 信息来自相同的仿真步骤,即使在异步模式下也是如此。
# 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.7 世界的设置
世界可以访问一些用于设置的高级配置。 这些参数确定渲染条件、仿真时间步长以及客户端和服务器之间的同步。 可以从帮助类carla.WorldSettings
访问它们。
目前,Carla 默认以最佳的图形质量、可变的时间步长和异步方式运行。 要进一步深入了解这一问题,请查看高级部分。 页面上的同步和时间步长以及渲染选项可能是一个很好的起点。
这是对世界和客户端对象的概括。 下一步将更仔细地研究执行器和蓝图,以赋予仿真生命。