车辆沿路前进时,路线决定方向,前车影响速度,路口和信号决定何时通行。遇到阻塞后,车辆还要保留当前任务,等条件解除再继续。本文按一帧的处理顺序,说明各模块读取的数据、作出决策的依据,以及执行结果如何反馈到下一帧。
本篇承接城市交通运行时(上)与城市交通运行时(下),整理截至 2026 年 10 月 11 日的 UE5 原型与演示。讨论范围包括有向路网、短路线窗口、前车感知、跟车与换道、路口许可、信号权限、局部车流维护,以及一组真实驾驶员参与的物理车队实验。各项实验沿用原有道路几何和已编译路网,分别录制对应机制。
这批材料包含两种执行路径。大部分短片使用路线/Actor 执行(非物理车辆),车辆沿已验证的路线更新位置;长时车队片段使用真实 Ped(驾驶员实体)与物理车辆。34 个路线/Actor 槽位与峰值 6 辆的物理车队是不同实验。 两者的数量和验证结果分开列出。
全文配有 12 段独立视频,分别展示各项机制的状态变化。影片中的道路和车辆来自真实 PIE 视口;部分文字、地图和信号圆点根据运行记录叠加。不同实验之间存在场景重置,物理长时片段还包含明确跳切,不能把这些短片理解为同一次连续的全城模拟。
交通画面中的运行时状态
先看一个规模稍大的局部场景:2 辆演示车与 32 辆环境车同时存在。车辆在道路上持续移动,画面侧边显示全车分布、路线和逐车状态。要解释其中一辆车为何减速或停车,可以将画面与它的路线、感知输入和等待原因对照。
视频 1|局部车流与生命周期,60.03 秒。先看左侧实景编号,再与右侧地图和下方名单对应。紫色连接线表示旧路线释放、新路线建立的替换事件,不表示同一辆车瞬移。34 个槽位采用路线/Actor 执行。具体维护规则见后文。
关注同一个编号时,可以依次检查四件事:它当前使用哪个 route ID,正在沿哪一段有向链接行驶,驾驶状态是否处于跟车或等待,以及路线窗口有没有成功续接。槽位编号保持不变而 route ID 改变,说明这个槽位中的环境车已经替换;route ID 不变、目标节点前进,则属于同一条持续路线的执行。
独立的观察者负责切换镜头、刷新名单和缩放地图,只读取已发布的运行状态,不改变车辆的车道、路线或通行权。车辆停住时,记录应能指出原因:前车、障碍、路口、邻道间隙,或预测冲突。观察者不会为了演示而暂停车辆运动。
本文结合三类材料:参考引擎源码中的职责和更新顺序、UE 项目的具体计算,以及同轮视频、逐帧 CSV 和日志中的执行结果。某个机制在源码中存在,不代表当前短片执行了它;短片显示车辆通过,也不能独自证明所有输入和安全条件都正确。

图 1|机制示意:路网与路线、感知、驾驶任务、通行权限和执行反馈分别保留自己的状态。观察者读取发布结果,不参与驾驶决策。
一帧中的数据传递
路网运行时先提供当前有向链接、车道和未来路线。感知层结合车辆姿态、车体边界与路线收集前车、邻道车辆、静态障碍和预测冲突。驾驶任务用这些输入更新持续状态,提出目标速度、行进距离或换道请求。随后,路口、信号、同车道队列和执行层的安全检查共同限制这次请求。实际执行结果再反馈到下一帧。
驾驶任务提出的行驶距离可能超过执行器允许的距离,换道请求也需要经过候选路线检查。请求被拒绝时,旧状态和拒绝原因都要保留。因此 HUD 除了目标速度,还需要显示实际进度、许可和执行限制,才能解释车辆为何移动或停留。
| 状态 | 主要负责者 | 本帧提供的内容 | 不能由它代替的判断 |
|---|---|---|---|
| 道路与车道关系 | 路网运行时 | 有向连接、车道数、连接限制 | 当前前车与碰撞结果 |
| 路线与节点进度 | 路线运行时 | 当前段、目标节点、未来窗口、必选车道 | 本帧移动距离是否安全 |
| 环境观察 | 感知层 | 前后间距、速度、障碍和预测冲突 | 谁应获得路口通行权 |
| 持续驾驶状态 | 驾驶任务 | 目标速度、等待计时、换道请求 | 路线候选是否可以提交 |
| 局部通行资格 | 路口与信号运行时 | 入口权限、冲突关系、占用与释放 | 车体沿路径一定无障碍 |
| 执行结果 | 路线或物理执行器 | 实际进度、姿态、限制与反馈 | 城市级人口分配策略 |
| 可视化与记录 | 观察者 | 已发布状态、镜头、CSV、视频说明层 | 修改路线、许可或驾驶状态 |
这个分工保留了参考机制中的状态所有权与更新顺序。在 UE 中,这些职责分别由 Subsystem、Actor、Canvas 和碰撞查询实现。接口仍需明确各自持有的状态,避免一个每帧 Tick 的 Actor 同时管理全部交通逻辑。
有向路网与不断前移的短路线窗口
两段道路在几何上相连,车辆是否能够通行,还取决于方向和车道连接。运行时读取的是已经编译的 Region、Node、Link 和 Lane 数据:Region 组织数据,Node 提供位置与连接端点,Link 表示有向可达关系,Lane 提供该方向可使用的车道。道路材质和标线帮助玩家理解场景,车辆的逻辑连通性则来自这份路网。
确定下一步路线时,需要同时知道车辆从哪条链接进入、当前所在车道,以及能否驶向下一节点。分支、路口、车道数量变化和门户连接都会影响后续选择。仅按“离当前位置最近的道路点”推进,容易在相邻道路、对向车道或高低道路之间产生错误连接。
路线窗口保存当前段与后续节点
短路线窗口保存车辆接下来要经过的节点、链接与车道点。车辆当前位于一个已提交路段,沿该段积累进度;越过目标点后,目标节点继续前移。未来计划接近耗尽时,路线运行时尝试延长窗口,而不是重建当前车辆身份或从出生点重新寻路。
当前原型通常为环境车请求约 12 个未来节点,在剩余计划节点不超过 4 个时尝试续接。这些是原型的规划长度和触发阈值,不是参考引擎的统一常量。车辆保留当前状态,逐步补齐后续路线,不必每帧重新搜索完整城市路线。

