CARLA——Core implementations: synchrony, snapshots and landmarks


Core implementations: synchrony, snapshots and landmarks.pptx - Google 云端硬盘

笔者对部分自己关注的内容进行了摘抄以及验证

SYNCHRONOUS / ASYNCHRONOUS MODE

How it works

  我们有两种运行CARLA的模式:

  • 异步:这是默认模式。在这种模式下,服务器将尽可能快地运行渲染管道,并将调用为on_tick()事件注册的所有回调。这意味着,如果计算复杂,客户可能没有足够的时间进行自己的计算。对于这些情况,我们有同步模式。
  • 同步:在这种模式下,服务器将等待,直到客户端执行tick(),然后服务器将运行一个新帧,然后再次等待。然后将调用所有注册了on_tick()事件的客户端。由于客户端负责告知服务器何时可以计算新帧,因此在继续下一帧之前,客户端有无限的时间进行自己的计算。

Fixed Delta Time

  同步模式的一个重要概念(也可以应用于异步模式)是模拟步数的概念。服务器试图以尽可能快的速度一个接一个地计算帧,但在同步模式下,服务器将无限期地等待,直到客户端允许它继续。这意味着帧之间的时间不一致。因此,我们需要始终定义要在帧之间模拟的时间。这被称为fixed_delta_seconds,这是服务器在帧之间模拟的时间,无论帧需要多长时间。为了与UE4的物理引擎保持一致,我们不应该低于每秒10帧,因此0.1的时间步长是获得正确值的最大值,但较小的值会更好,比如0.05,这意味着(1/20=0.05)每秒20帧。

  对于同步模式,这可能同样重要。默认情况下,fixed_delta_seconds的值设置为0,这意味着生成下一帧所需的时间尽可能少(可能是每秒高帧数),但我们可以在那里指定一个值,然后我们可以实现模拟器能够比实时更快地模拟。例如,如果你的服务器以60 FPS的速度运行,那么你可以用20 FPS的速度进行模拟计算,这样你就可以用1/20的fixed_delta_seconds来决定帧速率,然后每秒钟你模拟3秒,所以你的模拟就像是在快进运动。

  设置模式非常简单。可以使用get_settings()方法从世界检索当前设置。然后您可以更改如下设置:

  • synchronous_mode:启用或禁用此模式的布尔值
  • fixed_delta_seconds:我们想要模拟每一帧的时间,通常计算如下(1/FPS)

  如果您处于同步模式,那么一个客户端将调用tick(),所有其他客户端都需要wait_for_tick()。对于异步模式,所有客户端都将wait_for_tick()。

Future work

  我们需要改进同步模式,让服务器等待所有客户端,直到计算出新的帧。然后,所有客户端都需要执行tick()或wait_for_tick(),让服务器知道它们已经准备好了下一帧。

WorldSnapshot

What is it

  在任何时候,我们都可以得到一个包含当前tick信息的对象,比如它被计算的时间戳,或者该tick处actor的属性。

  这些目标称为worldsnapshot,它是一个特定帧的快照。

  为了知道计算时间,我们有以下属性:

  • id:这是一个指定回合的计数器
  • frame:标识每个帧的计数器
  • frame_count:同上,这是一个遗产属性
  • elapsed_seconds:这是从模拟开始算起的秒数
  • delta_seconds:这是最后一帧的秒数
  • platform_timestamp:这是平台操作系统启动后的秒数

ActorSnapshot

  在worldsnapshot中,我们有一个actorsnapshot列表,每个生成到模拟中的actor对应一个。通过actorsnapshot,我们可以使用方法来检索位置和旋转、线速度和角速度以及加速度。

  这些对所有actor来说都是共同的,但我们也有一个由不同类型actor组成的状态结构:

  • Vehicle
  • Walker
  • TrafficLight
  • TrafficSign

  通过actorsnapshot可访问的属性描述如下:

  • Vehicle
    • control:使用典型的驾驶控制装置控制车辆的基本运动
      • throttle:控制车辆油门的标量值
      • steer:控制车辆转向的标量值
      • brake:控制车辆制动器的标量值
      • hand_brake:决定是否使用手刹
      • reverse:确定车辆是否向后移动
      • manual_gear_shift:确定是否通过手动换档来控制车辆
      • gear:说明车辆运行的档位
    • speed limit:影响该车辆的限速
    • has_traffic_light:影响该车辆的交通灯
    • traffic_light_id:影响该车辆的交通灯号
    • traffic_light_state:影响该车辆的交通灯状态
  • Walker
    • direction:使用全局坐标的向量,该坐标将对应于步行者的方向
    • speed:控制步行者速度的标量值
    • jump:如果为真,步行者将进行跳跃
  • TrafficLight
    • sign_id:openDRIVE中交通灯的id
    • green_time:设置交通灯为绿色的秒数
    • yellow_time:设置交通灯为黄色的秒数
    • red_time:设置交通灯为红色的秒数
    • elapsed_time:更改为不同状态的时间计数器
    • pole_index:标杆的索引,将其标识为交叉口交通灯组的一部分(与openDRIVE相关)
    • time_is_frozen:状态是否被冻结以改变
    • state:当前交通灯状态(红色、黄色、绿色、关闭或未知)
  • TrafficSign
    • sign_id:openDRIVE中交通标志的id

How to get it

  调用wait_for_tick()或get_snapshot()的世界方法时,我们将得到一个worldsnapshot。

  此外,当调用在on_tick()上注册的回调时,将传递一个worldsnapshot的参数。

  获得worldsnapshot后,我们可以使用worldsnapshot对象的find()方法获取actor的快照。我们可以使用has_actor()方法检查是否有actor。

 

API Extensions

Waypoint related functions

  Waypoint表示道路中的一个定向点。允许查询道路信息(例如道路id、车道id等)。next()函数允许沿着交通方向穿过道路。OpenDRIVE抽象来表示道路。

carla.Waypoint

  *.previous(distance):返回车道相反方向上特定距离处的路径点。类似于*.next()但在道路上向后移动。

  *.next_until_lane_end(distance):返回一个路径点列表,直到以距离分隔的车道结束。

  *.previous_until_lane_start(distance):返回一个路径点列表,直到以距离分隔的车道开始。

carla.Map

  *.get_waypoint_xodr(road_id, lane_id, s):从OpenDRIVE参数返回一个路径点。

New class: Junction

New class: Landmark 

相关