Hierarchical Planning with Latent World Models

Paper: arXiv:2604.03208 Code: kevinghst/HWM_PLDM Code reference: main @ e197375b (2026-04-06)

1. Motivation(研究动机)

当前基于 learned world model 的 MPC 在 embodied control 中有一个很诱人的优点:模型可以只从 reward-free / task-agnostic offline trajectories 学 dynamics,然后在新任务上通过 goal-conditioned planning 零样本部署,不必为每个任务重新训练 policy。问题是这种范式一进入 long-horizon control 就暴露两个根本瓶颈。

第一,world model 的 rollout 会累积误差。低层模型通常擅长一步或短窗口预测,但如果为了到达远处 goal 必须 autoregressively rollout 很多步,小的 latent prediction error 会不断放大,最后 planner 优化的是不可靠的未来。第二,即使 dynamics 是完美的,直接在 primitive action sequence 上做长 horizon search 也会遇到组合爆炸:horizon 越长,CEM / MPPI 需要探索的 action sequence 空间越大,固定 compute budget 下很容易只找到 greedy 或局部可行的动作。

这篇论文要解决的具体问题不是“再训练一个更大的 policy”,而是:怎样在已经学好的 latent world models 上,把 long-horizon reasoning 和 short-horizon execution 分开,让 zero-shot MPC 能完成非 greedy、多阶段的机器人任务和导航任务。 这件事重要,因为一旦成功,world model 就可以成为通用 planner:高层负责找可解释的 latent subgoals,低层负责执行精细动作,系统不需要人工给中间目标,也不需要任务特定的 skill / option policy。

Figure 1 解读:这张总览图把论文的主要动机和结论放在一起。上半部分展示 high-level planner 在 latent space 里用 macro-actions 朝最终 goal 搜索,得到的第一个预测 latent state 被低层当作 subgoal;底部的实验覆盖图说明 hierarchy 在 Franka、Push-T、Diverse Maze 等不同 world model / task 上都能带来增益;右下角的 compute curve 强调 HWM 不是单纯用更多 search 换性能,而是在更低 planning time 下达到相近或更高 success。

2. Idea(核心思想)

核心 insight 是:hierarchy 不一定要靠学一个 hierarchical policy 或显式 skill library;如果多个 temporal scale 的 world model 共享 latent representation,那么高层预测出的未来 latent state 本身就可以作为低层 MPC 的 subgoal。 这样,高层只需要在抽象 latent action 空间里做长程搜索,低层只需要在 primitive action 空间里解决短程可达性。

HWM 的关键创新是把 temporal abstraction 放在 inference-time planning 中:低层 world model 学 primitive action dynamics,高层 world model 学由 action encoder 压缩出的 macro-action dynamics;规划时先最小化最终 goal latent 的高层 energy,再把第一个高层预测 latent 交给低层 MPC。

它和传统 hierarchical RL / options 的根本差别在于:HWM 不训练任务特定 high-level policy,也不要求低层 skill policy 接受 symbolic subgoal;相比 flat VJEPA2-AC / DINO-WM / PLDM planner,HWM 改变的是 planner 的 temporal structure,而不是低层模型的训练目标。论文实验也刻意复用底层 world model recipe,以隔离“hierarchical planning 本身”的贡献。

3. Method(方法)

3.1 总体框架:top-down latent-space MPC

给定当前 observation 和 goal observation ,共享 encoder 把它们映射到 latent states: HWM 假设有两个时间尺度的 latent world model: 其中 是 primitive action, 是由 action encoder 从一段低层动作压缩得到的 latent macro-action。规划过程是 top-down 的:高层先搜索 个 latent actions,使预测轨迹靠近最终 goal;然后低层只追踪高层轨迹中的第一个 subgoal,并按 receding-horizon MPC 不断重规划。

高层 energy 写作: 展开最优 latent plan 得到高层子目标: 低层只追踪第一个 latent subgoal: 直觉上,高层避免了“直接搜索一长串 primitive actions”的组合爆炸,低层避免了“长时间 rollout 一个短 horizon 模型”的误差累积。更重要的是,高层 subgoal 仍然是同一个 latent space 里的 state,不需要 inverse model 把 symbolic goal 翻译成 action,也不需要人工标注 skill boundary。

3.2 低层 latent world model:复用已有短程 dynamics

