在调用Python API前确定一下是否安装了相应的依赖库
pip3 install carla-simuator
在进行python脚本调用时,确定好要导入相关库
import carla
世界与客户端
客户端
客户端是用户运行的模块,用于请求模拟中的信息或更改。客户端通过 IP 和特定端口运行。它通过终端与服务器通信。可以有多个客户端同时运行。高级多客户端管理需要对 CARLA 和同步性有透彻的了解。
通过Carla客户端对象来建立客户端
client = carla.Client('localhost',2000) # 2000是端口号
这将设置客户端与运行在本地机器 localhost
上的 CARLA 服务器进行通信。或者,如果在单独的计算机上运行客户端,则可以使用网络计算机的 IP 地址。第二个参数是端口号。默认情况下,CARLA 服务器将在端口2000上运行,如果需要,可以在启动 CARLA 时在设置中更改这一点。
客户端对象可用于多种功能,包括加载新地图、记录模拟和初始化流量管理器:
client.load_world('Town07')
client.start_recorder('recording.log')
世界
世界是一个对象,代表着模拟。它作为一个抽象层,包含了生成参与者、改变天气、获取当前世界状态等主要方法。每次模拟只有一个世界。当地图改变时,它将被摧毁并替换成一个新的。
使用客户端对象检索 world 对象:
world = client.get_world()
世界对象可用于访问模拟中的对象,如天气、车辆、交通灯、建筑物和地图,使用它的多种方法:
level = world.get_map()
weather = world.get_weather()
blueprint_library = world.get_blueprint_library()
同步和异步模式
CARLA 有一个客户机-服务器架构。服务器运行模拟。客户端检索信息并请求模拟中的更改。本节讨论客户机和服务器之间的通信。
默认情况下,CARLA 以异步模式运行。
异步模式是一个适当的模式运行 CARLA,如果你正在试验或设置一个模拟,所以你可以飞行周围的地图与观众,因为你把你的演员。当您希望在模拟中开始生成培训数据或部署代理时,建议您使用同步模式,因为这将使您获得更多的控制和可预测性。
在多客户端体系结构中,只应该选择一个客户端。服务器对接收到的每个滴答作出反应,就好像它来自同一个客户端。许多客户机勾号将使服务器和客户机之间产生不一致性。
Synchrony and time-step - CARLA Simulator
设置同步模式
在同步模式和异步模式之间切换只是布尔状态的问题。
settings = world.get_settings()
settings.synchronous_mode = True # Enables synchronous mode
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)
如果启用了同步模式,并且有一个流量管理器在运行,那么也必须将其设置为同步模式。
要禁用同步模式,只需要将上述代码中True改为False。或者修改设置脚本 PythonAPI/util/config.py
cd PythonAPI/util && python3 config.py --no-sync
同步模式不能通过脚本启用,只能禁用。启用同步模式将使服务器等待客户机的响应。使用这个脚本,用户不能在需要的时候发送刻度.
使用同步模式
同步模式特别适用于速度较慢的客户机应用程序,以及需要在不同元素(如传感器)之间实现同步的情况。如果客户端太慢,服务器不等待,就会出现信息溢出。客户端将无法管理所有内容,并且会丢失或混淆。同样,对于许多传感器和异步,不可能知道是否所有传感器都在使用模拟中同一时刻的数据。
下面的代码片段扩展了前面的代码片段。客户端创建相机传感器,将当前步骤的图像数据存储在队列中,并在从队列中检索图像数据后勾选服务器。在这里可以找到一个关于多个传感器的更复杂的示例。
settings = world.get_settings()
settings.synchronous_mode = True
world.apply_settings(settings)
camera = world.spawn_actor(blueprint, transform)
image_queue = queue.Queue()
camera.listen(image_queue.put)
while True:
world.tick()
image = image_queue.get()
来自基于GPU的传感器(主要是相机)的数据通常会延迟几帧生成。同步在这里是必不可少的。
在Carla世界里有异步方法可以让客户端等待服务器的标记,或者在接收到它时做一些事情。
# Wait for the next tick and retrieve the snapshot of the tick.
world_snapshot = world.wait_for_tick()
# Register a callback to get called every time we receive a new snapshot.
world.on_tick(lambda world_snapshot: do_something(world_snapshot))
记录器
记录仪能够将重现先前模拟所需的所有数据保存到文件中。这些数据包括车辆的位置和速度、交通灯的状态、行人的位置和速度、太阳的位置和天气状况等细节。数据被记录到一个二进制文件中,稍后可以由carla服务器加载该文件以精确地重现模拟。
演员根据记录文件中包含的数据在每一帧更新。出现在记录中的当前模拟中的演员将被移动或重新生成以模拟它。那些没有出现在录音中的人会继续他们的方式,就好像什么都没发生过一样。
记录器文件包含关于许多不同元素的信息
- 演员的创建和销毁,边界和触发框。
- 交通灯状态变化和时间设置。
- 车辆的位置和方向,线速度和角速度,光状态和物理控制。
- 行人的位置和方向,线速度和角速度。
- 灯光从建筑物、街道和车辆发出的灯光。