图 2|机制示意:当前链接和段内进度保留,未来路线先构造候选,检查成功后提交;失败时不把空候选覆盖到旧路线。图中节点为教学编号。
当前续接实现先复制路线状态,在候选中补齐精确链接索引,再按尾部的实际车道和进入链接搜索后续。如果缺少有效连接,或后续窗口无法构造,函数返回失败。成功时才把新节点及链接追加到候选中。历史窗口压缩还要同步调整换道完成索引,避免节点数组缩短后把一次尚未结束的换道误判为完成。
此时车辆可能仍在换道,或已确定从某个路口出口离开。若窗口续接时只保留节点坐标、丢失原车道与执行索引,下一帧就可能从错误车道继续,甚至重新接受一个互相冲突的横移请求。
视频 2|有向路网与短路线窗口,8.87 秒。红车是观察对象,黄色标出当前目标,青色标出后续路线与方向。依次观察目标从 2418 更新到 2419、2420,同时车辆继续沿原路段前进。此片展示车辆沿已编译路段推进,不展示离线路网生成。
两次目标切换均有状态记录,实验中未出现路线续接失败。该结果验证了指定路段上的窗口推进,尚未覆盖全部路口、所有跨区域连接或任意目的地寻路。
更新未来路线时保留当前执行状态
参考巡航机制分别处理未来路线替换、当前车道和位置反馈。项目沿用这一划分:候选提交后可以改变后续节点,车辆当前的姿态和段内进度则继续保留。检查候选时还需要考虑已经提交的路口运动、换道和占用约束。
遇到障碍时,也要保留这种区分。车辆可以沿原路线制动等待,或通过重规划入口提交合法替代路线。这些操作延续同一辆车的任务;若将整个环境实例释放后重新生成,则属于人口替换,需要另行记录,不能算作这辆车成功绕障。
前车感知与跟车速度怎样计算
判断一辆车是否在前方,需要结合自身路线和实际行驶方向。隔壁车道上的车可能在画面上更近,弯道外侧车辆可能与自身 XY 距离很小,后车也可能出现在未来路线回环附近。只用两车中心的欧氏距离,无法正确区分这些情况。
当前前车查询先检查候选身份、车体边界、朝向、距离和相对高度,再沿自身未来路线逐段测试候选车体。路线段穿过候选包围范围且方向符合条件时,才形成前车观察,并输出沿路径的间距和投影速度。这里的具体包围盒扩展和方向阈值属于 UE 项目实现,不能据此宣称完整参考 scanner 已被复现。
路径间距与车体净空的定义
源码中的观察量包含中心沿路径距离,也使用自身前端、对方后端和局部车体边界做资格检查。距离以米进入驾驶计算,而世界坐标部分以厘米存储。教学公式中的 gap 统一表示传给驾驶任务的间距观察,不将它直接解释为车头到车尾的净空。使用不同定义的距离时,静止间距与车体尺寸也必须相应匹配。
这类单位和语义错误很容易被最终画面掩盖。车辆看起来仍然在减速,但如果感知层传的是中心距、控制器却按保险杠净距理解,停止位置和跟车距离就会系统性偏移。排查时应先固定一辆车、一个前车和同帧路线点,确认传递的数据含义,再调整参数。
检测到前车后,驾驶任务结合当前速度和驾驶档位计算期望间距,再根据实际间距与前车速度调整目标。当前原型的期望间距可写成:
desiredGap = standstillGap + currentSpeed × followingTime
closingSpeed = max(0, currentSpeed − leaderSpeed)
brakingGap = standstillGap
+ closingSpeed² / (2 × deceleration)
+ closingSpeed × dt
其中,standstillGap 是静止时保留的间距基准;跟车时还会与执行队列要求的最小值取较大者。followingTime 把速度转换成时间头距,速度越高,期望间距越大。closingSpeed 只保留自身比前车快的部分,最后一项计入本次更新期间继续接近的距离。
这些公式来自当前项目控制器。实现沿用了参考机制中对前车身份、相对运动和速度限制的区分,具体采用时间头距反馈与制动包络;公式和参数不等同于参考引擎。

