前面的章节为我们构建了一个能在理想化、结构化的环境中完成基本导航的算法框架。然而,要使 Humanoid 从实验室的受控环境迈向混乱、动态且充满意外的真实世界,就必须攻克一系列“进阶场景”。这些场景是检验导航系统鲁棒性、智能性和社会适应性的试金石,也是区分“技术演示”与“可靠产品”的核心所在。本章将深入剖超控动态交互设施(电梯、闸机)、破解感知陷阱(玻璃、镜面)、适应极端环境变化(光照骤变)、处理复杂社会交互(狭路会车),以及实现任务级的失败与恢复。本章的目标不仅是识别这些长尾问题,更是为它们提供一套层次分明、原理清晰、且能在不同算力预算(1B/10B)下权衡的算法策略。
这类场景的本质挑战在于,机器人必须与一个具有内部逻辑和隐藏状态的外部“智能体”进行精确协同。这超越了简单的几何避障,需要一个能够理解并执行特定“社会协议”的决策系统。我们将此问题域称为状态化交互导航 (Stateful Interactive Navigation)。
核心算法:分层有限状态机 (Hierarchical Finite State Machine, HFSM) 与感知锚点
我们将交互过程建模为一个分层的 FSM。顶层 FSM 管理宏观流程(如“使用电梯”),而其内部状态可以自身就是一个更小的 FSM(如“按按钮”这个动作包含“定位按钮”、“伸出机械臂”、“确认按压”等子状态)。
以乘坐电梯为例,一个详尽的 FSM 流程:
+-----------------------------+ User Command: "Go to Floor 5" +-----------------------------+
| IDLE |------------------------------------->| NAV_TO_ELEVATOR_LOBBY |
| (Awaiting Task) |<-------------------------------------| (Path to call panel area) |
+-----------------------------+ Task Fail/Cancel +-----------------------------+
|
| Goal Reached
v
+-----------------------------+ <----------------------------------- +-----------------------------+
| MONITOR_ELEVATOR_ARRIVAL | Press Fail (Timeout/Occluded) | EXECUTE_CALL_SEQUENCE |
| (Listen for 'ding', watch door)|----------------------------------->| (Detect button, align, press) |
+-----------------------------+ Press Success +-----------------------------+
|
| Door_State == OPEN and Path_Clear == TRUE
v
+-----------------------------+ <----------------------------------- +-----------------------------+
| ENTER_ELEVATOR | Entry Path Blocked | VALIDATE_ENTRY_PATH |
| (Move inside carefully) |------------------------------------| (Check for people, obstacles) |
+-----------------------------+ Path is Clear +-----------------------------+
|
| Entry Complete
v
+-----------------------------+ <----------------------------------- +-----------------------------+
| WAIT_FOR_DOOR_CLOSE | Panel Not Found | NAV_TO_INTERNAL_PANEL |
| (Wait for door to shut) |------------------------------------| (Locate floor buttons) |
+-----------------------------+ Panel Found +-----------------------------+
| |
| Door_State == CLOSED | Press '5' button
v v
+-----------------------------+ +-----------------------------+
| MONITOR_FLOOR_CHANGE | | EXECUTE_PRESS_SEQUENCE |
| (OCR screen, listen to voice) | | (Press target floor button) |
+-----------------------------+ +-----------------------------+
^
| Target_Floor_Reached == TRUE
v
+-----------------------------+
| EXIT_ELEVATOR |
| (Wait for door, then exit) |
+-----------------------------+
感知锚点 (Perceptual Anchors): FSM 的状态转换完全由一系列专用的感知模块触发,我们称之为“感知锚 ઉ 点”。
Detect_Button: 一个轻量级目标检测模型,用于定位电梯内外按钮。Read_Floor_Number: 一个 OCR 模型,用于读取电梯内外的数字显示。Door_State_Classifier: 一个基于深度或 RGB 的分类器/分割模型,判断门是 OPEN, CLOSED, OPENING, CLOSING。Sound_Event_Detector: 识别“电梯到达”的提示音(“叮”)或楼层播报语音。Path_Clear_Evaluator: 结合深度信息和行人检测,判断进出路径是否安全。1B vs. 10B 方案对比:
[FindElevatorButton -> PressButton(Up) -> WaitAndEnter -> ...]。EXECUTE_CALL_SEQUENCE 失败,1B 模型只能放弃。而 VLA 可以分析失败原因。
这类材质对主流的几何传感器(LiDAR, ToF, Structured Light)构成了根本性挑战,因为它们违反了“表面反射”的基本假设。处理不当会导致机器人直接撞墙,或在 SLAM 地图中构建出不存在的“幻影空间”。
核心算法:多模态线索冲突检测与不确定性建模
解决该问题的核心思想是:任何单一传感器都不可信,必须建立一个交叉验证框架,主动寻找不模态信息之间的矛盾,并将这种矛盾量化为导航风险。
glass_door, window, mirror”。# 伪代码
for region in image:
is_traversable = geometry_module.check(region) # -> True
semantic_label = semantic_module.predict(region) # -> "glass_door"
if is_traversable and semantic_label in GHOST_OBJECTS:
occupancy_map.set_cost(region, costs.HIGH_UNCERTAINTY)
GHOST_OBJECTS 是一个预定义的、包含“玻璃”、“镜子”、“高透明亚克力板”等汇的集合。T_ego = (R, t)。F。T_ego 和平面参数 (n, d) 来解释。如果光流场与机器人自身运动引起的反射光流高度相关,则该平面有极高概率是镜面。Score_mirror = correlation(F_region, project(T_ego, plane))Score_mirror 的区域在 SLAM 和规划的代价图中标记为不可信区域,应被排除在地图构建之外。occupied。这是一个高风险的最后手段,需要严格的安全限制。1B vs. 10B 方案对比:
视觉算法,特别是依赖特征点匹配的 V-SLAM 和 VIO,对光照条件极为敏感。光照的剧烈变化(如开关灯、进出隧道)或极端条件(夜间、过曝)会导致特征点大量丢失,从而引发定位失败和感知系统崩溃。
核心算法:感知质量自评估与分级降级策略 (Perception Quality Self-Assessment & Tiered Degradation Strategy)
系统必须具备内省能力,即实时、量化地评估其核心感知模块的健康状况,并据此自动切换到预设的、不同等级的运行模式。
Num_Tracked_Features: 持续跟踪的特征点数量。低于某个阈值(如 < 50)则为危险信号。Feature_Distribution_Entropy: 特征点在图像上的分布均匀度。如果特征点聚集在一小块区域,说明场景纹理单一,定位不可靠。Reprojection_Error_Variance: 重投影误差的方差。方差突然增大意味着匹配质量下降或出现外点。Confidence_Score_Histogram: 模型输出置信度的均值和方差。均值持续偏低表明模型对当前输入不确定。Uncertainty_Estimation: 对于支持不确定性估计的模型(如使用 Monte Carlo Dropout),可以直接量化模型的不确定性。Histogram_Entropy: 图像直方图的熵,可以衡量图像的对比度。Exposure_Level: 图像的平均亮度,判断是否过曝或暗。NOMINAL (正常模式): 所有质量指标均在健康范围内。全功能运行,速度、规划策略正常。CAUTIOUS (谨慎模式): 部分指标开始恶化(如特征点数下降 20%)。
R_vision,从而让系统更相信 IMU 和轮式里程计的推算。W_vision ∝ 1 / QualityScore_visionSAFE_STOP (安全停止模式): 关键指标跌破生存阈值(如 VIO 连续 1s 无法收敛)。
MANUAL_RECOVERY (人工干预): 重定位尝试多次失败。
Rule-of-Thumb: 系统的安全性不取决于它在最佳状态下能跑多快,而在于它在最差状态下能否安全地停下来。降级策略是主动安全的核心,必须在设计阶段就作为一等公民来考虑。
在拥挤空间中与人或其他机器人交互,纯粹的几何避障是远远不够的。这会导致机器人行为生硬、不自然(如在人面前突然急停),甚至引发死锁(如在门口与人对峙)。成功的社交导航要求机器人能够理解并遵守隐含的社会规范。
核心算法:预测性规划与社会规范代价函数 (Predictive Planning with Social Norm Cost Functions)
其核心是将不可见的社会规则,通过数学建,转化为规划器可以理解和优化的“代价”。
C_social:
规划器的总代价函数 Cost_total = w_path * C_path + w_obs * C_obs + w_social * C_social。其中 C_social 由多个部分组成:
C_personal(p) = Σ_i A_i * exp(-d(p, person_i)^2 / (2σ_i^2))
这是一个以每个行人 i 为中心的高斯惩罚场。关键在于 σ_i 不是常数,而是各向异性的:
σ_front > σ_side > σ_back,即人们对前方的侵犯更敏感。σ 会根据行人的速度 v 动态调整,速度越快,前方的安全距离要求越大。R 与行人 H 即将相遇。P_c 的预计时间 T_R 和 T_H。
IF |T_R - T_H| < threshold_time: # 可能冲突
IF distance(H, P_c) < distance(R, P_c): # 对方更近
robot_action = YIELD # 机器人让行
ELSE:
robot_action = PROCEED_CAUTIOUSLY # 机器人先行
1B vs. 10B 方案对比:
C_social 是静态的,对所有人都使用相同的、各向同性的个人空间模型。让行逻辑是硬编码的规则。导航只是实现更复杂任务(如送货、引导)的一个子环节。任务执行链条可能因各种外部因素而中断(目标点无法到达、收到新指令等)。系统必须具备健壮的任务管理能力,以优雅地处理这些中断。
核心算法:行为树 (Behavior Trees, BT) 与抢占式任务调度器
相比于容易产生“状态爆炸”问题的 FSM,行为树为复杂、分层的任务逻辑提供了更模块化、可组合和响应式的解决方案。
为何选择行为树 (BT) 而非 FSM?
OpenDoor 技能)。一个更复杂的“取物”任务 BT 示例:
-> Sequence (Fetch Coffee Task)
|
+--> ? Selector (Get to Kitchen)
| |
| +--> -> Sequence (Primary Route)
| | |
| | +--> PathToKitchenExists?
| | +--> NavigateTo(Kitchen)
| |
| +--> -> Sequence (Recovery: Ask for Help)
| |
| +--> Announce("The path to the kitchen is blocked.")
| +--> WaitForHumanHelp(timeout=60s)
|
+--> ? Selector (Operate Coffee Machine)
| |
| +--> -> Sequence (Main Operation)
| | |
| | +--> Localize(CoffeeMachine)
| | +--> PressButton("Brew")
| |
| +--> FailSafe("Failed to operate coffee machine.")
|
+--> NavigateTo(UserLocation)
Selector (?) 节点会依次尝试其子节点,直到一个成功为止。这天然地实现了“尝试-备用方案”的逻辑。Sequence (->) 节点会依次执行其子节点,只要有一个失败,整个序列就失败。这用于描述必须按顺序完成的步骤。抢占式调度 (Preemptive Scheduling):
FetchCoffee, EmergencyStop)都被赋予一个先级。EmergencyStop 指令)到达时:
FetchCoffee 的 BT)被挂起 (Suspend)。T_enter 和一个较高的退出阈值 T_exit。只有当质量低于 T_enter 时才进入谨慎模式,而必须当质量恢复到 T_exit 以上时才能返回正常模式。