Skip to content

feat: cppMapNavigator#1170

Merged
MistEO merged 6 commits intov2from
feat/cppMapNavigator-v2
Mar 10, 2026
Merged

feat: cppMapNavigator#1170
MistEO merged 6 commits intov2from
feat/cppMapNavigator-v2

Conversation

@Lemon-miaow
Copy link
Member

@Lemon-miaow Lemon-miaow commented Mar 9, 2026

本 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
Loading

核心技术特性

1. 从“瞬时导航”跃迁为“感知驱动的闭环控制系统”

  • 定位与导航一体化闭环:MapNavigator 不再把定位当作一次性的初始化步骤,而是持续从 PositionProvider 拉取由 MapLocator 输出的实时空间观测,将坐标、朝向、区域 zone_id 与时间戳统一纳入控制回路。
  • 从开环走向闭环:导航决策不再依赖“命令已经下发,因此角色大概率会照做”这种假设,而是每个 Tick 基于最新观测结果重新计算误差、推进状态,并判断是否需要纠偏、减速、转向、冲刺或重规划。
  • 真正的工业控制语义:这套系统本质上已经不是“脚本在走路”,而是一个以空间观测为反馈信号的实时控制器。

2. 显式相位状态机,彻底终结导航逻辑的意大利面化

  • 多相位治理:引入 NavigationStateMachine,将整个导航流程划分为 BootstrapAlignHeadingAdvanceOnRouteWaitZoneTransitionRecoverRejoinExactTargetRefineFinishedFailed 等显式阶段。
  • 语义清晰的阶段切换:每一种行为切换都有明确的触发条件、恢复路径与日志快照,不再出现“上一帧还在赶路,下一帧突然进入某个神秘分支”的维护噩梦。
  • 复杂场景可控化:跨区、失锁、偏航、接近终点、动作节点触发等过去最容易堆 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 --> [*]
Loading

3. 路线不是“死轨道”,而是支持动态重挂的连续流形

  • 失配后的智能重挂:新增 RouteRejoinPlanner,并非简单回退到最近路径点,而是同时评估路点候选与线段投影候选,结合当前位置、路径拓扑、朝向一致性与前后索引偏置,选出代价最低的重入方案。
  • 拒绝“倒车回档式”恢复:系统在候选打分时显式惩罚过度回退,并鼓励合理的前向重挂,最大限度避免因为局部漂移导致整段路径反复重走。
  • 路径连续性升级:导航轨迹不再是机械地追逐离散点集,而是具备了对“路径本身”这一几何对象的理解能力。

4. 面向真实地形阻塞的本地驾驶内核,而非脆弱的直线前冲

  • 轻量级局部驾驶器:引入 LocalDriverLite,持续监测是否存在“无进展但仍在推进”的异常状态,并在检测到局部受阻后,自动执行跳跃前冲、左右微避让、恢复规避、原地转向等微操策略。
  • 承诺制动作提交:局部规避并非每帧抖动式乱切,而是采用带持续时间的 commitment 机制,确保动作具有物理连续性,不会因为瞬时噪声而疯狂抽搐。
  • 阻塞升级与主动放弃:当连续恢复仍无法脱困时,系统不会死磕错误路径,而是主动请求进入路线重挂流程。这种“知难而退”的能力,恰恰是成熟导航系统与脚本式实现之间的分水岭。

恢复与重挂时序

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: 继续推进主路径
Loading

5. 跨区 / 传送门导航被首次提升为一等公民

  • 区域感知式路径语义:路径节点不再只有平面坐标,还原生支持 ZONEPORTALHEADING 等控制节点,导航语义从二维平面走向了拓扑空间。
  • 跨区确认闭环:通过 ZoneTransitionController 显式等待预期 zone_id 出现,并在切区阶段执行盲走恢复、跳跃推进、侧移探测等动作,直到稳定进入新区域。
  • 不再把楼层或传送视作异常:跨区行为从过去只能“赌一下能不能穿过去”,升级为可确认、可恢复、可审计的正式流程,系统由此具备了处理多层级地图、传送点、楼层切换的工程能力。

