网络转储(也称为 netstate 输出 或 netstate dump)是 SUMO 中实现的第一个输出功能。它包含每个车道、每辆车以及每个仿真步的详细信息。由于其高详细程度,它非常灵活,但通常需要额外的编程来解析和过滤实际所需的信息。Simulation/Output/FCDOutput 具有类似的详细程度,但不会根据车辆所在的车道对其进行分组。
在仿真中实例化#
要强制 SUMO 构建包含网络转储的文件,请在命令行(或配置)参数中添加 --netstate-dump <FILE>(或 --ndump <FILE> 或 --netstate <FILE>)。
或者,将该选项添加到配置文件中,例如:
<output>
<netstate-dump value="<FILE>" />
</output>
<FILE> 是输出将写入的文件名。任何同名的其他文件都将被覆盖,目标文件夹必须存在。
生成的输出#
网络转储是一个 xml 文件,包含每个仿真步中网络的每条车道上的所有车辆。对于每辆车,都会写入其名称、速度及其在各自车道上的位置。一个原始转储文件如下所示:
<netstate>
<timestep time="<TIME_STEP>">
<edge id="<EDGE_ID>">
<lane id="<LANE_ID>">
<vehicle id="<VEHICLE_ID>" pos="<VEH_POSITION>" speed="<VEH_SPEED>"/>
... 如果该车道上还有更多车辆 ...
</lane>
... 如果该车道还有更多车道 ...
... 如果当前该车道上有处于活动状态的人员或容器,则可选
<person id="<ID>" pos="<OFFSET_FROM_EDGE_BEGIN>" speed="<SPEED>"/>
...
<container id="<ID>" pos="<OFFSET_FROM_EDGE_BEGIN>" speed="<SPEED>"/>
...
</edge>
... 更多车道 ....
</timestep>
... 下一个仿真步 ...
</netstate>
Note
如果人员或容器在车辆内运输,它们将作为该车辆的子元素写入,而不是作为车道的子元素。
写入值的含义如下表所示。
| 名称 | 类型 | 描述 |
|---|---|---|
| time | (仿真) 秒 | 该 timestep 元素中描述的值对应的时间步 |
| id | id | 车道/车辆的 id |
| pos | m | 在描述的时间步内,车辆在车道上的位置(前保险杠距离车道起点的距离) |
| speed | m/s | 在描述的时间步内,车辆的速度 |
| posLat | m | 距离车道中心的偏移量(仅在使用子车道模型时) |
| personNumber | # | 车辆内人员的数量(不适用于 MESO) |
| containerNumber | # | 车辆内容器的数量(不适用于 MESO) |
| stage | string | 当前阶段的描述(仅适用于人员和容器) |
附加选项#
选项 --netstate-dump.precision <INT> 控制在将位置和速度写入输出文件时的有效数字位数。选项 --netstate-dump.empty-edges <BOOL> 控制是否在输出中包含没有车辆的车道。
注意事项#
正如您可能想象的那样,这种输出非常冗长。它的主要缺点是生成文件的大小。很容易在几分钟内生成几个 GB 大小的文件。当然,可以编写一些很好的工具来解析该文件(使用 SAX 解析器)并生成一些有意义的信息,但我们不知道有谁做过这件事。另一个问题是,当必须写入如此大量的数据时,仿真的执行速度当然会下降。
通常,即使车道上没有车辆,也会写入所有车道。您可以使用布尔开关 --netstate-dump.empty-edges 更改此行为。在这种情况下,只会写入包含车辆的车道。
