NoMaD 是 Berkeley AI Research 提出的视觉导航策略模型,核心创新是目标掩码扩散策略(Goal-Masked Diffusion Policy):一个模型同时学会目标导向导航(给定目标图像寻路)和自主探索(无目标自由探索)。它属于 GNM/ViNT 系列的第三代,将扩散模型引入机器人导航,实现了多模态轨迹输出。
为什么值得关注?
• 纯视觉:仅需 RGB 摄像头,不依赖 GPS/激光雷达/预建地图
• 双模式统一:目标导航 + 探索模式共享一个网络,训练时 50% 概率掩码目标
• 跨具身泛化:在 5 个不同机器人的数据上训练,可零样本迁移到新平台
• 扩散策略:输出多模态动作分布(而非确定性轨迹),更灵活地处理路口等歧义场景
NoMaD 不是凭空出现的。它是 Dhruv Shah 等人在 Berkeley 连续推进的通用导航模型(General Navigation Models)系列的第三个里程碑,三篇论文共享同一个代码仓库(visualnav-transformer):
| 模型 | 时间 | 架构 | 动作输出 | 关键创新 |
|---|---|---|---|---|
| GNM | 2022.10 / ICRA 2023 | MobileNetV2 + CNN | 确定性:单条轨迹 | 首个跨具身通用导航模型;图像→轨迹端到端 |
| ViNT | 2023.06 / CoRL 2023 | ViT + Transformer | 确定性 + 拓扑图搜索 | 引入时序上下文(历史观测);拓扑图导航 |
| NoMaD | 2023.10 / ICRA 2024 | EfficientNet + 扩散策略 | 多模态分布 | 扩散模型输出 + 目标掩码双模式 |
三者的递进关系:GNM 证明了"一个模型控制任何机器人"的可行性;ViNT 引入了 Transformer 架构和时序推理能力;NoMaD 则解决了前两者的两个根本缺陷——动作输出的单模态性(无法处理歧义场景)和必须依赖目标图像(无法自由探索)。
NoMaD 由三个模块组成:视觉编码器(NoMaD_ViNT)、噪声预测网络(扩散策略)、距离预测网络。整体数据流:
NoMaD 的视觉编码器在 ViNT 基础上改造,名为 NoMaD_ViNT。它有两个独立的 EfficientNet-b0 编码器:
| 编码器 | 输入通道 | 输入内容 | 输出维度 |
|---|---|---|---|
obs_encoder |
3 通道 | 单帧观测图像(96×96 RGB) | 1280 → 压缩至 256 |
goal_encoder |
6 通道 | 当前观测 + 目标图像拼接 | 1280 → 压缩至 256 |
为什么目标编码器用 6 通道? 目标图像单独编码会丢失与当前观测的相对关系。将当前观测和目标图像在通道维度拼接(6 通道),让编码器从第一层就能联合提取两者的对应关系——这是视觉惯性里程计中常用的技巧。
编码后,4 帧观测 + 1 个目标 token 拼接成长度为 5 的序列,加入位置编码,经过 4 层 Transformer 自注意力(4 头,前馈维度 1024,GELU 激活,pre-norm)。最终对序列做加权平均池化,输出 256 维全局表示。
GroupNorm 替换 BatchNorm
NoMaD 将 EfficientNet 中所有 BatchNorm2d 替换为 GroupNorm(每组 16 个特征)。BatchNorm 依赖 batch 内统计量,在跨具身训练(不同摄像头、不同环境)时统计量差异巨大,导致泛化性差。GroupNorm 的统计量与 batch 无关,更适合多源数据训练。
这是 NoMaD 最本质的设计——让一个模型同时处理两种截然不同的导航任务:
| 模式 | 目标 token 状态 | 训练概率 | 语义 |
|---|---|---|---|
| 目标导航 | 不掩码(mask=0) | 50% | "我看到目标图像,规划通往那里的路径" |
| 自主探索 | 掩码(mask=1) | 50% | "没有目标,自由探索未知区域" |
实现方式极其优雅——不改变任何网络结构,仅通过 Transformer 的 src_key_padding_mask 参数控制:
# 训练时随机选择是否掩码目标(goal_mask_prob = 0.5)
# 当 mask=1 时,Transformer 自注意力忽略最后一个 token(目标)
goal_mask = [False, False, False, False, True] # 掩码目标
no_mask = [False, False, False, False, False] # 不掩码
# 掩码时,平均池化重新加权:
# 不掩码 → 每个 token 权重 1/5
# 掩码 → 前 4 个 token 权重 1/4,目标 token 权重 0
这个设计的精妙之处在于:掩码操作使得 Transformer 在探索模式下自然地"忘记"目标信息。同一组参数,掩码时学会"探索开阔区域",不掩码时学会"朝目标前进"。推理时只需切换 mask 即可切换模式,无需加载不同模型。
NoMaD 用条件扩散模型替代了 GNM/ViNT 的确定性回归头,这是动作质量提升的关键。
扩散策略的核心思想:将路径点生成建模为从高斯噪声逐步去噪的过程。给定视觉编码器的 256 维输出作为全局条件 global_cond,噪声预测网络(一个 U-Net 变体)学习预测每一步添加的噪声。
| 参数 | 值 | 说明 |
|---|---|---|
| 扩散步数 | num_diffusion_iters = 10 | 仅需 10 步去噪(非标准 DDPM 的 1000 步),实时性足够 |
| U-Net 下采样维度 | [64, 128, 256] | 轻量网络,推理速度 < 50ms |
| 输出长度 | len_traj_pred = 8 | 8 个二维路径点,间距约 1 米 |
| 角度预测 | learn_angle = False | 只预测 xy 坐标,朝向由路径点切线推导 |
| 条件缩放 | cond_predict_scale = False | 使用简单的 FiLM 条件注入 |
为什么扩散模型比回归头好?
在路口、分叉处,正确的行动方向可能不止一种(左转或右转都可能通向目标)。回归头会对所有训练样本取平均,输出一条"直行"的无效轨迹。扩散模型天然支持多模态分布——每次采样可能给出不同的合理路径,更符合真实导航中的不确定性。
这是一个轻量 MLP(256 → 64 → 16 → 1),以视觉编码输出为输入,预测到达目标的离散化距离(0-20 档,每档约 1 米)。它的两个作用:
NoMaD 在 5 个公开数据集上训练,总数据量超过 100 小时的机器人轨迹:
| 数据集 | 来源 | 环境 | 机器人 | 特点 |
|---|---|---|---|---|
| RECON | Shah et al. | 室外校园/公园 | Clearpath Jackal | 856 km 轨迹,覆盖最广 |
| GoStanford2 | Stanford | 室内+室外混合 | TurtleBot 系列 | 校园漫游,goals_per_obs=2 倍增样本 |
| Cory Hall | UC Berkeley | 室内办公楼 | LoCoBot | 工程楼走廊,窄通道导航 |
| TartanDrive | CMU | 越野/非铺装路面 | Clearpath Jackal | 崎岖地形,室外高速 |
| SACSoN/HuRoN | Stanford | 室内人机共存 | 多平台 | 人机交互场景,动态避障 |
训练超参数
• Batch size: 256(大 batch 利于跨具身特征对齐)
• Epochs: 100 · LR: 1e-4 · 优化器: AdamW
• 调度器: Cosine annealing + 4 epoch warmup
• 输入分辨率: 96×96(极低分辨率,降低计算量但限制了细节感知)
• 上下文窗口: 3 帧历史 + 1 帧当前 = 4 帧观测序列
• 负样本挖掘: 所有数据集启用(ViNG 论文方法),提升目标区分度
NoMaD 的代码仓库提供两种部署脚本,对应两种导航模式:
navigate.sh)record_bag.sh 录制 ROS bag
create_topomap.sh 将 bag 按固定间隔提取关键帧图像,构成拓扑节点
navigate.sh — NoMaD 接收当前观测,匹配最近的拓扑节点,预测通往下一节点的路径点
exploration.sh)注意:探索模式(explore.sh)是 NoMaD 独有的——GNM 和 ViNT 只支持目标导向导航,无法在无目标情况下工作。这归功于目标掩码训练策略。
| 维度 | GNM | ViNT | NoMaD |
|---|---|---|---|
| 视觉骨干 | MobileNetV2 | ViT (Patch) | EfficientNet-b0 + GroupNorm |
| 时序建模 | 无(单帧) | Transformer 自注意力 | Transformer 自注意力(4 层 4 头) |
| 动作生成 | CNN 回归头 | Transformer 回归头 | 条件扩散模型(10 步) |
| 输出特性 | 确定性 | 确定性 | 多模态分布 |
| 探索模式 | ❌ 不支持 | ❌ 不支持 | ✅ 目标掩码实现 |
| 距离感知 | ❌ | 隐式(图距离) | ✅ 显式距离预测头 |
| 输入分辨率 | 96×96 | 96×96 | 96×96 |
| 输出维度 | 4 路径点(xyθ) | 4 路径点(xyθ) | 8 路径点(xy,无 θ) |
| 部署复杂度 | 低 | 中(需拓扑图) | 中(支持无图探索) |
对于汽车从地下车库导航到地面这一实际场景,NoMaD 是当前最接近的开源方案,但仍存在显著差距:
| 维度 | 地库出库需求 | NoMaD 能力 | 匹配度 |
|---|---|---|---|
| 无 GPS 环境 | 必须纯视觉/惯性 | ✅ 纯 RGB 视觉 | 高 |
| 无预建地图 | 首次进入即需导航 | ✅ 探索模式支持 | 高 |
| 找出口能力 | 需要识别出口标志/光线 | ⚠️ 探索模式随机游走,无语义目标 | 中 |
| 运动速度 | 汽车 5-15 km/h | ❌ 训练数据为机器人 ~1 m/s (3.6 km/h) | 低 |
| 车辆动力学 | 非完整约束、最小转弯半径 | ❌ 差速底盘运动学,无汽车动力学 | 低 |
| 感知范围 | 需要看 10-20 米远 | ⚠️ 96×96 分辨率 + 广角,远距离细节模糊 | 中 |
| 柱子/车辆避障 | 地库密集立柱、停放车辆 | ⚠️ 无显式障碍物检测,依赖训练数据泛化 | 中 |
实践建议:组合方案
直接用 NoMaD 做地库出库不可行(速度/动力学差距太大),但其核心思想可借鉴:
• 定位:VIO/SLAM(如 ORB-SLAM3)提供精确位姿
• 探索决策:NoMaD 探索模式 + 出口标志语义检测(如 YOLO 检测"出口 EXIT"标牌)
• 运动控制:路径跟随控制器(Pure Pursuit / Stanley),匹配车辆运动学
• 更简方案:出口光线检测(地面亮度梯度)→ 路径规划 → 运动控制,不依赖学习模型
| 局限 | 影响 | 根本原因 |
|---|---|---|
| 96×96 输入分辨率 | 无法识别远处的小物体(行人、出口标志) | 计算效率与感知精度的权衡 |
| 无角度预测 | 路径点仅含 xy,朝向由切线推导,弯道精度受限 | 训练数据中里程计 yaw 噪声较大 |
| 探索模式无语义 | "找出口"无法表达为"无目标探索" | 模型不理解"出口"概念,仅学习运动先验 |
| 训练数据速度范围窄 | 无法直接迁移到汽车 | 数据来自低速轮式机器人(<2 m/s) |
| 无动态障碍物显式建模 | 行人/车辆密集场景安全性不足 | 扩散策略隐式学习避障,无安全约束 |
NoMaD 发布后,同一团队在 2024 年推出了 ViNT-Large(基于 Transformer 的扩展版本),将参数量从 ~10M 扩展到 ~300M,引入了语言目标条件(可用文字描述目标而非图像),并在更大规模数据上训练。ViNT-Large 在部分场景下取代了 NoMaD 的位置,但 NoMaD 的目标掩码扩散策略思想仍是最核心的方法论贡献。
# 1. 克隆代码仓库
git clone https://github.com/robodhruv/visualnav-transformer.git
cd visualnav-transformer
# 2. 创建训练环境
conda env create -f train/train_environment.yml
conda activate vint_train
pip install -e train/
# 3. 下载预训练权重(nomad.pth)
# Google Drive: visualnav-transformer/model_weights/
# 4. 部署到 LoCoBot(需 ROS Noetic)
conda env create -f deployment/deployment_environment.yaml
conda activate vint_deployment
# 5. 拓扑图导航
cd deployment/src
./navigate.sh "--model nomad --dir "
# 6. 自由探索(NoMaD 独有)
./explore.sh "--model nomad"
已验证的部署平台
Clearpath Jackal · DJI Tello · Unitree A1 · TurtleBot2 · LoCoBot · Vizbot · CARLA 仿真器
官方测试硬件:LoCoBot + NVIDIA Jetson Orin Nano + 广角鱼眼摄像头