图 3|教学示意:间距不足时,目标速度围绕前车速度下降;期望间距处趋向速度匹配。公式旁的数字用于演算,不是视频逐帧测量值。
速度匹配比持续接近更稳定
前车正在移动且尚未进入必须停车的距离时,当前控制器使用:
targetSpeed = clamp(
leaderSpeed + (gap − desiredGap) / max(0.5, followingTime),
0, cruiseSpeed
)
这条反馈的平衡点是 gap = desiredGap:后车的目标速度等于前车速度。间距大于期望值时,可以适当追近;小于期望值时,目标速度低于前车,让间距恢复。若在期望间距处仍继续加速接近,下游队列就会反复强制停车,画面表现为不必要的启停。
以一组教学数值为例:自身速度为 10 m/s,前车速度为 8 m/s,静止间距取 5 m,时间头距取 1.5 s。期望间距为 20 m;实际观察间距为 17 m 时,上式给出的目标速度为 6 m/s。这个值是当前帧的目标,不代表速度立刻从 10 变成 6。
任务还会用制动包络限制目标,并按加减速度逐步接近目标速度。路线执行器根据旧速度与新速度的平均值计算本帧请求距离:
newSpeed = approach(previousSpeed, targetSpeed, rate × dt)
requestedDistance = (previousSpeed + newSpeed) × 0.5 × dt
队列、通行权限和执行层的安全检查还可能缩短本帧移动距离。记录时应分别保留目标速度、驾驶任务中的速度、实际路线进度和物理车实测速度,以便判断限制发生在哪一层。
视频 3|跟车与减速,6.03 秒。观察红车与蓝色前车的间距和红车速度一同下降。该连续区间内,间距由约 23.9 m 降到 12.8 m,速度由约 28.2 km/h 降到 12.4 km/h。它展示本轮路线执行下的跟车响应。
此片选自一次 18 秒的跟车实验,车辆持续处于跟车状态,未出现续路失败。视频用于观察减速过程,运行记录用于核对控制器当时收到的输入;短片只展示其中一段。
可选换道:请求、接受与完成是三个时刻
前车变慢可以触发换道意愿,但意愿并不等于执行许可。驾驶任务先确认道路允许换道,当前没有尚未完成的横移,路口权限没有禁止,且档位的等待时间和冷却条件满足。再评估邻道前方的通行情况,并检查前后间隙。
邻道判断尤其需要后方信息。邻道前方空旷,而后车正在快速接近,横移仍可能危险。当前实现将后车相对接近速度乘以前视时间,加入后方所需间距;同时保留车体长度项。它没有把纵向巡航所需的整个头距直接搬成横向换道阈值。
当前可选换道分支的间距条件可以概括为:
frontRequired = 2 × selfFrontExtent + 1
rearClosing = max(0, rearSpeed + rearAllowance − currentSpeed)
rearRequired = max(
2 × selfFrontExtent,
selfRearExtent + rearHalfLength + rearClosing × rearLookAheadTime
)
这里的前后 gap 是邻道观察中的中心间距。前方阈值直接使用自身前端尺寸的两倍,没有显式读取前车半长,这是当前原型的简化策略。在两车纵向尺寸相同、前后半长对称时,这一尺寸项等价于两车半长之和;尺寸不同或车体不对称时不能这样解释。额外的 1 m 为项目安全余量。只有观察有效、目标确为相邻车道,且已观察到的前后车辆满足要求时,这一层检查才通过。没有前车或后车,不等于可以跳过整条路线的可达性与占用检查。

图 4|机制示意:驾驶意愿、邻道资格、候选路线提交和完成反馈分别发生。被拒绝的候选不覆盖当前路线;计数增加也不直接等于车体已经完成横移。
跨节点的邻道车辆查询
早期实现只在同一条链接内查找邻道车辆。当一辆邻车刚跨过节点时,两车仍然相邻,链接编号却已不同。这时若将它从观察中排除,系统就可能误以为横移空间已经足够。
当前适配会沿方向连续、容量一致的普通走廊查询邻道,最大读取约 50 m、最多 32 条已编译链接。遇到路口、分支、门户、车道容量或宽度变化、缺失连接等条件则停止。50 m 和 32 条是项目的查询预算。是否继续向前查询,取决于路网中的连续关系;两个车体 XY 接近不足以说明它们位于同一条走廊。
换道计数与完成反馈
驾驶请求提出后,路线执行器还要构造候选并做占用与安全检查。候选提交成功后,车体才按执行路径逐步横移;到达完成条件后,车道索引和任务中的请求状态再更新。并行发生的路线窗口压缩也必须维护完成索引。
视频 4|受约束换道,5.03 秒。依次观察换道计数、红车横移、车道索引变化和从前车侧面通过。这个片段与跟车片段之间重置了场景,不是同一辆车自然接续的后续事件。
原始记录中,全局第 622 帧换道计数已为 1,第 668 帧车道索引才由 1 变为 0,第 700 帧能看到红车在蓝车左侧通过。计数增加只表明决策状态发生了变化。确认换道完成,还要检查车道索引、车体位置和执行反馈。
本轮完整换道实验运行 18 秒,记录 1 次换道、0 次续路失败。该实验验证了指定路段和车辆布置下的可选换道,尚未覆盖其他超车策略或完整的物理并线协议。
必选车道与可选超车的职责
可选换道是在当前路线仍可继续时,尝试改善速度或避开前方阻碍。必选车道则来自未来路线约束:前方道路从三车道缩为两车道,当前外侧车道不能按原编号直接延续,路线需要提前给出目标车道。
两者可以共用部分间隙和执行检查,但不能共用同一个意图来源。若必选车道被放进可选超车的冷却或“此刻能否立即横移”判断中,车辆可能直到缩口前才发现应当并线。参考路线机制把 required-lane 保存在路线点并提前传播,供后续目标计算读取;当前 UE 实现沿用这一职责。
先保留路线意图,再判断何时能够执行
项目入口向前查看约 100 m 的路线,发现经核验的三变二转换时,为外侧车道 2 给出目标车道 1 及剩余距离。它只是报告未来约束,不直接移动车辆,也不修改道路图。100 m、车道 2 到 1 的映射和具体缩口标记,都是当前项目的配置。
必选意图存在后,可选超车冷却不应将它删除。不过,绕过冷却不代表绕过安全检查。邻道有车时仍要保留目标,等待前后空隙,再由候选路线占用检查、提交资格和最终移动保护决定能否开始。候选被拒绝时,车辆继续使用旧路线和制动状态,下一帧可以重新评估。
两个代码分支在这里有所不同:可选换道辅助函数直接检查当前横移间隙;按参考机制组织的 required-lane 路径先保留路线意图,再由下游检查整条候选路径能否安全提交。这一区别需要在调用接口中保留。
多节点横移解决短链接上的提交问题
原地图一个缩口前约有 32.166 m 可用距离,但每段只有约 3 m。旧单段横移条件要求至少 8 m,每次只看当前短段,就可能连续拒绝所有提前并线。道路总长度足够,局部接口却没有表达跨节点动作的能力。
当前路线执行适配器使用约 15 m 的多节点平滑横移,从测量得到的段内位置开始构造候选。第一段的横向变化约为 0.220 m,随后沿原路线节点继续过渡。候选整体通过占用检查后再提交;动作期间禁止嵌套换道和局部重规划,历史压缩同步调整结束索引,源车道的所有权保留到规定完成点。
这些处理解决的是路线执行器的数据连续性。15 m 不应被解释成所有车型都适用的物理并线长度,也不能因为路线点平滑,就推出真实车体在任意速度、轮胎条件和坡度下都能完成相同动作。
视频 5|必选车道与邻道空隙,17.47 秒。影片包含两场重置实验:先看单车提前由外侧车道 2 并入车道 1,再看邻道有车时等待空隙。道路方向箭头和车道调试层保留。两场均使用路线/Actor 执行,不是 Chaos 必选并线验收。
本次分别测试了单车提前并线,以及邻道有车时等待空隙。两场实验都完成了并线,出口车道均为 1,记录中未出现车体重叠;双车场景还记录到了等待邻道空隙的过程。
此前完整测试还包含密集车流和下游队列两类情况,本轮视频只录制了前两场。这 17 秒片段对应本轮两场实验,另外两类仍以先前测试记录为准。另一条物理执行路径当时明确拒绝此多节点协议,如何根据实测姿态确认动作完成、何时允许开始,以及怎样交接安全约束,仍需单独实现和验证。
路口许可、占用与信号相位
信号转绿、获得路口许可和驶入冲突区,发生在不同阶段。绿灯允许对应方向通行,局部路口还需检查其他运动与占用。车辆实际驶入后,才记为已进入的参与者。这些状态若共用一个布尔值,就难以判断车辆为何等待、许可何时可以撤回,以及占用何时能够释放。
项目用局部路口运行时维护参与者、入口/出口意图、许可和清空后释放。感知、跟车与物理运动仍由各自层处理。当前演示控制区是可替换的局部适配,并非完整参考引擎的全部入口和运动冲突矩阵;视频证明的是这组已绑定路线上的状态转换。

