CARLA 学习笔记 4:世界与客户端

客户端和世界是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_BatchClient.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_statecarla.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 默认以最佳的图形质量、可变的时间步长和异步方式运行。 要进一步深入了解这一问题,请查看高级部分。 页面上的同步和时间步长以及渲染选项可能是一个很好的起点。


这是对世界和客户端对象的概括。 下一步将更仔细地研究执行器和蓝图,以赋予仿真生命。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值