低层模型 预测短程 latent transition。论文没有为 HWM 重新设计低层模型,而是分别复用对应 benchmark 的原始 world model recipe:Franka 使用 VJEPA2-AC,Push-T 使用 DINO-WM,Diverse Maze 使用 PLDM。训练目标包含 teacher forcing 和多步 autoregressive rollout loss: 多步 rollout loss 用 表示从 开始按动作序列 autoregressive 得到的最终 latent: 论文的实验设计强调:低层模型不因为 HWM 而换 architecture,因此 Franka 上 VJEPA2-AC flat planner 与 HWM 的差异主要来自 hierarchy;Push-T 与 Diverse Maze 同理。

3.3 高层 latent world model 与 latent action encoder

高层模型 不是直接吃 primitive actions,而是吃 macro latent actions。给定轨迹 ,先选择 waypoint indices 。第 个高层 transition 是: 共享 encoder 得到 waypoint latents ,action encoder 把动作片段 编成 macro-action 。高层 world model 接收交错的 并预测下一个 waypoint latent:

Figure 2 解读:高层训练图显示了 HWM 的关键接口:低层动作片段先被 action encoder 压缩成 ,再和 waypoint latent state 交错输入 causal high-level world model。高层模型预测的是未来 waypoint 的 latent representation,而不是像素或动作;这使它可以和低层 planner 直接通过 latent-state matching 连接。

不同任务的高层 action encoder 实例化不同:Franka 和 Push-T 使用 transformer-based action encoder,CLS token 经过 MLP head 得到 latent action;Diverse Maze 的 released code / appendix 使用 MLP 把 primitive action chunks 编成 8-dimensional latent action。Franka 高层 latent action dimension 在主实验中设为 4;Diverse Maze released config 中 large_diverse_25maps_l2.yaml 使用 z_dim: 8l2_step_skip: 10l2_n_steps: 6

3.4 Planning:CEM / MPPI 的两层目标如何交互

Franka 和 Push-T 使用 CEM;Diverse Maze 使用 MPPI。两者共同点是:planner 采样 action sequences,用 learned dynamics rollout,按 latent target distance 计算 cost,然后执行优化序列的前几个动作并重规划。

论文给出的 CEM hyperparameters 很具体。单层 Franka 使用 2400 samples、15 iterations、20 elites、prediction horizon 6、;HWM Franka 高层使用 3000 samples、15 iterations、22 elites、prediction horizon ,低层使用 800 samples、5 iterations、12 elites、prediction horizon ,每步重规划。Push-T 的 HWM 在 上分别使用高层 samples 、高层 horizon ,低层 samples 、低层 horizon 均为 5,

Diverse Maze 的 released config 走 MPPI:large_diverse_25maps_l2.yaml 中 medium/hard 难度高层分别使用 num_samples=2000/4000,论文 MPPI table 的 high-level prediction horizon 为 ;低层使用 num_samples=500/1000,论文 table 的 low-level prediction horizon 固定为 。这里要区分两个量:released YAML 里的 max_plan_length=50 是 evaluation level 的 episode/planning cap,而不是论文 MPPI table 中的低层 pred 。代码中 TwoLvlPlanner.plan() 的实际接口很直接:先用 L1 backbone encode 当前状态,L2 planner 对最终 goal planning;然后把 l2_result.pred_obs[1] 设为 L1 planner 的 target,让 L1 在 l2_step_skip 个 primitive steps 内追踪它。

3.5 论文公式与 released code 实现差异

论文主文和 appendix 用 形式描述低层/高层 teacher-forcing 与 rollout prediction loss;但 released PLDM implementation 中,pldm/objectives/prediction.pyPredictionObjectivePredictionObs / PredictionProprio 使用 (encodings - predictions).pow(2).mean(),即 MSE-style loss。Diverse Maze 的 released config pldm/configs/diverse_maze/icml/large_diverse_25maps_l2.yaml 也把高层 objectives 设为 PredictionObsPredictionProprio,因此该开源实现的训练损失与论文公式的 写法并不完全一致。

另一个边界是 release scope:GitHub repo 明确说它是 PLDM / Diverse Maze 的 minimal implementation;Franka 的 VJEPA2-AC 与 Push-T 的 DINO-WM 完整训练/evaluation pipeline 不在该 repo 中。因此本笔记中的 pseudocode 和 mapping 以 released PLDM code 为锚点,Franka / Push-T 的训练数值主要来自论文 appendix。

