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:影响该车辆的交通灯状态
- control:使用典型的驾驶控制装置控制车辆的基本运动
- 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参数返回一个路径点。