图 5|机制示意:未进入的许可可以重新评估,已提交占用需要等车辆清空后释放。无冲突运动可以并行,存在冲突时等待前一占用解除;图中关系为教学示意。
无冲突车辆可以同时获得许可
两条运动在当前局部规则下不冲突时,可以同时持有许可,各自通过路口,再分别释放占用。检验这种并行行为,应看车辆所属控制区、许可身份和清空状态,不能仅凭两辆车画面接近就认定它们在冲突区互相穿越。
视频 6|局部路口并行许可,6.53 秒。红车和蓝车在同一控制区同时持有许可,沿各自路线通过;离开后该区许可归零。本轮没有停车让行,也没有信号相位变化。
完整实验记录到两车同时持有许可、通过并清空控制区,期间未发生停车等待。该结果只对应本轮无冲突运动组合,其他入口组合和冲突关系需要另行测试。
冲突让行需要真实发生等待
另一轮实验专门设置汇入冲突:蓝车沿支路到达控制区,红车正在通过相关运动段。蓝车因通行权约束停车,待冲突解除、获得许可后再驶出。这里应观察等待原因、许可和速度的对应变化,而不只看车辆停住了几秒。
视频 7|路口冲突让行,6.70 秒。先看蓝车停在汇入前,再看红车通过,最后观察蓝车获准并恢复行驶。这是独立 PIE,不能与上一段并行许可拼成同一轮实验。
完整实验记录到蓝车等待红车通过,获准后恢复行驶,两车随后清空控制区。记录中未出现冲突运动同时获准的情况;短片展示其中的等待与放行过程。
拥堵时尤其需要区分尚未进入车辆的许可与已经进入车辆的占用。已进入的车没有清空时,不能仅因等待过久就删除它的占用,否则后车可能被授予一项与真实车体冲突的权限。超时可以触发诊断或受控恢复,但占用仍应按实际清空情况释放。
信号权限还需要入口元数据
信号运行时有相位,并不代表保存的地图中所有道路都已绑定信号节点。当前保存的路网没有永久信号入口;为演示车辆如何按信号权限通行,在 PIE 前将指定节点临时标成入口,运行后恢复内存标记,没有保存地图和路网资产。
相位周期由当前项目的车辆人口 Actor 持有,再向路网发布相关组的权限。这是当前原型的模块安排。车辆根据对应入口的权限判断能否通行;画面里的彩色圆点只按真实相位绘制,并不是场景中已经存在的实体灯具。
视频 8|信号相位与停车放行,9.03 秒。观察红相位停车、全红清空、目标方向绿相位和重新起步。圆点是状态说明层;入口元数据为 PIE 临时配置。本片不证明永久灯位、灯具或全城配时已完成。
完整实验记录到红相位停车,以及绿相位后的起步。测试后恢复了临时入口标记,并确认保存的路网资产未被修改。入口检查与资产核对用于确认实验条件,不能代替信号算法验证。
即使目标方向允许通行,前方队列和障碍仍可能限制行驶。信号相位与前车、下游空间、局部许可共同约束车辆通行。若车辆绿灯时没有起步,应检查前车、下游空间和局部许可,而不是先把等待一律归为信号错误;反过来,红灯时车辆越线,也要确认入口绑定、停止距离和本帧执行限制是否一致。
等待与恢复:保留任务,也保留阻塞来源
同样是 0 km/h,停车原因可能是前车停住、静态障碍、路口尚未授予许可、邻道无空隙、预测冲突,或已经发生车体接触。不同原因决定何时可以恢复,也决定哪一层有权改变状态。
当前项目保留 TrafficHoldReason,用于把这些原因带到发布快照和 CSV。枚举用于归类,前车 ID、冲突车辆、路口参与关系和感知距离则保留判断依据。原因变化时,可以结合目标速度和执行限制检查状态切换是否合理。
| 等待原因 | 需要复查的事实 | 恢复条件的来源 |
|---|---|---|
| 前车限制 | 前车身份、路径间距、投影速度 | 同帧感知与驾驶反馈 |
| 静态障碍 | 碰撞体、查询路径、检测距离 | 障碍变化或明确重规划结果 |
| 路口权限 | 当前入口、冲突占用、许可状态 | 路口运行时重新评估 |
| 邻道间隙 | 目标车道、前后车辆与候选路径 | 间隙和提交资格满足 |
| 预测车辆冲突 | 冲突对象、预测时间及方向 | 新观察不再要求相同速度限制 |
| 车体接触或移动边界 | 实际车体与允许距离 | 执行层的明确安全反馈 |
条件解除后继续原路线
阻塞等待实验展示预测冲突导致车辆停车,条件变化后继续加速。驾驶任务持续存在,路线和身份没有因为等待而被重置。观察恢复时,应同时确认速度重新增加、路线进度继续和等待状态解除。
视频 9|阻塞等待与恢复,7.03 秒。红车先停等,再重新起步。完整实验使用预测冲突与执行约束形成等待;片段展示恢复过程,不是观察者定时暂停和播放车辆动画。它与跟车、换道实验之间各自重置场景。
该实验完整运行 21 秒,记录到阻塞等待、条件解除和恢复行驶,未出现路线续接失败。跟车、换道与阻塞恢复分别进行实验,发布短片也保留了各自的场景边界。
静态障碍停车与主动绕障分开验收
静态障碍实验在道路上临时放置一个真实碰撞体。车辆感知到它后停车,第 8 模拟秒移除障碍,车辆恢复。为了隔离这条纵向路径,实验暂时关闭可选换道。这个设置使停车原因更明确,也决定了本片不能用来证明主动绕障。
视频 10|静态障碍停车与恢复,14.00 秒。白色碰撞体真实参与感知,红车进入静态障碍等待;障碍移除后继续行驶。本实验关闭可选换道,只证明停车和恢复,不证明绕行或物理碰撞响应。
完整实验记录到静态障碍等待与移除后的恢复,临时 Actor 和设置在 PIE 后恢复。使用真实碰撞体验证了感知入口;球形 sweep、完整车体扫掠和物理接触仍需分别检查。
对于没有解除的障碍,等待本身不等于错误。需要诊断它是否合理阻止进入、未来路线是否仍可用,以及有没有明确实现的重规划策略。原型已有静态阻塞后的局部路线替换记录,但相关候选次数、重试间隔和检测体积属于项目恢复政策,本次短片未执行完整主动绕障,因此这项能力仍以另外的实验为准。

