P-ANYmalParkour-2023 · ANYmal Parkour: Learning Agile Navigation for Quadrupedal Robots
作者 / 机构:David Hoeller, Nikita Rudin(equal contribution), Dhionis Sako, Marco Hutter — ETH Zürich RSL + NVIDIA
发表:arXiv 2023.06.26 首发 (arXiv:2306.14874v1 [cs.RO]);后续发表在 Science Robotics(2024)。PDF 自标 "Under Review"。
arxiv:2306.14874 · 项目页:https://sites.google.com/leggedrobotics.com/agile-navigation · 代码:未由作者发布完整训练栈;下游 parkour 复现多基于 leggedrobotics/legged_gym。
在线索中的位置:[T12 Agile Locomotion] 转折 3(与 P-ExtremeParkour-2023.md 转折 2 形成 philosophy 对照);与 T01 sim-to-real 仅在感知/部署维度交叉。
一句话定位:与 CMU Extreme Parkour 同期、philosophy 相反的对偶工作——感知越准、skill 越专。ETH 用 6 相机 + LiDAR 融合的 neural scene representation + 5 个 specialist skill + 一个 categorical-output 高层 navigation policy,让 ANYmal D 在 2 m/s 下连贯完成跳 1 m 间隙、爬 1 m 高箱、钻 0.4 m 矮桌、恢复跌倒等连续 parkour 序列。是 parkour 走向「工程化可重复」的标志。
动机:两条前路的瓶颈
2023 年前的四足 parkour 走两条路,各自卡在相反的地方:
- model-based / MPC 路线(如 [4]–[6])要求预先给定接触 schedule、依赖精确地形感知,遇打滑或地图噪声就崩;offline planning 几秒一帧,无法实时。Parkour 的接触完全反规则——膝盖、shank、base 都要参与接触——MPC 的接触假设直接破灭。
- end-to-end depth policy 路线(如 Extreme Parkour 的前作)感知太弱(单前向深度相机 + DR),剧烈动作下地图稀疏 + 自遮挡让 policy 看不清场景。
ANYmal Parkour 的核心判断是:剧烈动作的瓶颈不在 policy 容量,而在感知质量。如果有准确、稠密、3D 的地形重建,specialist skill 就能用相对简单的 reward 单独训出来;用一个高层 policy 来在 skill 之间做几何感知驱动的选择,就能串联整个 parkour course。这与 CMU Extreme Parkour 「感知越简、policy 越统一」的判断形成对极。
ETH 还有一个具体动机:[7] (ANYmal-C, Science Robotics 2022) 已经把 perceptive walking 做到了 robust 但只覆盖 stable gait;[2] (Rudin et al. IROS 2022) 的 position-based formulation 让单个 locomotion skill 学起来更自然;[3] (Hoeller et al. RA-L 2022) 已经证明 neural scene representation 能处理 structured terrain。三块积木都齐了,缺的就是把它们拼成完整 parkour 系统。
方法核心:三模块 pipeline + hybrid PPO
整个 pipeline 由三个学习模块构成(Fig. 2),全部只在仿真训练,部署时全机载实时运行:
1. Perception Module:多分辨率 neural scene representation
输入:6 个 Intel RealSense 深度相机(前 2 / 后 2 / 左 1 / 右 1)+ Velodyne Puck LiDAR 的点云融合。输出:3D 地形重建(喂给 locomotion)+ compact latent tensor $l$(喂给 navigation policy 当 belief state)。
架构是 encoder-decoder(灵感来自 [3]),关键改造是多分辨率:
- Coarse network:voxel 12.5 cm、map 4 m × 4 m × 4 m。带自回归反馈——上一帧的输出 transform 到当前帧再 concat 到 measurement,能跨帧累积证据。这让模块能重建当前看不见的区域(例:钻进桌下前看见过桌面,进去后仍记得头顶有桌子)。
- High-resolution network:voxel 6.25 cm、map 2 m × 2 m × 2 m。不做自回归(输入已含 coarse 网络最后一层特征 + 当帧点云)。近距离高分辨率用于精确 foothold placement。
关键设计选择:
- 用 dense 3D convolution(不用 [3] 的 sparse 实现)——sparse 实现跑不动 4096 并行环境的 RL batch;dense 反而能扛,代价是 ~45 GB GPU 显存。
- 没有 skip connections——刻意让 latent 更紧凑、信息更瓶颈化,便于 navigation policy 直接消费。
- 输出每 voxel 的 occupancy 概率(BCE loss)+ centroid 位置(Euclidean loss)。
- 训练数据:2000 条轨迹 × 100 步,跨 parkour 场景均分;无监督(用仿真 ground truth 作监督,但不需要人工标签);数据增强沿用 [3]:位置扰动 + random blobs + patch removal + robot 位姿噪声。
部署 trick(决定 sim-real):原 DirectROS 把 RealSense 点云 publish 到 ROS 主题有高达 250 ms 延迟——climbing 这种快速动作根本扛不住。作者禁掉相机端点云发布、直接订阅 depth image、在 perception 节点本地投影成点云再与 LiDAR 融合,把延迟压到 25 ms。这是 sim-real 的隐形关键。
感知模块在 Jetson Orin 上异步运行,locomotion + navigation 在另一台机载计算机上同步单节点运行;策略侧每次取最近一帧 perception message。
2. Locomotion Module:5 个 specialist skill(50 Hz)
包含 5 个独立 RL 策略:walk / jump / climb up / climb down / crouch。每个 skill 单独训,共用 observation/action 空间但 reward 和 termination 不同。
位置形式化(继承自 [2]):不是 velocity tracking,而是 (局部目标位置 r, 剩余时间 t, 末端朝向 ψ)。Policy 在 t 内自由调度,只要到点 + 朝向 + 不摔。比 velocity command 更适合剧烈动作(跳/爬不需要稳定步速)。
Skill 训练配置(正文 Sec.II.B.2):
| Skill | 训练场景 | 上限 | 关键 trick |
|---|---|---|---|
| Walk | 60% stairs + 20% slopes + 20% 随机障碍 | 40° 坡、0.25 m 台阶、2 m/s 平地 | 同 [7] 的 perceptive walking 基线 |
| Jump | 两箱之间 gap | 1 m gap | 横向接近 → 三腿蹬 + 第四腿伸直落地 → 对角两腿转移 → 最后一条腿过 |
| Climb down | 从箱顶下到地面 | 箱高 1 m | 先膝盖跪边降 CoG → 前腿跳下 → 用 L 形 shank 当钩子挂边 → 后腿慢慢下来。高冲击力 termination(防止学到「直接跳下」——仿真能过但真机会损) |
| Climb up | 从地面爬上箱顶 | 箱高 1 m | 前腿上顶 → 拉起身 → 跳上后腿(第四腿撑垂直面)→ 全身推上。允许 knee/base 接触(降低对应惩罚权重) |
| Crouch | 穿过水平窄通道 | 最低 0.4 m | 降低 base、双腿 hip 抬脚 |
Locomotion reward(Table S2):position tracking(权重 10)+ heading tracking(5)+ 关节速度/扭矩惩罚 + joint vel limit / torque limit 软约束(-1 / -0.2)+ base acc / feet acc / action rate 平滑项 + feet contact force(>700 N 惩罚)+ "don't wait"(速度 <0.2 m/s 惩罚)+ move in direction(与目标方向余弦)+ stand at target(SL 触发后关节回归 default)+ collision / stumble 惩罚 + termination(base collision 或脚力 >1500 N,权重 -200)。
关键改造:对称性增广。Position-based 训练不约束轨迹 → climb 只学前向、遇后向就绕掉。基于 [44](Abdolhosseini et al. MIG 2019)的对称 duplication 思路,作者对 ANYmal D 用 front-back + left-right 对称把每个 transition 增广为 4 份。改进点:[44] 的原始方法因 mirrored action 概率低导致 off-policy 收敛差,作者把原动作概率直接设为所有对称变体的概率,等价于 warm-bootstrapping——「收敛时对称状态必对应等概率对称动作」先注入 prior。
Sim-real:直接对输入 locomotion 的 2.5D elevation map 加扰动——单点噪声 + 任意方向 ≤7.5 cm 位移。单阶段训练,无 teacher-student。
3. Navigation Module:高层 5 Hz categorical + Gaussian hybrid
层级 RL:外层 navigation 5 Hz、内层 locomotion 50 Hz(frozen)。Navigation 输入:相对全局目标位置 $r_G^*$、剩余时间 $t_G^*$、base velocity/orientation、perception latent $l$。输出:选哪个 skill + 给出该 skill 的局部 $(r^*, t^*, \psi^*)$ 命令。
核心算法改造:hybrid PPO actor。作者修改 PPO [1] 的 actor MLP 最后一层,split 成两支:一支 Gaussian 出连续 command(位置、朝向、时间),一支 categorical 出 skill 选择概率。训练时两支都采样以 explore;部署时取 Gaussian 均值 + categorical argmax。
Navigation reward(Table S3):非常稀疏——position tracking 只在 $t^*=0$(最后一步)激活:$0.15 \cdot \mathbb{1}_{t^*=0}(40 S_N - \|r - r_G^*\|)$;termination 惩罚 -0.5($\alpha < \pi/2$ base 倾倒或脚力 >2500 N)。稀疏设计是刻意的——允许 policy 自己探索地形、在需要时绕远路找更安全的路径。
Curriculum:先放近目标(让 policy 学会基本 reach),随 reward 增长逐渐把目标挪远。没有这个 curriculum,policy 学不会——会在大障碍前卡死(论文 Sec.III 明确列为局限)。
为什么不学 [29] 用简化运动学内层模型:作者明确指出——「rolling out 实际 low-level policies 才能做敏捷 navigation」。简化模型不知道 jump 的实际落点分布、不知道 climb 的失败模式,navigation policy 也就学不会「这个箱太高不要直接爬」。
4. 工程基础:4096 并行 + 自定义 CUDA
Isaac Gym [42] 仿真、4096 并行 robot。点云生成用 NVIDIA Warp [43] 写自定义 CUDA kernel——每次为 6 个相机 + LiDAR 做光线追踪(约 1.4 亿条 ray 总量),直接输出 voxel grid 输入,无内存拷贝。这是让 dense 3D conv + 4000 agents 跑得动的关键。
关键实验
硬件部署(Sec.II 开头 + Fig. 3):ANYmal D,~55 kg,12 SEA @ 85 N·m;6 RealSense + Velodyne Puck LiDAR;Jetson Orin(perception,async)+ 另一机载计算机(locomotion + nav,sync)。
涌现行为(正文 Sec.II.A–C,已 PDF 核实):
- 0.8 m 宽箱子(比机器人站立 footprint 还小)——机器人以 1.5 m/s 速度到达后,用 walk skill 做精确 foothold 完成最后一步并为 jump 做准备;这里 jump skill 是 OOD——训练时箱子宽度是该大小的两倍(约 1.6 m),但 jump 仍能成功起跳并跨过 gap。这是 specialist skill 在 OOD 障碍上的泛化。
- climb down 中 HFE 电机偏转 >160°(trajectory A,Fig. 3 A2)——腿部需要伸到 gap 另一侧承接下落,对应 climb down maneuver。
- 0.9 m 高平台——climb up skill 满扭矩爬上(trajectory B,Fig. 3 B3,电机饱和)。
- 1 m gap 跳跃——三腿蹬 + 第四腿伸直的特技动作。
- 跌倒恢复:从箱子上摔下后能站起继续课程;低摩擦打滑后能恢复;运行中拖走障碍物能即时重规划(即使训练时全是静态环境)。
- 速度:达 2 m/s,伴随剧烈加速/减速(Fig. 3 A1/B1)和满扭矩输出。
Adaptive path selection(Fig. 5,核心结果之一):让 robot 从地面去 box 顶再返回,统计「走直路 vs 绕远路」的概率随 box 高度 $h$ 的变化(0.7–1.3 m)。climb down:$h \leq 1 \text{ m}$ 时走直路,$h > 1 \text{ m}$ 后逐渐偏好绕到更低的箱子;climb up:在更低的 $h$ 就开始切换到最长路径。论文给出的解释是高层训练时加的扰动对 climb up skill 影响更大,使其成功率对扰动更敏感。这是 navigation policy 学到了 skill capability model 的直接证据。
vs 人工 hardcoded 轨迹(Table I,1000 roll-outs/terrain):
| Terrain | Ours | Manual(专家级硬编码) |
|---|---|---|
| Fig. 7-A | 98.2% | 95.3% |
| Fig. 7-B | 96.3% | 60.9% |
| Fig. 7-C | 97.6% | 75.3% |
Manual 在 A 上接近(因为 A 较规整),但在 B/C 上崩溃——「手动定点」无法适应随机化的障碍参数。Manual 还会拖慢 robot(关键点必须卡位 → 频繁减速)。
Navigation action ablation(Table S6):去掉 heading output(No H)或 timer output(No T)都降成功率。No H 在地形 A 上掉得最狠(A 需要窄通道中原地急转 → 必须显式 heading 命令);No T 在长地形 B/C 上掉得最狠(直道快、险段慢必须靠 timer 调速)。
Perception vs elevation map baseline [37](Fig. 6):baseline 是带 z-drift 校正 + visibility check 的强 elevation map,但仍无法处理 overhang(桌底)、垂直面、自遮挡。本方法用点云边缘证据补全未见区域(例:从箱子前沿点推断箱顶高度),并能从 state estimation 突变中自动恢复地图(Fig. 6 B/D 中 elevation map 把腿包进地面、本方法没有)。
Failure modes(Fig. S4):偶尔会幻觉出盲区背后的楼梯(数据失衡)或爬入桌底时桌子形状膨胀(点云稀疏 + state estimation drift),但下游 policy 容忍——一旦传感器看清就自动纠正。
为什么重要
- 首个完整 parkour pipeline:perception + locomotion + navigation 三层全部学习、全部仿真训练、全部机载实时(秒级内)部署;不需要 pre-mapping、不需要 offline planning、不需要 a priori 环境知识、不需要 expert demonstration。在它之前,要么 single-skill demo([2]/[14]/[15])、要么 hard-coded course([32] Barkour)、要么需要 motion capture + 单一预地图([32])。这是 parkour 从「单技能演示」迈到「自主多技能串联」的标志。
- 「specialist + 高层选择」范式的工程化证明:5 个 specialist skill 各自训得精、由 categorical-output 高层 policy 学切换。在真实户外能可靠工作——Science Robotics 2024 接收是工程化标志。与同期 CMU Extreme Parkour 形成 parkour 设计的两极对照(unified policy vs specialist)。后续 Parkour-in-the-Wild [Rudin et al. 2025] 走的就是「多 specialist → 蒸馏成 generalist」的折中路线。
- Neural scene representation > elevation map 的实证:[3] 的 RA-L 工作被推到 parkour 这种极端场景,证明多分辨率 + 自回归 + 3D voxel 在自遮挡、overhang、drift 下显著优于 elevation map。后续 ETH 一系列 perceptive 工作继承这套感知栈。
- PPO hybrid actor 的工业级可用范例:categorical + Gaussian 混合输出做 hierarchical RL,简单稳定、可复现——比把 skill 选择当 discrete latent 嵌入隐空间的 VAEMRL/HRL 路线工程上更易落地。
局限(Sec.III + 作者自承)
- 8 个神经网络 + 串行依赖,训练/迭代成本高:5 个 locomotion skill + 1 个 navigation + coarse + high-res perception = 8 个网络,每个单独调参;navigation 依赖具体 perception latent 和具体 locomotion policy——换一个就要重训。作者明确写「未来需要 simultaneous training」。
- specialist 之间不能 chaining:jump 落地紧接 climb 的过渡由 5 Hz 高层 policy 拼接,过渡平滑度靠 5 Hz 决策频率硬撑;不像 Parkour-in-the-Wild 那样的多专家蒸馏 + RL fine-tune 能把「过渡」内化进单 policy。
- scalability 未证:只在 pallet-sized box + 桌椅 + 简单 outdoor 验证;崩塌建筑、真实 parkour 场景的多样性远超训练分布。
- curriculum 是必需的,不是优化:去掉 curriculum policy 学不会——会在大障碍前卡死。这说明 sparse nav reward + categorical skill 选择本身探索效率低,仍需 task-specific curriculum 救场。
- 依赖昂贵传感器栈:6 RealSense + LiDAR 是 ETH 一贯配置,商用小型四足(Unitree A1/Go2)装不下;这也正是 Extreme Parkour 走「单深度相机」对偶路线的原因。
- specialist OOD 能力是经验性的,无理论保证:0.8 m 箱子上跳跨能成功是 jump skill 在 OOD 障碍宽度上的巧合泛化(训练时箱子约 1.6 m 宽)——作者自己指出「超出训练分布」;新场景可能不延续。
复现要点
- 基座:Isaac Gym Preview Release + legged_gym 训练栈;NVIDIA Warp 用于点云生成 CUDA kernel。4096 并行 robot。单 GPU 显存需求 ~45 GB(dense 3D conv),需要 A100 80 GB 或 H100。
- 三模块独立训练顺序:(1) 先训 perception module(unsupervised,2000 轨迹 × 100 步);(2) 冻结 perception 输出 2.5D map,训 5 个 locomotion skill(各自 curriculum);(3) 冻结 perception + locomotion,训 navigation policy。
- Perception 配置:
- Coarse:voxel 12.5 cm / map 4 m³;带自回归(上帧输出 transform 后 concat)。
- High-res:voxel 6.25 cm / map 2 m³;输入 = coarse 末层特征 + 当帧点云;无自回归。
- 不要 skip connection——会让 latent 不够瓶颈、navigation policy 学不好。
- Loss:BCE(occupancy)+ Euclidean(centroid)。
- 数据增强:position perturbation + random blobs + patch removal + robot pose noise(沿用 [3])。
- Locomotion 配置:
- Position-based(继承 [2]):r + t + ψ*,不要 velocity command。
- 5 skill 各自 PPO 训;walk 训练集 60% stairs + 20% slopes + 20% random;其他 skill 80% 目标障碍 + 20% rough terrain。
- 对称增广:front-back + left-right 4 倍 duplication;关键改造——把原动作概率设为所有对称变体的概率(warm bootstrap)。
- Sim-real 关键:elevation map 加点噪声 + ≤7.5 cm 三轴位移扰动;climb down 必须加高冲击力 termination(防学到「直接跳下」)。
- Reward 见 Table S2;termination 权重 -200(base collision / 脚力 >1500 N)。
- Navigation 配置:
- 修改 PPO actor:最后一层 split → Gaussian(command)+ Categorical(5 skill 选择)。
- 5 Hz 高层 / 50 Hz 低层;low-level frozen。
- Reward 极稀疏:position tracking 仅 $t^*=0$ 激活(权重 0.15,$40 S_N - \|r-r_G^*\|$);termination 权重 -0.5。
- Curriculum 必须:目标从近到远随 reward 增长逐步推远;无 curriculum 学不出。
- Observation:$r_G^*, t_G^*$, base $v/\psi$, perception latent $l$(不要给 raw map——latent 已含 belief state)。
- 部署侧:
- RealSense 禁掉相机端点云发布,直接订阅 depth image(否则 250 ms 延迟、climb 必崩)。
- Perception 节点(Jetson Orin)异步运行;locomotion + nav 同节点同步运行,每次取最新 perception message。
- 真机坑:(a) ANYmal D 的 L 形 shank 是 climb down 用膝盖挂钩的关键几何特征——换机器人要重设计 contact reward;(b) 6 相机 + LiDAR 标定误差直接进 perception module,标定 drift 是 sim-real 隐形杀手;(c) 85 N·m 扭矩饱和在 climb up 高箱时常常触发——是策略学到的「极限动作」的一部分,电机不一致会让落点漂移。
- 预期难度:高。仿真复现 1–2 个月(三模块串行 + curriculum 调参);真机稳定穿越 parkour course 3–6 个月(perception 标定 + 6 相机 latency 调优 + specialist skill 真机微调)。
相关
- 建立在:[2] Rudin et al. IROS 2022(position-based skill formulation);[3] Hoeller et al. RA-L 2022(neural scene representation——本论文第一作者的前作);[7] ANYmal-C Science Robotics 2022(perceptive walking baseline + teacher-student 思路来源);[44] Abdolhosseini et al. ACM MIG 2019(对称 duplication);[42] Isaac Gym;[43] NVIDIA Warp。
- 同期对照:Extreme Parkour [Cheng et al. 2023, arXiv:2309.14341]——单深度相机 + unified policy 的对偶路线,见 P-ExtremeParkour-2023.md。
- 引出:Parkour-in-the-Wild [Rudin et al. 2025, arXiv:2505.11164](多专家蒸馏 + RL fine-tune,把 specialist 路线和 unified policy 路线折中)。
- 本仓库笔记交叉引用:T12-agile-locomotion.md 转折 3;与 P-ANYmal-C-2022.md(ETH 感知 locomotion 前作)、P-ExtremeParkour-2023.md(对偶路线)、P-ASAP-2025.md(剧烈动作 sim-real 的下一步突破)形成对照。