NPC 已经有了目的地,前面却有一辆慢车。前车急刹,它得跟着停下;旁车并入,它得重新留出车距;施工物占住当前车道,它还要判断能不能绕过去,绕过去以后又能不能回来。目的地没变,接下来该怎么开,却要随着路况不断调整。
上一篇《临时接管、路线重建与行程接续》处理玩家临时接手车辆以后,NPC 怎样从新的车位继续原行程。那一轮里,车头横停时由玩家实际倒车回正。本篇进一步把路况响应和受限恢复接到 NPC 一侧:它自己计算速度限制、等待换道空隙,必要时通过倒车和前进调整姿态,再接回原目的地。
底层仍沿用玩家驾驶与四轮受力中的物理执行,以及座位关系与驾驶权中的命令资格检查。这里增加的是目的地、交通策略与恢复动作之间的协调,没有为 NPC 另做一套可以直接移动模型的执行器,也没有替换城市交通原型的全城调度入口。
后面的实现围绕一个判断展开:当前路线还能不能执行?路线有效,就先处理本步速度和通行条件;需要换车道,就构造候选并检查;车头不适合接路时,再尝试有限的姿态恢复。恢复仍然解决不了,就保留失败,等上层明确重试、取消或下达新任务。
下面的八段视频各自展示一趟完整任务,都有明确的触发条件、驾驶过程和结果。它们来自独立 PIE 会话,每段内始终使用同一逻辑车辆和同一 Chaos 车体。场景脚本安排前车目标、临时路障和改派时机,受测车辆的驾驶命令由 NPC 运行时生成。实现范围限于受控普通车辆,文中的距离、时间和预算也都对应本次配置。
目的地不变,当前动作可以改变
先看一趟普通行程:前车低速行驶后急刹,本车跟随减速并停稳。前车重新起步,本车恢复行驶,最后停到原来的目的地。
视频 1|前车急刹后,安全跟随并完成原行程,约 34.73 秒。观察前车停车时本车怎样等待,以及前车离开后怎样继续。参照车的目标变化由脚本触发,受测车自行生成跟车和制动命令。
片内约 6.67 s,前车开始制动;约 12.67 s,它重新起步;约 23.67 s,前车加速离开。本车在对应区间达到低于 0.05 m/s 的等待状态,相关低速采样区间跨度约五秒,约 32.63 s 确认到达。精确时点和低速范围来自同轮事件与物理采样,画面用于观察动作连续性。
前车停下以后,本车仍然要去原来的地方,这次停车也不算行程失败。因此,目的地和当前控制要分开保存:上层任务保存“去哪里”,道路计划保存“沿哪些有向车道走”,交通策略限制“本步最多允许多快”,物理车体反馈“实际上走到了哪里”。
| 信息 | 由谁保存 | 变化时机 |
|---|---|---|
| 目的地、巡航速度、意图编号 | 行程对象 | 接受有效新请求时更新;一般停等不改写目的地 |
| 道路条目、车道点、游标、计划编号 | 行程中的道路计划 | 接路或换道计划被接受时更新 |
| 当前威胁、允许速度、空隙稳定时间 | 交通策略与单车宿主 | 依据本轮观察重新计算,部分等待历史跨步保存 |
| 原车道、待绕障碍、已通过障碍 | 单车宿主 | 跟踪一次绕出与返回过程,取消或新任务时清理 |
| 恢复阶段、换向次数、进展历史 | 恢复任务 | 从制动开始,到恢复完成、失败或取消结束 |
| 驾驶员与命令所有权 | 人物、车辆及关系接口 | 命令接受时检查当前资格 |
| 姿态、速度、接触和受力结果 | Chaos 车体与物理回读 | 每轮实际物理执行后产生 |
同一个 UE 宿主协调这些状态,但不会同时改写它们。前车停下,只收紧当前速度;换道获准,才替换相关道路计划;恢复尝试耗尽,再向行程报告失败。所以,看到车停着,还要看它保留了什么计划、正在等谁给出继续条件。
IntentSerial 记录有效新目的地请求被接受的次数。即便坐标相同,再次接受 Start 也可以产生新意图;继续或重试原任务则不增加它。PlanSerial 记录已经接受的低层计划变化,重接道路、绕出和返回都可能增加。计划编号在同一宿主里累计,不保证每次新意图都重新从零开始。
车辆可以为了同一个目的地更换计划,也可以沿同一计划暂时停车。后面的绕行过程会用到这两种情况。
文章目录
停在原地,不一定进入同一种等待状态
跟车停等时,道路仍然可执行,只是本步允许速度降为零;WaitingForRoad 则表示当前没有可执行的道路计划。这两个情况都会制动,恢复入口却不相同。
| 当前情况 | 意图与计划 | 本步如何处理 | 继续执行需要什么 |
|---|---|---|---|
| 前车停车、行人占道 | 意图保留;当前路线仍可用 | 交通限速压低或归零,车辆制动 | 当前空间重新允许行驶 |
| 正在检查绕行候选 | 意图和旧计划保留;候选尚未生效 | 保住合法换道起点,停车检查 | 当前准入连续通过后提交 |
| 已提交换道又遇阻 | 意图及已接受换道计划保留 | 沿当前计划收紧速度、停车 | 障碍解除后继续当前计划 |
| 当前姿态无法接路 | 意图保留;没有可执行的接路计划 | 低速重试,符合条件时启动恢复 | 实际姿态与空间重新满足接路条件 |
| 恢复预算耗尽 | 意图记录保留;行程进入失败 | 保留失败并制动 | 上层显式重试、取消或改派 |
| 行程已取消 | 意图失效;旧计划与动作清理 | 物理制动消除已有动量 | 接受新的有效任务 |
车辆速度为零,只能说明它此刻没有移动。任务是否失败、是否完成,还要看表中的状态和条件。
每轮先读事实,再产生控制
宿主在物理提交阶段读取车体实际姿态和速度,先评估当前行程,得到道路目标与允许速度。随后由协调入口选择本步的控制路径:已经结束或暂停的任务退出当前交通处理;恢复失败时保留失败并制动;恢复正在运行时,优先由恢复任务产生命令;尚无道路可执行时,检查低速重试或姿态恢复条件;其余情况才进入普通交通观察、速度限制和换道准入。
普通分支中,目标控制器根据目标点、允许速度和实际状态生成油门、制动、转向。恢复分支直接提供同类命令,同一步只选择其中一条控制路径。这是当前宿主的分支安排,还不是全工程通用的任务优先级。
两种命令最终都要通过同一驾驶权接受入口。当前驾驶员、人物关系与车辆保存的命令所有权需要一致,通过后才能进入传动和四轮受力计算。物理求解仍由同一个 Chaos 车体承担,NPC 没有因进入恢复阶段就获得绕过碰撞或直接写位置的权限。
物理后阶段把车体实际姿态发布给逻辑车辆,并回读本轮速度。下一步推进路线、判断恢复和确认到达时,都使用这些实测结果。车辆受阻没有移动,路线进度就不能按预计巡航速度继续增加。
前车改变速度,巡航目标怎样收紧
行程的巡航速度是期望值。前车速度、候选碰撞和道路限制都可能使本步目标速度低于它。实现保留了转向相关的威胁减速,再加入适合当前轮力执行的碰撞距离保护。
交通策略使用本轮实际观察。其他轮力车辆提供车体当前位置、前向、水平速率和包围盒;显式登记的障碍提供碰撞边界与类别;原生行走宿主提供人物的位置、朝向和速率。这是当前入口收集得到的观察集合,尚不是统一的全城感知注册与分帧扫描系统。
威胁方向与本步准备行驶的方向有关
普通驾驶时,减速探测方向会在实际车头基础上,根据上一轮转角作有限旋转。这样转向进入旁侧空间时,也会考虑那里可能出现的威胁。已提交换道路径时,探测方向改为当前目标方向,避免车辆正在横移,速度判断却只检查原车道正前方。
下式用二维旋转说明选择关系,角度使用弧度:
普通驾驶:sensingDirection = rotateXY(actualForward, 0.5 × previousSteer)
已改变路径方向:sensingDirection = normalizeXY(target − actualPosition)
探测方向用于预测减速。换道还要单独检查道路资格和空间:某个方向暂时没有迫近物体,只能说明这次探测没有发现威胁,不能替代跨线许可,也不会预约未来空间。
预测使用本车的期望运动与其他对象的估计运动。其他车的估计速度由车体前向乘实测水平速率构造,当前没有完整处理对方倒车与大侧滑的速度矢量。朝向明显改变时会重新读取观察,但不能据此宣称已覆盖所有驾驶姿态。
威胁减速建议之外,再检查可用空间
已有减速模块会根据预测碰撞时间和巡航速度计算距离代理,再限制允许速度。其制动距离尺度按当前实现保留为:
stopScale = cruiseSpeed / speedAtBrakeDistance
× (maximumBrakeDistance − minimumBrakeDistance)
predictedDistance = cruiseSpeed × predictedCollisionTime
这里没有再加一个 minimumBrakeDistance。字段名容易让人以为这是从最小值到最大值的插值,但公式实际只使用两者差值。当前使用的构造默认值为 20 m、60 m 和 40 m/s;它们不表示已经加载了某个完整车型与驾驶性格配置,也不是车辆真实紧急制动距离的测量值。
威胁越近,候选速度越低,相对运动判断也会考虑前车速度。各项建议最后取更严格的限制,已有道路或任务限速不会被抬高。这个调用没有传入成对避让上下文,模块里处理互相堵塞的分支因此没有在本宿主启用。
宿主另外取得前方可用距离 clearance:一项来自 UE 世界全车体扫掠,另一项来自观察快照中的车体边界扫掠,取两者更小值。当前向目标方向探测最多 25 m,并把距离转换成米,再用于本轮速度上限:
guardSpeed = sqrt(5 × max(0, clearance − 0.8))
desiredSpeed = min(sourceAdvisorySpeed, guardSpeed)
5 是当前公式的项目尺度系数。距离按米输入、速度按米每秒输出时,它承担速度平方除以距离的量纲,即 m/s²;0.8 m 是距离余量。这个系数用于限制期望速度,不是轮胎附着系数,也不表示已测得车体能够实现相应的固定减速度。
停车需要保留一小段距离历史
障碍前停车如果只用单一阈值,很容易出现“刚稍微退开就给油,又靠近后制动”的反复动作。这里采用距离滞回:可用距离严格小于 1.2 m 时进入保护停等,严格大于 2 m 才解除;中间区间沿用上一轮的停等标记。因此刚好等于两端阈值时,都不会靠比较相等自行切换状态。
进入保护以后,目标速度为零。普通 NPC 分支转为制动,在有效行程存在且实测速率低于 0.25 m/s 时还会请求手刹。车体仍参与物理模拟,暂停的是行驶请求,没有冻结世界或把速度强行写成零。
移动中还保留一层额外制动边界:当前方探测距离小于范围上限,且实际水平速率超过目标 0.1 m/s 以上时,按剩余空间估算所需减速度,增加制动请求。公式按当前项目实现为:
requiredDeceleration = actualSpeedXY² / (2 × max(0.15, clearance − 0.6))
brake = max(existingBrake, clamp(requiredDeceleration / 6, 0, 1))
该分支只增加制动;制动超过 0.05 后撤掉油门,不产生额外推进。世界距离保护、速度建议与最终物理制动分开后,才能说明为什么目标速度已经降为零,车体却还需要一段时间才能真正停稳。
邻车并入后,重新计算可用车距
速度约束每轮都要刷新。一直跟着同一辆慢车时,前车身份比较稳定;邻车并入时,原本不占当前路径的车体会逐渐进入威胁范围。只在行程开始时找一次前车,就会漏掉这个变化。
视频 2|邻车并入,让出车距后继续行程,约 26.07 秒。观察参照车从相邻车道进入当前路径后,本车怎样调整速度并继续原目的地。本段展示响应其他车辆并入,没有展示本车主动超车。
邻车约在 3.67 s 开始并入,约 7.63 s 完成。本车没有更换目的地,约 24.00 s 确认到达。同轮记录中的计划编号也保持为 1:这里改变的是速度约束,没有因为前车身份变化就必然重建整条路线。
观察包含车体尺寸和朝向。一个中心还没进入目标车道的车辆,其转向后的前角或后角可能已经占据本车准备使用的空间。只比较中心点是否落在车道中心线附近,会漏掉这种过程。
当前减速预测把对象看成每次观察中朝向固定、随后平移的包围盒,并用相对运动判断可能接触的时间。它能考虑本轮车体朝向造成的空间变化,但不会在一次查询内模拟对方未来所有旋转。下一轮重新观察,才能更新正在并入的车体几何。
这也解释了“能看到邻车”与“已经知道邻车准备做什么”的区别。当前读取的是对方实际运动,不是借用对方脚本中的目标轨迹。即便脚本计划它继续并入,本车也不能假定下一帧对方一定移动到某处:它仍可能减速、被挡或发生接触。
停住的车辆仍然是交通参与者
主机通过明确登记区分施工障碍和一般车辆。一辆车实际速度为零,不会因此被放进静态障碍集合。前车可能只是排队、急刹或让行,系统不能看到它不动,就立即把它当作可以随意绕过的施工物。
这里把可选绕行限定在登记过的静态占道对象。普通前车即使停住,仍按交通威胁处理。完整驾驶个性、尾随上下文和其他超车动机还没有接入,所以视频 1 中等待前车,视频 3 中绕过施工物,走的是不同的判断分支。
对象类别也会影响换道后方检查。动态交通需要考虑其后续接近,静态对象则按实际占位边界与余量检查。若只用速度来猜类别,静止排队车就会获得不适合它的短后向检查距离。
施工占道,先确认绕出后还有路可回
施工物占住车道以后,车辆可以提出从相邻车道绕行。但要先确认路线允许换道、旁边有安全空隙,而且通过障碍后还能返回。旁车正在接近,就先留在原车道,等它通过后重新检查。
视频 3|施工占道,等旁车通过后绕行并返回,约 38.67 秒。观察绕出前的等待,以及越过障碍后返回原车道的过程。绕出与返回分别检查和提交,没有借用对向车道。
约 9.23 s,绕出计划被接受;约 18.03 s,返回计划被接受;约 36.60 s,确认到达。意图编号一直为 1,计划则由 1 变为 2,再变为 3。两次计划变化分别服务于绕出与返回,不是两个新的目的地。
路线先回答能不能换到相邻车道
行程对象先复制当前路线状态,连同当前目标索引、条目和链接交给已有原生换道函数。当前位置在当前段上的进度由实测车位投影计算,进入道路核心前由厘米换成米。
这里复用的是有向路线操作。目标必须是相邻车道,当前路段有对应同向车道;节点、链接与后续道路关系也要允许修改。已有换道函数会拒绝正在换道、路线容量不足、当前段过短或不适合的路口与转向组合,还会保留后续必选车道的约束。
一般路段需要留出至少 max(8 m, 1.5 × laneWidth) 的转移距离;已有路网实现另有特定已审查车道收缩的处理,不能把一般门槛写成全工程无例外规则。本次场景使用的是普通同向路段,没有因此增加任意道路跨线能力。
候选构造成功后,得到的是中间换道点和后续车道点。正式行程尚未改写,车体也还没有横移。后续检查失败时,丢弃这份候选即可。
绕出之前先预览返回几何
只证明能切到旁边,可能会把车辆带到一个已经没法合法返回的位置。因此绕出之前,策略会沿候选的后续条目寻找满足通过距离的位置,复制候选,再尝试向原车道提出一次返回请求。
这一步只询问路线几何和已有换道约束是否容许后续返回。它不检查未来某个时刻的交通空隙,也不创建那次返回的正式计划。原候选与当前行程不会因为“试过能回来”就立刻消耗换道点。
当前预览中的通过距离使用障碍边界、车体长度和额外距离来留出余地。真正执行返回时,仍会重新检查车尾是否已经超过障碍,以及当前交通和世界碰撞是否允许。这两个阶段使用的检查时点不同,预览不能代替实际返回准入。
前后空隙按实际尺寸计算
动态车的前向检查范围为 20 m。后向范围至少 10 m,并考虑后车与本车的速率差,当前策略可以写成:
rearSearch = max(10 m, 6 m + 4 s × (otherSpeed − selfSpeed))
若本车为 2 m/s、后车为 5 m/s,检查范围为 18 m。一辆在后方 15 m 的车虽然尚未抵达换道位置,仍可能使候选被拒绝。若后车没有更快,公式也不会把范围缩到 10 m 以下。这是局部预测余量,不是后车未来四秒轨迹的承诺。
空间检查还把对方车体按本车前向投影。设对方纵向、侧向半尺寸为 ex、ey,两车朝向的绝对点积为 c,水平叉积绝对值为 s:
otherAlongExtent = c × ex + s × ey
otherSideExtent = s × ex + c × ey
侧向带宽结合本车半宽、50 cm 额外带宽和对方投影半宽。若对象在对应带宽内,且纵向位置落在当前前后检查区间内,本次空隙不通过。高度区间完全分开的对象先排除,避免把另一高度层的交通直接当作当前车道阻挡。
显式静态对象的后方检查改为两者纵向半尺寸之和,再加 1 m 余量。这里仍是当前包围盒策略,不是所有非对称车型的精确轮廓求交。输入中的姿态、边界或速率无效时,接口返回不通过,不让不完整观察自动变成可通行空间。
等空隙时,也要保住换道起点
合法候选形成后,宿主把目标速度压到零,在当前起点检查空隙。否则车辆一边等待一边向前挪,可能在后车终于通过时,已经走过足够长度的换道窗口。
这个停车条件与“前车太近”的速度限制不同:即便前方暂时还有空间,候选换道也可能需要在这里等待。它保留的是路线操作所需的起点条件,而不是为了画面整齐,把车辆固定在预设坐标。
本次空隙判断还包含 UE 碰撞扫掠。对候选点组成的最前几段分别扫掠车体包络,最多检查三个连续线段;包络带有项目额外余量,每条线段使用对应行进方向的朝向。这是有限分段检查,未沿整个转弯过程连续旋转车体,也没有覆盖整条余下道路。
路线候选、返回几何、交通空隙和碰撞检查均通过,且通过结果累计保持 0.6 s,才允许提交。任何一轮失败都会把稳定计时清零。计时表达的是多次当前观察都符合条件,没有向其他车辆发出城市级空间预约。
条件在变化,提交前后怎样处理
空隙检查持续一段时间,场景当然也在继续变化。旁车可能突然加速,原来可用的间隙消失;车辆已经开始换道以后,前方也可能加入新的障碍。实现需要按当前是否已经提交,采取不同处理。
视频 4|绕行条件变化时,避免抢道和反复改道,约 38.87 秒。前半段观察空隙关闭时的等待;后半段观察已提交换道路线遇阻后怎样停车,以及清障后沿同一计划继续。使用的是最终重录版本。
片头邻车加速,使初始空隙关闭。约 6.60 s,重新获准的绕行计划提交,同时场景加入临时路障;约 13.27 s,移除该路障。车辆继续原计划,随后返回原车道,约 36.80 s 确认到达。原来的施工障碍一直存在。
提交前,失败只撤回当前候选
每轮都用最新观察重新构造候选。旁车进入后方检查范围、转向后占据更多侧向空间,或者碰撞扫掠失败,都会清空稳定计时。候选没有提交,正式路线和意图就继续保留。
“本次尝试撤回”不等于永久禁止绕行。外部条件改变以后,可以从当前位置再次构造合法候选,重新累积稳定时间。也不能把画面中的等待都归为寻路失败:这里道路几何本来可用,拒绝发生在交通或碰撞准入阶段。
真正写入前,行程接口核对意图编号与计划编号是否仍匹配,还检查当前处于道路驾驶阶段、没有未消费换道点、候选目标索引仍等于当前游标,以及条目数量一致。它们限制这份候选能修改哪一版行程,不构成跨网络任务的通用版本协议。
这些条件通过后,正式条目和车道点才由候选替换,记录中间换道目标,标记当前为换道计划,并增加计划编号。在本轮同步调用里,构造和提交都在宿主这一轮协调中完成;本文没有假设它已经是异步规划服务或覆盖所有失败副作用的事务系统。
提交后,新阻挡先收紧速度
提交先改变行程保存的路线,不会直接使车体横移。当前宿主先评估旧计划,随后才检查并提交候选;有合法候选等待准入时,本步速度被压为零。提交完成后,下一次道路评估读取新的中间目标,再进入正常控制和物理执行。
沿新计划行驶期间,新的障碍仍参与速度限制和世界扫掠,可以让车减速、停住;宿主不会因此立刻从另一侧再提出一个绕行候选。
视频 4 的同轮记录中,临时路障前低于 0.05 m/s 的采样区间跨度约 1.43 s,其间计划编号保持 2。这段等待没有更换已经接受的换道计划。清障后继续的是已经接受的换道路径,返回原车道才形成下一版计划。
中间换道点还有独立消费条件。车辆接近该点,或者已经通过它且侧向误差仍在允许范围内,才能结束这段中间目标跟随。把计划提交、开始横移和完成横移分开,才不会在刚提交的那一帧就把车辆当成已经位于旁边车道。
原路线后缀不能偷偷变成返回许可
已有换道函数只修改它能够确认的后续路线窗口。遇到分支、车道容量变化或不合适的转向,可能停止修改,留下仍指向原车道的后缀。若执行器直接追随该后缀,就会在没有新准入的情况下产生第二次横移。
行程会检查换道计划里的这类边界。相邻条目的车道索引发生切换,却没有新请求批准这次切换时,先输出零速度。之后重新提出返回候选,通过交通和碰撞检查,再提交执行。旧路线后缀本身不提供返回许可。
实际返回的通过余量依据车体和障碍投影边界计算:本车车尾完全越过障碍之后,再留出 1 m。这与“车中心已经超过障碍”不同,车尾仍可能在障碍旁边。返回一旦获准,清理本次障碍与原车道记录,避免同一个已处理障碍持续触发绕行。
这套处理解决当前受限路段中的往返过程,没有实现任意路网上的多车时空预约,也不会因为旁边空着就跨入对向道路。
宿主还保留目的地车道对齐入口:接近目的地时,如果当前车道与目标所在车道不同,可以提出相邻换道候选。它同样要经过几何、空隙、碰撞和提交检查。这个入口服务于目标接近,不能与“普通前车一停车就主动超车”混为一谈,也没有提供跨任意多车道的全局终端规划。
行人和封路怎样让车辆等待
前车和施工物以外,人物也会占据行驶路径。第五段把人物横穿与整段道路暂时封闭放在同一趟行程里,检查两种等待都不会自动取消目的地。
视频 5|先让行人通过,再等待道路重新开放,约 31.33 秒。观察人物中途停步时本车的让行,以及后续道路封闭解除后自动继续。本段人物在连续道路表面横穿,未展示跨越高路缘的新导航能力。
约 3.37 s,人物开始横穿当前车道;约 5.67 s,它在途中停步。本车不能只根据“人物已经开始过街”就假定前方即将清空,而是继续读取实际占位。人物离开路径后,本车恢复,约 16.90 s 停在全路幅障碍前,约 19.93 s 道路开放,约 29.23 s 确认到达。
人物来自任务执行与倒地恢复文章中使用的原生行走宿主,具有实际行走、转向和停步表现。车辆侧读取其原生位置与当前速率,并构造成感知体,不依赖字幕里写了“正在过街”,也不读取一个尚未执行完成的目标位置来代替人物当前位置。
当前人物感知包络围绕其位置建立,中心在竖向抬高,使用独立的人体宽度和高度。它是驾驶观察中的空间近似,不能等同于精确逐骨骼碰撞。人物移动仍由行走系统负责,车辆策略只消费它的当前结果。
整段道路封闭时,可用空间保护会降低速度。障碍解除后,重新观察到的空间允许行驶,车辆就继续原行程,无需业务层再发一次目的地。场景里约三秒后开放道路,是脚本的安排;运行时没有“停够三秒就强制放行”的计时器。
本次让行没有增加完整交通语义
车辆会对人物的实际空间占用作出反应,但没有在这一包新增行人过街权、信号相位、交叉口优先级或全城随机感知事件。横穿时机和封路变化都由脚本安排。
这段要检查的是:人物走到一半停下来,车辆是否还会继续让行。行走系统的实际占位已经能约束车速,过街优先权、信号等规则仍要由相应系统提供。
发生接触以后,继续相信实际车位
前面的路况变化主要改变可用空间和速度。第六段进一步检查执行结果偏离计划时怎么办:真实物理接触把车位推偏以后,当前路线可能仍然有效,但目标控制必须立即使用新的实测姿态。
视频 6|碰撞打断行驶后,按实际车位继续原路线,约 30.67 秒。这是受控物理扰动测试:脚本用冲量推动箱体与车接触,再以反向冲量移开箱体;受测车由 NPC 控制,未被脚本直接移动。
箱体质量为 600 kg。片内约 6.67 s 施加侧向冲量,约 7.17 s 记录到真实接触通知;约 8.20 s 对箱体施加反向冲量,使它离开车辆路径。本车最大横向偏移约 62.3 cm,约 28.60 s 确认到达原目的地。
同轮记录到七次接触通知。这是碰撞回调计数,同一段持续接触可以产生多次通知,不能解释成发生了七起独立事故。箱体被移开也来自场景施加的第二次冲量,没有验收 NPC 主动推开障碍的能力。
偏移不一定需要重建整条路线
这段计划编号保持为 1,恢复任务没有启动。被推偏以后,当前道路条目仍然可用,实际车体仍位于允许走廊中,目标控制器按新的位置、方向和速度调整控制,最终回到既有路线。
因此碰撞响应不能简化成“每次碰撞就重规划”。是否需要新计划取决于当前计划还是否适用。只有计划失效、无法接路或出现其他明确条件时,才进入对应处理。否则频繁重建可能反过来丢掉本来仍可用的路线进度。
实际路线进度仍按接近节点或经过节点来推进,不把侧向滑动距离累计成道路里程。车辆即使被侧推了半米,也不能据此宣布它向目的地多行驶了半米。
位置以厘米从 UE 传入,速度以米每秒参与策略,编译路网节点以米保存。车道构造、道路查询和物理作用点处均有显式转换。把三个消费者都叫“位置”或“速度”,不代表可以省去接口换算;这类错误很容易让避障距离表面上数值合理,实际却差两个数量级。
车头不满足接路条件时,自主倒车与前进
上一段的侧向偏移,还能靠当前路线跟随修正。第七段从更困难的位置开始:车头不满足接路方向,普通目标控制暂时没有可执行的道路计划。
车辆从横向停放开始。车头约为 yaw=-90°,附近虽然有路,但当前朝向不能通过有向接路检查,前方墙体又使它无法直接前进转正。
视频 7|车头不正且前方受阻,自行倒车调整后出发,约 35.53 秒。观察倒车、制动停顿、前进回正和重新接路。所有驾驶控制来自 NPC 恢复任务,与上一篇玩家倒车回正的片段不同。
记录中约 0.47 s 开始制动,约 1.00 s 进入倒车;约 4.63 s 进入停顿,约 5.13 s 转入前进调整;约 7.03 s 进入收敛制动,约 7.27 s 恢复完成并重新接路;约 33.43 s 确认到达。同一意图下,最初计划编号为零,恢复姿态后才接受第一份可执行计划。
先判断为什么不能继续,再选择恢复入口
主机需要从已加载的编译路网中找到附近、能通向当前目的地的有向道路。搜索恢复方向时,不要求车头已经满足普通接路的方向门,否则横停的车永远找不到可以调整的目标方向;但它仍检查距离、高度和有向连通关系。
得到的是一个需要逐步靠近的道路方向,没有直接写入车体朝向。主机还收集附近的简化道路单元,供恢复时判断前后运动是否仍处在已知道路范围。当前最多保留最近的一组有限单元,而不是临时把所有周围地面都当作可行驶区域。
在没有道路可执行的分支中,宿主要求实际速度长度小于 0.25 m/s,并且重试间隔至少 0.5 s。若能找到连向目的地的恢复道路方向,而且它与车头的点积低于 0.35,才尝试启动姿态恢复;否则重新尝试普通接路。等待本身不会自动被解释成需要倒车。
另一个入口来自仍有道路输出、但当前目标方向与车头明显不兼容的情况:实际完整速率小于 0.5 m/s、目标方向与车头点积小于 0.15 时,先制动,再尝试寻找恢复方向并启动任务。因此是否恢复既看计划能否执行,也看当前车头是否适合追随该目标;普通前车停住,并不会单凭目标速度为零触发这两个方向条件。
恢复任务启动前,也会检查意图编号、输入是否合法、是否已经在恢复,以及实际速度。Start 允许的速度上限为 1 m/s,宿主通常在更低速时才调用它。调用入口的要求与模块内部阈值需要分别看。
前后空间同时约束动作
每轮恢复观察包含实际姿态、完整速度、期望道路方向、转向锁角与时间步。前方、后方分别沿车体当前前向探测 5 m,取世界车体包络扫掠与道路范围查询更严格的结果。
世界查询关注当前车体与场景碰撞,道路端则在前后保险杠中心建立小包络,检查沿已编译道路的可用距离。后者没有覆盖车体任意角运动的完整轮廓,不能把它当成整车转向永远不会越界的证明。当前恢复验收也集中在平直路段,没有验证立交、坡面或路宽剧烈变化。
先制动到实际速度长度小于 0.2 m/s,再选择初始运动方向。当前规则在前方不足 1 m、后方又比前方宽裕时先倒车,否则从前进开始。若前后都狭窄,任务也不能靠更大的油门把限制忽略掉。
换向依据实际速度,不依据状态名称
当前有符号前向速度为:
forwardSpeed = dot(actualVelocityMps, bodyForward)
倒车阶段会产生负的期望速度,但油门仍保持非负,倒挡意图独立保存。如果实际运动方向与期望方向相反,且前向速率绝对值超过 0.2 m/s,本步先返回制动命令,不继续给反方向推进。
例如任务已经选了倒车,车体却还以正前向速度运动,此时仅把阶段字段改成 Reverse 不会消除惯性。等真实速度降下来,倒挡意图、传动与轮力才能共同形成向后运动。恢复与普通驾驶使用同一车体,不能在两个阶段之间重置其速度或轮状态。
停顿阶段至少等待 0.5 s,同时要求实际有符号前向速度绝对值小于 0.2 m/s,才进入新的前进或倒车阶段。初始制动和最终恢复完成使用完整速度长度;停顿门使用有符号前向分量。这些门的输入不同,不能只写一句“所有阶段都等全车速度为零”。
转向、目标速度和推进幅度
恢复保留一个持续转向角。期望转角由转向锁角、旋转侧及倒车方向共同决定,倒车时符号相应翻转;每步角度变化限制在 2 × dt 弧度以内。这样前进与倒车交替时,控制请求不会瞬间跳到相反锁角。
沿当前方向的目标速率按可用距离收紧:
targetMagnitude = min(1.8, sqrt(2 × max(0, directionalClearance − 0.25)))
targetSpeed = directionSign × targetMagnitude
speedError = abs(targetSpeed) − directionSign × forwardSpeed
其中距离使用米,速率使用米每秒,directionSign 在前进时为正、倒车时为负。公式里的 1.8 m/s 上限、余量和系数属于本轮恢复策略。可用距离接近余量时,目标速率降低,没有靠固定油门维持碰撞前的推进。
通过方向冲突检查后,速度误差用于生成制动或油门,油门上限为 0.65。空间小于 0.35 m 时直接请求制动;否则过快就制动,低于目标才给油门。控制值生成以后仍要通过驾驶资格检查,不因为属于恢复任务就直接作用于车体。
用时间和位移识别没有进展
一次移动阶段持续至少 0.5 s 后,空间不足、低速无进展或阶段超时都可能触发换向。无进展检查每 0.25 s 执行一次,并在起步经过 1.25 s 宽限后才检查,避免把刚开始克服惯性的瞬间立即算作卡住。
低速条件使用当前方向上的实际速度:低于 0.15 m/s,且没有比上次检查增加超过 0.01 m/s 时,认为该阶段出现低进展。单个移动阶段超过四秒也会换向。这些条件限制每次动作持续多久;是否取得进展,还要继续检查实际位移。
每次换向另外比较当前实际位置与上次换向位置。位移低于 25 cm 就增加低进展次数,有明显位移则清零;累计四次低进展换向后,改变旋转侧,再清空这项计数。这条历史影响后续尝试方向,但没有搜索出任意场景的最优调头轨迹。
恢复总时间严格超过 30 s,或者换向计数已经达到 12,都会返回失败。这里的有限预算是本项目策略,不是参考系统在所有车型和状态下的统一上限。
回正完成以后,再次验证接路
车头与期望道路方向的误差小于 20° 时进入收敛阶段,继续制动;实际完整速率小于 0.2 m/s,才把恢复标成完成。随后宿主从真实姿态重新查询道路,并做既有短接路走廊扫掠。
这里有两个独立结果:Recovery Completed 说明姿态调整已经结束;接下来 Resume 与短走廊检查的结果,才决定能否重新执行道路计划。完成恢复的这一轮仍返回制动命令,新计划由后续道路评估读取。
道路加载变化、没有合格候选或短走廊受阻,都可以使重新接路失败。主机保留相应的道路等待与失败原因,之后按既有低速和间隔条件重试。这样既不会把恢复完成当成成功行驶,也不会在恢复尚未停稳时叠加普通巡航。
第七段检查的是前后探测、实际倒车与前进、低速换向、姿态收敛和重新接路这一条完整过程,没有完整搜索全部恢复机动,也没有覆盖翻车自救或特殊损伤车型。
恢复失败以后,旧动作怎样结束
空间始终不允许回正时,恢复要停下来,把失败报告给拥有目的地的上层。途中收到取消,也要结束旧动作,再通过制动消除车体已有的动量。
视频 8|无法脱困时上报失败,改派后释放旧动作,约 48.33 秒。先观察封闭空间中的有限失败,再观察运动中取消和新目的地执行。场景只让最后的新任务完成,旧任务不会因通路开放或车体回正而自行恢复。
这段依次安排目的地 A、B、C。A 的恢复尝试耗尽后,约 15.27 s 写入上层失败事件;约 16.80 s 取消 A 并打开通路。B 随后进入恢复,在车体已经实际运动时被取消。车辆制动停稳后再重试旧任务,调用被拒绝;约 19.60 s 接受不同的目的地 C,约 46.23 s 确认到达。
本段把失败反馈交回上层,再由脚本明确发出取消与改派。NPC 负责恢复动作的控制和结束,上层决定是否放弃旧目的地、何时接受新目标;自动业务改派尚未实现。
失败需要同时出现在恢复和行程报告中
恢复模块进入 Failed 后,宿主调用行程的失败入口,把当前行程标成 Failed / RecoveryExhausted,清理低层条目、车道点、中间换道状态与到达确认历史。目的地和意图编号仍保留用于诊断,不会因为有坐标就继续产生巡航目标。
恢复 Update 与上层失败传播也不一定发生在同一个分支内。某次 Update 首次把恢复改成 Failed 时,本步已经得到制动命令;后续协调入口看到这份保留的 Failed,才调用行程失败入口。片内的上报事件由脚本读取报告后写入,不能把事件时间反推成恢复内部首次失败的精确时点。
之后每轮继续保留失败并制动,不再进入普通等待中的自动重试。否则有限预算只限制一个恢复实例,外层仍不断创建新实例,最终就变成无限尝试。
本轮显式 Retry 可以清掉保留的恢复失败结果,再重新尝试接路;新的有效任务也会重置恢复。这里没有给所有失败安装同一个自动重试计时器。何时重试、取消或改派,仍由上层根据业务和场景条件决定。
取消清理控制状态,不清零真实动量
Cancel 首先使意图失效,清空当前道路条目和换道点,重置空隙计时、待绕或已通过障碍、原车道和保护停等历史,并重置恢复阶段及其进展记录。取消后的道路评估不再提供巡航目标。
物理车体仍然存在,也还可能在运动。命令分支产生制动,已有速度通过正常传动、轮力与场景接触逐步降低。不能把“取消后没有油门”写成“取消瞬间位置与速度都停止变化”。
视频 8 特意在 B 已有实际运动时取消,检查的就是这一差别。停稳以后重试 B 被拒绝,之后接受 C 才重新开始。只拍到最后停车,无法说明旧任务是否真的失效;需要同时核对取消事件、旧重试返回和随后完成的意图身份。
恢复任务只服务它启动时的意图
恢复启动时保存当时的 IntentSerial。Update 收到不同编号时,清理旧状态并返回制动命令,不让前一个目的地的倒车方向、计时和无进展历史继续影响新任务。
实际宿主在 Cancel 和新 Start 时也显式重置恢复及绕行相关状态。编号检查与宿主清理各有作用:前者约束恢复对象消费哪次意图,后者清理协调层中与该意图相关的记录。单靠清一个目标坐标,无法覆盖这些持续状态。
记录存在,不代表任务仍可执行
HasIntent() 仍然不能直接解释成“正在驾驶”。当前 Completed 和 Failed 都可以保留意图记录;Evaluate 会单独拒绝这些结束阶段,不再产生道路巡航。Cancelled 则使 HasIntent 返回 false,旧任务不能因重试重新生效。
新任务的参数检查发生在目的地和意图编号写入之前。非法请求不应先覆盖旧目标再返回失败;有效请求一旦被接受,即便随后接路失败,也应保留它自己的新意图。这沿用上一篇的入口约定,本轮再补齐恢复和绕行状态的清理。
驾驶资格仍独立存在。旧恢复状态已失效,不等于可以忽略当前驾驶员;新的 NPC 命令照样通过车辆关系接受流程。该意图检查也没有提供联机迟到包、任务树身份或多生产者仲裁的完整协议。
目的地匹配,为什么不能只挑最近道路节点
前面已经把等待、绕行、恢复和失败串成了一趟行程。最后还要检查这条链的两端:建路时有没有选对目标所在的道路,执行以后又是否真的停稳到达。
实车恢复暴露了一个计划层问题:车确实已经回正,目的地看起来就在前方,重建后的路线却绕进旁边支路。车辆执行没有直接出错,问题发生在目的节点选择。
这个位置的原始目标约为 (114.3529, -11) m。支路的一个参考节点约在 (113.0583, -10.9420) m,离目标约 1.296 m;主路参考节点在 (114.3529, -13) m,离目标 2 m。若只挑最近参考节点,支路会先胜出。
但目标位于主路实际车道上。道路参考点可以在车道之外,参考节点更近,并不说明那条道路的实际车道更接近目标。初版选择因而产生了九十四个路线点,原本直接的路段被组织成绕远路径。
用有向车道段的投影距离匹配
第二版遍历可用有向链接及其同向车道,根据已审查车道偏移构造实际车道端点。设目标为 G,车道端点为 A、B,坐标已经转成厘米:
D = B − A
alpha = clamp(dot(Gxy − Axy, Dxy) / lengthSquaredXY(D), 0, 1)
projection = A + alpha × D
distanceSquared = lengthSquaredXY(G − projection)
endDistanceSquared = lengthSquaredXY(G − B)
投影参数先夹取到 [0,1],高度仍沿端点插值。高度差严格小于 2.5 m 的候选,才参与后续比较。主搜索范围按 30 m 位置尺度初始化,用实际投影距离比较,而不再把参考节点距离当作车道距离。
源码还保留细小的平方距离比较容差:距离项有明确改善时更新;平方距离之差绝对值不超过 0.01 cm² 时,再比较到达端点的平方距离,也使用相应容差。这是平方量的比较,不能把它直接说成“所有候选都有固定一毫米线性容差”。
几何接近相当时,优先更近的到达端 B。最终保存对应链接的目标节点,供有向图搜索使用。它改善的是当前局部目的节点匹配,没有联合求解所有车道选择、任务终端姿态和全程路线代价。
修复后,主路实际车道经过目标,正确路线恢复为七个点,并增加“更近的支路参考点不能夺走主路车道目标”的回归。这里的七与九十四是这次问题的具体结果,不是系统规定的标准路线长度。
同一修复需要同步服务普通接路与恢复
普通 Resume 和恢复方向搜索都需要找到目的节点。若只修普通入口,恢复对象可能仍为另一个错误目的节点寻找方向,表面上是“同一目的地”,两个消费者却在使用不同的道路终点。
第二版把目的节点匹配集中到同一个查询函数,普通 Resume 和恢复方向搜索共用。业务目的地坐标不变,修正的是道路层选择的端点。任务最终是否完成,仍按车辆与原始目标的实际距离和低速条件判断。
目的地匹配的修复也区分了素材版本:早期已完成片段来自第一版,第四、七、八段在修复后录制。车辆控制、四轮受力和恢复控制器保持一致,目标匹配则不同,具体录像与复测归属放在文末核对。
到达需要物理执行后的连续确认
NPC 行程完成必须可靠,否则上层可能在车辆尚未真正停稳时触发下车、对话、服务或下一条指令。实车检查发现,单次低速样本通过以后,制动与悬架仍可能引起随后短暂运动。
因此,本轮启用交通策略的宿主增加了实测到达确认:行程先进入停车准备,再由物理后回读持续检查。是否启用由宿主配置,其他调用入口的完成方式并没有一并改变。
先进入较紧范围,再允许制动收敛
最后一段仍按目标距离降低期望速度。进入水平距离严格小于 1.5 m、完整速率严格小于 0.2 m/s 的范围,且高度差小于 2.5 m 时,建立到达等待标记,输出零目标速度。
一旦进入,允许车辆在 1.8 m 范围内继续制动收敛,不因车体轻微回弹越过较紧的进入线就立即重新起步。离开外层范围或不再满足高度条件,则清掉等待标记和累计时间。
这是距离滞回,与障碍前的停等滞回分别持有状态。一个处理路况停车,一个处理末段到达,不能混用同一标记,否则前方障碍停车可能被误判为已经到达。
PostPhysics 的采样决定是否完成
物理后更新发布实测姿态,只有本轮确实有待消费物理提交、当前为 NPC 模式且没有宿主故障时,才继续观察到达。输入有效性、时间步、目标距离、速度都需要通过:
arrivalPending 已建立,阶段仍为 JoiningRoad 或 Driving
0 < dt <= 0.1 s,实际姿态与速度有效
distanceXY(actualPosition, destination) < 1.8 m
abs(actualZ − destinationZ) < 2.5 m
length(actualVelocityMps) < 0.05 m/s
有效观察累计至少 0.5 s,才设置 Completed。任一项不满足会把累计时间归零。代码累计的是满足条件的后物理更新时间,不是从片头经过了多久,也不是“发送制动以后固定等半秒”。
固定 30 Hz 的当前运行中,半秒大约覆盖十五个更新间隔。浮点累计与具体观察起点仍会影响首次通过发生在哪一轮,不能用这个近似倒推所有场景都精确在第十五帧完成。宿主使用实际传入的物理后时间步,本篇也没有声明每个 Chaos 内部子步都单独执行一次该判断。
恢复完成和行程完成使用不同条件
恢复完成说明车头与目标方向已接近、完整速率足够低,可以再次尝试接路。行程完成则检查原始目的地距离和连续低速。前者不应该触发“业务已到达”,后者也不应该因为恢复对象还保留 Completed 诊断值就提前成立。
视频在实测确认后才发出到达事件,片尾还保留了一段停车画面。上一篇是在字幕侧额外等待更低速,本轮则把连续低速确认接进宿主与行程反馈。这是实车验收后补入的实现变化。
当前端点接近仍没有完整停车姿态目标、停车位检测或通用靠边寻点。停到目标框附近并满足低速,不等于已经验收任意车位中的精确泊车。
从参考机制到当前运行链,证据怎样对齐
这些实现参考了成熟开放世界引擎中的车辆任务机制:先根据威胁收紧速度,再交给低层控制;换道前验证路线和前后空间;恢复时用正常物理控制调整姿态,并按实际速度决定换向前是否制动。
源码中的交通处理还涉及驾驶性格、车辆关系、驾驶风格、分帧扫描和特殊车型。当前移植保留了其中与这一包相关的职责,再由 UE 原生 C++ 状态对象、世界查询、数组和物理回读接入。职责相符不代表每个原分支已经逐行等价。
| 层面 | 当前使用内容 | 需要保留的范围 |
|---|---|---|
| 参考任务机制 | 目的与路线分开、威胁减速、换道准入、阶段恢复 | 完整性格、尾随和全部驾驶风格没有接通 |
| 既有原生模块 | 车道路线、感知边界、转向相关速度建议、目标控制、轮力 | 相关源码存在不等于每条分支都在本宿主启用 |
| 本轮协调 | 换道候选和提交、返回检查、恢复失败上报、取消清理 | 当前单车入口,没有全城中央仲裁器 |
| UE 场景约束 | 世界扫掠、人物与障碍观察、Chaos 接触与物理回读 | 几何保护和系数属于目标引擎适配 |
| 展示与验收 | 前车目标、临时障碍、冲量、取消改派、字幕镜头 | 明确刺激的自动化场景,不是随机城市涌现 |
工程里还保留了普通角度探针代码,但这个轮力宿主主要通过相邻车道路线选择绕行方向。多方向探针相关模块及回归的存在,只说明那部分代码已保留,不代表已经全部接入当前驾驶过程。
录像与记录分别回答什么
| 视频 | 时长 | 连续画面核对内容 | 记录补充与限制 |
|---|---|---|---|
| 前车急刹与恢复 | 34.73 s | 跟车、停车、重新出发、到达 | 低速区间和同意图;没有完整性格跟车模型声明 |
| 邻车并入 | 26.07 s | 对方切入后调整车距 | 实际观察、计划保持;不是本车主动超车 |
| 施工绕行与返回 | 38.67 s | 等旁车、绕出、返回、到达 | 同意图、两次获准换道;没有对向车道或全城预约 |
| 条件变化 | 38.87 s | 提交前等待、提交后受阻、清障续行 | 停等中保留 Plan 2,低速跨度约 1.43 s |
| 行人与封路 | 31.33 s | 人物停步让行、道路重开后继续 | 人物来自原生行走宿主;没有高路缘跨越能力 |
| 物理接触 | 30.67 s | 箱体侧撞、移开后修正并到达 | 七次接触通知,偏移约 62.3 cm;Plan 保持 1 |
| 自主姿态恢复 | 35.53 s | 倒车、停顿、前进、重新接路 | NPC 控制;限平直路段,未验收复杂地形恢复 |
| 失败与改派 | 48.33 s | 有限失败、运动中取消、只有新任务到达 | 意图依次为 1、2、3;新目的地由脚本下达 |
八段视频总长 284.2 s,各自来自独立 PIE 会话。一段中可以同时检查跟车、停步和重新出发,但它仍然只是一段录像。
视频以固定 30 Hz 仿真,每两个物理样本取一帧,编码为 15 fps,保持仿真时长。开头裁去初始化,片内没有跳切、倒放和加速。录制耗时与输出帧率都不表示引擎实时性能;这里也没有人工硬件操作或联网同步验收。
连续画面能展示动作过程,命令来源、意图与计划编号、实际停稳区间、精确偏移仍从同轮记录核对。第六段明确要求出现真实接触,其余片段要求没有接触;不能把整包统称为无碰撞测试,也不能把一次受控侧撞扩大为任意事故恢复。
回归数和版本分别核对
交付记录中,248 项相关原生回归成功,零失败、零未运行、零带警告成功。其中已经包含十一项聚焦测试,即八项新增与三项既有测试,不把子集再加到总数上。这是交付阶段的相关回归,不是写作时重新运行的全仓库测试。
聚焦测试覆盖空隙与显式类别、速度保护滞回、返回几何不改写当前计划、恢复按实际速度制动、有限失败与意图替换、行程生命周期、停稳确认,以及目的地使用实际有向车道几何。测试输入检查机制分支,实车场景再检查其是否进入同车物理执行。
第一版对应视频 1、2、3、5、6;第二版对应视频 4、7、8。第二版修复目的地匹配,第四段也延长了临时路障前的实测停等画面。前六个原任务在第二版另有实车复测,不能把复测结果写成旧录像已经换成第二版。
交付中保留了两版源码快照、差异、DLL 指纹,以及录制脚本、事件和轨迹。原城地图没有保存临时修改,路网也没有重新生成。本文依据这些已冻结的材料撰写,没有为写作改代码、重录或重跑引擎验收。
后续接入仍要保留哪些职责
在这些受控场景里,普通车辆已经能保留目的地,处理交通停等、受限换道、自主姿态恢复,并把失败交回上层。扩展到全城交通,还要处理扫描预算、多车预约、路口优先级和更丰富的道路条件。
恢复也还没有翻车自救、复杂坡面或立交验证;正常交通预测尚未覆盖对方倒车和大侧滑的完整速度矢量;目的地匹配没有形成任意目标车道的全局最优规划,网络同步与多人一致性均未验收。
后续可以把这套行程接到服务车辆、同伴接应或剧情驾驶中。业务层决定目的地何时有效、失败后怎样改派;行程保留目的和路线,交通策略限制当前动作,恢复执行有限机动,驾驶关系检查命令资格,车体反馈实际结果。这样,停车、绕行和回正就不必重建业务任务,车辆处理完眼前的情况,还能继续原来的行程。
AI 协作复盘
写作前先完整看完八段任务视频,再对照交接、冻结源码和同轮事件、轨迹。AI 帮助整理状态由谁保存、速度与空隙公式怎样使用,以及候选提交和取消的调用顺序,并绘制机制图。文中的实现和引擎验收均来自已有交付,没有在写作阶段新增驾驶功能。
最容易写混的是停车。前车急刹、换道前空隙消失、提交后遇阻、恢复预算耗尽,看起来都可能是车停住了,实际保留的计划和继续条件却不同。逐条检查调用顺序后,才把这些情况分开解释。
源码核对也收窄了几处容易扩大的说法:静止速度不代表静态类别,返回几何预览不授予未来通行权,Recovery Completed 不直接等于道路接续成功;接触通知次数不代表事故次数,沿当前路线修正也不等于整路重规划。
两处实车问题也需要保留原因:道路参考点更近,仍可能选错目标车道;某一轮速度很低,也不代表车已经稳定停住。前者通过目标匹配修正,后者增加物理后连续确认。核对时分别看对应版本、实现和记录,避免把修复后的结果写到旧录像上。












《城市模拟的 UE5 运行时实现|NPC 跟车、受限绕行与自主恢复》有1条评论