图 6|机制示意:观察与权限产生阻塞,持续任务保留路线;条件解除后重新评估并执行。只有原条件解除或合法替代方案提交,才能恢复相应动作,观察者和超时提示不直接改变通行事实。
预测方向与后续修复也有版本边界
参考机制对普通减速使用的方向,以及避让改变后使用的替代方向有明确区别。源码阅读记录将“普通情况下的实际行驶方向与部分转角”同“避让后的目标方向”分开。若一律使用最终目标点方向,弯道上的前后资格和预测矩形可能与真实运动不一致。
项目对这项机制保留了显式能力分支。其修复过程曾出现“车辆最终都退出,但仍记录到接触帧”的运行。因此,完成退出数不能单独充当零接触验收。后续专门的六车实验记录为零接触,也只对应那次测试配置和指定路段,不能据此宣称所有能力分支、原有拥堵现场和任意路线都已修复。
这次失败暴露了退出计数与接触检查之间的差别。方向、路线意图、候选提交和真实车体接触分别属于不同问题。改变其中一个条件,即使最终画面变得流畅,也仍需检查同一轮日志中的安全指标。
局部车流的生成、续路与回收
开头的 34 槽位场景由 2 辆演示车和目标 32 辆环境车组成。演示车提供持续观察对象,环境车用于形成局部交通密度。两者生命周期不同:环境车可以按策略回收补充,关注车的路线连续性不能用这种替换来掩盖。
人口维护先解决数量和合法出生位置,驾驶系统随后决定每辆已存在车辆如何移动。数量目标不能直接推导车速、路口许可或可用间隙。32 辆环境车即使全部成功生成,也可能因为道路范围和通行条件而形成拥堵,因此人口与交通行为需要分别记录。
出生位置通过路网与占用条件筛选
当前项目在第一辆演示车周围寻找环境车入口。初次候选距离约为 35–300 m,后续补充约为 90–300 m,并检查高度差、合法有向车道、车体占用、跟车间距、路口出生保护区和可见保护范围。初次尝试填满目标数量,后续每 0.5 秒维护一次,每次最多处理 4 个补充或替换。
这些半径、数量和维护预算用于维持当前演示周边的局部车流。参考引擎完整的城市人口分配、密度场和驾驶目的地生成不在本轮实现范围内。
生成位置检查还需要确认点位所属的道路和车道。一个点在镜头外、距离合适,并不意味着它位于合法车道上;在路口内部生成,也可能直接占据已经授予其他车辆的运动区域。因此候选通过空间筛选后,还要经过路网、占用和局部保护检查,成功后才能建立路线与执行对象。

