对象上下文订阅

引言#

上下文订阅允许从特定的所谓“本车(EGO)”对象周围的对象中获取特定值。利用这些数据,可以确定该本车对象周围的交通状况。这种本车对象可以是任何可能的车辆、感应线圈、兴趣点(POI)等。例如,在城市中行驶的车辆周围会有很多不同且不断变化的车辆、车道、交叉路口或沿途的兴趣点。上下文订阅可以提供本车对象一定范围内这些对象的选定变量。

Note

当查询本车对象的域时,本车对象本身会包含在上下文订阅结果中(例如,车辆始终在自身范围内的所有车辆集合中)。

使用“Subscribe ... Context”命令(0x80-0x8e)启动对结构体上下文的订阅。该命令在请求时立即进行评估,以此进行验证。它返回一个“Subscribe ... Context”响应(0x90-0x9e)。如果本车是车辆,一旦该车辆离开仿真,订阅就会被取消调度。

一旦订阅被接受,它将在每次调用 仿真步进(2) 命令后执行。

命令 ID 描述了作为上下文中心的本车对象的类型;目前支持以下本车对象:

类型 命令 ID
车辆 (vehicles) 0x84
行人 (persons) 0x8e
车道 (lanes) 0x83
边 (edges) 0x8a
交叉路口 (junctions) 0x89
兴趣点 (points of interest) 0x87
多边形 (polygons) 0x88
公交站点 (bus stops) 0x8f
充电站 (charging stations) 0x05
停车区域 (parking areas) 0x04
校准器 (calibrators) 0x07
感应线圈 (inductive loops) 0x80
车道区域检测器 (lane area detectors) 0x8d
多入口出口检测器 (multi entry exit detectors) 0x81

对于给定的本车结构体,每个订阅允许多个特定类型的结构体变量。这意味着,如果有一个本车车辆,你可以询问本车范围内的车辆的速度和位置。如果你还需要关于周围兴趣点的信息,你必须为兴趣点添加一个额外的上下文订阅。车辆和兴趣点属于不同的“上下文域”。以下是可用的域:

类型 上下文域 ID 备注
车辆 (vehicles) 0xa4 可检索变量
行人 (persons) 0xae 可检索变量
车道 (lanes) 0xa3 可检索变量
边 (edges) 0xaa 可检索变量
交叉路口 (junctions) 0xa9 可检索变量
兴趣点 (points of interest) 0xa7 可检索变量
多边形 (polygons) 0xa8 可检索变量
公交站点 (bus stops) 0xaf 可检索变量
充电站 (charging stations) 0x25 可检索变量
停车区域 (parking areas) 0x24 可检索变量
校准器 (calibrators) 0x27 可检索变量
感应线圈 (inductive loops) 0xa0 可检索变量
车道区域检测器 (lane area detectors) 0xad 可检索变量

对于每个域,可以检索与使用 Get ... Variable 命令相同的变量(见上文)。

命令 0x8X: Subscribe ... Context#

时间 时间 字符串 字节 双精度浮点数 字节 字节[n]
开始时间 结束时间 对象 ID 上下文域 上下文范围 变量数量 要返回的变量列表

一些注意事项:

  • 开始时间:订阅仅在时间步长 >= 此值时执行;单位为秒
  • 结束时间:订阅在时间步长 \<= 此值时执行;如果仿真达到更高的时间步长,则订阅被移除;单位为秒
  • 上下文域:要从中请求值的寻址对象周围对象的类型
  • 上下文范围:周围环境的半径(忽略第三维度!);单位为米
  • 变量列表的大小必须等于“变量数量”字段。

响应 0x9X: ... Subscription Response#

字符串 字节 字节 整型 字符串 字节 字节 字节 <返回类型> ... 字节 字节 字节 <返回类型> ... 字符串 字节 字节 字节 <返回类型> ... 字节 字节 字节 <返回类型>
对象 ID 上下文域 变量数量 对象数量 对象 #1 ID 对象 #1 / 变量 #1 Id 对象 #1 / 变量 #1 状态 对象 #1 / 变量 #1 的返回类型 对象 #1 / <值#1> ... 对象 #1 / 变量 #n Id 对象 #1 / 变量 #n 状态 对象 #1 / 变量 #n 的返回类型 对象 #1 / <值#n> ... 对象 #m ID 对象 #m / 变量 #1 Id 对象 #m / 变量 #1 状态 对象 #m / 变量 #1 的返回类型 对象 #m / <值#1> ... 对象 #m / 变量 #n Id 对象 #m / 变量 #n 状态 对象 #m / 变量 #n 的返回类型 对象 #m / <值#n>

"Subscribe ... Variable" 的响应。

如果变量可以成功检索,状态为 0x00 (RTYPE_OK)。否则,状态为 0xff (RTYPE_ERR)。在第二种情况下,变量类型被设置为字符串,变量值包含错误消息。请注意,在所有情况下状态都应该是 ok。

  • 变量数量 是每个对象返回的变量数
  • 对象数量 是范围内的对象数

这意味着返回 n*m 个值(变量数量 * 对象数量)。

命令 0x7E: Add Context Subscription Filter#

字节 [字节] [双精度浮点数/字节列表/字符串列表]
过滤器类型 参数类型 参数值

添加上下文订阅过滤器时,它将应用于最近创建的车辆上下文订阅(命令 ID 0x84)。

Note

上下文订阅过滤器仅支持类型为 'vehicle' 的本车对象。

目前,已实现以下上下文订阅过滤器类型:

过滤器名称 过滤器类型 参数值 描述 是否使用上下文范围
lanes 0x01 字节列表 仅返回相对于本车车辆的指定车道列表上的车辆
no-opposite 0x02 - 排除对向车道(及其他车道)上的车辆
downstream distance 0x03 双精度浮点数 仅返回在给定下游距离内的车辆
upstream distance 0x04 双精度浮点数 仅返回在给定最大上游距离内的车辆
leader/follower 0x05 - 仅返回指定车道上的前导车和跟随车(需要 'lanes' 过滤器)
turn 0x07 - 仅返回即将到达的交叉路口上的冲突车辆
vClass 0x08 字符串列表 仅返回给定车辆等级 (vClass) 的车辆
vType 0x09 字符串列表 仅返回给定车辆类型 (vType) 的车辆
field of vision 0x0A 双精度浮点数 仅返回视野范围内的车辆(角度单位为度)
lateral distance 0x0B 双精度浮点数 仅返回在给定横向距离内的车辆

互操作性#

虽然上下文订阅过滤器原则上可以组合使用,但请注意并非所有组合都能正常工作(或至少不能按预期工作)。 这是因为过滤器的一个子类(见上表最后一列“是否使用上下文范围”)不是在上下文订阅范围内收集的对象集合上操作,而是在由其各自过滤器参数定义的对象集合上操作。 因此,例如,视野范围过滤器和横向距离过滤器的组合是不可行的。

客户端库方法#

注意事项#

  • 当查询“兴趣点”和“多边形”域时,当前版本不支持在使用 TraCI 更改其位置后查询这些结构体。