• 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 

  • 相关阅读:
    Linux curl命令详解
    php技能树---大神的进阶之路
    PHP Socket 编程之9个主要函数的使用之测试案例
    史上最全的PHP正则表达式
    php 简单使用redis 队列示例
    PHP中使用 Memcached 的测试案例
    机动车驾驶(1)--- 禁令标志汇总 by John
    闵可夫斯基和(Mincowsky sum)
    二维平面上判断点是否在三角形内
    计算任意多边形的面积
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/16195031.html
Copyright © 2020-2023  润新知