图 7|项目策略示意:人口槽位维护、同路线窗口续接和旧路线释放重建是不同操作。槽位可复用,但每次替换保留旧/新 route ID。图中的半径和预算属于当前局部项目配置。
同一路线续接与环境车替换
环境车通常以持续巡航为目标,计划一段有限未来;接近窗口尾部时尝试续路。已提交的路口出口和换道意图不能被下一次随机游走选择随意覆盖。续路成功保留当前 route ID 和实际进度,追加后续可用路段。
当环境车完成路线,或距离关注车超过约 360 m,且不处于可见保护范围时,人口层可以释放旧路线,从合法入口重新建立一个环境实例。视频同时显示旧、新 route ID。紫色线将两个位置联系起来,是为了说明替换事件,不能作为该车真实驶过两点之间道路的轨迹。
需要区别三个计数:同时在场槽位、累计环境投放、总路线身份。本轮保持 34 个槽位,初始 32 辆环境车加上 85 次替换,累计环境投放为 117;加上 2 条演示路线,共出现 119 个 route ID。117 表示累计投放,不能理解为同时运行 117 辆车。
| 本轮指标 | 记录值 | 对应的含义 |
|---|---|---|
| 同时在场槽位 | 34 | 32 环境槽位与 2 演示槽位 |
| 环境替换 | 85 | 旧路线释放后建立新路线 |
| 窗口续接 | 277 | 路线未来计划延长事件 |
| 累计环境投放 | 117 | 初始 32 加后续 85 |
| 路线续接失败 | 0 | 本轮已执行入口记录的失败数 |
累计环境投放由初始车辆与后续替换相加得到:32 + 85 = 117。这些结果对应本轮局部车流实验,尚不足以判断更长时间运行后的拥堵情况。
本轮最多同时等待 7 辆、跟车 10 辆。记录出现过无等待、前车限制、路口权限、邻道间隙和预测车辆冲突状态;本轮没有覆盖静态障碍等待或车体接触,这两项需要独立实验检查。未出现的状态,需要在能触发它的场景中检查。
驾驶档位怎样影响响应
项目驾驶档位提供巡航倍率、跟车时间、静止间距、加减速度和换道冷却。它们能使相同路线上的车产生不同响应,但不会改变路网的方向、冲突区占用或安全准入。激进档位仍需要合法路线、邻道空隙和通行权限。
| 当前项目参数 | 谨慎档 | 激进档 | 主要影响 |
|---|---|---|---|
| 巡航倍率 | 0.88 | 1.08 | 自由巡航目标速度 |
| 跟车时间 | 1.8 s | 0.85 s | 速度对应的期望间距 |
| 静止间距 | 6.5 m | 3.5 m | 停车基准与制动包络 |
| 最大加速度 | 1.7 m/s² | 3.4 m/s² | 接近目标速度的速率 |
| 舒适减速度 | 3.2 m/s² | 5.5 m/s² | 常规制动与包络 |
| 换道冷却 | 12.0 s | 5.0 s | 可选换道再次请求的节奏 |
| 换道意愿 | 0.25 | 0.85 | 可选横移策略输入 |
视频 11|项目驾驶档位对比,6.53 秒。同一地点与路线分别重置运行,再按相同模拟时间并排。此片比较当前项目参数,不是参考引擎驾驶人格精确数值还原,也不代表实际 Ped 的完整人格所有权。
两轮各运行 10 模拟秒,发布片段配对各自连续的 2.0–8.5 秒画面。在第 4 秒,谨慎档为约 24.5 km/h、换道计数 0;激进档约 49.0 km/h、计数 1。首次换道计数分别出现在约 7.0 秒和 3.6 秒。到第 8 秒,激进档速度反而低于谨慎档,因此结论只限于这个场景中更快的初期加速和更早发起换道,不能写成“激进档在任何时刻都更快”。
参考机制中的人格输入还涉及实际驾驶员、模型值、覆盖值、无驾驶员占位输入及随机状态的所有者。这些输入不能由三个固定档位完整表达。本次对比只检查项目控制参数;驾驶员切换、占位表示转换和覆盖值读取仍需分别验证,才能判断人格输入的映射是否完整。
物理车队:从路线命令到实际运动
路线执行和物理执行都读取路线与驾驶意图,但执行方式不同。路线执行器按有效路径推进段内进度,Actor 显示该结果;物理执行器还要把意图转换为车辆控制,由动力学得到实际姿态和速度,再把测量反馈给下一帧。
对物理车来说,目标速度与实测速度之间可能有差距,转向目标也不代表车身立即对齐。坡度、车体尺寸、轮胎状态和控制更新都会影响执行。交通层若持续使用理想路线姿态去替代真实车体,就可能在画面已经接触时仍认为候选安全。因此物理验收还要检查实际位置、接触和恢复,而不只看路线是否到达终点。
六车重复放行的实验范围
本次物理实验在指定原地图路段,每波安排六辆真实 Ped 驾驶的物理车先形成队列,再解除前车静止约束,让车队继续行驶。队列、跟车、放行与执行反馈使用已有运行时;相机和方向箭头只负责观察,没有控制车队运动。
完整测试运行 12 波,峰值 6 辆物理车,累计 72 辆退出,模拟时间约 372 秒,检测记录未发现车体接触。72 是累计退出数,并非同时在场数量;其他车辆模型、路口、拥堵和物理必选并线不在这次验收范围内。
视频 12|真实驾驶员参与的物理车队,10.87 秒。分别观察第 1 波与第 12 波的队列和放行,中间明确跳过第 2–11 波。最终 72/72 来自同轮完整测试日志,不是在这 10 秒里逐车可见。
短片展示第 1 波和第 12 波的队列与放行,中间以跳切注明省略的波次。第 12 波画面结束时,累计退出数为 66/72,最后六辆随后退出。片尾的 72/72 引用同轮完整日志,不能仅凭短片画面得出。
物理执行沿用了前文的路线、感知、权限和等待状态,又增加了车辆控制与实测反馈。两条执行路径可以分别测试这些交接,但物理车队的结果不能替代其他路段和行为的验收。
将接触和恢复纳入通过条件
修复历史中曾有一次车队全部退出,但日志记录到接触;当时测试缺少零接触断言,旧 Success 只表示已有断言通过。补上断言后,新的测试结果才同时包含退出和接触两项检查。
测试中的 Success 只表示已设置的断言通过。若目标是无接触完成,就需要验证接触计数;若目标是主动恢复,就需要证明发生过阻塞并在条件变化后继续;若目标是必选并线,就要让车辆实际从需要并线的车道出发。没有触发目标分支的一次流畅行驶,不算该分支验收。
“未记录到车体接触”只适用于当前检测方式与实验配置,不代表所有未经测试的几何都不会碰撞。增加车型、速度、路面和车流密度后,仍应重新执行相应检查。
UE 接入中需要保留的接口与失败处理
接入 UE 时,首先要确定状态由谁持有、哪些函数只读、哪些操作能够提交修改,以及失败后下一帧保留什么。参考机制提供函数职责和更新顺序,Subsystem、Actor 等 UE 类型用于组织这些实现。
当前项目中,StreetPath Subsystem 提供路网、路线及相关通行查询入口;感知与驾驶模块处理观察和持续任务;车辆人口 Actor 组织局部参与者、批量更新和当前演示信号周期;路线或物理执行器完成运动;观察者负责镜头、章节重置和记录。这是当前工程的分工,不要求所有项目使用同样的类结构。
读取状态不应隐式修复运行时
早期交通就绪检查已经明确了一条接口约束:快照可以报告身份、驾驶员、命令来源、车道、路线和注册信息是否完整,不应在读取过程中创建路线或重建注册。如果查询本身会修复状态,连续查询两次就会得到不同的现场,也无法判断恢复究竟由哪个操作触发。
这项原则也适用于视频采集。观察者可以把相位绘制成圆点、把路线绘制成箭头,但不能为了保证镜头效果而授予许可、清除等待或重置关注车。必要的场景初始化和实验重置在入口完成,并在视频与记录中注明;开始采集后,展示层读取正常运行结果。
只读约束针对的是快照接口。路线推进、驾驶、路口许可和信号更新仍由对应模块执行,查询函数不负责补齐缺失状态。排查时才能区分:系统本来就已就绪,还是某次修改操作使它恢复了运行。
候选构造和实际提交分离
路线续接、换道与局部重规划都需要候选状态。候选可以包含未来节点、链接、车道点和结束索引;旧路线仍保持有效,直到候选通过相应检查。提交失败不能留下“路线已经改了、执行器却没接受”的半更新状态。
多车更新时,还需要检查候选对应的所有者和状态版本。候选计算期间,车辆可能已推进到下一节点,横移动作可能仍未结束,路口运动也可能已经提交。接口应在修改生效前检查这些条件,避免旧快照构造的候选覆盖新状态。事后调整显示位置无法补救这类状态冲突。
失败时应返回具体原因:没有合法连接、窗口数据不足、邻道观察无效、候选被占、当前动作不允许嵌套、通行权限不足或执行距离受限。若只记录“车辆速度为零”,恢复逻辑便无法区分需要等待的条件。
坐标单位、时间来源与队列排序
世界坐标通常以厘米保存,驾驶速度、间距和制动参数以米制计算,展示速度再转换为 km/h。转换位置需要明确,不应把同一个变量按不同阶段随意解释。路径距离、中心距离、车体净空和沿车道进度也需要各自命名。
时间同样有三个来源:模拟时间推进驾驶状态,采样帧确定记录间隔,墙钟时间包含渲染、截图、编码和等待。录制原图可能使 10 模拟秒耗费更长墙钟时间,这不说明车辆停了更久,也不能把采集效率写成游戏运行帧率。
队列顺序需要在同一参考坐标下比较。项目历史记录出现过各车按自己的朝向投影世界坐标,导致场景平移后顺序变化的错误。改用相对位置和共同参考方向后,队列排序不再随场景平移变化。另一个由静态障碍造成的长期阻塞仍需单独处理。
对于同帧观察,CSV 通常在采集 Tick 读取,视口则来自最近完成的渲染;人口视频记录明确提示可能有一帧显示延迟。解释精确事件先后时,应以状态序列与原帧编号核对,不从一个已压缩的画面推断亚帧级因果关系。
现有安全约束不能为了演示而削弱
原地图道路和碰撞是验收输入的一部分。遇到路杆、缩口或相邻车阻挡时,不能删除资产、忽略碰撞、缩小车体或把超时占用直接清空来获得流畅画面。若需要临时元数据来触发机制,就像信号实验那样明确说明入口、恢复步骤和保存资产是否变化。
同理,给关注车替换路线后,应记录这是合法重规划;释放整个环境实例再重建,则记录为人口替换。移动车体、修改许可和替换身份分别属于不同操作,不能用一种成功掩盖另一种失败。
视频、状态记录与验收结论的对应关系
视频展示运动过程,逐帧数据保留当时的输入和状态,日志与断言给出整轮检查结果。核对一次实验时,需要将三者对应起来;片尾的 Success 卡只能作为结果摘要。

