Conversation
Contributor
There was a problem hiding this comment.
Sorry @Lemon-miaow, your pull request is larger than the review limit of 150000 diff characters
Continues #1008 --------- Co-authored-by: MistEO <mistereo@hotmail.com> Co-authored-by: uy/sun <hmy0119@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
本 PR 引入 C++ MapNavigator 寻路模块,并与已合入主干的 MapLocator 深度耦合,首次在架构层完成“高精定位先验 + 闭环运动控制 + 导航状态机治理”的一体化落地。
这并非传统“点到点朝向修正 + 前进”式移动逻辑的线性逻辑。导航模块不依赖脆弱的单帧瞬时判断,也不再将“路径跟随”“跨区过渡”“卡死恢复”“重新挂回路线”拆成彼此割裂的局部 patch,而是统一收束进一个具备感知、决策、执行、反馈完整闭环的工业级导航引擎。
在这一新架构下,MapLocator 提供稳定、低延迟、高置信度的位置与朝向观测;MapNavigator 则以此为传感器输入,构建出可持续纠偏、可跨区域推进、可失配自愈、可动态重入路线的强鲁棒控制系统。系统第一次真正具备了在复杂地图拓扑、长路径连续行进、传送门或楼层切换、局部遮挡与短时失锁场景下稳定工作的能力。
总体架构
flowchart LR A[游戏画面 / 小地图帧] --> B[MapLocator] B --> C[PositionProvider<br/>Capture / WaitForFix / ResetTracking] subgraph S[Session Layer] D[NavigationSession<br/>current_path / current_node_idx<br/>virtual_yaw / current_zone_id<br/>progress tracking / stalled_ms] end C --> D subgraph F[NavigationStateMachine<br/>中央编排核心] E1[Bootstrap] E2[AlignHeading] E3[AdvanceOnRoute] E4[WaitZoneTransition] E5[WaitRelocation] E6[RecoverRejoin] E7[ExactTargetRefine] E8[Finished / Failed] end D --> F C -. 实时 position / yaw / zone_id .-> F subgraph P[Planning & Recovery] G[RouteRejoinPlanner<br/>Waypoint / Segment candidate planning] H[ZoneTransitionController<br/>ConsumeZoneNodes / WaitForExpectedZone] I[LocalDriverLite<br/>Cruise / MicroAvoid / Recover] end subgraph X[Execution Layer] J[MotionController<br/>turn / move / sprint<br/>forward commit / adaptive turn learning] K[ActionExecutor<br/>RUN / JUMP / INTERACT / PORTAL / FIGHT] L[ActionWrapper<br/>controller backend abstraction] end F --> G F --> H F --> I F --> J F --> K G --> D H --> D I --> F J --> L K --> L L --> M[角色控制输入] M --> A J -. SyncVirtualYaw / turn feedback .-> D H -. ConfirmZone / landing portal .-> D G -. ApplyRejoinSlice .-> D核心技术特性
1. 从“瞬时导航”跃迁为“感知驱动的闭环控制系统”
zone_id与时间戳统一纳入控制回路。2. 显式相位状态机,彻底终结导航逻辑的意大利面化
NavigationStateMachine,将整个导航流程划分为Bootstrap、AlignHeading、AdvanceOnRoute、WaitZoneTransition、RecoverRejoin、ExactTargetRefine、Finished、Failed等显式阶段。if-else的脆弱逻辑,现在都被统一状态机收编治理,系统行为第一次具备了可解释性与可调试性。状态机相位图
stateDiagram-v2 direction LR [*] --> Bootstrap Bootstrap --> AlignHeading : 初始 fix 成功 Bootstrap --> Failed : 初始定位失败 AlignHeading --> AdvanceOnRoute : 对齐完成 AlignHeading --> WaitRelocation : 转向后等待稳定 AlignHeading --> RecoverRejoin : 对齐失败 / 偏差过大 AdvanceOnRoute --> WaitZoneTransition : 命中 ZONE / PORTAL AdvanceOnRoute --> WaitRelocation : 动作后待重定位 AdvanceOnRoute --> ExactTargetRefine : 进入终点邻域 AdvanceOnRoute --> Finished : 路径完成 AdvanceOnRoute --> RecoverRejoin : 偏航 / 卡滞 / 丢路 WaitZoneTransition --> AdvanceOnRoute : 切区确认成功 WaitZoneTransition --> WaitRelocation : 传送落地后等待稳定 WaitZoneTransition --> RecoverRejoin : 未稳定挂回 WaitZoneTransition --> Failed : 超时失败 WaitRelocation --> AlignHeading : 需重新对齐 WaitRelocation --> AdvanceOnRoute : 可继续推进 WaitRelocation --> RecoverRejoin : 已脱轨 WaitRelocation --> Failed : 长时间无 fix ExactTargetRefine --> Finished : 精修完成 ExactTargetRefine --> RecoverRejoin : 精修期间失配 RecoverRejoin --> AlignHeading : 重挂成功 RecoverRejoin --> Failed : 无可行候选 / 超出 abort distance Finished --> [*] Failed --> [*]3. 路线不是“死轨道”,而是支持动态重挂的连续流形
RouteRejoinPlanner,并非简单回退到最近路径点,而是同时评估路点候选与线段投影候选,结合当前位置、路径拓扑、朝向一致性与前后索引偏置,选出代价最低的重入方案。4. 面向真实地形阻塞的本地驾驶内核,而非脆弱的直线前冲
LocalDriverLite,持续监测是否存在“无进展但仍在推进”的异常状态,并在检测到局部受阻后,自动执行跳跃前冲、左右微避让、恢复规避、原地转向等微操策略。恢复与重挂时序
sequenceDiagram participant Sensor as PositionProvider / MapLocator participant Session as NavigationSession participant FSM as NavigationStateMachine participant Driver as LocalDriverLite participant Rejoin as RouteRejoinPlanner participant Motion as MotionController participant Game as Character Sensor->>FSM: 持续提供 position / yaw / zone_id FSM->>Session: ObserveProgress(actual_distance, waypoint_idx) Session-->>FSM: stalled_ms 上升 / best_actual_distance 不再改善 FSM->>Driver: Evaluate(yaw_error, distance_delta, moved_distance) Driver-->>FSM: blocked=true / request_rejoin=true alt 可先局部脱困 FSM->>Motion: SetAction(ForwardLeft / ForwardRight / JumpForward) Motion->>Game: 执行微避障 / 恢复动作 Sensor->>FSM: 返回新的位置观测 else 直接进入重挂 FSM->>Rejoin: Plan(current_pos, heading, path, preferred_index) Rejoin-->>FSM: 返回 waypoint / segment 候选 FSM->>Session: ApplyRejoinSlice(slice_start, pos) FSM->>Session: UpdatePhase(AlignHeading) end FSM->>Motion: 重新朝向当前目标 Motion->>Game: turn / move / sprint Sensor->>FSM: 新定位稳定 FSM->>Session: 继续推进主路径5. 跨区 / 传送门导航被首次提升为一等公民
ZONE、PORTAL、HEADING等控制节点,导航语义从二维平面走向了拓扑空间。ZoneTransitionController显式等待预期zone_id出现,并在切区阶段执行盲走恢复、跳跃推进、侧移探测等动作,直到稳定进入新区域。6. 朝向控制进入“自学习标定”时代
NavigationSession内部维护virtual_yaw,既利用视觉观测同步实际朝向,又在执行转向动作后根据执行量预测新姿态,构成短期连续控制所需的中间状态。MotionController不再把“单位输入对应多少角度”写死为经验常量,而是利用动作后的定位反馈进行在线更新,持续修正units_per_degree。7. 终点精修机制,解决“到了附近但就是不算到”的最后一公里顽疾
ExactTargetRefine,采用更高频率的定位重试、更严格的距离阈值与角度修正策略。JUMP、INTERACT、FIGHT、PORTAL等节点支持严格到达语义,不会在“还差一截”的位置误触发关键动作。跨区与重定位流程
flowchart TD A[AdvanceOnRoute] --> B{当前节点类型} B -->|ZONE / PORTAL| C[进入 WaitZoneTransition] B -->|普通位置节点| Z[继续路径推进] C --> D[ZoneTransitionController] D --> E[ConsumeZoneNodes] E --> F[WaitForExpectedZone: expected_zone_id] F --> G{已进入目标 zone?} G -->|否| H[继续等待 fix / 保持前进 / 落地探测] H --> F G -->|是| I[NavigationSession.ConfirmZone] I --> J{是否为 portal 落地后重定位阶段?} J -->|是| K[进入 WaitRelocation] J -->|否| L[切回 AdvanceOnRoute] K --> M[等待位置稳定 / movement settle] M --> N{恢复到有效路径上下文?} N -->|是| O[AlignHeading 或 AdvanceOnRoute] N -->|否| P[RecoverRejoin] P --> Q[RouteRejoinPlanner Plan] Q --> R{存在可行候选?} R -->|是| S[ApplyRejoinSlice] S --> O R -->|否| T[Failed]相比传统脚本式导航范式的本质变化
过去的导航系统,本质上仍停留在“识别一下当前位置,算个目标角度,按住前进,偶尔修一下头”的朴素范式。这种范式在短路径、无遮挡、单图层、无跨区的理想环境下尚可工作;一旦进入真实业务场景,就会暴露出明显的系统性短板:
而本次 MapNavigator 与 MapLocator 的联合落地,第一次从架构层把这些问题系统性收束起来。导航系统不再是定位模块输出坐标后的“附属消费者”,而是与定位引擎共同组成了一个持续反馈、自主修复、支持拓扑迁移、可在线校正的完整空间智能体。
工程价值
本次 PR 最重要的意义,并不只是“导航成功率更高”或者“走路更稳”这种局部收益,而是正式确立了一个具备长期演进上限的底层基座:
MapLocator持续提升感知质量,MapNavigator将同步获得更强的控制稳定性。换句话说,这次不是新增了一个能跑路径的模块,而是给项目补上了一套真正配得上复杂地图任务的导航操作系统内核。
架构边界
MapLocator:提供高置信度实时位置、朝向、区域观测,是整个导航闭环的感知底座。MapNavigator:负责路径推进、相位治理、朝向控制、跨区确认、失配重挂与局部脱困。