6. 朝向控制进入“自学习标定”时代

  • 虚拟朝向与视觉朝向双轨制:NavigationSession 内部维护 virtual_yaw,既利用视觉观测同步实际朝向,又在执行转向动作后根据执行量预测新姿态,构成短期连续控制所需的中间状态。
  • 转向比例自适应学习:MotionController 不再把“单位输入对应多少角度”写死为经验常量,而是利用动作后的定位反馈进行在线更新,持续修正 units_per_degree
  • 从能转到转准:这意味着系统的镜头控制不再停留在“差不多拧过去”,而是能随着环境和设备特性自动逼近更稳定的角度响应模型。

7. 终点精修机制,解决“到了附近但就是不算到”的最后一公里顽疾

  • 两阶段接近策略:远距离阶段强调连续推进与路径跟随,进入终点邻域后自动切换到 ExactTargetRefine,采用更高频率的定位重试、更严格的距离阈值与角度修正策略。
  • 严格动作节点可控:JUMPINTERACTFIGHTPORTAL 等节点支持严格到达语义,不会在“还差一截”的位置误触发关键动作。
  • 导航质量从“能跑通”提升到“能精确落点”:这对高价值交互点、传送门入口、触发式机关等场景至关重要。

跨区与重定位流程

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]
Loading

相比传统脚本式导航范式的本质变化

过去的导航系统,本质上仍停留在“识别一下当前位置,算个目标角度,按住前进,偶尔修一下头”的朴素范式。这种范式在短路径、无遮挡、单图层、无跨区的理想环境下尚可工作;一旦进入真实业务场景,就会暴露出明显的系统性短板:

  • 缺乏统一状态治理,复杂流程只能靠分散逻辑硬拼。
  • 缺乏拓扑语义,无法优雅处理区域切换、传送、楼层迁移。
  • 缺乏局部恢复机制,卡住时只能继续硬顶。
  • 缺乏路径重挂能力,一旦偏离就容易整段报废。
  • 缺乏执行器标定学习,朝向控制质量高度依赖经验参数。
  • 缺乏与定位系统的深层耦合,感知与控制始终是松散拼装。

而本次 MapNavigator 与 MapLocator 的联合落地,第一次从架构层把这些问题系统性收束起来。导航系统不再是定位模块输出坐标后的“附属消费者”,而是与定位引擎共同组成了一个持续反馈、自主修复、支持拓扑迁移、可在线校正的完整空间智能体。

工程价值

本次 PR 最重要的意义,并不只是“导航成功率更高”或者“走路更稳”这种局部收益,而是正式确立了一个具备长期演进上限的底层基座:

  • MapLocator 持续提升感知质量,MapNavigator 将同步获得更强的控制稳定性。
  • 路径语义可继续扩展更多控制节点,支撑更复杂的任务编排。
  • 局部驾驶器、重挂策略、转向学习器都具备天然的参数化与数据驱动优化空间。
  • 整个系统已经完成从“脚本式流程”到“闭环自治系统”的范式切换,后续无论扩展地图复杂度、提升极端场景适应力,还是接入更高层任务规划,底层都已经具备承载能力。

换句话说,这次不是新增了一个能跑路径的模块,而是给项目补上了一套真正配得上复杂地图任务的导航操作系统内核。

架构边界

  • MapLocator:提供高置信度实时位置、朝向、区域观测,是整个导航闭环的感知底座。
  • MapNavigator:负责路径推进、相位治理、朝向控制、跨区确认、失配重挂与局部脱困。
  • 二者组合后,系统正式具备了长路径连续导航、多区域拓扑迁移、极端场景恢复的一体化能力。

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @Lemon-miaow, your pull request is larger than the review limit of 150000 diff characters

Lemon-miaow and others added 4 commits March 10, 2026 01:10
Continues #1008

---------

Co-authored-by: MistEO <mistereo@hotmail.com>
Co-authored-by: uy/sun <hmy0119@gmail.com>
@MistEO MistEO merged commit b06dca9 into v2 Mar 10, 2026
17 checks passed
@MistEO MistEO deleted the feat/cppMapNavigator-v2 branch March 10, 2026 01:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants