a quick-start guide for the three-stage pipeline of this repository:
- Stage 1: NL -> HTT (Task Decomposition)
- Stage 2: HTT -> HLTL (Proposition & Temporal Compilation)
- Stage 3: HLTL -> STAP (AI2THOR Planning & Execution)
- Activate Python Environment
conda activate nl2hltl- OpenAI Configuration
- Default model settings are located in
configs/pipeline_ai2thor.json. - Supports access via port 10808 proxy (the
proxy_urlis reserved in the config). - The API key is read by default from the
keyfile in the repository root.
The main entry script is: run_repro.py
Common Commands:
- Full Pipeline Run (Stage 1 -> Stage 2 -> Stage 3)
python run_repro.py --config configs/pipeline_ai2thor.json- Limit Task Quantity (For quick testing)
python run_repro.py --config configs/pipeline_ai2thor.json --limit 5- Disable LLM (Uses heuristic-based Stage 1)
python run_repro.py --config configs/pipeline_ai2thor.json --disable-llmThe pipeline supports starting from specific stages and reusing historical results to avoid re-running Stage 1 or 2.
Parameters:
--start-stage {1,2,3}: Start from the specified stage.--reuse-cached: Reuse existing Stage 1/Stage 2 data inoutputs/repro_run3/<task>/result.json.--stage3-timeout <sec>: Timeout limit for a single Stage 3 attempt.
Examples:
- Start from Stage 3 Only (Reuse existing Stage 1/2)
python run_repro.py --config configs/pipeline_ai2thor.json --start-stage 3 --reuse-cached- Start from Stage 2 (Keep Stage 1, re-compile Stage 2 + Stage 3)
python run_repro.py --config configs/pipeline_ai2thor.json --start-stage 2 --reuse-cachedDefault output root: outputs/repro_run3
Each task directory (e.g., FloorPlan303.tasks_1.compose_4.fintune_1) contains:
result.json: Full structured results for all three stages.result.md: Human-readable stage-by-stage report.ai2thor_constraints.json: Scene constraints for the current task.ai2thor_object_lookup.json: Bidirectional index for symbol/objectId/name.ai2thor_containment.json: Relationships between receptacles and children.
Batch Summary Files:
summary.json/summary.mdfailure_analysis.json/failure_analysis.md
- Check if the
task_treehierarchy is logical. - Check
ltl_pattern_check_passedandpattern_violations.
- Leaf tasks should only use two types of propositions:
- Object proposition:
object_symbol - Action proposition:
action000object_symbol
- Object proposition:
- Verify
checks.syntax_okandchecks.affordance_ok.
- On Success: Note
stage3.success,stage3.cost,stage3.completion_time, andstage3.plan(step-by-step locations and actions). - On Failure: Check
stage3.message,stage3.planning_retries, and the statistical breakdown infailure_analysis.md.
Reference: env_catalog/ai2thor_action_reference.md
Conventions:
- Navigation tasks use object propositions (e.g.,
shelf1). - Action tasks use action propositions (e.g.,
pickup000creditcard1). - The
000string is strictly used as a separator between the action and the object.
run_repro.py: Main pipeline entry.nl2hltl_pipeline/stage1_decompose.py: Stage 1 logic.nl2hltl_pipeline/stage2_nl2ltl.py: Stage 2 logic.nl2hltl_pipeline/stage3_stap_ai2thor.py: Stage 3 logic.Hierarchical-LTL-STAP/: The core STAP planner.env_catalog/: Scene objects, affordances, and action mappings.
If you find this work useful in your research, please consider citing:
@article{xu2025nl2hltl2plan,
title = {NL2HLTL2Plan: Scaling up Natural Language Understanding for Multi-Robots
Through Hierarchical Temporal Logic Task Specifications},
author = {Xu, Shaojun and Luo, Xusheng and Huang, Yutong and Leng, Letian
and Liu, Ruixuan and Liu, Changliu},
journal = {IEEE Robotics and Automation Letters},
year = {2025},
publisher = {IEEE}
}