图 8|验证示意:完整运行包含状态记录和断言,发布视频从中选择可读片段。短片时长、原始运行时长、日志结果和适用范围分别保存,不能相互替代。
将短片与完整实验对应
路线窗口片段关注目标节点更新;跟车片段关注间距与速度;可选换道片段关注请求和完成的时序;必选车道片段关注路线意图与邻道空隙;路口两段分别关注并行许可和冲突让行;信号段关注相位权限;障碍段关注感知停车和清除恢复。人口和物理车队则分别解释生命周期与执行稳定性。
短片展示行为过程,下表归纳完整实验的结果与适用范围。
| 机制 | 发布短片 | 完整运行记录中的关键结果 | 适用范围 |
|---|---|---|---|
| 局部人口 | 60.03 s | 34 槽位,85 替换,277 续接 | 当前局部人口政策与路线/Actor 执行 |
| 路线窗口 | 8.87 s | 两次目标更新,续路失败 0 | 指定已编译路段 |
| 跟车 | 6.03 s | 18 秒实验中持续跟车,续路失败 0 | 本轮路线执行场景 |
| 可选换道 | 5.03 s | 18 s,1 次换道 | 本轮独立重置场景 |
| 必选车道 | 17.47 s | 两场各 1 次并线,出口车道 1,重叠 0 | 路线执行适配器,两场录制 |
| 并行路口许可 | 6.53 s | 双车同时获准,通过后释放许可,无停车等待 | 局部无信号控制区 |
| 路口让行 | 6.70 s | 等待冲突车辆通过,获准后驶出并清空 | 独立汇入冲突实验 |
| 信号权限 | 9.03 s | 红相位停车,绿相位后起步 | 临时信号入口 |
| 阻塞恢复 | 7.03 s | 21 秒实验,记录到等待与恢复 | 预测冲突与执行约束 |
| 静态障碍 | 14.00 s | 感知到障碍后停车,移除后恢复 | 可选换道关闭,无主动绕障结论 |
| 驾驶档位 | 6.53 s | 两轮各 10 模拟秒,按时间配对 | 项目参数对照 |
| 物理车队 | 10.87 s | 12 波,72 退出,接触 0 | 峰值六车、指定路段、同轮日志 |
各项结果只对应表中列出的范围。人口片没有展示所有等待原因,信号片没有验证永久灯位,物理车队没有验收全部必选并线协议,路线窗口也不证明离线路网构建正确。
如何理解修复前后的记录
本轮开发中遇到的主要问题包括:短链接阻止提前横移、同链接观察遗漏跨节点邻车、各车使用不同投影方向、换道计数被误解为完成,以及缺少接触断言使旧 Success 含义过强。复查这些问题时,需要同时核对修复前后的实现和对应实验记录。
后续已经补齐让行和信号视频,早期“没有相关可视化”的记录应按日期理解。全城覆盖、完整参考 scanner 和长期拥堵恢复仍有未验证项,新增局部短片没有改变这些范围。
本轮结果来自上述已有实验,没有新增整城测试或交通性能测量。机制图解释状态与交接,车辆运动则以原始视频和对应运行记录为依据。
结论
当前原型已经能在保存的道路地图上持续沿有向路线行驶,处理前车、邻道、局部路口与信号权限,并在指定条件解除后恢复行驶。局部人口策略维持 34 个路线/Actor 槽位,独立物理实验完成了六车重复波次的规定检查。各项结果分别有对应视频、状态记录和日志。
各阶段需要保留并明确区分相关状态:未来路线不能重置当前进度,换道请求不能提前当作完成,许可不能替代实际占用,环境替换不能当作同车绕障,目标速度也不能替代物理反馈。速度与距离由各模块计算,结果按状态所有权和提交顺序进入下一帧。
接下来需要增加路口运动组合与永久信号绑定,补足物理必选并线的准入和完成反馈,再检查更复杂车流、长期阻塞恢复与人口调度。扩展到新执行路径或新场景时,还需要分别记录输入、失败分支和验证结果。
AI 协作复盘
本次整理以现有落地草稿和 12 段独立插入视频为入口,再读取路线、感知、驾驶控制的当前实现,以及人口、让行、信号、必选车道、驾驶档位和物理车队的验收记录。AI 负责重排文章、建立术语与实验对应关系、整理公式和图注,并从真实成片提取预览帧。
核对时重点检查素材来源和结论范围。原稿按补充时间排列,容易将不同 PIE、执行器和日期的结果混在一起。整理后,每段视频分别注明片长、完整实验、重置或跳切及适用范围;项目策略与参考机制也分开说明。
另一个需要纠正的误读是把计数当作事件完成:换道次数增加早于车道索引变化,物理车队短片结束前只显示 66/72 退出,最终 72/72 来自窗口之后的日志。图注据此区分决策变化、动作完成和整轮结果,便于复查与后续开发。
这轮工作整理了已有证据并补充可视化,没有新增运行时算法或重新验收全城。文章、机制图、独立视频和来源清单均保留,具体采集统计、源码位置与文件校验记录另存于内部核对清单。