SatNav 轨迹数据生成
本文介绍如何使用 applications/trajectory_generation 生成 VLM-based VLN 方法所需的离线训练数据。生成器按照每个 Episode 的 reference_path 驱动 SatSim,并保存 RGB 帧、动作序列和指令标注。
路径跟随算法、目标点切换和帧—动作对齐的图解见专家轨迹原理。
1. 准备环境
开始前请完成环境安装、Episode 数据下载和卫星场景下载,然后在 SatNav 仓库根目录执行:
python -m pip install -e '.[applications]'
export SATNAV_DATA_ROOT="$PWD/data/satnav_datasets/SatNav-v0.1"
export SATNAV_TRAIN_EPISODES_PATH="$SATNAV_DATA_ROOT/episodes/train/all_episodes.json"
export SATNAV_SCENES_DIR="$PWD/data/satnav_datasets/scenes"
export SATNAV_TRAJECTORY_DIR="$SATNAV_DATA_ROOT/trajectory_data"
完整 train split 当前生成的 trajectory 数据约占 233 GB,开始生成前建议至少预留 250 GB 可用磁盘空间。
先确认 Episode 和 59 个 GeoTIFF 场景均已就绪:
bash scripts/validation/data_validation.sh
2. 快速测试
仓库提供了两个示例 Episode 和一张合成 GeoTIFF,可在不下载真实数据的情况下测试生成流程:
python -m applications.trajectory_generation.generate \
--config applications/resources/satnav_example_task.yaml \
--output_dir output/trajectory_generation_test
成功后终端会显示 Trajectory generation completed successfully,并在输出目录生成 annotations.json、summary.json 和 RGB 图像。
3. 生产配置
SatNav-v0.1 使用以下配置生成轨迹数据:
applications/episode_processing/configs/trajectory_generation.yaml
主要参数包括 10 米前进步长、15° 转向角、448 × 448 RGB、90° HFOV 和最多 500 个 step。不同轨迹类型的 waypoint 到达半径为:
Trajectory type |
到达半径 |
|---|---|
Boundary |
10 m |
LandmarkSet |
3 m |
Road |
10 m |
这里的 3 米是生成 expert trajectory 时的 waypoint 到达半径,用于更精确地判断 LandmarkSet waypoint 是否到达,从而生成更准确的训练数据。
为保证数据可复现,建议不要修改生产配置。
4. 生成完整训练数据
完整 train split 使用并行入口:
python -m applications.trajectory_generation.generate_parallel \
--config applications/episode_processing/configs/trajectory_generation.yaml \
--output_dir "$SATNAV_TRAJECTORY_DIR"
生成器默认根据场景数量和 CPU 核数选择 worker,并按场景分组以降低 GeoTIFF 内存占用。也可以通过 --num_workers N 手动设置;内存不足时应减小该值。
推荐使用并行入口生成完整数据,其效率明显高于串行入口。
5. 断点续跑
生成过程中断后,直接重新执行同一条并行命令即可续跑,无需添加额外参数。
断点续跑必须使用与首次生成相同的输出目录。
6. 输出结构
trajectory_data/
├── annotations.json
├── summary.json
└── images/
└── <scene>_satnav_<episode-index>/
├── .done
├── .annotation.json
└── rgb/
├── 001.jpg
└── ...
annotations.json:用于模型训练的最终标注。summary.json:JSONL 格式的逐 Episode 摘要。images/:与动作序列逐帧对齐的 RGB 图像及续跑缓存。
.done和.annotation.json用于断点续跑,不建议手动修改。
7. 确认生成完成
并行命令结束时会输出处理统计。完整的 SatNav-v0.1 train split 应显示:
Success (incl. cached): 105164
Discarded (max steps): 0
Failed: 0
Generated annotations: 105164 / 105164 episodes
如果数量不足,可以先重跑同一命令以重试未完成 Episode;若问题持续存在,请根据终端中的 failure reason 检查场景文件和生产配置。
8. 常见问题
为什么运行生成命令时出现 ModuleNotFoundError?
在 SatNav 仓库根目录为当前环境安装 applications 依赖:
python -m pip install -e '.[applications]'
为什么并行生成占用过多内存?
使用 --num_workers N 减少并行 worker 数量。每个 worker 都会持有 simulator、场景缓存和
图像编码资源,因此 worker 数不应超过机器内存和本地磁盘吞吐能够支持的范围。
为什么 trajectory 生成速度较慢?
确认 Episode、GeoTIFF 和输出目录位于本地高速磁盘,并保留默认的 scene affinity,使同一 worker 尽量连续处理相同场景,减少 GeoTIFF 切换和缓存重建。
为什么找不到 Episode 或场景?
重新设置 SATNAV_TRAIN_EPISODES_PATH 和 SATNAV_SCENES_DIR,然后运行:
bash scripts/validation/data_validation.sh
确认每个 Episode 的 logical scene_id 都能在场景目录中解析为对应 GeoTIFF。
为什么重跑后部分 Episode 被重新生成?
对应 Episode、生成配置或 GeoTIFF 内容已经变化,因此已有缓存不能继续复用。检查本地路径 是否指向同一批输入;如果输入确实发生变化,应保留本次重新生成的结果。