3.6 代码级伪代码:高层训练、两层规划、MPPI rollout

Code reference: main @ e197375b (2026-04-06) — pseudocode and mapping based on this commit

高层训练路径对应 pldm/models/hjepa.py + pldm/train.py + pldm/objectives/*.py。论文中 Franka / Push-T 使用 transformer-based action encoder;但 released PLDM / Diverse Maze code 是另一种实现:large_diverse_25maps_l2.yaml 固定 l2_step_skip=10l2_n_steps=6,把 10 个 primitive 2D actions 拼成 posterior_input_dim=20 的 chunk,并在 level-2 predictor 中用 action_encoder_arch: '8-64-8' 的 MLP-style encoder 处理 8D latent action。因此下面 pseudocode 以 released PLDM code 为准:

import torch
from pldm.models.predictors.conv_predictors import Expander2D
 
def build_diverse_maze_l2_sample(dataset, episode_idx, start_idx,
                                 step_skip: int = 10, l2_n_steps: int = 6,
                                 stack_states: int = 1):
    # Mirrors D4RLDataset.__getitem__ for level-2 samples.
    # Code uses l2_n_steps_total = l2_n_steps * l2_step_skip + 1.
    total = l2_n_steps * step_skip + 1
    l2_states, l2_locations, primitive_actions, l2_vel, l2_pos = dataset._load_data_from_start_idx(
        episode_idx=episode_idx,
        start_idx=start_idx,
        length=total + stack_states - 1,
        skip_frame=step_skip,
    )
 
    # _load_data_from_start_idx subsamples states/locations/proprio with skip_frame,
    # but keeps the dense primitive action interval [start_idx, end_idx - 1].
    # With total=61 and step_skip=10, this becomes 6 chunks of 10 actions.
    chunks = primitive_actions.split(step_skip)
    l2_actions = torch.stack(chunks, dim=0)  # [l2_n_steps, step_skip, action_dim]
    return l2_states, l2_actions, l2_locations, l2_vel, l2_pos
 
def posterior_chunk_to_latent(sequence_predictor, actions, i):
    # Mirrors SequencePredictor: posterior_input_type='actions'.
    # DataLoader supplies actions[i] as [batch, chunk_size, action_dim].
    posterior_input = actions[i]
    if sequence_predictor.config.posterior_arch != "analytical":
        posterior_input = posterior_input.view(posterior_input.shape[0], -1)  # [B, 20]
    posterior_mu, posterior_var = sequence_predictor.posterior_model(posterior_input)
    return posterior_mu  # deterministic released config uses the posterior mean/mode
 
class ReleasedPLDMPredictorActionEncoder(torch.nn.Module):
    def __init__(self):
        super().__init__()
        # Separate path from posterior_arch='32-32': this mirrors action_encoder_arch='8-64-8'
        # used by the level-2 predictor to expand an 8D latent action during prediction/planning.
        self.action_encoder = torch.nn.Sequential(
            torch.nn.Linear(8, 64),
            torch.nn.ReLU(),
            torch.nn.Linear(64, 8),
            Expander2D(w=16, h=16),
        )

实际 HJEPA training step 可抽象为:

import torch
import torch.nn.functional as F
 
def train_hjepa_step(hjepa, batch, objectives_l1, objectives_l2, optimizer, train_l1=False):
    states = batch["states"].cuda()       # [T, B, C, H, W]
    actions = batch["actions"].cuda()     # primitive or chunked actions
    optional = {
        "proprio_pos": batch.get("proprio_pos"),
        "proprio_vel": batch.get("proprio_vel"),
        "locations": batch.get("locations"),
        "l2_states": batch.get("l2_states"),
        "l2_actions": batch.get("l2_actions"),
        "l2_proprio_pos": batch.get("l2_proprio_pos"),
        "l2_proprio_vel": batch.get("l2_proprio_vel"),
    }
 
    result = hjepa.forward_posterior(states, actions, **optional)
 
    losses = []
    if train_l1:
        losses += [obj(batch, [result.level1]).total_loss for obj in objectives_l1]
    if result.level2 is not None:
        losses += [obj(batch, [result.level1, result.level2]).total_loss
                   for obj in objectives_l2]
 
    loss = sum(losses)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss.detach()

两层 planner 对应 pldm/planning/planners/two_lvl_planner.py

def hierarchical_plan_step(two_lvl_planner, current_obs, final_goal_repr,
                           curr_proprio_pos=None, curr_proprio_vel=None):
    two_lvl_planner.reset_targets(final_goal_repr, repr_input=True)
 
    l1_backbone_output = two_lvl_planner.l1_planner.model.backbone(
        current_obs.cuda(),
        proprio=torch.cat([curr_proprio_pos, curr_proprio_vel], dim=-1).cuda()
        if curr_proprio_pos is not None and curr_proprio_vel is not None else None,
    )
 
    l2_result = two_lvl_planner.l2_planner.plan(
        current_state=l1_backbone_output,
        plan_size=two_lvl_planner.l2_step_skip,
        repr_input=True,
    )
 
    next_latent_subgoal = l2_result.pred_obs[1].detach()
    two_lvl_planner.l1_planner.reset_targets(next_latent_subgoal, repr_input=True)
    l1_result = two_lvl_planner.l1_planner.plan(
        current_state=l1_backbone_output,
        plan_size=two_lvl_planner.l2_step_skip,
        repr_input=True,
        curr_proprio_pos=curr_proprio_pos,
        curr_proprio_vel=curr_proprio_vel,
    )
    return l1_result.actions, l2_result

Diverse Maze 的 MPPI planning 对应 pldm/planning/planners/mppi_planner.pypldm/planning/planners/mppi_torch.py

def mppi_command(model, state, target_repr, nominal_actions, noise_dist, objective,
                 num_samples: int, horizon: int, temperature: float):
    sampled_noise = noise_dist.sample((horizon, num_samples))
    action_sequences = nominal_actions[:, None, :] + sampled_noise
    costs = torch.zeros(num_samples, device=state.device)
 
    rollout_state = state.repeat(num_samples, *([1] * (state.ndim - 1)))
    for t in range(horizon):
        action_t = action_sequences[t]
        pred = model.forward_prior_or_posterior(rollout_state, action_t)
        rollout_state = pred.obs_component
        costs = costs + objective(rollout_state, target_repr)
 
    beta = costs.min()
    weights = torch.exp(-(costs - beta) / temperature)
    weights = weights / weights.sum().clamp_min(1e-8)
    updated_sequence = (weights[None, :, None] * action_sequences).sum(dim=1)
    return updated_sequence[0], updated_sequence

3.7 Code-to-paper mapping

Code reference: main @ e197375b (2026-04-06) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
Two-level JEPA / HJEPA modelpldm/models/hjepa.pyHJEPA, HJEPAConfig, forward_posterior()
Low/high-level JEPA predictorpldm/models/jepa.py; pldm/models/predictors/*JEPA, predictor modules
Training loop and objective aggregationpldm/train.pyTrainer.train(), model.forward_posterior(), objectives list
Prediction / VICReg objectivespldm/objectives/prediction.py; pldm/objectives/vicreg.py; pldm/objectives/__init__.pyPredictionObjective, VICRegObjective, ObjectivesConfig.build_objectives_list()
Hierarchical planner interfacepldm/planning/planners/two_lvl_planner.pyTwoLvlPlanner.plan()
Planner construction and target encodingpldm/planning/mpc.py; pldm/planning/d4rl/hmpc.py_construct_h_planner(), _construct_planner(), HierarchicalD4RLMPCEvaluator
Representation target costpldm/planning/objectives_v2.pyReprTargetMPCObjective, ReprTargetMPCObjective2
MPPI trajectory optimizerpldm/planning/planners/mppi_planner.py; pldm/planning/planners/mppi_torch.pyMPPIPlanner, MPPI.command()
Released Diverse Maze configspldm/configs/diverse_maze/icml/large_diverse_25maps.yaml; large_diverse_25maps_l2.yamllow-level / high-level PLDM hyperparameters

4. Experimental Setup(实验设置)

4.1 Datasets and tasks

  • Franka Arm with Robotiq gripper:训练数据为约 96 小时 DROID unlabeled robot videos 与 30 小时 RoboSet;observation 包含 RGB image 与 7D end-effector proprioception,action 是 end-effector delta pose。评测包含 10 个 pick-and-place start-goal pairs(cup / box 两类物体)与 7 个 drawer opening / closing tasks。
  • Push-T:使用 DINO-WM released offline dataset,共 18,500 trajectories;每条轨迹包含 RGB observation、2D action 与 agent position/velocity proprioception。评测把 start-goal separation 扩展到 timesteps,其中 明显超过原 DINO-WM 的 设置。
  • Diverse Maze:MuJoCo PointMaze 变体,模型输入是 top-down RGB maze view,而不是直接使用 。训练使用 25 个随机地图,每个地图 2,000 episodes,每个 episode 100 steps、action repeat 4,总计约 5M transitions;测试在 20 个 held-out layouts 上 zero-shot,按 grid distance 分 easy 、medium 、hard

Figure 3 解读:这张 appendix 图列出了 evaluation tasks 的 initial / goal states。它有助于理解为什么这些任务不是简单 greedy reaching:drawer 和 pick-and-place 往往需要先移动到中间姿态,Push-T 与 Maze 也要求在远距离 start-goal pair 之间完成多阶段路径。

4.2 Baselines and metrics

Franka 对比 VJEPA2-AC flat planner,以及 Octo、-FAST-DROID、-DROID 三个 VLA baselines。Push-T 对比 GCIQL、HIQL、HILP 与 DINO-WM。Diverse Maze 对比 GCIQL、HIQL、HILP 与 PLDM。

主要 metric 是 success rate。分析部分还使用 planning time / normalized test-time compute、latent prediction error、high-level action 与 expert trajectory 的 action cosine similarity / action distance。Franka / Push-T 使用 CEM planning,Diverse Maze 使用 MPPI planning。

4.3 Training and planning configs

Franka:低层 VJEPA2-AC 使用 frozen ViT-g/16 encoder 与约 300M-parameter ViT world model,context ,epochs 200,batch size 256,;高层 VJEPA2-AC context ,epochs 120,batch size 768,。论文没有给出 GPU 型号/数量,只说明 planning rollouts parallel across GPUs。

Push-T:低层 DINO-WM 使用 frozen DINOv2 encoder 与 25M-parameter causal ViT,context ,epochs 100,batch size 256;高层 DINO-WM 扩到 75M parameters(layers 6→10,embedding 384→768,MLP 2048→3072,heads 16→12),context ,epochs 500,batch size 128。两者

Diverse Maze:论文 appendix 与 released config 对齐。低层 PLDM:pldm/configs/diverse_maze/icml/large_diverse_25maps.yamln_steps=15、batch size 128、epochs 3、base LR 0.017632900482959527、VICReg / IDM / proprio prediction objectives、planning n_envs=85replan_every=4。高层 PLDM:pldm/configs/diverse_maze/icml/large_diverse_25maps_l2.yamll2_step_skip=10l2_n_steps=6、batch size 128、epochs 5、freeze_l1=truez_dim=8PredictionObs + PredictionProprio objectives,加载低层 checkpoint 3-9-1-seed248_epoch=3_sample_step=15465472.ckpt

5. Experimental Results(实验结果)

5.1 Main results across three domains

Franka robotic manipulation

MethodP&P Subgoals CupP&P Subgoals BoxP&P CupP&P BoxDrawer
Octo20%10%0%0%43%
-FAST-DROID52%18%
-DROID68%36%
VJEPA2-AC80%80%0%0%30%
VJEPA2-AC (hierarchy)80%80%70%60%70%

Flat VJEPA2-AC 在人工 subgoals 下能完成 cup/box 的 greedy subtasks(80% / 80%),但只给 final goal 时 pick-and-place 完全失败(0% / 0%),drawer 也只有 30%。HWM 在不提供人工 subgoal 的情况下达到 cup 70%、box 60%、drawer 70%,说明高层自动提出的 latent subgoals 确实替代了手工分解。

Figure 4a 解读:Franka execution strip 中红色虚线列表示高层 planner 推断并 decode 出来的 subgoal。可以看到 HWM 不是直接朝最终图像贪心移动,而是先到达抓取/对齐/抽屉操作等中间状态,再由低层短程 planner 执行。

Figure 4b 解读:Push-T execution 同样展示了 high-level subgoal 对 long-horizon pushing 的作用。T 形物体需要通过一系列中间位姿逼近 goal;flat planner 在 时容易因为搜索 horizon 太长而失败,而 HWM 把问题拆成多个短程追踪。

Push-T long-horizon goal-conditioned control

Method
GCIQL40%25%7.5%
HIQL55%30%20%
HILP25%13%0%
DINO-WM84%55%17%
DINO-WM (hierarchy)89%78%61%

Push-T 的关键趋势是 horizon 越长,flat DINO-WM 掉得越厉害:从 的 84% 降到 的 17%。HWM 在 仍有 61%,绝对提升 44 个百分点。和 offline RL / zero-shot RL baselines 相比,HWM 的优势也随 horizon 扩大而更明显。

Diverse Maze OOD navigation

Method
GCIQL85%40%33%
HIQL88%73%48%
HILP48%20%10%
PLDM100%63%44%
PLDM (hierarchy)100%95%83%

Diverse Maze 说明 HWM 不只适用于机器人手臂,也适用于从像素输入做 latent planning 的 navigation。训练和测试地图 layout 不同,且 hard split 的距离达到 ;PLDM flat planner 在 hard 上是 44%,加 hierarchy 后到 83%。

Figure 5 解读:Maze plans 图把高层 plan 和低层执行放在同一张图里。高层轨迹在较粗时间尺度上跨越长距离 maze corridor,低层 planner 负责局部转向和避墙;这正对应 HWM “长程抽象 + 短程控制”的分工。

5.2 Compute efficiency and long-horizon prediction

Figure 6 解读:左侧 Push-T、右侧 Diverse Maze 都画出 success rate 与 planning time 的 trade-off。论文结论是,HWM 在 Push-T 上可以用约 更低 compute 达到或超过 flat planner,在 Diverse Maze 上则约 更低 compute。原因不是高层模型更便宜,而是它显著缩短了低层 primitive action search 的有效 horizon。

Figure 7 解读:prediction horizon 分析验证了 hierarchy 的另一个前提:低层 world model 在短 horizon(约 秒)更准,但要预测到 1.5–2 秒后时,高层单步 prediction 比低层多步 autoregressive rollout 的 error 更低。也就是说,高层不是替代低层,而是在低层误差开始累积的时间尺度上接管。

5.3 Ablations: latent actions and subgoal quality

High-Level ActionAction Cos Action L1
Delta Pose
Latent Action

这组 action alignment 结果说明 learned latent action 比直接用 delta-pose 更贴近 expert behavior:cosine similarity 更高、L1 distance 更低。论文的解释是,latent action encoder 可以压缩一段 primitive actions 中对高层 planning 有用的可控变化,而不是把所有低层细节都暴露给高层 optimizer。

Figure 8 解读:latent action dimension 有一个 trade-off。维度太低时,高层模型容量不足,plan success 低;维度升高后,视觉重建和 plan 表达力改善,但过高维度也可能让高层提出低层难以 greedy 到达的 subgoal。Franka 上经验最优大约是 4D:足够表达 useful trajectories,但不会过度鼓励不可执行的 non-greedy subgoals。

Figure 9 解读:appendix 的 thorough rollout 图补充了成功与失败案例。失败通常不是 hierarchy 完全失效,而是 perceptual imprecision、深度估计误差或接近目标但未精确完成;这对应作者在主文中提到的 limitation:长程 manipulation 仍然需要更抽象且 uncertainty-aware 的 representation / planning。

5.4 Limitations and conclusions

HWM 的主要结论是:hierarchical planning 是一种 model-agnostic extension,可以在 VJEPA2-AC、DINO-WM、PLDM 三类 latent world model 上提高 zero-shot long-horizon control,尤其在 flat planner 受限于 long rollout error 或 action search 空间时最明显。

限制也很清楚。第一,所有方法随着 horizon 增长仍会退化;HWM 缓解但没有消除 long-horizon manipulation 的难度。第二,高层 subgoal 是 strictly top-down 提供给低层,当前方法缺少跨层 feedback / joint optimization;如果高层提出“语义合理但低层不可达”的 subgoal,低层仍会失败。第三,论文认为未来需要更 abstract 的 high-level representation 与 uncertainty-aware planning,来处理真实世界长程预测中的 stochasticity 与 model uncertainty。