引言#
上下文订阅允许从特定的所谓“本车(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 | 双精度浮点数 | 仅返回在给定横向距离内的车辆 | 否 |
互操作性#
虽然上下文订阅过滤器原则上可以组合使用,但请注意并非所有组合都能正常工作(或至少不能按预期工作)。 这是因为过滤器的一个子类(见上表最后一列“是否使用上下文范围”)不是在上下文订阅范围内收集的对象集合上操作,而是在由其各自过滤器参数定义的对象集合上操作。 因此,例如,视野范围过滤器和横向距离过滤器的组合是不可行的。
客户端库方法#
- 在 python 库 中,所有域都支持方法 subscribeContext 和 unsubscribeContext
- 对于 python 客户端,包含了多种为车辆到车辆上下文订阅添加上下文过滤器的方法。
- 在 C++ 库 中,方法 simulation.subscribeContext 接受一个额外的参数,该参数对源域进行编码。
注意事项#
- 当查询“兴趣点”和“多边形”域时,当前版本不支持在使用 TraCI 更改其位置后查询这些结构体。
