diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 44f7239..0000000 --- a/.dockerignore +++ /dev/null @@ -1,62 +0,0 @@ -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -*.egg-info/ -dist/ -build/ -*.egg - -# Virtual environments -venv/ -env/ -ENV/ -.venv/ -.conda/ - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# Testing -.pytest_cache/ -.coverage -htmlcov/ -.tox/ - -# Outputs -outputs/ -logs/ -*.log - -# Git -.git/ -.gitignore - -# Documentation -docs/_build/ - -# OS -.DS_Store -Thumbs.db - -# Docker -Dockerfile -.dockerignore -docker-compose.yml - -# Temporary files -*.tmp -*.bak -*.orig - -# Large data files (uncomment if you have large datasets) -# data/ -# *.csv -# *.h5 -# *.hdf5 \ No newline at end of file diff --git a/.gitignore b/.gitignore index acd1484..a18733b 100644 --- a/.gitignore +++ b/.gitignore @@ -178,10 +178,12 @@ examples/maps/ann_arbor /phase1_results phase1_results.zip /sumo -sim_configs -vis_configs -uv.lock texas_example README_QUICKSTART.md -run_experiments_debug.py -test_docker.sh +run_experiments_debug.pyeb.geohjson +jupiter/eb/eb.geojson +jupiter/wb/wb.geojson +jupiter +*.geojson +output.geojson +11_03_demo diff --git a/DOCKER_SETUP_GUIDE.md b/DOCKER_SETUP_GUIDE.md deleted file mode 100644 index f744d20..0000000 --- a/DOCKER_SETUP_GUIDE.md +++ /dev/null @@ -1,312 +0,0 @@ -# TeraSim Docker Setup Guide - -## Overview - -TeraSim now provides two Docker deployment options: - -1. **Base Image**: Lightweight deployment for core TeraSim functionality (simulation, planning, control testing) -2. **GPU Image**: Full-featured deployment for TeraSim-Cosmos with NVIDIA GPU support (world model training, video generation) - ---- - -## Quick Decision Guide - -### Use **Base Docker Image** if you need: -- ✅ Traffic simulation with SUMO -- ✅ Naturalistic and adversarial environment generation (NDE-NADE) -- ✅ Planning and control testing -- ✅ FastAPI service for integration -- ✅ Basic visualization tools -- ✅ Smaller image size (~2-3 GB) -- ✅ No GPU required - -### Use **GPU Docker Image** if you need: -- ✅ TeraSim-Cosmos functionality -- ✅ NVIDIA Cosmos-Drive integration -- ✅ HD map video generation -- ✅ LiDAR rendering -- ✅ ML model training/inference -- ✅ Street view analysis -- ⚠️ Requires NVIDIA GPU -- ⚠️ Larger image size (~8-10 GB) - ---- - -## Option 1: Base Docker Image - -### Quick Start - -```bash -# From TeraSim root directory -docker-compose up -d --build -docker-compose exec terasim bash - -# Inside container - run simulation -python run_experiments.py -``` - -### What's Included -- Core TeraSim packages: - - `terasim` - Core simulation engine - - `terasim-nde-nade` - Naturalistic & adversarial environments - - `terasim-service` - FastAPI service - - `terasim-envgen` - Environment generation - - `terasim-datazoo` - Data processing - - `terasim-vis` - Visualization tools -- SUMO 1.23.1 traffic simulator -- Redis for service components -- Development tools (pytest, black, ruff, mypy) - -### What's NOT Included -- ❌ `terasim-cosmos` (requires GPU) -- ❌ PyTorch/TensorFlow with GPU support -- ❌ Waymo Open Dataset tools -- ❌ GPU-accelerated rendering - -### Documentation -See [README_DOCKER.md](README_DOCKER.md) - ---- - -## Option 2: GPU Docker Image (TeraSim-Cosmos) - -### Prerequisites - -#### Hardware -- NVIDIA GPU with CUDA 11.8+ support -- 16GB+ RAM (32GB recommended) -- 50GB+ free disk space - -#### Software -Install NVIDIA Container Toolkit: - -```bash -# Ubuntu/Debian -distribution=$(. /etc/os-release;echo $ID$VERSION_ID) -curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg -curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ - sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ - sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list - -sudo apt-get update -sudo apt-get install -y nvidia-container-toolkit -sudo nvidia-ctk runtime configure --runtime=docker -sudo systemctl restart docker - -# Test installation -docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi -``` - -### Quick Start - -```bash -# Navigate to terasim-cosmos directory -cd packages/terasim-cosmos - -# Build and start GPU container -docker-compose -f docker-compose.gpu.yml up -d --build - -# Enter container -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos bash - -# Inside container - verify GPU -python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}')" - -# Run conversion -python packages/terasim-cosmos/terasim_cosmos/converter.py \ - --path_to_config configs/converter/scenario.yaml \ - --streetview_retrieval True -``` - -### What's Included -- **Everything from Base Image**, PLUS: -- `terasim-cosmos` package -- PyTorch with CUDA 11.8 -- TensorFlow with GPU support -- Waymo Open Dataset -- GPU-accelerated rendering libraries -- Additional ML tools (transformers, ray) -- Jupyter Notebook - -### Documentation -See [packages/terasim-cosmos/README_DOCKER_GPU.md](packages/terasim-cosmos/README_DOCKER_GPU.md) - ---- - -## Comparison Table - -| Feature | Base Image | GPU Image | -|---------|------------|-----------| -| **Base OS** | Ubuntu 22.04 | Ubuntu 22.04 + CUDA 11.8 | -| **Image Size** | ~2-3 GB | ~8-10 GB | -| **Build Time** | 10-15 min | 30-60 min | -| **GPU Required** | No | Yes (NVIDIA) | -| **RAM Required** | 4GB+ | 16GB+ | -| **Disk Space** | 10GB+ | 50GB+ | -| | | | -| **Core Packages** | | | -| terasim | ✅ | ✅ | -| terasim-nde-nade | ✅ | ✅ | -| terasim-service | ✅ | ✅ | -| terasim-envgen | ✅ | ✅ | -| terasim-datazoo | ✅ | ✅ | -| terasim-vis | ✅ | ✅ | -| terasim-cosmos | ❌ | ✅ | -| | | | -| **ML Libraries** | | | -| PyTorch | ❌ | ✅ (CUDA 11.8) | -| TensorFlow | ❌ | ✅ (GPU) | -| Transformers | ❌ | ✅ | -| Ray | ❌ | ✅ | -| | | | -| **Capabilities** | | | -| Traffic simulation | ✅ | ✅ | -| NDE-NADE testing | ✅ | ✅ | -| FastAPI service | ✅ | ✅ | -| Cosmos-Drive integration | ❌ | ✅ | -| HD map video gen | ❌ | ✅ | -| LiDAR rendering | ❌ | ✅ | -| Street view analysis | ❌ | ✅ | -| GPU acceleration | ❌ | ✅ | - ---- - -## Common Workflows - -### Workflow 1: Basic Simulation Testing (Use Base Image) - -```bash -# Start base container -docker-compose up -d -docker-compose exec terasim bash - -# Run simulation -python run_experiments.py - -# Run tests -pytest - -# View outputs -ls outputs/ -``` - -### Workflow 2: Cosmos-Drive Video Generation (Use GPU Image) - -```bash -# Start GPU container -cd packages/terasim-cosmos -docker-compose -f docker-compose.gpu.yml up -d -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos bash - -# Step 1: Run TeraSim simulation (or use existing outputs) -cd /app/TeraSim -python run_experiments.py - -# Step 2: Convert to Cosmos format -python packages/terasim-cosmos/terasim_cosmos/converter.py \ - --path_to_config configs/converter/my_scenario.yaml - -# Step 3: View outputs -ls outputs/my_scenario/render/ -``` - -### Workflow 3: Development with Live Code Changes - -```bash -# For base image - mount source code -docker run -it --rm \ - -v $(pwd)/packages:/app/TeraSim/packages \ - -v $(pwd)/outputs:/app/TeraSim/outputs \ - terasim:latest bash - -# For GPU image - edit docker-compose.gpu.yml to add volume: -# volumes: -# - ../../packages/terasim-cosmos:/app/TeraSim/packages/terasim-cosmos -``` - ---- - -## Troubleshooting - -### Issue: "libproj25 not found" during build -**Solution**: This has been fixed. Update to latest Dockerfile (uses libproj22). - -### Issue: "terasim_cosmos import error" in base image -**Solution**: This is expected. Use GPU image for terasim-cosmos functionality. - -### Issue: GPU not detected in GPU container -**Solution**: -```bash -# Verify NVIDIA Container Toolkit -docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi - -# Check GPU visibility in container -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos nvidia-smi -``` - -### Issue: CUDA out of memory -**Solution**: -```bash -# Set memory growth for TensorFlow -export TF_FORCE_GPU_ALLOW_GROWTH=true - -# Reduce batch sizes in your code -``` - ---- - -## File Structure - -``` -TeraSim/ -├── Dockerfile # Base image (no GPU) -├── docker-compose.yml # Base image compose -├── README_DOCKER.md # Base image docs -├── DOCKER_SETUP_GUIDE.md # This file -│ -├── packages/terasim-cosmos/ -│ ├── Dockerfile.gpu # GPU-enabled image -│ ├── docker-compose.gpu.yml # GPU image compose -│ └── README_DOCKER_GPU.md # GPU image docs -│ -├── outputs/ # Simulation outputs (mounted) -├── logs/ # Log files (mounted) -└── configs/ # Configuration files - └── converter/ # Cosmos converter configs -``` - ---- - -## Next Steps - -### For Base Image Users -1. Read [README_DOCKER.md](README_DOCKER.md) -2. Run example simulations -3. Explore NDE-NADE scenarios -4. Test FastAPI service integration - -### For GPU Image Users -1. Install NVIDIA Container Toolkit -2. Read [packages/terasim-cosmos/README_DOCKER_GPU.md](packages/terasim-cosmos/README_DOCKER_GPU.md) -3. Run TeraSim simulation -4. Convert outputs to Cosmos-Drive format -5. Generate HD map videos -6. Integrate with NVIDIA Cosmos platform - ---- - -## Support - -- **Main Documentation**: [README.md](README.md) -- **Development Guide**: [CLAUDE.md](CLAUDE.md) -- **GitHub Issues**: https://github.com/mcity/TeraSim/issues -- **Discussions**: https://github.com/mcity/TeraSim/discussions - ---- - -## License - -- **TeraSim Core**: Apache 2.0 License -- **TeraSim Visualization**: MIT License - -See [LICENSE](LICENSE) for details. \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 25e25db..0000000 --- a/Dockerfile +++ /dev/null @@ -1,146 +0,0 @@ -# TeraSim Docker Image -# Base: Ubuntu 22.04 with Python 3.10 -# Includes: gcc, g++, SUMO, Redis, and all TeraSim dependencies - -FROM ubuntu:22.04 AS builder - -# Prevent interactive prompts during package installation -ENV DEBIAN_FRONTEND=noninteractive - -# Install system dependencies -RUN apt-get update && apt-get install -y \ - # Build tools - gcc \ - g++ \ - make \ - cmake \ - build-essential \ - # Python 3.10 - python3.10 \ - python3.10-dev \ - python3-pip \ - python3.10-venv \ - # Version control - git \ - # Redis - redis-server \ - # Spatial libraries (for rtree, shapely, pyproj) - libspatialindex-dev \ - libgeos-dev \ - libproj-dev \ - # XML processing (for lxml) - libxml2-dev \ - libxslt1-dev \ - # Other utilities - wget \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# Set Python 3.10 as default python3 -RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 \ - && update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 - -# Upgrade pip -RUN python3 -m pip install --upgrade pip setuptools wheel - -# Set working directory -WORKDIR /app/TeraSim - -# Copy project files -COPY . . - -# Clone SUMO tools repository for SUMO_HOME -RUN mkdir -p /root/.terasim/deps && \ - git clone --depth 1 https://github.com/eclipse/sumo.git /root/.terasim/deps/sumo && \ - echo "SUMO_HOME=/root/.terasim/deps/sumo" > /root/.terasim/deps/.sumo_home - -# Set SUMO_HOME environment variable -ENV SUMO_HOME=/root/.terasim/deps/sumo -ENV PATH="${SUMO_HOME}/bin:${PATH}" - -# Install Python packages in editable mode -# Note: terasim-cosmos is excluded from base image (requires GPU support) -# For terasim-cosmos, use packages/terasim-cosmos/Dockerfile.gpu instead -RUN pip install -e packages/terasim && \ - pip install -e packages/terasim-nde-nade && \ - pip install -e packages/terasim-service && \ - pip install -e packages/terasim-envgen && \ - pip install -e packages/terasim-datazoo && \ - pip install -e packages/terasim-vis - -# Install development dependencies -RUN pip install \ - pytest>=7.4.0 \ - pytest-cov>=4.1.0 \ - black>=23.7.0 \ - ruff>=0.1.0 \ - mypy>=1.5.1 \ - isort>=5.12.0 - -# Build Cython extensions for NDE-NADE -RUN cd packages/terasim-nde-nade && \ - python setup.py build_ext --inplace && \ - cd ../.. - -# Create output directories -RUN mkdir -p outputs logs - -# Verify installation -RUN python3 -c "import terasim; print('✅ TeraSim core imported successfully')" && \ - python3 -c "import terasim_nde_nade; print('✅ TeraSim NDE-NADE imported successfully')" && \ - python3 -c "import terasim_service; print('✅ TeraSim Service imported successfully')" && \ - python3 -c "import terasim_vis; print('✅ TeraSim Visualization imported successfully')" - -# === Runtime Stage === -FROM ubuntu:22.04 - -ENV DEBIAN_FRONTEND=noninteractive - -# Install runtime dependencies only -RUN apt-get update && apt-get install -y \ - python3.10 \ - python3-pip \ - git \ - redis-server \ - libspatialindex-c6 \ - libgeos-c1v5 \ - libproj22 \ - libxml2 \ - libxslt1.1 \ - && rm -rf /var/lib/apt/lists/* - -# Set Python 3.10 as default -RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 \ - && update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 - -# Copy installed packages and SUMO from builder -COPY --from=builder /usr/local/lib/python3.10 /usr/local/lib/python3.10 -COPY --from=builder /usr/local/bin /usr/local/bin -COPY --from=builder /root/.terasim /root/.terasim -COPY --from=builder /app/TeraSim /app/TeraSim - -# Set working directory -WORKDIR /app/TeraSim - -# Set environment variables -ENV SUMO_HOME=/root/.terasim/deps/sumo -ENV PATH="${SUMO_HOME}/bin:${PATH}" -ENV PYTHONUNBUFFERED=1 - -# Expose ports -# 8000: TeraSim FastAPI service -# 6379: Redis -EXPOSE 8000 6379 - -# Default command: start bash shell -CMD ["/bin/bash"] - -# Alternative entry points (uncomment as needed): -# Run simulation with GUI disabled -# CMD ["python3", "run_experiments.py"] - -# Start TeraSim service -# CMD ["python3", "run_service.py"] - -# Start Redis and then run simulation -# CMD ["sh", "-c", "redis-server --daemonize yes && python3 run_experiments.py"] \ No newline at end of file diff --git a/README.md b/README.md index b17a93b..2e44d07 100644 --- a/README.md +++ b/README.md @@ -3,187 +3,214 @@ -

- - - ---- - -# TeraSim - -**Generative AI–Driven Autonomous Vehicle Simulation for Unknown Unsafe Events Discovery** +**Generative Autonomous Vehicle Testing Environment for Unknown Unsafe Events Discovery** --- -## Overview +WebsitePaperExamplesCommunity -TeraSim is an open-source platform for automated autonomous-vehicle (AV) simulation using generative AI. -Its primary objective is to **efficiently uncover real-world unknown unsafe events** by automatically creating diverse and statistically realistic traffic environments. +[![PyPI python](https://img.shields.io/pypi/pyversions/terasim)](https://pypi.org/project/terasim) +[![PyPI version](https://badge.fury.io/py/terasim.svg)](https://pypi.org/project/terasim) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) +[![GitHub issues](https://img.shields.io/github/issues/mcity/TeraSim.svg)](https://github.com/mcity/TeraSim/issues) -The framework has evolved from its initial focus on planning-and-control testing to a **complete simulation workflow**, which now includes: - -1. **High-fidelity HD map generation** for large-scale, accurate simulation environments -2. **Generative traffic environment creation** for naturalistic and adversarial scenario testing -3. **Generative sensor simulation** for camera and LiDAR perception validation - -This expanded scope enables a unified pipeline from map generation to perception and planning validation. - -## 🚀 **Updates** - -- **[09/29/2025]**: TeraSim-World source codes are available. See [TeraSim_World.md](docs/TeraSim_World.md) to get started. +

+ +## About +TeraSim is an **open-source traffic simulation platform** designed for **naturalistic and adversarial testing** of autonomous vehicles (AVs). It enables **high-speed, AI-driven testing environment generation** to expose AVs to both routine and **rare, high-risk driving conditions**. -## **🌎 New Feature: TeraSim-World** +Developed with **researchers, AV developers, and regulators** in mind, TeraSim is designed to better support **ISO 21448 (SOTIF) and ISO 34502 compliance**, providing a **scalable, automated, and unbiased AV evaluation framework**. +Built upon the open-source traffic simulation software [SUMO (Simulation of Urban MObility)](https://www.eclipse.org/sumo/), TeraSim extends its capabilities to provide specialized features for autonomous vehicle testing. - +## **🎥 Demo Video** -**TeraSim-World** automatically synthesizes geographically grounded, safety-critical data for End-to-End autonomous driving **anywhere in the world**. See 📄 [paper](https://arxiv.org/abs/2503.03629) and 🌐 [videos](https://wjiawei.com/terasim-world-web/) for details. +[![TeraSim Demo Video](https://img.youtube.com/vi/9wc5QTAETTk/0.jpg)](https://www.youtube.com/watch?v=9wc5QTAETTk) -✨ **Key Capabilities:** -- 🗺️ **Global Coverage**: Generate realistic driving scenarios for any location worldwide -- 🎯 **Safety-Critical Data**: Automatically create safety-critical events for E2E AV safety testing -- 🔄 **NVIDIA Cosmos-Drive Compatible**: Direct integration with video generation model training platforms +TeraSim is built upon a series of foundational academic works in autonomous vehicle testing: -🚀 **Source code is now available!** See [TeraSim_World.md](docs/TeraSim_World.md) for getting started guide. +- **NDE** ([Paper](https://doi.org/10.1038/s41467-023-37677-5) | [Code](https://github.com/michigan-traffic-lab/Learning-Naturalistic-Driving-Environment)): Learning naturalistic driving environment with statistical realism. *Yan, X., Zou, Z., Feng, S., et al. Nature Communications 14, 2037 (2023).* +- **NADE** ([Paper](https://doi.org/10.1038/s41467-021-21007-8) | [Code](https://github.com/michigan-traffic-lab/Naturalistic-and-Adversarial-Driving-Environment)): Intelligent driving intelligence test for autonomous vehicles with naturalistic and adversarial environment. *Feng, S., Yan, X., Sun, H. et al. Nature Communications 12, 748 (2021).* -## **🎥 Demo Video** +- **D2RL** ([Paper](https://doi.org/10.1038/s41586-023-05732-2) | [Code](https://github.com/michigan-traffic-lab/Dense-Deep-Reinforcement-Learning)): Dense reinforcement learning for safety validation of autonomous vehicles. *Feng, S., Sun, H., Yan, X., et al. Nature 615, 620–627 (2023).* -## Background and Foundations +--- -TeraSim builds on prior research in naturalistic and adversarial driving environments: +## **🌟 Key Features** +✅ **Generative Driving Environment Testing** +→ **Adaptive and interactive** environments replace static, manually designed scenarios. +→ **Automatically uncovers unknown unsafe events**, enhancing AV safety validation. +→ **Scalable and efficient**, reducing manual effort while expanding test coverage. -* **NDE** – Learning naturalistic driving environment with statistical realism - [Paper](https://doi.org/10.1038/s41467-023-37677-5) | [Code](https://github.com/michigan-traffic-lab/Learning-Naturalistic-Driving-Environment) +✅ **Naturalistic & Adversarial Driving Environments (NADE)** +→ Real-world traffic behavior modeling based on **large-scale naturalistic driving data**. +→ Injects **corner cases** (e.g., jaywalking pedestrians, sudden lane changes) to rigorously test AV safety. -* **NADE** – Intelligent driving intelligence test with naturalistic and adversarial environment - [Paper](https://doi.org/10.1038/s41467-021-21007-8) | [Code](https://github.com/michigan-traffic-lab/Naturalistic-and-Adversarial-Driving-Environment) +✅ **Scalable & Automated AV Testing** +→ AI-driven **naturalistic and adversarial driving environment** accelerates AV validation **by 1,000x - 100,000x** compared to real-world testing. +→ Dynamically adapts test cases to **urban, highway, and mixed-traffic conditions**. -* **D2RL** – Dense deep reinforcement learning for AV safety validation - [Paper](https://doi.org/10.1038/s41586-023-05732-2) | [Code](https://github.com/michigan-traffic-lab/Dense-Deep-Reinforcement-Learning) +✅ **Seamless Integration with Third-Party Simulators** +→ Works with **CARLA, Autoware**, and more. +→ API-driven design enables **plug-and-play simulation** for integration with third-party simulators. -These works provide the statistical and algorithmic basis for TeraSim’s scenario generation and risk discovery. +✅ **City-Scale AV Testing with TeraSim-Macro** +→ Extends simulations from **single intersections to entire cities**, supporting **policy-level AV impact analysis**. --- -## Key Capabilities +## **🛠️ System Architecture** -### 1. High-Fidelity HD Map Generation +TeraSim is modular, allowing users to **customize and extend** simulations easily. -* Tools for building **city-scale, high-resolution digital twins** suitable for AV testing. -* Automated conversion of real-world survey data into simulation-ready HD maps. -* Provides accurate lane geometry and traffic-control metadata for downstream simulations. +![Architecture](docs/figure/TeraSim_architecture.svg) -### 2. Generative Traffic Environment Creation -* Automated scenario generation based on **large-scale naturalistic driving data**. -* **Adversarial scenario synthesis** to reveal rare or high-risk interactions (e.g., aggressive cut-ins, unexpected pedestrian crossings). -* Integration with [SUMO](https://www.eclipse.org/sumo/) and third-party simulators such as [CARLA](https://carla.org/) and Autoware. +📌 **Packages:** +- **`terasim`:** Core simulation engine for generating AV test environments. +- **`terasim-nde-nade`:** Realistic & adversarial driving environments for safety evaluation. + - **Vehicle Adversities** (e.g., aggressive cut-ins, emergency braking). + - **VRU Adversities** (e.g., jaywalking pedestrians, erratic cyclists). +- **`terasim-service`:** RESTful API service built with FastAPI for seamless integration with **popular simulators like CARLA** and **AV planning and control system**. +- **`terasim-envgen`:** Automatic environment generation (map and traffic) tools for creating test scenarios. +- **`terasim-datazoo`:** Data processing utilities for **real-world driving datasets (Waymo, NuScenes, NuPlan)**. +- **`terasim-vis`:** Advanced visualization tools for trajectory and network analysis. -### 3. Generative Sensor Simulation - -* **`terasim-cosmos`** integrates TeraSim-World with **generative AI–based camera and LiDAR simulation**. -* Enables perception validation and sensor pipeline testing under diverse conditions. -* **Ongoing work:** support for fully **custom sensor models and configurable realism levels** is under active development. +📌 **Plug-and-Play Compatibility:** +✅ SUMO-based microsimulation +✅ CARLA & Autoware integration +✅ Real-world dataset support --- -## System Architecture - -TeraSim uses a modular monorepo design. Each package can be used independently or combined into a complete simulation pipeline. - -``` -TeraSim/ -├── packages/ -│ ├── terasim/ # Core simulation engine -│ ├── terasim-envgen/ # HD map and environment generation -│ ├── terasim-nde-nade/ # Naturalistic & adversarial environment algorithms -│ ├── terasim-cosmos/ # TeraSim-World integration & generative AI sensor simulation -│ ├── terasim-sensor/ # Baseline sensor utilities -│ ├── terasim-datazoo/ # Data processing utilities for real driving datasets -│ ├── terasim-service/ # RESTful API for external simulators -│ └── terasim-vis/ # Visualization and analysis tools -├── examples/ # Example configurations and scenarios -├── docs/ # Documentation and figures -└── tests/ # Test suites -``` - ---- +## **🔧 Installation** -## Installation +### Quick Installation (Recommended) -### Quick Setup +TeraSim is now available as a unified monorepo with multiple packages. Use our automated setup script for the easiest installation: ```bash +# Clone the monorepo git clone https://github.com/mcity/TeraSim.git cd TeraSim + +# Run automated setup (installs all components) ./setup_environment.sh ``` -This script installs all required Python packages and dependencies, including [SUMO](https://www.eclipse.org/sumo/). - -### Docker Installation (Recommended for Production) - -For a containerized environment with all dependencies pre-installed: - -```bash -git clone https://github.com/mcity/TeraSim.git -cd TeraSim -docker-compose up -d --build -docker-compose exec terasim bash -``` -See [README_DOCKER.md](README_DOCKER.md) for detailed Docker deployment instructions. +### Development Installation -### Development Environment +For development or if you want the latest features: ```bash +# Create environment (recommended) conda create -n terasim python=3.10 conda activate terasim + +# Clone and install in development mode git clone https://github.com/mcity/TeraSim.git cd TeraSim + +# Install gcc and g++ +conda install -c conda-forge gcc +conda install -c conda-forge gxx ./setup_environment.sh ``` -**Requirements** - -* Python 3.10–3.12 -* SUMO 1.23.1 (installed by the setup script) -* Redis for service components -* gcc/g++ compilers (for Cython extensions) +**System Requirements:** +- Python 3.10-3.12 +- SUMO 1.23.1 (automatically installed) +- Redis (for service components) --- -## Quick Start Example +## **🚀 Quick Start** + +After installation, try a basic simulation: ```python +import terasim + +# Create and run a simple simulation from terasim import Simulator from terasim.envs import EnvTemplate +# Initialize simulator with example map sim = Simulator("examples/maps/Mcity/sim.sumocfg") + +# Set up environment env = EnvTemplate() sim.bind_env(env) +# Run simulation sim.start() sim.run(steps=1000) sim.close() ``` -Additional examples are available in the [`examples/`](examples/) directory. +For more examples, see the [`examples/`](examples/) directory. + +**Development Commands:** +```bash +# Run tests +uv run pytest + +# Format code +uv run black . + +# Start Python shell with TeraSim +uv run python +``` + +--- + +## **🚀 Why TeraSim?** + +🔍 **Uncover Hidden AV Risks** +→ Dynamically generates realistic and adversarial traffic environments, identifying **corner cases**. + +⚡ **Automated & Scalable** +→ Uses AI to generate simulations across cities, with **1000x faster testing efficiency** than real-world methods. + +🔗 **Seamless Integration** +→ Plugin-based design works with **existing AV stacks & third-party simulators**. + +📢 **Open-Source & Extensible** +→ Encourages industry collaboration for **safer, more reliable AV deployment**. --- -## Contributing +## **📦 Monorepo Structure** -Contributions are welcome. Please read the [CONTRIBUTING.md](CONTRIBUTING.md) guidelines and join the [GitHub discussions](https://github.com/mcity/TeraSim/discussions) for feedback or proposals. +``` +TeraSim/ +├── packages/ # Python packages +│ ├── terasim/ # Core simulation engine +│ ├── terasim-nde-nade/ # NDE-NADE algorithms +│ ├── terasim-service/ # API service +│ ├── terasim-envgen/ # Environment generation +│ ├── terasim-datazoo/ # Data processing +│ └── terasim-vis/ # Visualization tools +├── apps/ # Applications & deployment +├── examples/ # Example simulations +├── docs/ # Documentation +└── tests/ # Test suites +``` --- +## **📌 Contributing** + +We welcome contributions! Please see our [contribution guidelines](CONTRIBUTING.md) and join our [community discussions](https://github.com/mcity/TeraSim/discussions). + +--- -## **📄 License** +## **📄 License & Attribution** - **TeraSim Core and other packages**: Apache 2.0 License - **Visualization Tools**: MIT License diff --git a/README_DOCKER.md b/README_DOCKER.md deleted file mode 100644 index ec63c0b..0000000 --- a/README_DOCKER.md +++ /dev/null @@ -1,402 +0,0 @@ -# TeraSim Docker Deployment Guide - -## Overview - -This Dockerfile provides a complete, production-ready environment for TeraSim based on **Ubuntu 22.04** and **Python 3.10**. It includes all necessary dependencies and tools for running autonomous vehicle simulations. - -### What's Included - -- ✅ **Compilers**: gcc, g++, build-essential -- ✅ **SUMO 1.23.1**: Traffic simulation engine (installed via pip) -- ✅ **SUMO Tools**: Full toolchain cloned to `~/.terasim/deps/sumo` -- ✅ **Redis**: Required for service components -- ✅ **Python Dependencies**: All packages including Cython extensions -- ✅ **Optimized Build**: Multi-stage Docker build (~2-3 GB final image) - ---- - -## Quick Start - -### Using Docker Compose (Recommended) - -```bash -# Build and start the container -docker-compose up -d --build - -# Enter the container -docker-compose exec terasim bash - -# Run simulation inside container -python run_experiments.py - -# Stop the container -docker-compose down -``` - -### Using Docker CLI - -```bash -# Build the image -docker build -t terasim:latest . - -# Run container in interactive mode -docker run -it --name terasim \ - -p 8000:8000 \ - -p 6379:6379 \ - -v $(pwd)/outputs:/app/TeraSim/outputs \ - -v $(pwd)/logs:/app/TeraSim/logs \ - terasim:latest - -# Inside the container, start Redis (if needed) -redis-server --daemonize yes - -# Run your simulation -python run_experiments.py -``` - ---- - -## Common Operations - -### Running Different Simulations - -```bash -# Standard simulation (police pullover scenario) -docker-compose exec terasim python run_experiments.py - -# Debug mode (cutin scenario, GUI required) -docker-compose exec terasim python run_experiments_debug.py - -# Start FastAPI service -docker-compose exec terasim python run_service.py - -# Run example scripts -docker-compose exec terasim python examples/scripts/example.py -``` - -### Running Tests - -```bash -# Run all tests -docker-compose exec terasim pytest - -# Run specific test suite -docker-compose exec terasim pytest tests/test_core/ - -# Generate HTML coverage report -docker-compose exec terasim pytest --cov=terasim --cov-report=html - -# Run only fast tests (skip slow integration tests) -docker-compose exec terasim pytest -m "not slow" -``` - -### Code Quality Tools - -```bash -# Format code with Black -docker-compose exec terasim black packages/ - -# Lint with Ruff -docker-compose exec terasim ruff check packages/ - -# Type checking with mypy -docker-compose exec terasim mypy packages/terasim/ - -# Sort imports with isort -docker-compose exec terasim isort packages/ -``` - ---- - -## Configuration - -### Data Persistence - -The Docker Compose configuration automatically mounts volumes for data persistence: - -- `./outputs` → Simulation output files -- `./logs` → Log files - -Your data persists on the host machine even after container removal. - -### Port Mappings - -- **8000**: TeraSim FastAPI service endpoint -- **6379**: Redis database - -### Environment Variables - -The following environment variables are pre-configured in the container: - -```bash -SUMO_HOME=/root/.terasim/deps/sumo -PATH=$SUMO_HOME/bin:$PATH -PYTHONUNBUFFERED=1 -``` - -### Resource Limits - -Default resource limits in `docker-compose.yml`: - -```yaml -deploy: - resources: - limits: - cpus: '4' - memory: 8G - reservations: - cpus: '2' - memory: 4G -``` - -Adjust these values based on your simulation requirements. - ---- - -## Customization - -### Changing Startup Command - -Edit the `command` field in `docker-compose.yml`: - -```yaml -# Auto-start simulation on container launch -command: sh -c "redis-server --daemonize yes && python run_experiments.py" - -# Auto-start FastAPI service -command: sh -c "redis-server --daemonize yes && python run_service.py" - -# Keep container running with bash (default) -command: sh -c "redis-server --daemonize yes && /bin/bash" -``` - -### Using Separate Redis Container - -Uncomment the Redis service in `docker-compose.yml`: - -```yaml -services: - redis: - image: redis:7-alpine - container_name: terasim-redis - ports: - - "6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes - -volumes: - redis-data: -``` - -Then update the TeraSim service to link to Redis: - -```yaml -services: - terasim: - # ... other config ... - depends_on: - - redis - environment: - - REDIS_HOST=redis -``` - ---- - -## Troubleshooting - -### Build Failures - -```bash -# Clean Docker cache and rebuild -docker-compose build --no-cache - -# Check Docker disk space -docker system df - -# Prune unused resources -docker system prune -a -``` - -### Redis Connection Issues - -```bash -# Check Redis status inside container -docker-compose exec terasim redis-cli ping - -# Manually start Redis -docker-compose exec terasim redis-server --daemonize yes - -# View Redis logs -docker-compose exec terasim redis-cli INFO -``` - -### SUMO_HOME Not Set - -```bash -# Verify environment variable -docker-compose exec terasim echo $SUMO_HOME - -# Manually set if needed -docker-compose exec terasim bash -c "export SUMO_HOME=/root/.terasim/deps/sumo" - -# Check SUMO installation -docker-compose exec terasim sumo --version -``` - -### Permission Issues with Mounted Volumes - -```bash -# On host machine, adjust permissions -chmod -R 777 outputs logs - -# Or change ownership to your user -sudo chown -R $USER:$USER outputs logs -``` - -### Container Won't Start - -```bash -# View container logs -docker-compose logs terasim - -# Check specific error messages -docker-compose logs --tail=50 terasim - -# Restart container -docker-compose restart terasim -``` - -### Python Import Errors - -```bash -# Verify package installation inside container -docker-compose exec terasim python -c "import terasim; print(terasim.__version__)" - -# Reinstall packages if needed -docker-compose exec terasim pip install -e packages/terasim -``` - ---- - -## Development Workflow - -### Making Code Changes - -1. Edit code on your host machine -2. Rebuild the container to apply changes: - -```bash -docker-compose up -d --build -``` - -Alternatively, mount your source code as a volume for live editing: - -```yaml -services: - terasim: - volumes: - - ./packages:/app/TeraSim/packages -``` - -### Debugging Inside Container - -```bash -# Enter container with bash -docker-compose exec terasim bash - -# Run Python interactively -docker-compose exec terasim python - -# Use IPython for better debugging -docker-compose exec terasim pip install ipython -docker-compose exec terasim ipython -``` - -### Running GUI Applications - -For SUMO GUI (`sumo-gui`) to work, you need X11 forwarding: - -```yaml -services: - terasim: - environment: - - DISPLAY=$DISPLAY - volumes: - - /tmp/.X11-unix:/tmp/.X11-unix -``` - -On the host: - -```bash -# Allow X11 connections -xhost +local:docker - -# Run container -docker-compose up -d -``` - ---- - -## Image Information - -- **Base Image**: `ubuntu:22.04` -- **Python Version**: `3.10` -- **SUMO Version**: `1.23.1` -- **Build Type**: Multi-stage (optimized) -- **Estimated Size**: 2-3 GB -- **Note**: Base image excludes `terasim-cosmos` (requires GPU support) - -### TeraSim-Cosmos GPU Image - -For full TeraSim-Cosmos functionality with GPU support, use the dedicated GPU Dockerfile: - -```bash -# Navigate to terasim-cosmos package -cd packages/terasim-cosmos - -# Build and run GPU-enabled image -docker-compose -f docker-compose.gpu.yml up -d --build - -# Enter container -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos bash -``` - -See [packages/terasim-cosmos/README_DOCKER_GPU.md](packages/terasim-cosmos/README_DOCKER_GPU.md) for detailed GPU setup instructions. - ---- - -## Performance Tips - -1. **Use BuildKit**: Enable faster builds with Docker BuildKit: - ```bash - DOCKER_BUILDKIT=1 docker-compose build - ``` - -2. **Layer Caching**: Order Dockerfile commands from least to most frequently changed - -3. **Parallel Builds**: Build with multiple CPU cores: - ```bash - docker-compose build --parallel - ``` - -4. **Resource Allocation**: Increase Docker Desktop resources in Settings → Resources - ---- - -## Support - -For issues, questions, or contributions: - -- **GitHub Issues**: [https://github.com/mcity/TeraSim/issues](https://github.com/mcity/TeraSim/issues) -- **Discussions**: [https://github.com/mcity/TeraSim/discussions](https://github.com/mcity/TeraSim/discussions) -- **Documentation**: See main [README.md](README.md) and [CLAUDE.md](CLAUDE.md) - ---- - -## License - -- **TeraSim Core**: Apache 2.0 License -- **TeraSim Visualization Tools**: MIT License - -See [LICENSE](LICENSE) for details. \ No newline at end of file diff --git a/configs/adversities/static/stalled_object_latlon_example.yaml b/configs/adversities/static/stalled_object_latlon_example.yaml new file mode 100644 index 0000000..43dd5f8 --- /dev/null +++ b/configs/adversities/static/stalled_object_latlon_example.yaml @@ -0,0 +1,40 @@ +# Example configuration for stalled object using latlon_degree placement mode +adversity_cfg: + static: + stalled_object: + _target_: terasim_nde_nade.adversity.StalledObjectAdversity + _convert_: 'all' + placement_mode: "latlon_degree" # Use lat/lon/degree placement mode + lon: -83.7430 # Longitude (example: Ann Arbor, MI) + lat: 42.2808 # Latitude (example: Ann Arbor, MI) + degree: 90.0 # Heading angle in degrees (0=North, 90=East, 180=South, 270=West) + object_type: "TRUCK" # Type of stalled object + start_time: 0 # Start time in simulation seconds + end_time: -1 # End time (-1 for infinite duration) + other_settings: + duration: 1200 + +# Alternative examples: +# +# Using xy_angle mode: +# adversity_cfg: +# static: +# stalled_object: +# _target_: terasim_nde_nade.adversity.StalledObjectAdversity +# _convert_: 'all' +# placement_mode: "xy_angle" +# x: 100.0 +# y: 200.0 +# angle: 90.0 +# object_type: "TRUCK" +# +# Using lane_position mode (default): +# adversity_cfg: +# static: +# stalled_object: +# _target_: terasim_nde_nade.adversity.StalledObjectAdversity +# _convert_: 'all' +# placement_mode: "lane_position" +# lane_id: "edge1_0" +# lane_position: 100 +# object_type: "veh_passenger" diff --git a/configs/config.yaml b/configs/config.yaml new file mode 100644 index 0000000..c437153 --- /dev/null +++ b/configs/config.yaml @@ -0,0 +1,30 @@ +map_download: + distance: 150 + network_type: drive +map_search: + bbox_size: 150 + default_city: San Francisco + max_results: 5 +output: + base_dir: output + scene_prefix: scene_ +sumo: + begin_time: 0 + end_time: 3600 +traffic: + end_time: 3600 + vehicle_period: 0.5 +visualization: + preview: + dpi: 300 + enabled: true + figure_height: 8 + figure_width: 16 + interactive_map: true + randomize: + enabled: true + map_style: true + node_selection: true + seed: 0 + visualization: true + satellite_view: true diff --git a/configs/simulation/example.yaml b/configs/simulation/example.yaml deleted file mode 100644 index 01725c1..0000000 --- a/configs/simulation/example.yaml +++ /dev/null @@ -1,190 +0,0 @@ -input: - sumo_net_file: "path_to_net" - sumo_config_file: "path_to_config" - -output: - dir: "path_to_output" # Output directory (use "output" for non-AV simulations) - name: "test" # Experiment name - nth: "0_2" # Experiment number - aggregated_dir: "aggregated" # Directory for aggregated logs - -simulation_module: "my_simulations" -simulation_class: "CarSimulation" -parameters: - num_cars: 10 - simulation_time: 3600 - -# Simulation type: Choose between "safetest_mcity_av" or "safetest_mcity" -simulation_type: "safetest_mcity" - - -environment: - # Module containing the environment class - module: "terasim_nde_nade.envs.safetest_nade" # Use "terasim_nde_nade.envs.safetest_nade" for non-AV simulations - # Environment class name - class: "SafeTestNADE" # Use "SafeTestNADE" for non-AV simulations - parameters: - # Vehicle factory class - vehicle_factory: "terasim_nde_nade.vehicle.nde_vehicle_factory.NDEVehicleFactory" - # Info extractor class - info_extractor: "terasim.logger.infoextractor.InfoExtractor" - log_flag: true - warmup_time_lb: 100 # Lower bound for warmup time - warmup_time_ub: 200 # Upper bound for warmup time - run_time: 1200 # Simulation run time (use 30 for non-AV simulations) - - MOBIL_lc_flag: True - stochastic_acc_flag: False - drive_rule: "righthand" - - adversity_sampling_probability: 1 - adversity_cfg: - vehicle: - roundabout_cutin: - _target_: terasim_nde_nade.adversity.vehicles.lanechange_adversity.LanechangeAdversity - _convert_: 'all' - location: 'roundabout' - ego_type: 'vehicle' - probability: 2.3123152310029683e-05 - predicted_collision_type: "roundabout_cutin" - - roundabout_rearend: - _target_: terasim_nde_nade.adversity.vehicles.leader_adversity.LeaderAdversity - _convert_: 'all' - location: 'roundabout' - ego_type: 'vehicle' - probability: 0 # 1.8383121748678325e-10 - predicted_collision_type: "roundabout_rearend" - - roundabout_fail_to_yield: - _target_: terasim_nde_nade.adversity.vehicles.trafficrule_adversity.TrafficRuleAdversity - _convert_: 'all' - location: 'roundabout' - ego_type: 'vehicle' - probability: 0.0005025411072000003 - predicted_collision_type: "roundabout_fail_to_yield" - - # roundabout_neglect_conflict_lead: - # _target_: terasim_nde_nade.adversity.roundabout_cutin_adversity.RoundaboutCutinAdversity - # _convert_: 'all' - # location: 'roundabout' - # ego_type: 'vehicle' - # probability: 0.00027119028871789013 - - highway_cutin: - _target_: terasim_nde_nade.adversity.vehicles.lanechange_adversity.LanechangeAdversity - _convert_: 'all' - location: 'highway' - ego_type: 'vehicle' - probability: 3.1996225726187704e-05 - predicted_collision_type: "highway_cutin" - - highway_rearend: - _target_: terasim_nde_nade.adversity.vehicles.leader_adversity.LeaderAdversity - _convert_: 'all' - location: 'highway' - ego_type: 'vehicle' - probability: 0 # 0.8783674048511999 - predicted_collision_type: "highway_rearend" - - intersection_cutin: - _target_: terasim_nde_nade.adversity.vehicles.lanechange_adversity.LanechangeAdversity - _convert_: 'all' - location: 'intersection' - ego_type: 'vehicle' - probability: 6.694592721399203e-05 - predicted_collision_type: "intersection_cutin" - - intersection_rearend: - _target_: terasim_nde_nade.adversity.vehicles.leader_adversity.LeaderAdversity - _convert_: 'all' - location: 'intersection' - ego_type: 'vehicle' - probability: 0 # 0.00017365940078885788 - predicted_collision_type: "intersection_rearend" - - intersection_headon: - _target_: terasim_nde_nade.adversity.vehicles.headon_adversity.HeadonAdversity - _convert_: 'all' - location: 'intersection' - ego_type: 'vehicle' - probability: 1.0663168272664859e-08 - predicted_collision_type: "intersection_headon" - - intersection_tfl: - _target_: terasim_nde_nade.adversity.vehicles.trafficrule_adversity.TrafficRuleAdversity - _convert_: 'all' - location: 'intersection' - ego_type: 'vehicle' - probability: 0.010141902545438387 - predicted_collision_type: "intersection_tfl" - - # intersection_neglect_conflict_lead: - # _target_: terasim_nde_nade.adversity.roundabout_cutin_adversity.RoundaboutCutinAdversity - # _convert_: 'all' - # location: 'roundabout' - # ego_type: 'vehicle' - # probability: 0.015050715723004704 - - vulnerable_road_user: - jaywalking: - _target_: terasim_nde_nade.adversity.vru.jaywalking_adversity.JaywalkingAdversity - _convert_: 'all' - location: 'crosswalk' - ego_type: 'vulnerable_road_user' - probability: 0.001 - predicted_collision_type: "intersection_jaywalking" - - runningredlight: - _target_: terasim_nde_nade.adversity.vru.runningredlight_adversity.RunningRedLightAdversity - _convert_: 'all' - location: 'crosswalk' - ego_type: 'vulnerable_road_user' - probability: 0.001 - predicted_collision_type: "intersection_runningredlight" - - stopcrossing: - _target_: terasim_nde_nade.adversity.vru.stopcrossing_adversity.StopCrossingAdversity - _convert_: 'all' - location: 'crosswalk' - ego_type: 'vulnerable_road_user' - probability: 0.001 - predicted_collision_type: "intersection_stopcrossing" - - AV_cfg: - route: ["EG_35_1_14", "EG_1_3_1", "EG_1_3_1.61", "EG_1_3_1.136", "EG_34_1_24", "EG_34_1_3", "gneE0", "EG_4_1_1", "EG_10_1_1", "EG_15_1_17", "EG_15_1_1", "EG_16_45_1", "EG_16_23_1", "EG_17_1_1", "EG_14_2_1", "EG_9_1_1", "EG_21_1_1", "EG_21_1_5", "EG_20_1_11", "EG_29_1_1", "EG_35_1_14"] # list of SUMO edges (example for Mcity) - type: "NDE_HIGHWAY" - cache_radius: 100 - control_radius: 50 - warmup_control: - enabled: true # Enable AV warmup (false keeps original behavior) - - # Trigger condition (choose one) - trigger_type: "time" # Options: "position", "time", "zone", "edge" - - # Position trigger configuration - time_trigger: - duration: 20.0 # Warmup duration in seconds -simulator: - module: "terasim.simulator" - class: "Simulator" - parameters: - num_tries: 10 - gui_flag: false - realtime_flag: false # Only applicable for AV mode - sumo_output_file_types: - - "fcd_all" - - "collision" - - "tripinfo" - -# Path resolution mode: -# - "config_relative": Relative paths are resolved from the config file's directory -# - "cwd_relative": Relative paths are resolved from the current working directory -path_resolution: "config_relative" - - - -logging: - levels: - - "TRACE" # Log level for the main log file - - "INFO" # Log level for the aggregated log file diff --git a/configs/visulation/example.yaml b/configs/visulation/example.yaml deleted file mode 100644 index 9545595..0000000 --- a/configs/visulation/example.yaml +++ /dev/null @@ -1,51 +0,0 @@ -fcd: "path_to_fcd" -net: "path_to_net" -output_dir: "path_to_output" -video_name: "bev_trajectory" - - -start_time: 95 # Start time for visualization (default: 0) -end_time: 99 # End time for visualization (null = use all data) -ego_vehicle_id: "flow_0.6" -adv_vehicle_id: "ped_flow_cross_1.15" - -animate: true # true for animation, false for static plot -speed_colors: false # Color trajectories by speed (overrides other colors) -lane_colors: false # Color trajectories by lane (overrides vehicle type colors) - -# Plot appearance -figsize: "9,12" # Figure size in inches (width,height) -dpi: 300 # Resolution for saved images/animations -max_frames: 19 # Maximum number of frames to visualize - -# Map styling -map_style: - style: "EUR" # Map style: EUR, USA, etc. - zoom_to_extents: false # Auto-zoom to fit all roads (set false for custom view) - show_title: false # Show plot title - show_labels: false # Show axis labels - title: "Traffic Simulation" # Custom title (if show_title: true) - - - # Custom view settings (only used when zoom_to_extents: false) - view: - width: 60 # View width in meters - height: 80 # View height in meters - center_on_ego: true # Center view on ego vehicle (if false, use fixed center) - center_x: 0 # Fixed center X coordinate (only if center_on_ego: false) - center_y: 0 # Fixed center Y coordinate (only if center_on_ego: false) - - # Colors for map elements - colors: - lane_color: '0.9' - lane_marking_color: '0.2' - -# Vehicle type coloring (when speed_colors and lane_colors are false): -# - Regular vehicles (BV_*, AV): red -# - Bicycles: yellow -# - Pedestrians (VRU_*): blue - -# Animation settings (only used when animate: true) -# - Frame rate: 10 fps -# - Marker sizes: vehicles=6, bicycles=4, pedestrians=2 -# - Uses ffmpeg writer for MP4 output \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 9fede28..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: '3.8' - -services: - terasim: - build: - context: . - dockerfile: Dockerfile - image: terasim:latest - container_name: terasim - working_dir: /app/TeraSim - ports: - - "8000:8000" # TeraSim FastAPI service - - "6379:6379" # Redis - volumes: - # Mount outputs and logs to host for persistence - - ./outputs:/app/TeraSim/outputs - - ./logs:/app/TeraSim/logs - # Optional: mount examples for easy editing - # - ./examples:/app/TeraSim/examples - environment: - - SUMO_HOME=/root/.terasim/deps/sumo - - PYTHONUNBUFFERED=1 - # Start Redis and keep container running - command: sh -c "redis-server --daemonize yes && /bin/bash" - stdin_open: true - tty: true - # Resource limits (adjust as needed) - deploy: - resources: - limits: - cpus: '4' - memory: 8G - reservations: - cpus: '2' - memory: 4G - - # Optional: Separate Redis service - # Uncomment if you prefer Redis as a separate container - # redis: - # image: redis:7-alpine - # container_name: terasim-redis - # ports: - # - "6379:6379" - # volumes: - # - redis-data:/data - # command: redis-server --appendonly yes - -# volumes: -# redis-data: \ No newline at end of file diff --git a/docs/TeraSim_World.md b/docs/TeraSim_World.md deleted file mode 100644 index 448e1df..0000000 --- a/docs/TeraSim_World.md +++ /dev/null @@ -1,101 +0,0 @@ -# TeraSim-World - -
- -
- -**TeraSim-World** automatically synthesizes geographically grounded, safety-critical data for End-to-End autonomous driving **anywhere in the world**. See 📄 [paper](https://arxiv.org/abs/2503.03629) and 🌐 [videos](https://wjiawei.com/terasim-world-web/) for details. - - - -## Quick Start - -### 1. Installation - -```bash -# Clone the repository -git clone https://github.com/mcity/TeraSim.git -cd TeraSim - -# Run automated setup (installs all components including TeraSim-World) -./setup_environment.sh - -# Activate environment -conda activate terasim - -# Configure API keys in .env file -# Required: OPENAI_API_KEY and GOOGLE_MAPS_API_KEY -``` - -### 2. Generate Experiments - -```bash -python scripts/generate_experiments.py \ - --lat 42.331936167160165 \ - --lon -83.70812725301244 \ - --bbox 500 \ - --output generated_experiments \ - --name ann_arbor_four_way_stop -``` - -**Key Parameters:** -- `--lat`: Latitude of the center point for scenario generation -- `--lon`: Longitude of the center point (required with --lat) -- `--bbox`: Size of bounding box in meters (default: 500) -- `--output`: Output directory for generated experiment files (default: generated_experiments) -- `--name`: Name for the scenario (auto-generated if not provided) - -### 3. Run Experiments (Debug Mode) - -Run simulations with visual debugging and real-time monitoring: - -```bash -python scripts/run_experiments_debug.py --config path/to/your/config.yaml -``` - -Example configurations are available in `configs/simulation/example.yaml`. - -### 4. Convert to Cosmos-Drive Format - -Transform TeraSim outputs into NVIDIA Cosmos-Drive compatible data: - -```bash -python scripts/convert_terasim_to_cosmos.py \ - --path_to_output /path/to/output \ - --path_to_fcd /path/to/fcd_all.xml \ - --path_to_map /path/to/map.net.xml \ - --vehicle_id vehicle_001 \ - --time_start 460.0 \ - --time_end 464.0 \ - --streetview_retrieval -``` - -**Key Parameters:** -- `--path_to_output`: Output directory for converted data -- `--path_to_fcd`: Path to TeraSim FCD (Floating Car Data) XML file -- `--path_to_map`: Path to SUMO network map XML file -- `--vehicle_id`: ID of the ego vehicle to track -- `--time_start/--time_end`: Time window in seconds for conversion -- `--streetview_retrieval`: Enable real-world street view image integration - -### 5. Use with Cosmos-Drive - -The converted output includes: -- **WebDataset Format**: Compatible with Cosmos-Drive data format -- **HD Map Videos**: Multi-view HDMap videos -- **Street View Images**: Multi-view street view images from Google Maps -- **Text Prompts**: Scene descriptions from street view analysis - -Import the data into [Cosmos-Drive-Dreams](https://github.com/nv-tlabs/Cosmos-Drive-Dreams) for multi-view video generation. - - -## Citation - -```bibtex -@article{wang2025terasim-world, - author = {Wang, Jiawei and Sun, Haowei and Yan, Xintao and Feng, Shuo and Gao, Jun and Liu, Henry}, - title = {TeraSim-World: Worldwide Safety-Critical Data Synthesis for End-to-End Autonomous Driving}, - journal = {arXiv preprint arXiv:2509.13164}, - year = {2025}, -} -``` \ No newline at end of file diff --git a/docs/figure/TeraSim_World.png b/docs/figure/TeraSim_World.png deleted file mode 100644 index 570606a..0000000 Binary files a/docs/figure/TeraSim_World.png and /dev/null differ diff --git a/examples/xodr_sumo_maps/README.md b/examples/xodr_sumo_maps/README.md deleted file mode 100644 index fb3a925..0000000 --- a/examples/xodr_sumo_maps/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# CARLA OpenDRIVE and SUMO Maps Collection - -This directory contains OpenDRIVE map files for the CARLA simulator and corresponding SUMO network files, intended for testing and developing an OpenDRIVE-to-SUMO converter. - -## 📁 Directory structure - -``` -examples/xodr_sumo_maps/ -├── carla_towns/ -│ ├── xodr/ # OpenDRIVE map files -│ │ ├── Town01.xodr # Basic city map (486KB) -│ │ ├── Town02.xodr # Small town map (602KB) -│ │ ├── Town03.xodr # Complex city map (2.2MB) -│ │ ├── Town04.xodr # Highway map (2.0MB) -│ │ └── Town06.xodr # Long highway map (2.0MB) -│ ├── configs/ # SUMO simulation configuration files -│ │ ├── Town01.sumocfg # Town01 SUMO config -│ │ ├── Town04.sumocfg # Town04 SUMO config -│ │ ├── Town05.sumocfg # Town05 SUMO config -│ │ └── carlavtypes.rou.xml # CARLA vehicle type definitions -│ └── sumo_net/ # SUMO network files (to be downloaded) -└── README.md # This file -``` - -## 🗺️ Map details - -### Town01 – Basic city map -- Type: urban roads -- Size: 410.68 x 344.26 m -- Features: basic test scenario with intersections and straight roads -- Use: initial algorithm testing, connectivity verification - -### Town02 – Small town map -- Type: compact town -- Size: 205.59 x 204.48 m -- Features: compact layout, suitable for quick tests -- Use: algorithm validation, performance tests - -### Town03 – Complex city map -- Type: complex urban environment -- Features: multi-lane roads, complex intersections, multiple road types -- Use: complex scenario testing, intersection handling validation - -### Town04 – Highway map -- Type: highway -- Features: ramps, lane-count changes, high-speed scenarios -- Use: ramp merging tests, variable lane-width handling - -### Town06 – Long highway map -- Type: long-distance highway -- Features: long highway stretches with multiple exits/entrances -- Use: long-range path planning, high-speed scenario testing - -## 🚗 CARLA-SUMO co-simulation - -### Configuration files -- Town01.sumocfg: full SUMO configuration for Town01 -- Town04.sumocfg: SUMO configuration for the Town04 highway scenario -- Town05.sumocfg: SUMO configuration for Town05 urban scenario -- carlavtypes.rou.xml: CARLA vehicle type definitions, includes vehicle blueprint mappings - -### Usage -```bash -# Run CARLA-SUMO co-simulation -cd carla_towns/configs -sumo-gui -c Town01.sumocfg # use the GUI -sumo -c Town01.sumocfg # headless / CLI mode -``` - -## 🛠️ Converter testing - -### Using the Python converter -```bash -# Test basic map -python python_opendrive_converter_v2.py examples/xodr_sumo_maps/carla_towns/xodr/Town01.xodr output_town01.net.xml - -# Test highway map (includes ramps) -python python_opendrive_converter_v2.py examples/xodr_sumo_maps/carla_towns/xodr/Town04.xodr output_town04.net.xml - -# Test complex city map -python python_opendrive_converter_v2.py examples/xodr_sumo_maps/carla_towns/xodr/Town03.xodr output_town03.net.xml -``` - -### Comparison with the official netconvert -```bash -# Use the official netconvert tool -export SUMO_HOME=/home/mtl/.terasim/deps/sumo -netconvert --opendrive-files examples/xodr_sumo_maps/carla_towns/xodr/Town01.xodr -o official_town01.net.xml - -# Compare results -sumo-gui -n output_town01.net.xml # Python converter result -sumo-gui -n official_town01.net.xml # Official converter result -``` - -## 📊 Testing recommendations - -### Suggested test order -1. Town01 — verify basic functionality -2. Town02 — test compact scenarios -3. Town04 — verify ramps and highway behavior -4. Town03 — test complex intersections -5. Town06 — test long-distance scenarios - -### Key verification points -- ✅ Geometry handling: straight lines, arcs, spirals -- ✅ Lane types: driving, entry, exit, onRamp, offRamp -- ✅ Connectivity: road connections, ramp merges/splits -- ✅ Intersections: handling of complex junctions -- ✅ Coordinate systems: UTM projection and geographic references - -## 📚 References - -- CARLA OpenDRIVE docs: https://carla.readthedocs.io/en/latest/adv_opendrive/ -- CARLA-SUMO co-simulation: https://carla.readthedocs.io/en/latest/adv_sumo/ -- OpenDRIVE standard: https://www.asam.net/standards/detail/opendrive/ -- SUMO network format: https://sumo.dlr.de/docs/Networks/SUMO_Road_Networks.html - -## 🐛 Known issues - -1. Town03 complexity: contains many complex geometries and may require optimized handling -2. Town04 ramps: ramp connection logic needs careful verification -3. Coordinate systems: ensure geographic reference is properly set - -## 📈 Performance metrics - -After conversion, evaluate using metrics such as: -- Number of edges vs original road count -- Number of nodes vs number of intersections -- Number of connections vs expected connections -- Total lane count consistency -- Geometric fidelity (arc smoothness) \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01.con.xml b/examples/xodr_sumo_maps/xodr/Town01.con.xml new file mode 100644 index 0000000..f4aab20 --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01.con.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01.edg.xml b/examples/xodr_sumo_maps/xodr/Town01.edg.xml new file mode 100644 index 0000000..62ffb5f --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01.edg.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01.net.xml b/examples/xodr_sumo_maps/xodr/Town01.net.xml new file mode 100644 index 0000000..8a4cc23 --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01.net.xml @@ -0,0 +1,928 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xodr_sumo_maps/xodr/Town01.nod.xml b/examples/xodr_sumo_maps/xodr/Town01.nod.xml new file mode 100644 index 0000000..755bbdf --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01.nod.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.con.xml b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.con.xml new file mode 100644 index 0000000..f4aab20 --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.con.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.edg.xml b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.edg.xml new file mode 100644 index 0000000..62ffb5f --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.edg.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.net.xml b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.net.xml new file mode 100644 index 0000000..5f4fe6b --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.net.xml @@ -0,0 +1,928 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.nod.xml b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.nod.xml new file mode 100644 index 0000000..755bbdf --- /dev/null +++ b/examples/xodr_sumo_maps/xodr/Town01_tiles/tile_0000/tile_0000.nod.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/terasim-cosmos/Dockerfile.gpu b/packages/terasim-cosmos/Dockerfile.gpu deleted file mode 100644 index fa34eca..0000000 --- a/packages/terasim-cosmos/Dockerfile.gpu +++ /dev/null @@ -1,191 +0,0 @@ -# TeraSim-Cosmos GPU Docker Image -# Base: NVIDIA CUDA 11.8 with cuDNN 8 on Ubuntu 22.04 -# Includes: TeraSim core + GPU-accelerated ML libraries for Cosmos-Drive integration - -FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 AS builder - -# Prevent interactive prompts during package installation -ENV DEBIAN_FRONTEND=noninteractive - -# Install system dependencies -RUN apt-get update && apt-get install -y \ - # Build tools - gcc \ - g++ \ - make \ - cmake \ - build-essential \ - # Python 3.10 - python3.10 \ - python3.10-dev \ - python3-pip \ - python3.10-venv \ - # Version control - git \ - # Redis - redis-server \ - # Spatial libraries (for rtree, shapely, pyproj) - libspatialindex-dev \ - libgeos-dev \ - libproj-dev \ - # XML processing (for lxml) - libxml2-dev \ - libxslt1-dev \ - # Graphics libraries (for rendering) - libgl1-mesa-glx \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender-dev \ - libgomp1 \ - # Other utilities - wget \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# Set Python 3.10 as default python3 -RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 \ - && update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 - -# Upgrade pip -RUN python3 -m pip install --upgrade pip setuptools wheel - -# Set working directory -WORKDIR /app/TeraSim - -# Copy project files -COPY . . - -# Clone SUMO tools repository for SUMO_HOME -RUN mkdir -p /root/.terasim/deps && \ - git clone --depth 1 https://github.com/eclipse/sumo.git /root/.terasim/deps/sumo && \ - echo "SUMO_HOME=/root/.terasim/deps/sumo" > /root/.terasim/deps/.sumo_home - -# Set SUMO_HOME environment variable -ENV SUMO_HOME=/root/.terasim/deps/sumo -ENV PATH="${SUMO_HOME}/bin:${PATH}" - -# Install PyTorch with CUDA 11.8 support first (this is large, so do it early for better caching) -RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 - -# Install TensorFlow with GPU support -RUN pip install tensorflow[and-cuda]>=2.11.0 - -# Install core TeraSim packages -RUN pip install -e packages/terasim && \ - pip install -e packages/terasim-nde-nade && \ - pip install -e packages/terasim-service && \ - pip install -e packages/terasim-envgen && \ - pip install -e packages/terasim-datazoo && \ - pip install -e packages/terasim-vis - -# Install terasim-cosmos with all dependencies -RUN pip install -e packages/terasim-cosmos - -# Install Waymo Open Dataset (optional dependency mentioned in README) -RUN pip install waymo-open-dataset-tf-2-11-0==1.6.1 - -# Install additional rendering and visualization libraries -RUN pip install \ - viser \ - open3d \ - pyglet \ - pyrender \ - trimesh[easy] - -# Install development dependencies -RUN pip install \ - pytest>=7.4.0 \ - pytest-cov>=4.1.0 \ - black>=23.7.0 \ - ruff>=0.1.0 \ - mypy>=1.5.1 \ - isort>=5.12.0 \ - ipython \ - jupyter - -# Build Cython extensions for NDE-NADE -RUN cd packages/terasim-nde-nade && \ - python setup.py build_ext --inplace && \ - cd ../.. - -# Create output directories -RUN mkdir -p outputs logs - -# Verify installation -RUN python3 -c "import terasim; print('✅ TeraSim core imported successfully')" && \ - python3 -c "import terasim_nde_nade; print('✅ TeraSim NDE-NADE imported successfully')" && \ - python3 -c "import terasim_service; print('✅ TeraSim Service imported successfully')" && \ - python3 -c "import terasim_vis; print('✅ TeraSim Visualization imported successfully')" - -# Verify terasim-cosmos imports (may show TensorFlow warnings, that's normal) -RUN python3 -c "import terasim_cosmos; print('✅ TeraSim Cosmos imported successfully')" - -# Verify GPU availability -RUN python3 -c "import torch; print(f'✅ PyTorch CUDA available: {torch.cuda.is_available()}')" && \ - python3 -c "import tensorflow as tf; print(f'✅ TensorFlow GPU devices: {len(tf.config.list_physical_devices(\"GPU\"))}')" - -# === Runtime Stage === -FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 - -ENV DEBIAN_FRONTEND=noninteractive - -# Install runtime dependencies only -RUN apt-get update && apt-get install -y \ - python3.10 \ - python3-pip \ - git \ - redis-server \ - libspatialindex-c6 \ - libgeos-c1v5 \ - libproj22 \ - libxml2 \ - libxslt1.1 \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender1 \ - libgomp1 \ - && rm -rf /var/lib/apt/lists/* - -# Set Python 3.10 as default -RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 \ - && update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 - -# Copy installed packages and SUMO from builder -COPY --from=builder /usr/local/lib/python3.10 /usr/local/lib/python3.10 -COPY --from=builder /usr/local/bin /usr/local/bin -COPY --from=builder /root/.terasim /root/.terasim -COPY --from=builder /app/TeraSim /app/TeraSim - -# Set working directory -WORKDIR /app/TeraSim - -# Set environment variables -ENV SUMO_HOME=/root/.terasim/deps/sumo -ENV PATH="${SUMO_HOME}/bin:${PATH}" -ENV PYTHONUNBUFFERED=1 - -# NVIDIA GPU environment variables -ENV NVIDIA_VISIBLE_DEVICES=all -ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics - -# Expose ports -# 8000: TeraSim FastAPI service -# 6379: Redis -# 8888: Jupyter Notebook (optional) -EXPOSE 8000 6379 8888 - -# Default command: start bash shell -CMD ["/bin/bash"] - -# Alternative entry points (uncomment as needed): -# Convert TeraSim to Cosmos-Drive format -# CMD ["python3", "packages/terasim-cosmos/terasim_cosmos/converter.py", "--path_to_config", "configs/converter/scenario.yaml"] - -# Start Jupyter Notebook for interactive development -# CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"] - -# Start TeraSim service -# CMD ["sh", "-c", "redis-server --daemonize yes && python3 run_service.py"] \ No newline at end of file diff --git a/packages/terasim-cosmos/README_DOCKER_GPU.md b/packages/terasim-cosmos/README_DOCKER_GPU.md deleted file mode 100644 index 34ceb8f..0000000 --- a/packages/terasim-cosmos/README_DOCKER_GPU.md +++ /dev/null @@ -1,378 +0,0 @@ -# TeraSim-Cosmos GPU Docker Guide - -This guide covers GPU-accelerated Docker deployment for TeraSim-Cosmos, enabling high-performance world model training and video generation with NVIDIA Cosmos-Drive integration. - -## Prerequisites - -### Hardware Requirements -- **NVIDIA GPU** with CUDA 11.8+ support (required for LiDAR rendering and ML inference) -- Minimum 16GB RAM (32GB recommended) -- 50GB+ free disk space - -### Software Requirements -- Docker Engine 19.03+ -- Docker Compose 1.28+ (with GPU support) -- NVIDIA Container Toolkit - -### Installing NVIDIA Container Toolkit - -#### Ubuntu/Debian -```bash -# Add NVIDIA package repositories -distribution=$(. /etc/os-release;echo $ID$VERSION_ID) -curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg -curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ - sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ - sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list - -# Install NVIDIA Container Toolkit -sudo apt-get update -sudo apt-get install -y nvidia-container-toolkit - -# Configure Docker to use NVIDIA runtime -sudo nvidia-ctk runtime configure --runtime=docker -sudo systemctl restart docker - -# Verify installation -docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi -``` - -#### Other Systems -See official guide: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html - ---- - -## Quick Start - -### Build and Run - -```bash -# Navigate to terasim-cosmos directory -cd packages/terasim-cosmos - -# Build the GPU-enabled image -docker-compose -f docker-compose.gpu.yml up -d --build - -# Enter the container -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos bash - -# Verify GPU is available -python -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}')" -python -c "import tensorflow as tf; print(f'GPU devices: {tf.config.list_physical_devices(\"GPU\")}')" -``` - -### Convert TeraSim Simulation to Cosmos-Drive Format - -```bash -# Inside the container -cd /app/TeraSim - -# Run conversion with street view retrieval -python packages/terasim-cosmos/terasim_cosmos/converter.py \ - --path_to_config configs/converter/scenario.yaml \ - --streetview_retrieval True -``` - ---- - -## Usage Examples - -### Example 1: Convert Simulation Output - -```python -from terasim_cosmos import TeraSimToCosmosConverter - -# Create converter from configuration -converter = TeraSimToCosmosConverter.from_config_file( - 'configs/converter/scenario.yaml' -) - -# Run conversion -converter.convert(streetview_retrieval=True) -``` - -### Example 2: Render HD Map Video - -```bash -# Inside container -python packages/terasim-cosmos/terasim_cosmos/render_from_rds_hq.py \ - --input_path outputs/scenario_001/wds \ - --output_path outputs/scenario_001/render \ - --camera_setting default -``` - -### Example 3: Visualize RDS-HQ Data - -```bash -# Start interactive 3D visualization -python packages/terasim-cosmos/terasim_cosmos/visualize_rds_hq.py \ - --data_path outputs/scenario_001/wds \ - --port 8080 -``` - ---- - -## Configuration - -### Configuration File Format - -Create a YAML configuration file (e.g., `configs/converter/my_scenario.yaml`): - -```yaml -# Paths -path_to_output: "outputs/my_scenario" -path_to_fcd: "outputs/simulation_run/fcd_all.xml" -path_to_map: "examples/maps/Mcity/map.net.xml" - -# Camera settings -camera_setting_name: "default" # Options: "default", "waymo" - -# Vehicle tracking -vehicle_id: null # Set to specific ID, or null for auto-detection from collisions - -# Time window -time_start: 460.0 # Start time in seconds -time_end: 464.0 # End time in seconds - -# Clipping distances -agent_clip_distance: 30.0 # Distance to include surrounding agents (meters) -map_clip_distance: 100.0 # Distance to include map elements (meters) -``` - -### Environment Variables - -Configure in `docker-compose.gpu.yml` or set manually: - -```bash -# GPU visibility -export NVIDIA_VISIBLE_DEVICES=all - -# TensorFlow GPU memory growth (prevents OOM errors) -export TF_FORCE_GPU_ALLOW_GROWTH=true - -# PyTorch CUDA settings -export CUDA_VISIBLE_DEVICES=0 # Use first GPU only -``` - ---- - -## Common Operations - -### Running Jupyter Notebook - -```bash -# Start Jupyter inside container -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos \ - jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root - -# Access at: http://localhost:8888 -``` - -### Batch Processing Multiple Scenarios - -```bash -# Create a batch processing script -cat > batch_convert.sh << 'EOF' -#!/bin/bash -for config in configs/converter/*.yaml; do - echo "Processing: $config" - python packages/terasim-cosmos/terasim_cosmos/converter.py \ - --path_to_config "$config" -done -EOF - -chmod +x batch_convert.sh -./batch_convert.sh -``` - -### Monitor GPU Usage - -```bash -# Watch GPU utilization in real-time -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos \ - watch -n 1 nvidia-smi - -# Or from host machine -watch -n 1 nvidia-smi -``` - ---- - -## Performance Optimization - -### GPU Memory Management - -```python -# For TensorFlow - enable memory growth -import tensorflow as tf -gpus = tf.config.list_physical_devices('GPU') -for gpu in gpus: - tf.config.experimental.set_memory_growth(gpu, True) - -# For PyTorch - clear cache periodically -import torch -torch.cuda.empty_cache() -``` - -### Parallel Processing - -```python -# Use Ray for parallel processing -import ray -from terasim_cosmos import TeraSimToCosmosConverter - -ray.init(num_gpus=1) - -@ray.remote(num_gpus=0.25) # Use 1/4 GPU per task -def convert_scenario(config_path): - converter = TeraSimToCosmosConverter.from_config_file(config_path) - converter.convert() - return config_path - -# Process multiple scenarios in parallel -futures = [convert_scenario.remote(f"configs/converter/scenario_{i}.yaml") - for i in range(4)] -results = ray.get(futures) -``` - ---- - -## Troubleshooting - -### GPU Not Detected - -```bash -# Check NVIDIA driver -nvidia-smi - -# Check Docker GPU support -docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi - -# Check container GPU access -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos nvidia-smi -``` - -### CUDA Out of Memory - -```bash -# Reduce batch size in your code -# Enable TensorFlow memory growth -export TF_FORCE_GPU_ALLOW_GROWTH=true - -# Or set explicit memory limit -export TF_GPU_MEMORY_FRACTION=0.8 # Use 80% of GPU memory -``` - -### Import Errors for waymo_open_dataset - -```bash -# Reinstall Waymo dataset package -docker-compose -f docker-compose.gpu.yml exec terasim-cosmos \ - pip install --force-reinstall waymo-open-dataset-tf-2-11-0==1.6.1 -``` - -### Slow Rendering Performance - -```bash -# Check if GPU is actually being used -python -c "import torch; torch.cuda.is_available() and print('GPU OK')" - -# Enable CUDA optimization -export CUDA_LAUNCH_BLOCKING=0 -export TORCH_CUDNN_V8_API_ENABLED=1 -``` - ---- - -## Output Structure - -After conversion, your output directory will contain: - -``` -outputs/my_scenario/ -├── wds/ # WebDataset format (Cosmos-Drive compatible) -│ ├── 000000.tar # Compressed data shards -│ ├── 000001.tar -│ └── ... -├── render/ # Rendered visualizations -│ └── vehicle_001/ -│ ├── hdmap/ # HD map renderings -│ │ ├── frame_0000.png -│ │ ├── frame_0001.png -│ │ └── video.mp4 -│ └── lidar/ # LiDAR visualizations -│ ├── frame_0000.png -│ └── video.mp4 -├── streetview/ # Retrieved street view images -│ ├── location_001.jpg -│ └── descriptions.json -└── monitor.json # Collision/event records -``` - ---- - -## Integration with NVIDIA Cosmos-Drive - -The output from TeraSim-Cosmos is directly compatible with NVIDIA Cosmos-Drive platform: - -```bash -# Export WebDataset for Cosmos-Drive training -cosmos-drive-train \ - --data_path outputs/my_scenario/wds \ - --output_path models/world_model \ - --config cosmos_config.yaml - -# Generate videos using trained model -cosmos-drive-generate \ - --model_path models/world_model \ - --prompt_path outputs/my_scenario/wds/000000.tar \ - --output_path generated_videos/ -``` - -See [NVIDIA Cosmos-Drive documentation](https://developer.nvidia.com/cosmos) for details. - ---- - -## Differences from Base Dockerfile - -| Feature | Base Dockerfile | GPU Dockerfile | -|---------|----------------|----------------| -| Base Image | Ubuntu 22.04 | NVIDIA CUDA 11.8 + cuDNN 8 | -| PyTorch | CPU-only | CUDA 11.8 | -| TensorFlow | CPU-only | GPU-enabled | -| GPU Libraries | ❌ | ✅ (CUDA, cuDNN, NCCL) | -| Waymo Dataset | ❌ | ✅ | -| Rendering | Software | GPU-accelerated | -| Image Size | ~3-4 GB | ~8-10 GB | -| terasim-cosmos | ⚠️ Limited | ✅ Full support | - ---- - -## Resource Requirements - -### Minimum Configuration -- GPU: NVIDIA GTX 1080 or equivalent (8GB VRAM) -- RAM: 16GB -- Disk: 50GB -- CPU: 4 cores - -### Recommended Configuration -- GPU: NVIDIA RTX 3090 or A100 (24GB+ VRAM) -- RAM: 32GB -- Disk: 100GB SSD -- CPU: 8+ cores - ---- - -## Additional Resources - -- **TeraSim-Cosmos Package**: See [README.md](README.md) -- **NVIDIA Cosmos-Drive**: https://developer.nvidia.com/cosmos -- **Waymo Open Dataset**: https://waymo.com/open/ -- **TeraSim Main Documentation**: [../../README.md](../../README.md) - ---- - -## License - -This Docker configuration follows the licensing of TeraSim-Cosmos package. See [../../LICENSE](../../LICENSE) for details. \ No newline at end of file diff --git a/packages/terasim-cosmos/docker-compose.gpu.yml b/packages/terasim-cosmos/docker-compose.gpu.yml deleted file mode 100644 index 936ef4c..0000000 --- a/packages/terasim-cosmos/docker-compose.gpu.yml +++ /dev/null @@ -1,56 +0,0 @@ -version: '3.8' - -services: - terasim-cosmos: - build: - context: ../../ # Build from TeraSim root - dockerfile: packages/terasim-cosmos/Dockerfile.gpu - image: terasim-cosmos:gpu - container_name: terasim-cosmos-gpu - working_dir: /app/TeraSim - ports: - - "8000:8000" # TeraSim FastAPI service - - "6379:6379" # Redis - - "8888:8888" # Jupyter Notebook (optional) - volumes: - # Mount outputs and logs to host for persistence - - ../../outputs:/app/TeraSim/outputs - - ../../logs:/app/TeraSim/logs - # Mount converter configs - - ../../configs:/app/TeraSim/configs - # Optional: mount source for development - # - ../../packages/terasim-cosmos:/app/TeraSim/packages/terasim-cosmos - environment: - - SUMO_HOME=/root/.terasim/deps/sumo - - PYTHONUNBUFFERED=1 - - NVIDIA_VISIBLE_DEVICES=all - - NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics - # TensorFlow GPU configuration - - TF_FORCE_GPU_ALLOW_GROWTH=true - - TF_GPU_THREAD_MODE=gpu_private - # Start Redis and keep container running - command: sh -c "redis-server --daemonize yes && /bin/bash" - stdin_open: true - tty: true - - # NVIDIA GPU support - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] - cpus: '4' - memory: 16G - limits: - cpus: '8' - memory: 32G - -# Alternative configuration without Docker Compose deploy (for older Docker versions) -# Use this if the above doesn't work: -# -# services: -# terasim-cosmos: -# runtime: nvidia -# # ... rest of the configuration ... \ No newline at end of file diff --git a/packages/terasim-cosmos/pyproject.toml b/packages/terasim-cosmos/pyproject.toml deleted file mode 100644 index ea3947c..0000000 --- a/packages/terasim-cosmos/pyproject.toml +++ /dev/null @@ -1,48 +0,0 @@ -[project] -name = "terasim-cosmos" -version = "0.1.0" -description = "TeraSim to Cosmos-Drive bridge package for world model training and video generation" -authors = [ - {name = "TeraSim Team", email = "jiawe@umich.edu"}, -] -readme = "README.md" -requires-python = ">=3.10,<3.13" -dependencies = [ - "scipy", - "pyyaml", - "tensorflow>=2.11.0", - "opencv-python-headless", - "pyproj", - "webdataset", - "imageio", - "imageio-ffmpeg", - "decord", - "trimesh", - "termcolor", - "tqdm", - "click", - "pandas", - "torch", - "transformers", - "sumolib", - "python-dotenv", - "openai", - "requests", - "ray" -] - -[project.optional-dependencies] -dev = [ - "pytest>=7.4.0", - "pytest-cov>=4.1.0", - "black>=23.7.0", - "ruff>=0.1.0", - "mypy>=1.5.1" -] - -[build-system] -requires = ["setuptools>=68", "wheel"] -build-backend = "setuptools.build_meta" - -[tool.setuptools.packages.find] -include = ["terasim_cosmos*"] \ No newline at end of file diff --git a/packages/terasim-cosmos/terasim_cosmos/__init__.py b/packages/terasim-cosmos/terasim_cosmos/__init__.py deleted file mode 100644 index f40779d..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -TeraSim-Cosmos Package - -A bridge package that converts TeraSim traffic simulation data (SUMO map and FCD) -into NVIDIA Cosmos-Drive compatible inputs for world model training and video generation. -""" - -from .converter import TeraSimToCosmosConverter -from .street_view_analysis import StreetViewRetrievalAndAnalysis - -__version__ = "0.1.0" -__all__ = ["TeraSimToCosmosConverter", "StreetViewRetrievalAndAnalysis"] \ No newline at end of file diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/ftheta.pdf b/packages/terasim-cosmos/terasim_cosmos/assets/ftheta.pdf deleted file mode 100644 index 288f93f..0000000 Binary files a/packages/terasim-cosmos/terasim_cosmos/assets/ftheta.pdf and /dev/null differ diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_multi_view_template.sh b/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_multi_view_template.sh deleted file mode 100644 index d597a03..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_multi_view_template.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -eval "$(conda shell.bash hook)" -conda activate cosmos-transfer1 - -export PROMPT="{prompt}" -export CUDA_VISIBLE_DEVICES="${{CUDA_VISIBLE_DEVICES:=0}}" -export CHECKPOINT_DIR="${{CHECKPOINT_DIR:=/scratch/mcity_project_root/mcity_project/jiawe/cosmos-transfer1-0624/checkpoints}}" -export NUM_GPUS=1 -PYTHONPATH=$(pwd) torchrun --nproc_per_node=${{NUM_GPUS}} cosmos_transfer1/diffusion/inference/transfer_multiview.py \ - --seed 1996 \ - --checkpoint_dir $CHECKPOINT_DIR \ - --video_save_name {video_name} \ - --video_save_folder {video_folder} \ - --offload_text_encoder_model \ - --guidance 3 \ - --controlnet_specs {controlnet_spec} \ - --num_gpus ${{NUM_GPUS}} \ - --num_steps 30 \ - --view_condition_video {view_condition_video} \ - --prompt "$PROMPT" \ No newline at end of file diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_single_view_template.sh b/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_single_view_template.sh deleted file mode 100644 index e67263a..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/assets/run_hdmap_single_view_template.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -eval "$(conda shell.bash hook)" -conda activate cosmos-transfer1 - -export PROMPT="{prompt}" -export CUDA_VISIBLE_DEVICES=0 -export RANK=0 -export CHECKPOINT_DIR="${{CHECKPOINT_DIR:=/scratch/mcity_project_root/mcity_project/jiawe/cosmos-transfer1-0624/checkpoints}}" -PYTHONPATH=$(pwd) python cosmos_transfer1/diffusion/inference/transfer.py \ - --seed 1996 \ - --checkpoint_dir $CHECKPOINT_DIR \ - --video_save_name {video_name} \ - --video_save_folder {video_folder} \ - --prompt "$PROMPT" \ - --sigma_max 80 \ - --offload_text_encoder_model --is_av_sample \ - --controlnet_specs {controlnet_spec} diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_multi_view_template.slurm b/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_multi_view_template.slurm deleted file mode 100644 index 7df4b9c..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_multi_view_template.slurm +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -#SBATCH --job-name=cosmos_multi_view -#SBATCH --account=mcity_project -#SBATCH --partition=mcity_project -#SBATCH --time=0-01:00:00 # The format is Day-Hour:Minitue:Second -#SBATCH --nodes=1 -#SBATCH --cpus-per-task=2 -#SBATCH --tasks-per-node=1 -#SBATCH --gpus-per-node=h100:1 # e.g. h100:1 or l40s:2 -#SBATCH --mem=128GB # e.g.128GB -#SBATCH --mail-type=END,FAIL -#SBATCH --output=/home/jiawe/jobs/logs/cosmos-%x-%j.log -#SBATCH --error=/home/jiawe/jobs/logs/cosmos-%x-%j.err - -source /home/jiawe/anaconda3/etc/profile.d/conda.sh -conda activate cosmos-transfer1 -cd /home/jiawe/cosmos-transfer1 -bash {script_path} diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_single_view_template.slurm b/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_single_view_template.slurm deleted file mode 100644 index ac1d5af..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/assets/slurm_cosmos_single_view_template.slurm +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -#SBATCH --job-name=cosmos_single_view -#SBATCH --account=mcity_project -#SBATCH --partition=mcity_project -#SBATCH --time=0-01:00:00 # The format is Day-Hour:Minitue:Second -#SBATCH --nodes=1 -#SBATCH --cpus-per-task=2 -#SBATCH --tasks-per-node=1 -#SBATCH --gpus-per-node=h100:1 # e.g. h100:1 or l40s:2 -#SBATCH --mem=128GB # e.g.128GB -#SBATCH --mail-type=END,FAIL -#SBATCH --output=/home/jiawe/jobs/logs/cosmos-%x-%j.log -#SBATCH --error=/home/jiawe/jobs/logs/cosmos-%x-%j.err - -source /home/jiawe/anaconda3/etc/profile.d/conda.sh -conda activate cosmos-transfer1 -cd /home/jiawe/cosmos-transfer1 -bash {script_path} diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/waymo_caption.csv b/packages/terasim-cosmos/terasim_cosmos/assets/waymo_caption.csv deleted file mode 100644 index 8d16c9c..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/assets/waymo_caption.csv +++ /dev/null @@ -1,2 +0,0 @@ -16153607877566142572_2262_000_2282_000,1105338229944737854_1280_000_1300_000,7344536712079322768_1360_000_1380_000,6814918034011049245_134_170_154_170,13238419657658219864_4630_850_4650_850,12511696717465549299_4209_630_4229_630,14244512075981557183_1226_840_1246_840,1022527355599519580_4866_960_4886_960,15948509588157321530_7187_290_7207_290,13909033332341079321_4007_930_4027_930,6707256092020422936_2352_392_2372_392,16676202516797441395_2460_000_2480_000,17342274091983078806_80_000_100_000,12212767626682531382_2100_150_2120_150,5200186706748209867_80_000_100_000,18111897798871103675_320_000_340_000,11017034898130016754_697_830_717_830,9334364225104959137_661_000_681_000,13944915979337652825_4260_668_4280_668,1943605865180232897_680_000_700_000,2330686858362435307_603_210_623_210,14183710428479823719_3140_000_3160_000,5871373218498789285_3360_000_3380_000,12856053589272984699_1020_000_1040_000,9529958888589376527_640_000_660_000,1939881723297238689_6848_040_6868_040,15611747084548773814_3740_000_3760_000,11076364019363412893_1711_000_1731_000,5861181219697109969_1732_000_1752_000,13254498462985394788_980_000_1000_000,16578409328451172992_3780_000_3800_000,169115044301335945_480_000_500_000,17860546506509760757_6040_000_6060_000,14348136031422182645_3360_000_3380_000,9653249092275997647_980_000_1000_000,13336883034283882790_7100_000_7120_000,15696964848687303249_4615_200_4635_200,5423607012724948145_3900_000_3920_000,17818548625922145895_1372_430_1392_430,16485056021060230344_1576_741_1596_741,6128311556082453976_2520_000_2540_000,1024360143612057520_3580_000_3600_000,9265793588137545201_2981_960_3001_960,14358192009676582448_3396_400_3416_400,7324192826315818756_620_000_640_000,16651261238721788858_2365_000_2385_000,3635081602482786801_900_000_920_000,7543690094688232666_4945_350_4965_350,5572351910320677279_3980_000_4000_000,10082223140073588526_6140_000_6160_000,2367305900055174138_1881_827_1901_827,2323851946122476774_7240_000_7260_000,13271285919570645382_5320_000_5340_000,12012663867578114640_820_000_840_000,13807633218762107566_6625_000_6645_000,7007702792982559244_4400_000_4420_000,13679757109245957439_4167_170_4187_170,3270384983482134275_3220_000_3240_000,12200383401366682847_2552_140_2572_140,5289247502039512990_2640_000_2660_000,5189543236187113739_2929_000_2949_000,8822503619482926605_1080_000_1100_000,550171902340535682_2640_000_2660_000,2581599794006798586_2440_000_2460_000,8099457465580871094_4764_380_4784_380,16238753252899859750_1340_000_1360_000,17539775446039009812_440_000_460_000,14276116893664145886_1785_080_1805_080,9058545212382992974_5236_200_5256_200,1800857743596232165_1500_000_1520_000,2273990870973289942_4009_680_4029_680,17356174167372765800_1720_000_1740_000,11486225968269855324_92_000_112_000,4167304237516228486_5720_000_5740_000,12358364923781697038_2232_990_2252_990,7089765864827567005_1020_000_1040_000,15832924468527961_1564_160_1584_160,3698685523057788592_4303_630_4323_630,3385534893506316900_4252_000_4272_000,7885161619764516373_289_280_309_280,16093022852977039323_2981_100_3001_100,18141076662151909970_2755_710_2775_710,4191035366928259953_1732_708_1752_708,13984577671034960830_4545_000_4565_000,10927752430968246422_4940_000_4960_000,6606076833441976341_1340_000_1360_000,11343624116265195592_5910_530_5930_530,2684088316387726629_180_000_200_000,1863454917318776530_1040_000_1060_000,4324227028219935045_1520_000_1540_000,14098575914252965554_511_000_531_000,12988666890418932775_5516_730_5536_730,14810689888487451189_720_000_740_000,3031519073799366723_1140_000_1160_000,7373597180370847864_6020_000_6040_000,13823509240483976870_1514_190_1534_190,6038200663843287458_283_000_303_000,7517545172000568481_2325_000_2345_000,6390847454531723238_6000_000_6020_000,10837554759555844344_6525_000_6545_000,13941626351027979229_3363_930_3383_930,18311996733670569136_5880_000_5900_000,4747171543583769736_425_544_445_544,11566385337103696871_5740_000_5760_000,10526338824408452410_5714_660_5734_660,10096619443888687526_2820_000_2840_000,13207915841618107559_2980_000_3000_000,15096340672898807711_3765_000_3785_000,8543158371164842559_4131_530_4151_530,6935841224766931310_2770_310_2790_310,17270469718624587995_5202_030_5222_030,17364342162691622478_780_000_800_000,16208935658045135756_4412_730_4432_730,2598465433001774398_740_670_760_670,14073578965827700743_1564_000_1584_000,5835049423600303130_180_000_200_000,17792522237954398691_2698_000_2718_000,3156155872654629090_2474_780_2494_780,9123867659877264673_3569_950_3589_950,12304907743194762419_1522_000_1542_000,2094681306939952000_2972_300_2992_300,7940496892864900543_4783_540_4803_540,8222208340265444449_1400_000_1420_000,16042886962142359737_1060_000_1080_000,7290499689576448085_3960_000_3980_000,15844593126368860820_3260_000_3280_000,8399876466981146110_2560_000_2580_000,10975280749486260148_940_000_960_000,6142170920525844857_2080_000_2100_000,4164064449185492261_400_000_420_000,5526948896847934178_1039_000_1059_000,11355519273066561009_5323_000_5343_000,3224923476345749285_4480_000_4500_000,8302000153252334863_6020_000_6040_000,8763126149209091146_1843_320_1863_320,1758724094753801109_1251_037_1271_037,5870668058140631588_1180_000_1200_000,1083056852838271990_4080_000_4100_000,7187601925763611197_4384_300_4404_300,15349503153813328111_2160_000_2180_000,5005815668926224220_2194_330_2214_330,473735159277431842_630_095_650_095,13085453465864374565_2040_000_2060_000,9415086857375798767_4760_000_4780_000,12896629105712361308_4520_000_4540_000,17647858901077503501_1500_000_1520_000,1891390218766838725_4980_000_5000_000,10770759614217273359_1465_000_1485_000,204421859195625800_1080_000_1100_000,11183906854663518829_2294_000_2314_000,17677899007099302421_5911_000_5931_000,2590213596097851051_460_000_480_000,11928449532664718059_1200_000_1220_000,2224716024428969146_1420_000_1440_000,8745106945249251942_1207_000_1227_000,7440437175443450101_94_000_114_000,8659567063494726263_2480_000_2500_000,16473613811052081539_1060_000_1080_000,15628918650068847391_8077_670_8097_670,12505030131868863688_1740_000_1760_000,16646360389507147817_3320_000_3340_000,809159138284604331_3355_840_3375_840,18024188333634186656_1566_600_1586_600,12974838039736660070_4586_990_4606_990,3591015878717398163_1381_280_1401_280,13181198025433053194_2620_770_2640_770,2919021496271356282_2300_000_2320_000,13517115297021862252_2680_000_2700_000,9179922063516210200_157_000_177_000,10485926982439064520_4980_000_5000_000,5144634012371033641_920_000_940_000,6813611334239274394_535_000_555_000,913274067754539885_913_000_933_000,4423389401016162461_4235_900_4255_900,17386176497741125938_2180_000_2200_000,13840133134545942567_1060_000_1080_000,10023947602400723454_1120_000_1140_000,3617043125954612277_240_000_260_000,13519445614718437933_4060_000_4080_000,6148393791213790916_4960_000_4980_000,3363533094480067586_1580_000_1600_000,16979882728032305374_2719_000_2739_000,3132641021038352938_1937_160_1957_160,14624061243736004421_1840_000_1860_000,4672649953433758614_2700_000_2720_000,14076089808269682731_54_730_74_730,1005081002024129653_5313_150_5333_150,17601040886987343289_472_000_492_000,3002379261592154728_2256_691_2276_691,16873108320324977627_780_000_800_000,4575389405178805994_4900_000_4920_000,9654060644653474834_3905_000_3925_000,12281202743097872109_3387_370_3407_370,5525943706123287091_4100_000_4120_000,8811210064692949185_3066_770_3086_770,3132521568089292927_2220_000_2240_000,5718418936283106890_1200_000_1220_000,6172160122069514875_6866_560_6886_560,9175749307679169289_5933_260_5953_260,15308653868652290306_460_000_480_000,3651243243762122041_3920_000_3940_000,514687114615102902_6240_000_6260_000,3060057659029579482_420_000_440_000,1926967104529174124_5214_780_5234_780,175830748773502782_1580_000_1600_000,16767575238225610271_5185_000_5205_000,2922309829144504838_1840_000_1860_000,2265177645248606981_2340_000_2360_000,7999729608823422351_1483_600_1503_600,4114454788208078028_660_000_680_000,7466751345307077932_585_000_605_000,14388269713149187289_1994_280_2014_280,3577352947946244999_3980_000_4000_000,384975055665199088_4480_000_4500_000,15533468984793020049_800_000_820_000,1988987616835805847_3500_000_3520_000,2711351338963414257_1360_000_1380_000,2961247865039433386_920_000_940_000,14143054494855609923_4529_100_4549_100,14777753086917826209_4147_000_4167_000,8633296376655504176_514_000_534_000,15482064737890453610_5180_000_5200_000,11119453952284076633_1369_940_1389_940,8327447186504415549_5200_000_5220_000,9325580606626376787_4509_140_4529_140,12940710315541930162_2660_000_2680_000,12174529769287588121_3848_440_3868_440,17962792089966876718_2210_933_2230_933,17763730878219536361_3144_635_3164_635,1994338527906508494_3438_100_3458_100,13573359675885893802_1985_970_2005_970,9465500459680839281_1100_000_1120_000,7988627150403732100_1487_540_1507_540,3584210979358667442_2880_000_2900_000,6242822583398487496_73_000_93_000,7101099554331311287_5320_000_5340_000,15795616688853411272_1245_000_1265_000,12900898236728415654_1906_686_1926_686,10247954040621004675_2180_000_2200_000,12303641360375776820_4378_000_4398_000,5065468048522043429_2080_000_2100_000,2259324582958830057_3767_030_3787_030,1255991971750044803_1700_000_1720_000,17759280403078053118_6060_580_6080_580,5592790652933523081_667_770_687_770,4114548607314119333_2780_000_2800_000,14766384747691229841_6315_730_6335_730,2895681525868621979_480_000_500_000,11406166561185637285_1753_750_1773_750,89454214745557131_3160_000_3180_000,10750135302241325253_180_000_200_000,9472420603764812147_850_000_870_000,5446766520699850364_157_000_177_000,12102100359426069856_3931_470_3951_470,6674547510992884047_1560_000_1580_000,16102220208346880_1420_000_1440_000,12257951615341726923_2196_690_2216_690,12473470522729755785_4000_000_4020_000,6456165750159303330_1770_080_1790_080,2834723872140855871_1615_000_1635_000,7313718849795510302_280_000_300_000,10231929575853664160_1160_000_1180_000,14964131310266936779_3292_850_3312_850,15646511153936256674_1620_000_1640_000,1405149198253600237_160_000_180_000,10094743350625019937_3420_000_3440_000,967082162553397800_5102_900_5122_900,1773696223367475365_1060_000_1080_000,972142630887801133_642_740_662_740,15959580576639476066_5087_580_5107_580,912496333665446669_1680_000_1700_000,14739149465358076158_4740_000_4760_000,11847506886204460250_1640_000_1660_000,6561206763751799279_2348_600_2368_600,10498013744573185290_1240_000_1260_000,12956664801249730713_2840_000_2860_000,4490196167747784364_616_569_636_569,3375636961848927657_1942_000_1962_000,10596949720463106554_1933_530_1953_530,3731719923709458059_1540_000_1560_000,17993467596234560701_4940_000_4960_000,15342828002152531464_1543_000_1563_000,2342300897175196823_1179_360_1199_360,574762194520856849_1660_000_1680_000,10689101165701914459_2072_300_2092_300,11616035176233595745_3548_820_3568_820,3927294516406132977_792_740_812_740,10599748131695282446_1380_000_1400_000,9568394837328971633_466_365_486_365,580580436928611523_792_500_812_500,15125792363972595336_4960_000_4980_000,200287570390499785_2102_000_2122_000,6386303598440879824_1520_000_1540_000,11718898130355901268_2300_000_2320_000,12374656037744638388_1412_711_1432_711,11219370372259322863_5320_000_5340_000,16331619444570993520_1020_000_1040_000,18025338595059503802_571_216_591_216,16435050660165962165_3635_310_3655_310,11454085070345530663_1905_000_1925_000,15857303257471811288_1840_000_1860_000,15445436653637630344_3957_561_3977_561,14705303724557273004_3105_000_3125_000,5083516879091912247_3600_000_3620_000,16793466851577046940_2800_000_2820_000,3390120876390766963_2300_000_2320_000,14424804287031718399_1281_030_1301_030,6680764940003341232_2260_000_2280_000,3441838785578020259_1300_000_1320_000,10448102132863604198_472_000_492_000,16202688197024602345_3818_820_3838_820,16372013171456210875_5631_040_5651_040,6290334089075942139_1340_000_1360_000,14081240615915270380_4399_000_4419_000,15396462829361334065_4265_000_4285_000,2656110181316327570_940_000_960_000,17874036087982478403_733_674_753_674,5268267801500934740_2160_000_2180_000,18305329035161925340_4466_730_4486_730,16751706457322889693_4475_240_4495_240,4916527289027259239_5180_000_5200_000,14964691552976940738_2219_229_2239_229,8700094808505895018_7272_488_7292_488,1857377326903987736_80_000_100_000,2899357195020129288_3723_163_3743_163,12306251798468767010_560_000_580_000,9985243312780923024_3049_720_3069_720,16087604685956889409_40_000_60_000,12844373518178303651_2140_000_2160_000,10289507859301986274_4200_000_4220_000,4960194482476803293_4575_960_4595_960,5458962501360340931_3140_000_3160_000,16121633832852116614_240_000_260_000,9547911055204230158_1567_950_1587_950,10275144660749673822_5755_561_5775_561,9443948810903981522_6538_870_6558_870,4058410353286511411_3980_000_4000_000,3154510051521049916_7000_000_7020_000,7038362761309539946_4207_130_4227_130,14931160836268555821_5778_870_5798_870,2107164705125601090_3920_000_3940_000,12161824480686739258_1813_380_1833_380,8454755173123314088_3202_000_3222_000,10455472356147194054_1560_000_1580_000,11236550977973464715_3620_000_3640_000,17612470202990834368_2800_000_2820_000,14106113060128637865_1200_000_1220_000,4017824591066644473_3000_000_3020_000,7861168750216313148_1305_290_1325_290,1473681173028010305_1780_000_1800_000,3039251927598134881_1240_610_1260_610,4468278022208380281_455_820_475_820,15882343134097151256_4820_000_4840_000,1505698981571943321_1186_773_1206_773,1907783283319966632_3221_000_3241_000,3919438171935923501_280_000_300_000,5121298817582693383_4882_000_4902_000,2791302832590946720_1900_000_1920_000,4426410228514970291_1620_000_1640_000,8859409804103625626_2760_000_2780_000,3112630089558008159_7280_000_7300_000,14233522945839943589_100_000_120_000,13622747960068272448_1678_930_1698_930,4808842546020773462_2310_000_2330_000,11199484219241918646_2810_030_2830_030,2975249314261309142_6540_000_6560_000,902001779062034993_2880_000_2900_000,1331771191699435763_440_000_460_000,6229371035421550389_2220_000_2240_000,10359308928573410754_720_000_740_000,3966447614090524826_320_000_340_000,14619874262915043759_2801_090_2821_090,6722602826685649765_2280_000_2300_000,11588853832866011756_2184_462_2204_462,16801666784196221098_2480_000_2500_000,8845277173853189216_3828_530_3848_530,183829460855609442_430_000_450_000,14561791273891593514_2558_030_2578_030,11004685739714500220_2300_000_2320_000,2400780041057579262_660_000_680_000,18331713844982117868_2920_900_2940_900,3928923269768424494_3060_000_3080_000,5451442719480728410_5660_000_5680_000,16341778301681295961_178_800_198_800,10212406498497081993_5300_000_5320_000,17295069199227237940_3160_000_3180_000,12581809607914381746_1219_547_1239_547,9758342966297863572_875_230_895_230,57132587708734824_1020_000_1040_000,5072733804607719382_5807_570_5827_570,1051897962568538022_238_170_258_170,14133920963894906769_1480_000_1500_000,7890808800227629086_6162_700_6182_700,3195159706851203049_2763_790_2783_790,2336233899565126347_1180_000_1200_000,13667377240304615855_500_000_520_000,7768517933263896280_1120_000_1140_000,11450298750351730790_1431_750_1451_750,17752423643206316420_920_850_940_850,12879640240483815315_5852_605_5872_605,5349843997395815699_1040_000_1060_000,1071392229495085036_1844_790_1864_790,11434627589960744626_4829_660_4849_660,8506432817378693815_4860_000_4880_000,3077229433993844199_1080_000_1100_000,7921369793217703814_1060_000_1080_000,8907419590259234067_1960_000_1980_000,2555987917096562599_1620_000_1640_000,3988957004231180266_5566_500_5586_500,10868756386479184868_3000_000_3020_000,17941839888833418904_1240_000_1260_000,18397511418934954408_620_000_640_000,3015436519694987712_1300_000_1320_000,16676683078119047936_300_000_320_000,8796914080594559459_4284_170_4304_170,272435602399417322_2884_130_2904_130,10963653239323173269_1924_000_1944_000,11967272535264406807_580_000_600_000,14300007604205869133_1160_000_1180_000,6433401807220119698_4560_000_4580_000,5373876050695013404_3817_170_3837_170,7799671367768576481_260_000_280_000,7239123081683545077_4044_370_4064_370,8398516118967750070_3958_000_3978_000,4295449061847708198_3769_000_3789_000,933621182106051783_4160_000_4180_000,3425716115468765803_977_756_997_756,10664823084372323928_4360_000_4380_000,30779396576054160_1880_000_1900_000,16608525782988721413_100_000_120_000,191862526745161106_1400_000_1420_000,14830022845193837364_3488_060_3508_060,15374821596407640257_3388_480_3408_480,16345319168590318167_1420_000_1440_000,141184560845819621_10582_560_10602_560,10584247114982259878_490_000_510_000,15488266120477489949_3162_920_3182_920,17791493328130181905_1480_000_1500_000,10734565072045778791_440_000_460_000,11392401368700458296_1086_429_1106_429,4447423683538547117_536_022_556_022,7643597152739318064_3979_000_3999_000,4305539677513798673_2200_000_2220_000,14127943473592757944_2068_000_2088_000,17244566492658384963_2540_000_2560_000,14262448332225315249_1280_000_1300_000,12566399510596872945_2078_320_2098_320,17564868480517233150_3643_000_3663_000,17159836069183024120_640_000_660_000,11925224148023145510_1040_000_1060_000,16951470340360921766_2840_000_2860_000,14752341928540512649_4960_000_4980_000,15221704733958986648_1400_000_1420_000,759208896257112298_184_000_204_000,9015546800913584551_4431_180_4451_180,6350707596465488265_2393_900_2413_900,4604173119409817302_2820_000_2840_000,1464917900451858484_1960_000_1980_000,15942468615931009553_1243_190_1263_190,3220249619779692045_505_000_525_000,9820553434532681355_2820_000_2840_000,3911646355261329044_580_000_600_000,4931036732523207946_10755_600_10775_600,1265122081809781363_2879_530_2899_530,9385013624094020582_2547_650_2567_650,1191788760630624072_3880_000_3900_000,14486517341017504003_3406_349_3426_349,16735938448970076374_1126_430_1146_430,6193696614129429757_2420_000_2440_000,1457696187335927618_595_027_615_027,10588771936253546636_2300_000_2320_000,7331965392247645851_1005_940_1025_940,2088865281951278665_4460_000_4480_000,3555170065073130842_451_000_471_000,14742731916935095621_1325_000_1345_000,1906113358876584689_1359_560_1379_560,3068522656378006650_540_000_560_000,17216329305659006368_4800_000_4820_000,17388121177218499911_2520_000_2540_000,14369250836076988112_7249_040_7269_040,4733704239941053266_960_000_980_000,14811410906788672189_373_113_393_113,13390791323468600062_6718_570_6738_570,14824622621331930560_2395_420_2415_420,4986495627634617319_2980_000_3000_000,10923963890428322967_1445_000_1465_000,9231652062943496183_1740_000_1760_000,2618605158242502527_1860_000_1880_000,268278198029493143_1400_000_1420_000,2899997824484054994_320_000_340_000,2607999228439188545_2960_000_2980_000,16204463896543764114_5340_000_5360_000,7000927478052605119_1052_330_1072_330,1737018592744049492_1960_000_1980_000,5847910688643719375_180_000_200_000,8079607115087394458_1240_000_1260_000,15539619898625779290_760_000_780_000,6771783338734577946_6105_840_6125_840,7119831293178745002_1094_720_1114_720,15803855782190483017_1060_000_1080_000,2025831330434849594_1520_000_1540_000,5574146396199253121_6759_360_6779_360,12894036666871194216_787_000_807_000,15717839202171538526_1124_920_1144_920,15868625208244306149_4340_000_4360_000,14663356589561275673_935_195_955_195,9024872035982010942_2578_810_2598_810,15367782110311024266_2103_310_2123_310,15379350264706417068_3120_000_3140_000,13078892192456386060_2960_000_2980_000,8938046348067069210_3800_000_3820_000,15903544160717261009_3961_870_3981_870,10226164909075980558_180_000_200_000,14503113925613619599_975_506_995_506,2547899409721197155_1380_000_1400_000,10241508783381919015_2889_360_2909_360,8722413665055769182_2840_000_2860_000,634378055350569306_280_000_300_000,11252086830380107152_1540_000_1560_000,12496433400137459534_120_000_140_000,16625429321676352815_1543_860_1563_860,4348478035380346090_1000_000_1020_000,9062286840846668802_31_000_51_000,5328596138024684667_2180_000_2200_000,857746300435138193_1869_000_1889_000,7554208726220851641_380_000_400_000,5576800480528461086_1000_000_1020_000,6742105013468660925_3645_000_3665_000,15834329472172048691_2956_760_2976_760,8148053503558757176_4240_000_4260_000,14956919859981065721_1759_980_1779_980,14193044537086402364_534_000_554_000,6763005717101083473_3880_000_3900_000,5076950993715916459_3265_000_3285_000,13694146168933185611_800_000_820_000,14333744981238305769_5658_260_5678_260,3078075798413050298_890_370_910_370,11918003324473417938_1400_000_1420_000,11113047206980595400_2560_000_2580_000,5127440443725457056_2921_340_2941_340,7670103006580549715_360_000_380_000,14791260641858988448_1018_000_1038_000,6694593639447385226_1040_000_1060_000,12979718722917614085_1039_490_1059_490,3126522626440597519_806_440_826_440,8956556778987472864_3404_790_3424_790,4409585400955983988_3500_470_3520_470,7120839653809570957_1060_000_1080_000,4784689467343773295_1700_000_1720_000,8603916601243187272_540_000_560_000,18295766828140813622_6775_000_6795_000,6771922013310347577_4249_290_4269_290,13982731384839979987_1680_000_1700_000,2206505463279484253_476_189_496_189,9350921499281634194_2403_251_2423_251,3194871563717679715_4980_000_5000_000,9579041874842301407_1300_000_1320_000,2570264768774616538_860_000_880_000,1887497421568128425_94_000_114_000,17750787536486427868_560_000_580_000,2692887320656885771_2480_000_2500_000,4392459808686681511_5006_200_5026_200,13476374534576730229_240_000_260_000,271338158136329280_2541_070_2561_070,9521653920958139982_940_000_960_000,10072140764565668044_4060_000_4080_000,7850521592343484282_4576_090_4596_090,17135518413411879545_1480_000_1500_000,6177474146670383260_4200_000_4220_000,8424573439186068308_3460_000_3480_000,13862220583747475906_1260_000_1280_000,2064489349728221803_3060_000_3080_000,16911037681440249335_700_000_720_000,8888517708810165484_1549_770_1569_770,17790754307864212354_1520_000_1540_000,16042842363202855955_265_000_285_000,12866817684252793621_480_000_500_000,1442753028323350651_4065_000_4085_000,4246537812751004276_1560_000_1580_000,13356997604177841771_3360_000_3380_000,4764167778917495793_860_000_880_000,6904827860701329567_960_000_980_000,12820461091157089924_5202_916_5222_916,3461228720457810721_4511_120_4531_120,16105359875195888139_4420_000_4440_000,10676267326664322837_311_180_331_180,10444454289801298640_4360_000_4380_000,8494653877777333091_540_000_560_000,5832416115092350434_60_000_80_000,15903184480576180688_3160_000_3180_000,2209007584159204953_2200_000_2220_000,12208410199966712301_4480_000_4500_000,14165166478774180053_1786_000_1806_000,1432918953215186312_5101_320_5121_320,7761658966964621355_1000_000_1020_000,207754730878135627_1140_000_1160_000,15943938987133888575_2767_300_2787_300,6207195415812436731_805_000_825_000,9907794657177651763_1126_570_1146_570,17778522338768131809_5920_000_5940_000,17761959194352517553_5448_420_5468_420,2105808889850693535_2295_720_2315_720,13299463771883949918_4240_000_4260_000,10335539493577748957_1372_870_1392_870,6150191934425217908_2747_800_2767_800,12027892938363296829_4086_280_4106_280,17703234244970638241_220_000_240_000,3417928259332148981_7018_550_7038_550,7932945205197754811_780_000_800_000,15448466074775525292_2920_000_2940_000,11901761444769610243_556_000_576_000,17160696560226550358_6229_820_6249_820,16388696051060074747_140_000_160_000,17065833287841703_2980_000_3000_000,7163140554846378423_2717_820_2737_820,3563349510410371738_7465_000_7485_000,4898453812993984151_199_000_219_000,6104545334635651714_2780_000_2800_000,4641822195449131669_380_000_400_000,2577669988012459365_1640_000_1660_000,2506799708748258165_6455_000_6475_000,12681651284932598380_3585_280_3605_280,5731414711882954246_1990_250_2010_250,1416654423768444853_2660_000_2680_000,8207498713503609786_3005_450_3025_450,16552287303455735122_7587_380_7607_380,7741361323303179462_1230_310_1250_310,366934253670232570_2229_530_2249_530,7650923902987369309_2380_000_2400_000,3437741670889149170_1411_550_1431_550,11048712972908676520_545_000_565_000,11139647661584646830_5470_000_5490_000,15053781258223091665_3192_117_3212_117,7912728502266478772_1202_200_1222_200,13363977648531075793_343_000_363_000,11356601648124485814_409_000_429_000,33101359476901423_6720_910_6740_910,16977844994272847523_2140_000_2160_000,15724298772299989727_5386_410_5406_410,12657584952502228282_3940_000_3960_000,13310437789759009684_2645_000_2665_000,8513241054672631743_115_960_135_960,1306458236359471795_2524_330_2544_330,17386718718413812426_1763_140_1783_140,7253952751374634065_1100_000_1120_000,13142190313715360621_3888_090_3908_090,11379226583756500423_6230_810_6250_810,16534202648288984983_900_000_920_000,6324079979569135086_2372_300_2392_300,13506499849906169066_120_000_140_000,11971497357570544465_1200_000_1220_000,14753089714893635383_873_600_893_600,5990032395956045002_6600_000_6620_000,2863984611797967753_3200_000_3220_000,1146261869236413282_1680_000_1700_000,10724020115992582208_7660_400_7680_400,17694030326265859208_2340_000_2360_000,7727809428114700355_2960_000_2980_000,13258835835415292197_965_000_985_000,18045724074935084846_6615_900_6635_900,4781039348168995891_280_000_300_000,5183174891274719570_3464_030_3484_030,8965112222692085704_4860_000_4880_000,5214491533551928383_1918_780_1938_780,14479353969865741728_2340_000_2360_000,9016865488168499365_4780_000_4800_000,1940032764689855266_3690_210_3710_210,16470190748368943792_4369_490_4389_490,14763701469114129880_2260_000_2280_000,1921439581405198744_1354_000_1374_000,915935412356143375_1740_030_1760_030,15202102284304593700_1900_000_1920_000,2335854536382166371_2709_426_2729_426,5222336716599194110_8940_000_8960_000,2974991090366925955_4924_000_4944_000,7189996641300362130_3360_000_3380_000,4013125682946523088_3540_000_3560_000,3504776317009340435_6920_000_6940_000,3665329186611360820_2329_010_2349_010,15036582848618865396_3752_830_3772_830,14687328292438466674_892_000_912_000,18136695827203527782_2860_000_2880_000,18331704533904883545_1560_000_1580_000,18380281348728758158_4820_000_4840_000,15021599536622641101_556_150_576_150,5100136784230856773_2517_300_2537_300,17066133495361694802_1220_000_1240_000,744006317457557752_2080_000_2100_000,616184888931414205_2020_000_2040_000,7996500550445322129_2333_304_2353_304,13355317306876751663_2200_000_2220_000,9105380625923157726_4420_000_4440_000,17144150788361379549_2720_000_2740_000,990914685337955114_980_000_1000_000,8158128948493708501_7477_230_7497_230,662188686397364823_3248_800_3268_800,8331804655557290264_4351_740_4371_740,16511546224219511043_6226_000_6246_000,11839652018869852123_2565_000_2585_000,3276301746183196185_436_450_456_450,12339284075576056695_1920_000_1940_000,4880464427217074989_4680_000_4700_000,10203656353524179475_7625_000_7645_000,4546515828974914709_922_040_942_040,16262849101474060261_3459_585_3479_585,4854173791890687260_2880_000_2900_000,2551868399007287341_3100_000_3120_000,2114574223307001959_1163_280_1183_280,3461811179177118163_1161_000_1181_000,8133434654699693993_1162_020_1182_020,8345535260120974350_1980_000_2000_000,2217043033232259972_2720_000_2740_000,17958696356648515477_1660_000_1680_000,13619063687271391084_1519_680_1539_680,15166409572599113654_808_000_828_000,17959337482465423746_2840_000_2860_000,14107757919671295130_3546_370_3566_370,10517728057304349900_3360_000_3380_000,18418533015310829002_480_000_500_000,15028688279822984888_1560_000_1580_000,6638427309837298695_220_000_240_000,8806931859563747931_1160_000_1180_000,4292360793125812833_3080_000_3100_000,17850487901509155700_9065_000_9085_000,6280779486809627179_760_000_780_000,7732779227944176527_2120_000_2140_000,13585809231635721258_1910_770_1930_770,1357883579772440606_2365_000_2385_000,17597174721305220109_178_000_198_000,4612525129938501780_340_000_360_000,12551320916264703416_1420_000_1440_000,575209926587730008_3880_000_3900_000,1352150727715827110_3710_250_3730_250,8582923946352460474_2360_000_2380_000,4277109506993614243_1648_000_1668_000,4816728784073043251_5273_410_5293_410,6792191642931213648_1522_000_1542_000,13731697468004921673_4920_000_4940_000,6637600600814023975_2235_000_2255_000,4138614210962611770_2459_360_2479_360,2670674176367830809_180_000_200_000,6417523992887712896_1180_000_1200_000,11660186733224028707_420_000_440_000,5215905243049326497_20_000_40_000,18286677872269962604_3520_000_3540_000,10940952441434390507_1888_710_1908_710,5973788713714489548_2179_770_2199_770,1172406780360799916_1660_000_1680_000,6074871217133456543_1000_000_1020_000,15090871771939393635_1266_320_1286_320,18244334282518155052_2360_000_2380_000,9114112687541091312_1100_000_1120_000,10723911392655396041_860_000_880_000,9509506420470671704_4049_100_4069_100,4702302448560822815_927_380_947_380,13177337129001451839_9160_000_9180_000,17912777897400903477_2047_500_2067_500,15496233046893489569_4551_550_4571_550,10327752107000040525_1120_000_1140_000,10786629299947667143_3440_000_3460_000,12179768245749640056_5561_070_5581_070,17885096890374683162_755_580_775_580,8120716761799622510_862_120_882_120,15266427834976906738_1620_000_1640_000,898816942644052013_20_000_40_000,11489533038039664633_4820_000_4840_000,3364861183015885008_1720_000_1740_000,2475623575993725245_400_000_420_000,11623618970700582562_2840_367_2860_367,6303332643743862144_5600_000_5620_000,3711598698808133144_2060_000_2080_000,5302885587058866068_320_000_340_000,1999080374382764042_7094_100_7114_100,3418007171190630157_3585_530_3605_530,9295161125729168140_1270_000_1290_000,7493781117404461396_2140_000_2160_000,17344036177686610008_7852_160_7872_160,16034875274658204340_240_000_260_000,15644354861949427452_3645_350_3665_350,6378340771722906187_1120_000_1140_000,1208303279778032257_1360_000_1380_000,2101027554826767753_2504_580_2524_580,3872781118550194423_3654_670_3674_670,12858738411692807959_2865_000_2885_000,3490810581309970603_11125_000_11145_000,13186511704021307558_2000_000_2020_000,13178092897340078601_5118_604_5138_604,14940138913070850675_5755_330_5775_330,7458568461947999548_700_000_720_000,7566697458525030390_1440_000_1460_000,6234738900256277070_320_000_340_000,5614471637960666943_6955_675_6975_675,9110125340505914899_380_000_400_000,1918764220984209654_5680_000_5700_000,4380865029019172232_480_000_500_000,10876852935525353526_1640_000_1660_000,9747453753779078631_940_000_960_000,6001094526418694294_4609_470_4629_470,14073491244121877213_4066_056_4086_056,2752216004511723012_260_000_280_000,9696413700515401320_1690_000_1710_000,8487809726845917818_4779_870_4799_870,2415873247906962761_5460_000_5480_000,15550613280008674010_1780_000_1800_000,3894883757914505116_1840_000_1860_000,10793018113277660068_2714_540_2734_540,2739239662326039445_5890_320_5910_320,13196796799137805454_3036_940_3056_940,8123909110537564436_7220_000_7240_000,17782258508241656695_1354_000_1374_000,12337317986514501583_5346_260_5366_260,15365821471737026848_1160_000_1180_000,13402473631986525162_5700_000_5720_000,7920326980177504058_2454_310_2474_310,3338044015505973232_1804_490_1824_490,4967385055468388261_720_000_740_000,18333922070582247333_320_280_340_280,1605912288178321742_451_000_471_000,4971817041565280127_780_500_800_500,10235335145367115211_5420_000_5440_000,5707035891877485758_2573_000_2593_000,2681180680221317256_1144_000_1164_000,13145971249179441231_1640_000_1660_000,14466332043440571514_6530_560_6550_560,12321865437129862911_3480_000_3500_000,6799055159715949496_2503_000_2523_000,447576862407975570_4360_000_4380_000,15241656472211725662_2500_000_2520_000,11126313430116606120_1439_990_1459_990,7837172662136597262_1140_000_1160_000,7019385869759035132_4270_850_4290_850,9250355398701464051_4166_132_4186_132,11318901554551149504_520_000_540_000,454855130179746819_4580_000_4600_000,10153695247769592104_787_000_807_000,2736377008667623133_2676_410_2696_410,17136314889476348164_979_560_999_560,10625026498155904401_200_000_220_000,8137195482049459160_3100_000_3120_000,4537254579383578009_3820_000_3840_000,12251442326766052580_1840_000_1860_000,9311322119128915594_5285_000_5305_000,18233614482685846350_7060_000_7080_000,2624187140172428292_73_000_93_000,15535062863944567958_1100_000_1120_000,4759225533437988401_800_000_820_000,14869732972903148657_2420_000_2440_000,14818835630668820137_1780_000_1800_000,18446264979321894359_3700_000_3720_000,14004546003548947884_2331_861_2351_861,4337887720320812223_1857_930_1877_930,6161542573106757148_585_030_605_030,5129792222840846899_2145_000_2165_000,15458436361042752328_3549_030_3569_030,17642771458376274038_2080_000_2100_000,1730266523558914470_305_260_325_260,1305342127382455702_3720_000_3740_000,17437352085580560526_2120_000_2140_000,1422926405879888210_51_310_71_310,9243656068381062947_1297_428_1317_428,11037651371539287009_77_670_97_670,260994483494315994_2797_545_2817_545,18096167044602516316_2360_000_2380_000,16600468011801266684_1500_000_1520_000,12134738431513647889_3118_000_3138_000,13182548552824592684_4160_250_4180_250,6791933003490312185_2607_000_2627_000,15578655130939579324_620_000_640_000,18252111882875503115_378_471_398_471,3451017128488170637_5280_000_5300_000,17552108427312284959_3200_000_3220_000,17330200445788773877_2700_000_2720_000,10061305430875486848_1080_000_1100_000,9142545919543484617_86_000_106_000,14018515129165961775_483_260_503_260,1231623110026745648_480_000_500_000,8031709558315183746_491_220_511_220,17547795428359040137_5056_070_5076_070,5846229052615948000_2120_000_2140_000,16561295363965082313_3720_000_3740_000,3915587593663172342_10_000_30_000,7950869827763684964_8685_000_8705_000,3247914894323111613_1820_000_1840_000,6491418762940479413_6520_000_6540_000,14098605172844003779_5084_630_5104_630,6183008573786657189_5414_000_5434_000,4723255145958809564_741_350_761_350,10500357041547037089_1474_800_1494_800,6037403592521973757_3260_000_3280_000,12831741023324393102_2673_230_2693_230,16797668128356194527_2430_390_2450_390,16080705915014211452_620_000_640_000,7447927974619745860_820_000_840_000,11060291335850384275_3761_210_3781_210,5495302100265783181_80_000_100_000,17152649515605309595_3440_000_3460_000,15331851695963211598_1620_000_1640_000,2308204418431899833_3575_000_3595_000,1972128316147758939_2500_000_2520_000,3644145307034257093_3000_400_3020_400,4655005625668154134_560_000_580_000,4575961016807404107_880_000_900_000,3657581213864582252_340_000_360_000,9320169289978396279_1040_000_1060_000,2935377810101940676_300_000_320_000,17626999143001784258_2760_000_2780_000,10017090168044687777_6380_000_6400_000,4427374597960783085_4168_000_4188_000,15224741240438106736_960_000_980_000,4457475194088194008_3100_000_3120_000,6410495600874495447_5287_500_5307_500,13830510593707564159_5575_000_5595_000,6559997992780479765_1039_000_1059_000,17902907331132202998_1564_000_1584_000,11674150664140226235_680_000_700_000,15265053588821562107_60_000_80_000,9164052963393400298_4692_970_4712_970,5459113827443493510_380_000_400_000,5372281728627437618_2005_000_2025_000,5602237689147924753_760_000_780_000,12273083120751993429_7285_000_7305_000,2151482270865536784_900_000_920_000,4414235478445376689_2020_000_2040_000,18441113814326864765_725_000_745_000,5772016415301528777_1400_000_1420_000,1382515516588059826_780_000_800_000,10107710434105775874_760_000_780_000,5468483805452515080_4540_000_4560_000,18068531698704694137_920_000_940_000,11070802577416161387_740_000_760_000,14383152291533557785_240_000_260_000,2075681641472425669_2635_000_2655_000,16229547658178627464_380_000_400_000,6625150143263637936_780_000_800_000,10072231702153043603_5725_000_5745_000,4458730539804900192_535_000_555_000,8126606965364870152_985_090_1005_090,4690718861228194910_1980_000_2000_000,15062351272945542584_5921_360_5941_360,12848519977617081063_2488_000_2508_000,11846396154240966170_3540_000_3560_000,16336545122307923741_486_637_506_637,3908622028474148527_3480_000_3500_000,4013698638848102906_7757_240_7777_240,13629997314951696814_1207_000_1227_000,16646502593577530501_4878_080_4898_080,17407069523496279950_4354_900_4374_900,18403940760739364047_920_000_940_000,4195774665746097799_7300_960_7320_960,16213317953898915772_1597_170_1617_170,13184115878756336167_1354_000_1374_000,17987556068410436875_520_610_540_610,16504318334867223853_480_000_500_000,13033853066564892960_1040_000_1060_000,15787777881771177481_8820_000_8840_000,11799592541704458019_9828_750_9848_750,16652690380969095006_2580_000_2600_000,11388947676680954806_5427_320_5447_320,13005562150845909564_3141_360_3161_360,14734824171146590110_880_000_900_000,12365808668068790137_2920_000_2940_000,5691636094473163491_6889_470_6909_470,10391312872392849784_4099_400_4119_400,7934693355186591404_73_000_93_000,3543045673995761051_460_000_480_000,8323028393459455521_2105_000_2125_000,4487677815262010875_4940_000_4960_000,4323857429732097807_1005_000_1025_000,2036908808378190283_4340_000_4360_000,346889320598157350_798_187_818_187,13469905891836363794_4429_660_4449_660,13940755514149579648_821_157_841_157,13415985003725220451_6163_000_6183_000,6740694556948402155_3040_000_3060_000,8679184381783013073_7740_000_7760_000,2508530288521370100_3385_660_3405_660,2698953791490960477_2660_000_2680_000,9288629315134424745_4360_000_4380_000,15270638100874320175_2720_000_2740_000,17674974223808194792_8787_692_8807_692,2660301763960988190_3742_580_3762_580,16191439239940794174_2245_000_2265_000,7799643635310185714_680_000_700_000,786582060300383668_2944_060_2964_060,16403578704435467513_5133_870_5153_870,10206293520369375008_2796_800_2816_800,13965460994524880649_2842_050_2862_050,11387395026864348975_3820_000_3840_000,4384676699661561426_1662_670_1682_670,16224018017168210482_6353_500_6373_500,80599353855279550_2604_480_2624_480,54293441958058219_2335_200_2355_200,10964956617027590844_1584_680_1604_680,14430914081327266277_6480_000_6500_000,4266984864799709257_720_000_740_000,14250544550818363063_880_000_900_000,8663006751916427679_1520_000_1540_000,9041488218266405018_6454_030_6474_030,11940460932056521663_1760_000_1780_000,10075870402459732738_1060_000_1080_000 -"The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving towards the camera. The car is stopped at a traffic light, which is red, and then continues driving forward. The street is lined with trees and there is a building on the right side of the street. The sky is clear and the sun is shining brightly, indicating that it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot with various cars parked and moving around. A black car is seen driving forward, while a white car is parked on the side. A person is walking on the sidewalk, and another person is standing near a car. The scene is set in a sunny day with clear skies, and the surroundings include trees and a building.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are several traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving in both directions, and pedestrians are walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential area with a two-lane road and a sidewalk. The road is lined with trees and houses, and there are stop signs at the intersection. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with houses, trees, and parked cars. As the camera moves forward, various vehicles can be seen driving or parked along the street. The houses are mostly single-story with driveways and garages. The street is well-maintained, with sidewalks and streetlights visible. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day seems to be late afternoon or early evening, as the sunlight is still strong but starting to warm up. Overall, the scene is peaceful and typical of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. Several cars are visible, including a blue car turning left, a white car driving straight, and a black car turning right. The traffic lights are red, and the road is lined with trees and power lines. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a shopping center. The street is lined with palm trees and has a sidewalk on the right side. There are several cars parked in the lot, and a few pedestrians are walking along the sidewalk. The sky is clear, indicating a sunny day. The scene appears to be a typical day in a suburban area with a shopping center.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a woman in a yellow vest holding a stop sign and directing traffic. Several cars are parked along the street, and a few are driving. There are also people walking on the sidewalk and crossing the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with cars parked on both sides of the road. The street is lined with trees, and the sun is shining brightly, casting shadows on the road. As the camera moves forward, it captures the movement of cars and pedestrians on the sidewalk. The street appears to be quiet, with no signs of heavy traffic or congestion. The weather is clear and sunny, with no visible clouds or rain. The time of day is likely morning or afternoon, as the sun is high in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and streetlights. The road is mostly empty, with a few cars driving in different directions. The weather appears to be clear and sunny, with shadows cast by the trees and streetlights. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a cyclist riding down the road. The road is lined with trees and houses, and there are no other vehicles or pedestrians visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy night scene with a focus on a wet road and a tunnel entrance. The road is illuminated by streetlights and reflects the lights, creating a blurry effect. A white car is seen driving through the tunnel entrance, and the road appears to be wet due to the rain. The overall atmosphere is dark and moody, with the rain creating a sense of solitude and quietness.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are several traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving in both directions, and pedestrians are crossing the street at designated crosswalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white line in the middle and a yellow line on the left side. There are orange and white striped poles on both sides of the road, and a sign that says ""KEEP RIGHT"" is visible. The road is lined with palm trees and has a sidewalk on the right side. The sky is clear, and the sun is setting in the distance. The road appears to be in a residential area with houses and buildings visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a winding road with a white guardrail on the right side and a yellow line in the middle. The road is surrounded by green hills and mountains, with a few houses visible in the distance. The sky is clear and blue, indicating a sunny day. The road curves to the right, and the camera captures the scenery as it moves forward.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a two-way road and a bike lane. The street is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime. The street is relatively quiet, with only a few cars driving by.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and traffic lights visible. The traffic lights are green, indicating that the cars are moving forward. The street is wet, suggesting recent rain. There are several cars on the road, including a white car directly in front of the camera. The weather appears to be cloudy, and the time of day is likely early morning or late afternoon. The street is lined with palm trees and other vegetation, and there are buildings visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The scene is set in a suburban area with palm trees lining the road and buildings in the background. The weather appears to be clear and sunny, with the time of day being daytime. The traffic is moving smoothly, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with various cars and pedestrians. A silver car is seen driving through the intersection, while a black car is parked on the side of the road. A blue truck is also visible, and a person is walking on the sidewalk. The scene is set in a parking lot with a large building in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a two-lane road with a yellow center line. The road is illuminated by streetlights, and there are occasional vehicles visible, including a car with its headlights on. The surroundings are dark, with some green signs visible in the distance. The overall scene is quiet and relatively empty, with no pedestrians or other significant activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and colorful buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy street with parked cars on both sides of the road. The sky is overcast, and the visibility is low due to the fog. The street is lined with telephone poles and power lines, and there are several cars parked along the curb. The scene appears to be a quiet neighborhood with no visible pedestrians or moving vehicles. The overall atmosphere is calm and somewhat eerie due to the fog.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a city street at dusk, with cars stopped at a red light. The street is lined with trees and houses, and there are traffic lights and streetlights visible. The weather appears to be clear, and the time of day is twilight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. The street is lined with parked cars and buildings on both sides. There are pedestrians walking on the sidewalks, and a few vehicles are driving or stopped at the intersection. The weather appears to be overcast, and the time of day is likely daytime. The street is relatively quiet, with no signs of heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is wide and has a double yellow line in the center, with a white line on the right side. There are several houses on the right side of the street, each with a well-maintained lawn and a few trees. The street is lined with streetlights and there are a few parked cars along the curb. The weather appears to be sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with various objects and actions. A truck is seen driving down the street, passing a large building with a yellow exterior. Several cars are parked along the street, and a few pedestrians are walking on the sidewalk. The street is lined with trees and has a few traffic lights and street signs. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a two-lane road with a bike lane. The road is wet, and the sky is overcast. Several cars are driving on the road, with some turning left and others continuing straight. The road is lined with trees and power lines, and there are streetlights along the side of the road. The overall scene is quiet and peaceful, with the sound of rain and the occasional car horn.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a two-lane road with a yellow line in the middle. The road is wet, and there are trees on both sides. The sky is overcast, and the visibility is low due to the rain. The road is relatively empty, with only a few cars driving in the opposite direction. The camera is positioned in the front of a car, and the windshield wipers are on, indicating ongoing rain. The road has a speed limit of 35 mph, and there are signs indicating a pedestrian crossing. The overall atmosphere is gloomy and wet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are parked along the curb while others are in motion. Pedestrians can be seen walking on the sidewalks and crossing the street at designated crosswalks. The traffic lights are visible, and some cars are waiting for the signal to change. The street is well-lit, suggesting it is daytime. The buildings are modern, with large windows and various signs and advertisements visible. The overall atmosphere is bustling and energetic, typical of a city center.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. Pedestrians are crossing the street at a crosswalk, and there are several buildings lining both sides of the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and a trolley. The street is lined with buildings, trees, and pedestrians. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and trucks. The street is lined with tall buildings, trees, and street signs. The weather appears to be clear and sunny, with the time of day being daytime. The traffic is moderate, with cars and trucks moving in both directions. The street is well-lit, and the buildings are tall and modern.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars along both sides. The street is lined with houses, trees, and street signs. The weather appears to be overcast, and the time of day is likely daytime. The street is relatively quiet, with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including a dedicated lane for taxis. Pedestrians are crossing the street at a crosswalk, and there are several cars and a bicycle visible. The street is lined with buildings, including a bank and a Skechers outlet. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a bus, all moving in different directions. A prominent billboard on the left side of the street displays an advertisement. The street is lined with buildings, including a large brick structure on the right side. The weather appears to be clear and sunny, with shadows cast by the vehicles and buildings. The time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and pedestrians. The scene is set in a suburban area with trees lining the streets. The weather appears to be clear and sunny. The time of day is daytime, as indicated by the bright lighting. The traffic lights are visible, and cars are either stopped or moving through the intersection. Pedestrians are crossing the street, and the overall atmosphere is typical of a busy suburban intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a busy street with multiple lanes of traffic. The sky is overcast, and the road is wet, reflecting the lights of the vehicles. Various cars are driving down the street, some with their headlights on. There are traffic lights at the intersection, and a few pedestrians are walking with umbrellas. The street is lined with trees and buildings, and there is a train track running parallel to the road. The overall atmosphere is gloomy due to the weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with palm trees lining both sides of the road. The sky is clear and blue, indicating a sunny day. The road is relatively empty, with a few cars and trucks visible. The traffic lights are green, allowing vehicles to proceed. The buildings on either side of the street appear to be residential or commercial structures. The overall atmosphere is calm and peaceful, with no signs of rush hour or heavy traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a two-way road intersection. The road is lined with trees and houses, and there are traffic lights at the intersection. The sky is clear, indicating a sunny day. As the camera moves forward, it captures various vehicles, including cars and trucks, driving on the road. The traffic lights change, and the vehicles stop and proceed accordingly. The scene is a typical suburban street with minimal traffic and clear weather conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a bicycle. The weather appears to be cloudy, and the time of day is daytime. The street is lined with trees and has a pedestrian bridge overhead. The traffic is moving slowly, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a few pedestrians and vehicles. The street is lined with palm trees and has a few traffic lights and street signs. A few people are walking on the sidewalk, and a few cars are driving on the road. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with only a few cars driving by. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few cars parked along the curb. The street is lined with trees and houses, and there are a few cars driving down the road. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the sun is low in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a bus driving down the road. The bus is white and has a green advertisement on its back. The street is lined with trees and buildings, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime. The bus is driving towards the camera, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a white jeep. The road is well-marked with lane dividers and traffic signs. The weather appears to be clear and sunny, with a blue sky overhead. The time of day seems to be daytime, as indicated by the bright sunlight. The highway is flanked by a barrier and trees, providing a natural backdrop.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including cars and a bicycle lane. The traffic lights are red, causing vehicles to stop. There are several pedestrians walking on the sidewalks and crossing the street. The street is lined with palm trees and has a green bike lane. The background features a large bridge and a cloudy sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered in the distance. The road is lined with trees on both sides, and there are several cars parked along the side of the road. The road is mostly empty, with only a few cars driving by. The trees on the left side of the road are taller and more dense, while the trees on the right side are shorter and more sparse. The road is well-maintained and has a smooth surface. The weather is clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a residential street. The street is lined with parked cars and houses, and there are streetlights illuminating the area. The headlights of a car are visible in the distance, approaching the intersection. The street appears to be quiet, with no pedestrians or other vehicles in motion. The overall atmosphere is calm and peaceful, with the lights of the houses and streetlights creating a warm glow against the dark sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime street scene with a car driving down a residential road. The road is illuminated by streetlights and has a double yellow line in the center. Both sides of the street are lined with parked cars, and there are stop signs at the intersections. The environment appears to be a quiet neighborhood with no visible pedestrians or other vehicles. The weather is clear, and the sky is dark, indicating it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several parked cars along the sides of the street. The street is relatively quiet, with only a few cars driving by. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night with numerous cars and pedestrians. The street is illuminated by streetlights and vehicle headlights, creating a bustling urban environment. Multiple cars are parked along the sides of the street, and a few are in motion, driving or waiting at a stoplight. Pedestrians can be seen walking along the sidewalks, and a few are crossing the street. The street is lined with buildings, some of which have lit windows, indicating active businesses or residences. The overall atmosphere is lively and typical of a city street during nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. Cars are moving in both directions, and pedestrians are crossing the street at designated crosswalks. The street is lined with tall buildings and trees, and traffic lights regulate the flow of vehicles. The weather appears to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple cars and pedestrians. The scene is set in a city with buildings lining both sides of the road. The weather appears to be clear and sunny, with the sun shining brightly in the sky. The time of day is likely daytime, as the lighting is bright and natural. The cars are moving in both directions, and pedestrians are crossing the street at designated crosswalks. The street is well-paved and has clear lane markings.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a wet road, with the windshield wipers in motion. The scene is illuminated by streetlights and vehicle headlights, creating a blurry and distorted view. The road is lined with trees and buildings, and the traffic is moderate. The overall atmosphere is dark and rainy, with the windshield wipers adding a dynamic element to the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime city street scene with a focus on a pedestrian crossing the road. The street is illuminated by streetlights and traffic lights, and there are several cars parked along the sides of the road. The buildings in the background are lit up, indicating an urban environment. The pedestrian is seen crossing the street, and the overall atmosphere is quiet and calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are a few cars parked along the side of the road. The street is relatively quiet, with no pedestrians visible. The weather appears to be sunny, with bright sunlight illuminating the scene. The time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along the curb. The street is lined with trees and houses, and there are several cars parked in front of the houses. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street with a McDonald's restaurant visible in the background. The street is illuminated by streetlights and traffic lights, and there are several cars driving on the road. The traffic lights change from red to green, allowing the cars to proceed. The street is relatively quiet, with only a few cars visible. The weather appears to be clear, and the overall atmosphere is calm and typical of a city street at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene of a city street with a pedestrian crossing in the foreground. The street is illuminated by streetlights and the headlights of vehicles. Several cars are visible, some waiting at a red light while others are driving through the intersection. The street is lined with parked cars and buildings on both sides. The overall atmosphere is quiet, with no pedestrians crossing the street. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet road, possibly after a rainstorm. The road is illuminated by streetlights and vehicle headlights, creating a reflective surface on the wet pavement. Several cars are visible, some with their headlights on, indicating they are either driving or parked. The scene appears to be in a residential or suburban area, with houses and trees lining the street. The overall atmosphere is dark and quiet, with the wet road reflecting the lights and creating a serene yet slightly eerie ambiance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and buses. The street is lined with tall buildings, some of which have flags and awnings. Pedestrians can be seen walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The traffic is moving slowly, and there are several construction cones and barriers set up along the road. A large stadium is visible in the background, and there are tall buildings on the left side of the street. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a city street. The road is wet, and there are several cars parked along both sides of the street. The weather is overcast, and the streetlights are on. The cars are parked in front of buildings, and there are trees lining the street. The overall scene is quiet and calm, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few trees lining the sides. The road is mostly empty, with a few cars parked along the side of the road. The cars are parked in a row, and there are no pedestrians visible in the scene. The road appears to be in a residential area, with houses and buildings visible in the background. The weather is clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a rainy day in a city street. The road is wet, and there are several cars and trucks driving slowly. A motorcycle rider is seen in the center of the road, and there are orange traffic cones placed on the side. The buildings on both sides of the street are tall and have multiple stories. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple cars and pedestrians. The street is lined with parked cars and buildings on both sides. The sky is overcast, suggesting cloudy weather. The time of day appears to be daytime, as the street is well-lit. The cars are moving in both directions, and pedestrians are crossing the street at designated crosswalks. The overall scene is typical of a bustling urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a wide road and houses on both sides. The road is lined with street lamps and trees, and there are several parked cars in driveways. The houses are large and well-maintained, with a variety of architectural styles. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The video captures the peaceful and quiet atmosphere of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several cars parked along the sides of the road. As the camera moves forward, it captures the movement of cars driving down the street, as well as pedestrians walking on the sidewalks. The street appears to be relatively quiet, with no signs of heavy traffic or congestion. The weather is sunny and clear, with no clouds visible in the sky. The time of day is not specified, but the lighting suggests it is daytime. Overall, the video provides a peaceful and serene view of a typical residential neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a city street. The camera is positioned in the middle of the road, capturing the movement of various vehicles, including cars and trucks. The street is wet, reflecting the rain, and there are several parked cars on both sides of the road. Pedestrians can be seen walking along the sidewalks, some holding umbrellas. The buildings lining the street are tall and have a mix of architectural styles. The sky is overcast, indicating the ongoing rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with multiple lanes in each direction. The road is illuminated by streetlights and vehicle headlights, creating a well-lit environment. Traffic is moderate, with several cars visible on the road, some of which are changing lanes or turning. The road appears to be in a suburban or semi-urban area, with houses and trees lining the sides. The weather is clear, with no visible signs of rain or fog. The overall scene is typical of a busy road at night, with vehicles moving in both directions and occasional lane changes.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene of a quiet residential street. The road is dimly lit by streetlights and has a pedestrian crossing in the foreground. Several parked cars line the sides of the street, and a few buildings with lights on can be seen in the background. The sky is dark, indicating it is late evening or night. The street appears to be in a neighborhood with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving through a roundabout. The car is seen turning left onto the street, passing a stop sign, and continuing on the road. The street is lined with trees and houses, and there are several traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars and buses. Pedestrians are crossing the street and walking on the sidewalks. The street is lined with tall buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video shows a street with a car driving down it, passing a stop sign and a house. The sun is shining brightly in the sky, casting a warm glow over the scene. The road is lined with trees and power lines, and there are a few cars parked along the side of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a hill, passing parked cars on both sides. The car continues to drive down the hill, passing more parked cars and eventually coming to a stop at the bottom of the hill. The street is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with trees and streetlights, and there are a few houses visible in the background. A white car is seen driving down the street, and a yellow fire hydrant is located on the sidewalk. The street appears to be in a suburban area with well-maintained lawns and driveways.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions, including a red car in the left lane and a red car in the right lane. The street is lined with trees and has a pedestrian crossing in the middle. There are also traffic lights visible in the distance, and a person is seen walking on the sidewalk. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night, with numerous cars and traffic lights visible. The traffic lights are green, indicating that the cars are moving through the intersection. The street is wet, possibly due to recent rain, and the headlights of the cars create a bright reflection on the wet surface. The cars are moving in both directions, and the traffic is heavy, with cars lined up at the intersection. The street is lined with palm trees, and the sky is dark, indicating that it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions, including a white car, a white van, and a white truck. The street is lined with trees and houses, and there are several pedestrians walking on the sidewalk. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white truck parked on the side of the road. The truck is facing away from the camera, and the street is lined with trees and houses. The weather appears to be clear and sunny, and the time of day is likely daytime. The street is relatively quiet, with no visible pedestrians or other vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a traffic light and a road intersection. The traffic light is red, indicating that vehicles must stop. The road is relatively empty, with only a few cars visible in the distance. The intersection is well-marked with white lines and a pedestrian crossing area. The surrounding area appears to be a residential neighborhood, with houses and trees visible in the background. The weather is clear and sunny, with no signs of rain or clouds. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with multiple lanes in each direction. The road is well-lit by streetlights, and there are several cars visible, some of which are changing lanes. The traffic appears to be moderate, with cars moving at a steady pace. The road has clear lane markings and a median strip separating the opposing traffic. There are also traffic signs and streetlights along the sides of the road. The weather seems clear, and the overall scene is typical of a busy urban or suburban area at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet road, with various vehicles and traffic lights visible. The road is illuminated by streetlights and vehicle headlights, creating a blurry and somewhat distorted view. Several cars are present, some with their brake lights on, indicating a stop or slow movement. The wet conditions reflect the lights, adding to the overall dim ambiance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in an urban setting, with a focus on a street scene. The road is wet, reflecting the headlights of the cars, and there are numerous parked cars along both sides of the street. The sky is overcast, and the overall atmosphere is gray and gloomy. The street is lined with buildings, some of which have visible signs and advertisements. The traffic is moderate, with cars moving slowly due to the wet conditions. There are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street during a rainy day. Multiple cars, including a silver SUV and a white truck with a Pepsi logo, are stopped at a red light. The street is flanked by tall buildings and trees, with some pedestrians visible on the sidewalks. The rain creates a wet surface on the road, and the overall atmosphere is overcast.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple lanes of traffic, including cars and trucks. The road is lined with palm trees, and there are traffic lights at intersections. The weather appears to be clear and sunny, with a blue sky and bright sunlight. The time of day is likely daytime, as indicated by the bright lighting. The scene is a typical urban or suburban street with moderate traffic flow.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene is set in a suburban area with trees lining both sides of the road. The weather appears to be overcast, suggesting a cloudy day. The traffic is moderate, with cars moving in both directions. Some pedestrians can be seen walking along the sidewalks, and there are several traffic lights and street signs visible. The overall atmosphere is calm, with no signs of rush hour congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with houses on both sides. The street is lined with parked cars and has a few trees and bushes. The weather appears to be overcast, and the time of day is likely early morning or late afternoon. The street is relatively quiet, with no pedestrians or moving vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The street is lined with trees and houses, and there are several pedestrians walking on the sidewalks. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a traffic scene on a street with multiple cars stopped at a red light. The cars are positioned at various distances from the camera, with some closer and others further away. The traffic light is visible in the background, showing a red signal. The street is lined with trees and streetlights, and the sky appears overcast, indicating cloudy weather. The cars are stationary, and the scene is quiet, with no pedestrians or other significant activities observed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with visible traffic lights and streetlights. The road is well-lit, and several cars are visible, some with their headlights on. The traffic appears to be moving smoothly, and there are no pedestrians or other obstacles in the scene. The weather seems clear, and the overall environment is a typical urban or suburban setting at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including a bus lane. Various vehicles, such as cars, vans, and a UPS truck, are moving along the street, while pedestrians cross the road at designated crosswalks. The street is lined with tall buildings, and there are traffic lights and streetlights visible. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along the sides of the road. The cars are of different colors and types, including sedans, SUVs, and vans. The street is lined with trees and houses, and there are orange traffic cones placed on the road. The weather appears to be cloudy, and the time of day is likely daytime. The overall scene is a typical urban street with parked cars and residential houses.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with parked cars on both sides of the road. The sky is overcast, and the road is wet, reflecting the surroundings. The camera moves forward, capturing the parked cars and the wet pavement.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The scene is set in a suburban area with palm trees lining the sides of the road. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is daytime, as indicated by the bright sunlight. The road is busy with cars moving in both directions, and some cars are stopped at the traffic lights. The traffic lights are red, indicating that the cars are waiting to proceed. The overall atmosphere is calm and orderly, with the cars following traffic rules and regulations.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood on a rainy day. The street is wet, and there are several cars parked along the curb. The houses are surrounded by trees, and the sky is overcast. The camera moves slowly down the street, capturing the quiet and peaceful atmosphere of the neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes cars, traffic lights, trees, and houses. The traffic lights are green, allowing vehicles to move forward. The street is well-lit, indicating it is daytime. The weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides. The street is lined with houses, and there are power lines running above the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered across the sky. The road is lined with palm trees and other vegetation, and there are several cars driving in both directions. The cars are moving smoothly, and the traffic appears to be light. The road is well-maintained, with clear lane markings and traffic lights at intersections. The surroundings are quiet and peaceful, with no pedestrians or other people visible. The weather is clear and sunny, with no signs of rain or other adverse weather conditions. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a scene in a parking lot with a person walking towards a parked truck. The parking lot is filled with various vehicles, including cars and trucks, and there are trees and buildings in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and pedestrians. The street is lined with tall buildings, and the sky is overcast. The traffic lights are visible, and the cars are moving in both directions. The scene is bustling with activity, and the overall atmosphere is typical of a busy urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road scene with a truck carrying a trailer full of plants driving down the road. The truck is followed by a car, and there are several other vehicles on the road, including a pickup truck and a car with a trailer. The road is lined with trees and power lines, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a car driving down it. The car is seen turning left onto a street with a stop sign painted on the road. The street is lined with parked cars and houses, and there are trees and power lines visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few parked cars and houses on both sides. The street is lined with trees and has a slight incline. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are several traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the lighting is soft.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a few cars and a truck driving down it. The road is lined with palm trees and has a median strip in the middle. There are also some buildings and houses visible on either side of the road. The sky is partly cloudy, and the weather appears to be clear. The video captures the movement of the vehicles as they travel down the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential neighborhood with a street lined with houses, trees, and parked cars. The houses are single-story with driveways and garages, and the street is lined with streetlights. The weather appears to be clear and sunny, with the sun setting in the background. The video captures the peaceful atmosphere of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a highway with multiple lanes of traffic, including a car in the left lane, a bus in the center lane, and several other cars in the right lane. The road is well-lit, suggesting it is either early morning or late evening. The sky is clear, and there are no visible pedestrians or other obstacles. The traffic appears to be moving smoothly, with no signs of congestion or accidents.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with palm trees and houses, and there are several cars parked along the side of the road. The camera moves forward, showing a few cars driving on the street and a few pedestrians walking on the sidewalk. The street is relatively quiet, with no signs of heavy traffic or congestion. The houses in the neighborhood appear to be well-maintained, with neatly trimmed lawns and driveways. The overall atmosphere is peaceful and serene, with the sound of birds chirping in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy night scene on a city street. The road is wet, and there are reflections of lights on the pavement. Several cars are visible, some with their headlights on, and others with their taillights illuminated. Pedestrians can be seen walking on the sidewalks, some holding umbrellas. The street is lined with trees and streetlights, and there are traffic lights and signs visible. The overall atmosphere is dark and wet, with the rain creating a glossy surface on the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a scene on a road with a car following behind a bus. The car is stopped at a traffic light, and the bus is moving forward. The road is lined with palm trees, and there are buildings visible in the background. The sky is overcast, suggesting it might be early morning or late afternoon. The car continues to follow the bus as they both move forward, with the car maintaining a safe distance behind the bus.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with palm trees and houses, and there are several parked cars along the curb. As the camera moves forward, it captures a white van parked on the side of the road, and a white truck is seen driving down the street. The street is relatively quiet, with no pedestrians visible. The overall atmosphere is peaceful and suburban.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. A yellow Penske truck is driving on the left side of the road, while a silver Toyota pickup truck is in the center lane. Several other vehicles, including a white van and a black car, are visible on the road. The traffic lights are red, causing the vehicles to come to a stop. The street is lined with trees and buildings, and the sky appears overcast.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with trees and buildings, and there are several traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime. The cars are moving in both directions, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The weather appears to be overcast, with a gray sky suggesting cloudy or possibly rainy conditions. The road is wet, reflecting the headlights and taillights of the vehicles. The traffic is moderate, with cars and trucks of various sizes visible. Some vehicles are changing lanes, and others are maintaining their positions. The highway is well-lit by streetlights, and there are signs overhead providing directions. The overall atmosphere is calm, with no signs of congestion or emergency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a cloudy sky overhead. The street is lined with houses, trees, and parked cars. As the camera moves forward, it captures various vehicles, including cars and trucks, parked along the sides of the road. The street appears to be relatively quiet, with no visible pedestrians or moving traffic. The overall atmosphere is calm and serene, with the overcast sky casting a soft light over the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions. The road is lined with trees and power lines, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving smoothly, and there are no visible pedestrians or traffic lights in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and traffic lights visible. The traffic lights are red, indicating that the cars are stopped at the intersection. The cars are positioned at various distances from the camera, with some closer and others further away. The weather appears to be cloudy, and the time of day is likely daytime. The street is lined with trees and buildings, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, trucks, and a bus, all moving in various directions. The traffic lights are visible, and some cars are waiting at the red light. The environment is a typical urban setting with trees and buildings in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the street. The street is relatively quiet, with only a few cars driving by. The weather appears to be sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a white truck stopped at a red light. The truck is surrounded by various vehicles, including cars and a white van, which are also stopped at the light. Pedestrians are crossing the street, and traffic lights are visible in the background. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a vehicle's perspective. The road is lined with parked cars on both sides, and there are several pedestrians walking along the sidewalks. The street is relatively busy, with multiple vehicles moving in both directions. The weather appears to be clear and sunny, with shadows indicating that it is daytime. The street is well-lit, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. The street is lined with tall buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The street is well-lit, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. Pedestrians are crossing the street at a crosswalk, and there are traffic lights and street signs visible. The scene is set in a city with tall buildings in the background, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides of the road. The street is lined with trees and houses, and there are power lines overhead. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The scene is illuminated by streetlights and vehicle headlights, creating a dimly lit environment. Several cars are visible on the road, some with their headlights on, while others are stationary at traffic lights. The street is lined with buildings and trees, and there are traffic lights and street signs visible. The weather appears to be clear, with no visible rain or snow. The overall atmosphere is quiet and calm, with minimal pedestrian activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street on a rainy day. The road is wet, and there are several parked cars along both sides of the street. The sky is overcast, and the visibility is slightly reduced due to the rain. The street is lined with houses, and there are a few trees and power lines visible. The overall atmosphere is calm and subdued, with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a hill lined with parked cars and houses. The road is lined with power lines and trees, and there are pedestrians walking on the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with various vehicles and buildings. The scene includes cars, trucks, and a bus driving on the road, as well as pedestrians walking on the sidewalks. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection on a rainy day. Multiple cars are driving through the intersection, with some turning left and others continuing straight. A bus is also visible, driving through the intersection. The traffic lights are red, indicating that vehicles must stop. The weather is rainy, with raindrops visible on the windshield. The time of day appears to be either early morning or late evening, as the sky is dark.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few parked cars on both sides. The street is lined with trees and houses, and there are a few pedestrians visible. The weather appears to be overcast, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a pedestrian crossing in the foreground. The street is lined with tall buildings on both sides, and there are several parked cars along the curb. A few pedestrians are walking on the sidewalks, and a few vehicles are driving or stopped at the intersection. The traffic lights are visible, and the street appears to be in an urban area. The weather seems to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few cars parked along the curb. The street is lined with trees and has a median in the middle. The sky is clear and blue, indicating a sunny day. The road is mostly empty, with only a few cars driving by. The surroundings are peaceful and residential, with houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white car driving down it. The road is lined with trees and has a sidewalk on the right side. There are traffic lights and streetlights along the road, and a white truck is parked on the side of the road. The sky is clear and blue, indicating a sunny day. The road appears to be in a residential area, with houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars and buses. Pedestrians are crossing the street at a crosswalk, and there are traffic lights and street signs visible. The street is flanked by tall buildings, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a rainy day. The street is wet, and there is a visible ""STOP"" sign painted on it. Several cars are parked along the sides of the street, and a fire truck is driving down the road. The sky is overcast, and the overall atmosphere is foggy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood during twilight. The sky is a mix of orange and blue hues, indicating either sunrise or sunset. The street is lined with houses, trees, and parked cars. Streetlights are on, and the area appears quiet and peaceful. The camera moves forward, capturing the quietness of the neighborhood as the sun sets or rises.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with parked cars and houses. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are two-story homes with various architectural styles, and the street is lined with trees and bushes. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars parked along the sides. The road is lined with trees and there are no pedestrians visible. The weather appears to be clear and sunny, with the sun shining brightly in the sky. The time of day is likely morning or late afternoon, as the shadows are long and the sunlight is low. The street is relatively empty, with only a few cars parked along the sides.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions. The road is lined with trees and power lines, and there are traffic lights visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving smoothly, and there are no pedestrians or other obstacles in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with parked cars and houses. The street is relatively quiet, with no visible pedestrians or traffic. The houses are two-story buildings with balconies and large windows, and the street is lined with trees providing shade. The weather appears to be clear and sunny, with shadows cast by the trees and the houses. The time of day is likely daytime, as indicated by the bright sunlight and shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city intersection with multiple lanes of traffic, including cars, a yellow utility truck, and pedestrians. The traffic lights are visible, and the street is marked with white lines and arrows indicating directions. There are several people walking on the sidewalks, and a few are crossing the street. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, pedestrians crossing the street, and various vehicles moving along the road. The scene is set in a bustling urban environment with tall buildings lining both sides of the street. The weather appears to be clear and sunny, with the time of day being daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are parked along the curb while others are in motion. Pedestrians can be seen walking on the sidewalks, and a few are crossing the street. Traffic lights are visible at various points along the street, and some are red, causing vehicles to stop. The weather appears to be clear, and the time of day seems to be daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars on both sides. The street is lined with trees and houses, and there are a few pedestrians visible. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The road is well-paved and has clear lane markings. Vehicles, including cars and trucks, are visible on the road, maintaining a steady flow of traffic. The sky is mostly clear with some scattered clouds, indicating fair weather conditions. The surrounding area appears to be an urban or suburban setting, with a mix of greenery and man-made structures. The time of day seems to be late morning or early afternoon, as suggested by the bright sunlight and shadows cast by the vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a busy city street with multiple lanes of traffic, including cars, buses, and construction vehicles. The street is flanked by tall buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime, given the natural light. There are also construction barriers and equipment on the left side of the street, indicating ongoing work.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars driving through an intersection. The sky is overcast, and the road appears wet, possibly from recent rain. The traffic lights are green, allowing vehicles to proceed. There are no pedestrians visible in the scene. The street is lined with palm trees and a few buildings in the background. The overall atmosphere is calm and serene, with no signs of rush hour or heavy traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a highway scene during what appears to be either dawn or dusk, given the dim lighting. The sky is overcast, and the visibility is somewhat reduced, possibly due to fog or mist. The road is wet, suggesting recent rain. Multiple lanes of traffic are visible, with cars traveling in both directions. The headlights and taillights of the vehicles create streaks of light due to the long exposure of the photograph. Streetlights are on, and there are various road signs overhead providing directions. The overall atmosphere is calm, with no signs of heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, bordered by a white line on the left and a yellow line on the right. The road is surrounded by greenery, including trees and bushes, and there are houses visible in the background. The sky is overcast, suggesting cloudy weather. The road appears to be empty, with no visible vehicles or pedestrians. The camera angle provides a view of the road stretching into the distance, with a slight curve to the right. The overall scene is quiet and serene, with no signs of traffic or human activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are parked along the curb, while others are in motion. There are several pedestrians walking on the sidewalks, and a few are crossing the street. The weather appears to be clear and sunny, with shadows cast by the buildings and streetlights. The time of day seems to be daytime, as indicated by the bright sunlight and shadows. The street is well-lit, and the overall atmosphere is lively and bustling.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a city, with a white truck driving down a street. The truck is moving slowly, and there are several orange traffic cones placed on the road. The street is wet, and there are several people walking on the sidewalk, some of them holding umbrellas. The traffic lights are visible, and there are some buildings on either side of the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a truck driving down a highway on a cloudy day. The truck is seen from behind, and the road is wet, possibly due to recent rain. The highway is lined with trees and power lines, and there are several cars and trucks visible in the distance. The sky is overcast, and the overall atmosphere is gray and muted.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a residential street. The road is wet, and there are several cars driving slowly, with their headlights on. A cyclist is riding in the rain, and there are construction cranes visible in the background. The sky is overcast, and the overall atmosphere is gloomy due to the weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a hill, passing parked cars and houses. The street is lined with trees and power lines, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street scene during the evening. The street is lined with buildings, and there are several cars driving in both directions. Traffic lights are visible, and some cars are stopped at red lights. The street is well-lit with streetlights and traffic lights. The weather appears to be clear, and there are no visible pedestrians. The overall atmosphere is calm, with a few cars passing by and the occasional traffic light changing colors.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where a car is driving forward. The road is lined with palm trees and various buildings, including a gas station on the right side. The sky is clear and blue, indicating a sunny day. The car passes by several vehicles parked along the side of the road and continues to drive forward, approaching an intersection with traffic lights.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city intersection with multiple lanes of traffic. Several cars are moving in different directions, including a red car turning left, a white car turning right, and a black car driving straight. Pedestrians are crossing the street, and a bus is visible in the background. The traffic lights are green, allowing vehicles to proceed. The environment is urban, with buildings lining the streets, and the weather appears to be overcast.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with houses on both sides. The road is lined with parked cars and has a few trees and bushes. The sky is clear and blue, indicating a sunny day. The street appears to be quiet, with no pedestrians or moving vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few trees lining both sides. The road is mostly empty, with a few cars and pedestrians visible. The cars are driving in both directions, and the pedestrians are walking along the sidewalks. The trees are tall and green, and the road is well-maintained. The weather is clear and sunny, with no signs of rain or clouds. The time of day appears to be daytime, as the sunlight is bright and the shadows are short.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street. The road is illuminated by streetlights, and several cars are visible, some with their brake lights on, indicating they are either slowing down or stopped. The traffic appears to be moving smoothly, with no immediate signs of congestion. The street is lined with trees and a few buildings can be seen in the background, suggesting an urban environment. The weather appears to be clear, with no visible signs of rain or other adverse conditions. The overall atmosphere is calm, with the streetlights casting a warm glow over the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a single car parked on the side of the road. The street is lined with palm trees and houses, and there are no pedestrians or other vehicles visible. The weather appears to be clear and sunny, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving down a road under a bridge. The road is lined with trees and bushes, and there are several cars visible in the distance. The weather appears to be clear and sunny, with a blue sky overhead. The car is driving on a two-lane road, and there are no pedestrians or other vehicles in the immediate vicinity. The video captures the car's journey as it approaches and passes under the bridge.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on the road and surrounding trees. The road is empty, and the trees line both sides, creating a shaded canopy. The sky is clear, and the sun is shining brightly, casting shadows on the road. The video captures the peaceful and serene atmosphere of the street, with no visible pedestrians or vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and a bus passing through. The traffic lights are red, and a person is crossing the street. The scene is set in a sunny environment, with a clear blue sky and bright sunlight. The cars are moving in various directions, and the traffic is heavy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime urban street scene with a focus on a vehicle's perspective. The street is illuminated by streetlights and the headlights of oncoming traffic. Several cars are parked along both sides of the street, and a few are in motion, driving in both directions. The road features yellow and white lane markings, including a center divider and pedestrian crosswalks. The buildings lining the street appear to be residential or mixed-use, with some lights on inside. The overall atmosphere is quiet, with no pedestrians visible. The weather appears to be clear, and the lighting suggests it is late evening or night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked and moving vehicles. The road is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be cloudy, and the time of day is likely daytime. The street is relatively quiet, with only a few cars driving by.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city intersection with multiple cars and pedestrians. The scene includes cars stopped at a red light, people crossing the street, and others walking on the sidewalk. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a pedestrian crossing the road. The street is lined with parked cars and a few moving vehicles. There are trees and buildings on either side of the street, and overhead power lines are visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at an intersection. The street is lined with houses, trees, and parked cars. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely morning or afternoon, as the sunlight is bright and the shadows are not too long. The street is relatively quiet, with no pedestrians or moving vehicles visible. The stop sign is clearly visible at the intersection, indicating that drivers must come to a complete stop before proceeding.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The road is wet, reflecting the lights from the vehicles and street lamps. Several cars are visible, some with their headlights on, while others are following the traffic lights. The street is illuminated by various street lamps and traffic signals, creating a mix of green, yellow, and red lights. The scene is relatively quiet, with no pedestrians or cyclists in sight. The buildings along the street are mostly dark, with only a few lights on in some windows. The overall atmosphere is calm and typical of a city street at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a two-story building with balconies and a parking lot in front of it. The street is lined with trees and has a speed limit of 40 mph. The camera pans to the right, showing a sidewalk and a road with a speed limit sign. The street is relatively empty, with a few cars parked and a few pedestrians walking. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street on a rainy day. The road is wet, and there are several cars driving and parked along the sides of the street. The traffic is moderate, with cars moving slowly due to the wet conditions. Pedestrians are walking on the sidewalks, and there are streetlights and traffic lights visible. The sky is overcast, indicating cloudy weather. The overall atmosphere is typical of a busy urban area during a rainy day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple lanes of traffic, including cars and a bicycle lane. The street is lined with palm trees and buildings, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. Pedestrians are crossing the street at various points, and there are traffic lights and street signs visible. The street is flanked by tall buildings and trees, and the weather appears to be clear and sunny. The time of day is likely daytime, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street at dusk with a cloudy sky overhead. The street is lined with parked cars and houses, and there are streetlights illuminating the area. The road is wet, possibly from recent rain, and there are some trees and bushes along the sides of the street. The scene is quiet and peaceful, with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The street is lined with trees and buildings, and there are several cars driving in both directions. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with a central barrier. The road is illuminated by streetlights, and there are several vehicles visible, including a car in the center lane and others on the left and right sides. The traffic appears to be moving smoothly, and there are no pedestrians or cyclists in the scene. The environment is urban, with buildings and streetlights lining the road. The weather is clear, and the overall atmosphere is calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy street with a car driving down a hill. The car is seen turning left onto a street with a house on the left side and a large tree on the right side. The street is wet, and there are several cars parked along the side of the road. The fog is thick, and the sky is overcast. The video captures the car driving through the fog, with the tree and house in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The weather appears to be overcast, with a gray sky suggesting cloudy conditions. The road is wet, indicating recent or ongoing rain. Several vehicles are visible, including cars and trucks, with their brake lights illuminated, suggesting slow-moving traffic or a stop. The highway is flanked by guardrails and a barrier, and there are streetlights and signs overhead. The overall atmosphere is calm, with no signs of congestion or emergency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is mostly empty, with only a few cars visible in the distance. The trees along the sides of the road are lush and green, and there are no pedestrians or other people visible. The road is well-maintained and has clear lane markings.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. Several cars are stopped at a red light, including a prominent gray car in the foreground. The street is flanked by tall buildings and trees, and there are pedestrians walking on the sidewalks. The weather appears to be clear, and the time of day is likely late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. The road is lined with palm trees and houses, and there are several cars and pedestrians visible. The traffic appears to be moving slowly, with some cars stopped at a red light. The weather is cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with trees and has a pedestrian crosswalk. A yellow sign on the sidewalk indicates a school zone, and a stop sign is visible further down the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes of traffic, including a white car in the left lane, a white SUV in the center lane, and a black car in the right lane. The road is lined with trees and bushes, and there are streetlights and a sidewalk on the right side. The sky is clear and blue, indicating a sunny day. The video captures the movement of the cars as they travel down the road, with the white car in the left lane changing lanes to the center lane. The video also shows a sign on the right side of the road, and a building with a sign that says ""Rogers"" in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving down a wet, two-lane road on a rainy day. The road is surrounded by trees and a few buildings, with a speed limit sign visible on the right side. The car is driving towards a stop sign at an intersection, and there are no other vehicles or pedestrians in sight. The weather is overcast, and the road is slick with rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple lanes of traffic. The traffic lights are red, causing vehicles to stop. There are various types of vehicles, including cars, trucks, and a fire truck. The road is lined with palm trees, and there are buildings visible in the background. The weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city intersection with multiple lanes of traffic, pedestrians, and various vehicles. The intersection is bustling with activity, as cars and pedestrians navigate the crosswalks and streets. The traffic lights are visible, and the vehicles are either stopped or moving through the intersection. The buildings lining the street are tall and modern, with a mix of commercial and residential structures. The weather appears to be clear, with good visibility. The time of day seems to be daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and a truck. The street is lined with buildings, trees, and parked cars. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the street is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night, with numerous cars and traffic lights visible. The traffic is moving slowly, and the street is well-lit with streetlights and traffic signals. The weather appears to be rainy, as the road is wet and the windshield wipers are in use. The traffic lights are green, allowing vehicles to move forward.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a double yellow line in the middle, surrounded by trees and buildings. The road curves to the right and continues straight ahead. There are no visible vehicles or pedestrians in the scene. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the lighting is soft and the sky is not bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and a truck driving down the road. The traffic lights are visible, and the cars are moving in both directions. The street is lined with palm trees and buildings, and the sky is clear with a bright sun shining. The video captures the hustle and bustle of a typical day in a city with good weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several cars parked along the sides of the road. The street is relatively quiet, with no pedestrians or other vehicles in motion. The houses are well-maintained, and the overall atmosphere is peaceful and serene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy highway scene with multiple lanes of traffic. The weather is overcast, and the road is wet, reflecting the headlights and taillights of the vehicles. The traffic is moderate, with cars maintaining a safe distance from each other. The vehicles are moving slowly due to the wet conditions. The highway is surrounded by a railing on the right side, and there are buildings visible in the background. The overall atmosphere is calm, with no signs of congestion or emergency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. The street is lined with tall buildings, and there are several pedestrians walking on the sidewalks. The weather appears to be cloudy, and the time of day is daytime. The traffic is moving slowly, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and traffic lights. The scene is set in a suburban area with a mix of residential and commercial buildings in the background. The weather appears to be cloudy, and the time of day is likely daytime. The traffic lights are visible, and the cars are moving in different directions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a busy street. The road is illuminated by streetlights and vehicle headlights, creating a well-lit environment. Multiple cars are visible, some moving forward while others are parked along the sides of the road. The street is lined with various businesses, including a restaurant with a large sign and a gas station. The traffic appears to be moderate, with cars moving at a steady pace. The overall atmosphere is vibrant and active, typical of a bustling urban area during the evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and a truck driving in different directions. The traffic is moving smoothly, and the cars are maintaining a safe distance from each other. The street is lined with trees and houses, and the sky is overcast, indicating cloudy weather. The cars are driving on a wet road, possibly due to recent rain. The overall atmosphere is calm, and the traffic appears to be flowing smoothly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses and parked cars lining both sides of the street. The houses are mostly two-story homes with garages and driveways. The street is relatively quiet, with no visible pedestrians or traffic lights. The weather appears to be clear and sunny, with shadows indicating it is daytime. The houses are well-maintained, and the street is clean and well-paved.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are buildings visible in the background. The weather appears to be clear and sunny, with a blue sky overhead. The time of day seems to be either morning or late afternoon, as the lighting is bright but not harsh.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a white USPS truck parked on the side of the road. The truck is positioned near a crosswalk, and the street is lined with trees and buildings. The traffic light is green, allowing vehicles to proceed. Several cars are visible on the road, including a black car that is parked on the side of the street. The scene is set in a city environment, with a mix of residential and commercial buildings. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and power lines. The road is relatively empty, with a few cars driving in both directions. The weather appears to be clear and sunny, with shadows cast on the road. The time of day seems to be daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime street scene with a focus on a single vehicle's perspective as it moves forward. The street is illuminated by streetlights and has a few parked cars on both sides. A prominent signboard is visible on the left side of the street, and a stop sign is present further down the road. The street appears to be relatively quiet, with no pedestrians or other vehicles in motion. The overall atmosphere is calm and still, typical of a late-night urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The road is lined with palm trees and houses, and there are several cars driving in both directions. The weather appears to be cloudy, and the time of day is daytime. The traffic lights are green, allowing vehicles to proceed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and pedestrians. The street is lined with buildings, some of which have awnings and signs. The weather appears to be cloudy, and the time of day is likely daytime. The traffic lights change throughout the video, and the cars move accordingly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a variety of objects and actions. The street is filled with cars, pedestrians, and traffic lights. The cars are parked along the sides of the street, and some are driving down the road. Pedestrians are walking on the sidewalks and crossing the street. The traffic lights are visible at various points along the street. The scene is set in a city with tall buildings and trees lining the street. The weather appears to be clear and sunny. The time of day is daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with trees and power lines, and there are a few houses visible on both sides. A few cars are parked along the street, and a few pedestrians can be seen walking. The street appears to be in a suburban area, with well-maintained lawns and driveways. The weather is sunny and clear, with no signs of rain or clouds. The time of day is daytime, with bright sunlight illuminating the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a bus driving down the road. The bus is a large, white vehicle with the number 22 on its back, and it is moving through the intersection. There are several cars on the road, including a black car turning left and a white car driving straight. The street is lined with buildings, including a pink one on the left and a yellow one on the right. There are also trees and power lines overhead. The weather appears to be cloudy, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a well-lit road. The road is illuminated by numerous streetlights, creating a bright and clear path for the driver. Several cars are visible on the road, with their headlights and taillights glowing. The traffic appears to be moderate, with cars moving in both directions. The road is bordered by sidewalks and lined with trees, adding to the scenic quality of the drive. The overall atmosphere is calm and peaceful, with the only sounds being the hum of the engine and the occasional noise from the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street and a driveway. The street is lined with houses, trees, and a few parked cars. The houses have driveways and garages, and some have cars parked in them. The street is relatively quiet, with no visible pedestrians or traffic. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely daytime, as the lighting is bright and there are no visible artificial lights.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bicycle lane. Pedestrians are crossing the street at a crosswalk, and there are traffic lights and street signs visible. The street is lined with tall buildings and trees, and the weather appears to be cloudy.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street on a rainy day. Multiple cars are stopped at a red light, including a white taxi with a red stripe and a white van with a yellow stripe. A person in a brown coat is crossing the street with an umbrella, and another person in a green coat is walking nearby. The street is wet from the rain, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. The street is lined with tall buildings, and there are trees along the sidewalk. The traffic is moving slowly, with cars stopped at a red light. The sky is overcast, indicating cloudy weather. The time of day appears to be late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a cloudy day with a parking lot and a tower in the background. A white bus is seen driving on the road, passing by a group of people standing near a stone wall. The bus continues to drive past a parking lot with several cars parked and a person walking on the sidewalk. The scene is set in a parking lot with a tower in the background, and the sky is cloudy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with various vehicles and pedestrians. The scene includes cars, trucks, and a construction crane. The traffic lights are visible, and the weather appears to be clear and sunny. The time of day is daytime, and the environment is a typical urban setting with buildings and infrastructure.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with various houses and parked cars. The street is lined with trees and has a stop sign at the intersection. A person is seen crossing the street, and a bus is driving down the road. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene is set in a suburban area with trees lining both sides of the road. The weather appears to be clear and sunny, with shadows cast by the trees indicating it is daytime. Several cars are visible on the road, some moving in the same direction as the camera, while others are coming from the opposite direction. There are also a few pedestrians walking on the sidewalks and crossing the street. The traffic lights are visible, and the road has clear lane markings.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few cars parked along the sides. The street is lined with trees and houses, and there are some stop signs visible. The weather appears to be overcast, and the time of day is likely morning or afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet road with a stop sign and a yellow diamond-shaped sign. The road is illuminated by the headlights of a car, and the surrounding area is dark. The car moves forward, and the stop sign and yellow diamond-shaped sign become visible. The car continues to move forward, and the stop sign and yellow diamond-shaped sign remain in view. The car eventually comes to a stop, and the scene becomes dark.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a bus driving down the road. The bus is silver and has the number 14 on it. The street is lined with tall buildings, and there are trees and street lamps on either side. The road has a bike lane on the left side and a bus lane on the right side. The bus is driving in the bus lane, and there are other vehicles on the road, including cars and a trolley bus. The weather appears to be clear, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered across the sky. The road is lined with trees and bushes, and there are several cars driving in both directions. The cars are moving at a moderate pace, and there are no pedestrians visible. The road appears to be well-maintained, with clear lane markings and streetlights along the sides. The weather is clear and sunny, with no signs of rain or other adverse weather conditions. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy urban street scene with multiple lanes of traffic, including cars and a bus. The traffic lights are visible, and the cars are either stopped or moving slowly. There are buildings on both sides of the street, and a train can be seen passing by on the left side. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet suburban street with a few cars driving through. The road is lined with trees and houses, and there are traffic lights and stop signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and traffic lights. The traffic lights are red, causing vehicles to stop. The street is lined with houses and trees, and the weather appears to be cloudy. The cars are of various types, including sedans and SUVs. The scene is set during the day, with the lighting indicating daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered across the sky. The road is relatively empty, with only a few cars driving in the distance. The trees on the side of the road are lush and green, and there are some buildings visible in the background. The overall scene is peaceful and quiet, with no pedestrians or other people visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered in the distance. The road is lined with tall palm trees on both sides, and there are several cars driving in both directions. The cars are moving at a moderate pace, and there are no pedestrians visible. The road appears to be well-maintained, with clearly marked lanes and traffic lights at intersections. The weather is sunny, with bright sunlight casting shadows on the road. The time of day is likely mid-morning or early afternoon, as the sun is high in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a car driving forward, surrounded by trees and streetlights. The car passes through a construction zone with orange and white striped barriers and signs indicating lane changes. The road has multiple lanes, and the car eventually reaches a traffic light, which is green. The scene is well-lit, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few parked cars and a person riding a bicycle. The street is lined with trees and has a sidewalk on one side. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered across the sky. The road is lined with trees and has a median strip separating the lanes. There are several cars driving on the road, and some pedestrians are walking on the sidewalks. The traffic lights are visible, and the road appears to be well-maintained. The overall scene is calm and peaceful, with no signs of rush hour traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street intersection with various vehicles and traffic lights. The traffic lights are red, indicating that vehicles must stop. There are multiple cars, including a black car on the left, a silver car in the center, and a white car on the right. A truck is also visible on the left side of the road. The street is lined with trees and buildings, and there is a Shell gas station on the right side. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. A black truck is driving down the street, passing a group of people walking on the sidewalk. The street is lined with trees and there are several traffic lights visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes cars, pedestrians, and traffic lights. The street is lined with trees and buildings, and there are several people walking on the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road. The car passes by several parked cars, including a white truck, and continues down the road. The street is lined with trees and buildings, and there are power lines overhead. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple lanes of traffic. A car is stopped at a red light, while other vehicles are moving through the intersection. There are several traffic lights and street signs visible, including a ""No Left Turn"" sign. The weather is clear and sunny, and the time of day appears to be midday.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The sky is overcast, and the road is relatively empty with a few cars and trucks driving in different directions. The road has a median strip with palm trees and other vegetation. The traffic lights are green, allowing vehicles to proceed. The surroundings include a mix of residential and commercial buildings, with some construction visible in the background. The overall scene is calm and orderly, with no signs of rush hour traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with multiple lanes in each direction. The road is well-lit by streetlights, and there are several vehicles visible, including a car directly ahead. The traffic appears to be moderate, with cars moving in both directions. The road has clear lane markings and a pedestrian crossing area. The surroundings are urban, with buildings and commercial establishments visible in the background. The weather is clear, and the overall scene is well-illuminated by artificial lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of parked cars and houses on both sides. The street is lined with trees and has a few pedestrians walking. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential area. The road is wet, likely from recent rain, and is illuminated by streetlights and vehicle headlights. The camera vehicle is moving forward, and the road ahead is clear of traffic. The scene is quiet, with no pedestrians or other vehicles visible. The weather appears to be overcast, and the overall atmosphere is dark and calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is lined with parked cars and houses, and the road is illuminated by streetlights. The camera moves forward, capturing the dimly lit surroundings and the occasional glimpse of a car's headlights. The scene is quiet and still, with no pedestrians or other vehicles in motion. The weather appears to be clear, with no signs of rain or fog. The overall atmosphere is peaceful and serene, with the only sounds being the occasional car engine and the distant hum of traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential area with a road that has multiple lanes and is lined with houses, trees, and street lamps. The road is relatively quiet, with a few cars driving in both directions. The houses are mostly single-story with tiled roofs, and the area appears to be well-maintained. The weather is clear and sunny, with shadows cast by the trees and street lamps. The time of day is likely midday or early afternoon, as indicated by the bright sunlight and long shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. The scene includes cars, pedestrians, traffic lights, trees, and buildings. The traffic lights are red, indicating that vehicles must stop. Pedestrians are crossing the street, and some are walking on the sidewalk. The street is lined with trees and buildings, and the weather appears to be cloudy. The time of day is daytime, as indicated by the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white truck driving down the road, followed by a red car and a white car. The truck is driving in the center lane, while the red car is in the right lane and the white car is in the left lane. The street is lined with trees and houses, and there are several street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with palm trees lining the streets. The road is relatively empty, with a few cars parked along the side and a few moving. The houses are single-story with driveways and garages. The weather appears to be clear and sunny, with shadows cast by the palm trees and other objects. The time of day is likely late morning or early afternoon, as the sun is high in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving through an intersection. The car is seen turning left onto a residential street lined with parked cars and palm trees. The street is lined with houses and trees, and the sky is clear and blue. The video captures the movement of the car as it navigates through the intersection and continues down the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked cars and moving vehicles. The street is lined with palm trees and houses, and there are a few pedestrians walking along the sidewalks. The weather appears to be clear and sunny, and the time of day is likely late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street on a rainy day. Multiple cars are driving down the street, with some turning left and others continuing straight. The street is wet from the rain, and the cars' headlights and taillights are illuminated. The buildings lining the street are tall and modern, with some having large windows. The weather is cloudy and overcast, with raindrops visible on the street and cars' windscreens. The time of day appears to be either early morning or late afternoon, as the lighting is not very bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet suburban neighborhood with a focus on a residential street. The street is lined with houses, trees, and a few parked cars. The weather appears to be clear and sunny, casting shadows on the road. The street is relatively empty, with no visible pedestrians or heavy traffic. The houses are single-story with well-maintained lawns and driveways. The overall atmosphere is calm and peaceful, typical of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a variety of objects and actions. A person on a bicycle is riding in the bike lane, while several pedestrians are crossing the street at a crosswalk. Traffic lights are visible, and cars are driving on the road. The scene is set in a city with buildings and a bridge in the background. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a stop sign and a crosswalk. The camera moves forward, capturing the intersection as vehicles approach and stop. The street is lined with buildings, trees, and power lines. A few pedestrians are visible, and the weather appears to be overcast. The video provides a clear view of the traffic and the surrounding environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a truck driving down a road with trees on both sides. The truck is white and has a logo on the back. The road has a white line on the right side and a guardrail on the left side. The sky is blue with some clouds, and the weather appears to be clear. The truck is driving on the right side of the road, and there are no other vehicles visible in the video. The video is shot during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The scene is set in a commercial area with various storefronts and buildings lining the street. The weather appears to be clear and sunny, with shadows cast by the vehicles and streetlights. The time of day is likely daytime, as indicated by the bright lighting and shadows. The traffic is moderate, with cars moving in both directions and some pedestrians visible on the sidewalks. The street is well-maintained, with clear lane markings and traffic lights regulating the flow of traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with palm trees and houses, and there are several cars parked along the side of the street. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street intersection at night, with various cars and pedestrians navigating the area. The traffic lights change from red to green, allowing vehicles to proceed. A cyclist is seen crossing the intersection, and several cars are stopped at the red light. The street is illuminated by streetlights and vehicle headlights, creating a bustling urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with parked cars on both sides, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is likely daytime. The street is relatively busy with cars moving in both directions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene is set in a suburban area with trees and buildings lining the sides of the road. The weather appears to be clear and sunny, with shadows cast on the road. The time of day is likely daytime, as indicated by the bright lighting. The traffic is moderate, with several cars moving in both directions. Some cars are turning left, while others are driving straight or making right turns. There are traffic lights and street signs visible, guiding the flow of traffic. The overall atmosphere is typical of a busy suburban street during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy day with a car driving down a street lined with trees and houses. The car is following another car, and there are traffic lights and street signs visible. The road is wet, and the sky is overcast. The car eventually comes to a stop at a traffic light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with palm trees and has a clear blue sky overhead. Traffic lights are visible at various intersections, and a Mobil gas station is present on the right side of the road. The cars are moving in both directions, and some pedestrians are walking on the sidewalks. The overall atmosphere is calm and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The scene is set in a suburban area with a clear blue sky and bright sunlight. The road is relatively empty, with a few cars and pedestrians visible. The traffic lights are red, indicating that vehicles must stop. The road has a green sign indicating the direction to Price Road Northbound. The overall atmosphere is calm and orderly, with no signs of congestion or chaos.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a stop sign painted on the road. The camera moves forward, capturing various vehicles, including a blue truck and a red car, as they pass by. The street is lined with colorful houses and parked cars, and the sky is clear and blue.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. The street is lined with tall buildings, trees, and street lamps. Pedestrians can be seen walking on the sidewalks, and some are crossing the street. The weather appears to be clear, and the time of day is likely daytime, as the street is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with parked cars on both sides, and there are several traffic lights and street signs visible. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various cars and pedestrians. The street is lined with parked cars and a few pedestrians walking along the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The street is bustling with activity, and the cars are moving in both directions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street. The road is wet, and there are several cars parked along the sides of the street. The traffic lights are visible, and some cars are driving through the intersection. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. Cars are moving in both directions, and some are parked along the sides of the road. The scene includes various vehicles such as cars, trucks, and a bicycle. There are also several pedestrians visible, walking on the sidewalks or crossing the street. The street is lined with trees and buildings, and there are traffic lights and street signs present. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day seems to be daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by trees and street lights. The road is relatively empty, with only a few cars driving in the opposite direction. The weather appears to be clear, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a series of parked cars along both sides. The street is lined with houses, and there are trees and power lines visible. The weather appears to be clear and sunny, with shadows cast by the parked cars and trees. The street is relatively quiet, with no visible pedestrians or moving vehicles. The time of day is likely daytime, as indicated by the bright sunlight and shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions. The road is lined with trees and palm trees, and there are buildings on either side. The weather appears to be clear and sunny, with shadows cast on the road. The cars are moving smoothly, and there are no pedestrians visible. The scene is typical of a suburban area with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The road is lined with palm trees and houses, and there are several vehicles parked along the street. A few pedestrians are walking on the sidewalks, and a car is driving down the road. The scene is peaceful and quiet, with no signs of traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential area with a hill in the background. The sky is cloudy, and the time of day appears to be daytime. The scene includes a white van parked on the street, a stop sign, and a person standing on the sidewalk. There are also cars driving on the road and parked along the street. The area appears to be quiet and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and bicycles. The street is lined with tall buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime. The traffic is moving smoothly, and there are no visible accidents or incidents.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. The road is marked with lanes for buses and taxis, as indicated by the painted markings. Several cars are stopped at a red light, while others are moving through the intersection. Pedestrians can be seen walking on the sidewalks, and tall buildings line the street. The weather appears to be clear, and it is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked and moving vehicles. The street is lined with palm trees and houses, and there are several cars parked along the curb. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the sky is bright but not overly sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a motorcycle. The street is lined with tall buildings, trees, and a pedestrian crosswalk. The weather appears to be clear and sunny, and the time of day is likely daytime. The traffic is moving smoothly, and there are no visible pedestrians crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street at night, with numerous cars and pedestrians visible. The street is illuminated by streetlights and traffic lights, and there are several cars parked along the side of the road. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and streetlights. The road is mostly clear, with a few cars and a truck visible. The weather appears to be sunny, and the time of day is likely daytime. The road has a few orange and white striped poles on the side, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street intersection with various vehicles and pedestrians. A blue convertible is waiting at a red light, while other cars are driving through the intersection. There are several potted plants and a clock on the sidewalk, and a truck is parked nearby. The sky is overcast, indicating cloudy weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered in the distance. The road is lined with tall palm trees and a few other types of trees, creating a shaded and serene atmosphere. The road is mostly empty, with only a few cars parked along the side of the road. The road curves slightly to the right, and there are a few signs and streetlights visible. The overall scene is peaceful and quiet, with no signs of traffic or people moving quickly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at the intersection. The street is lined with parked cars and houses, and there are trees and power lines visible in the background. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a bus and several cars. The bus is driving down the street, and the cars are following behind it. The street is lined with tall buildings, and there are people walking on the sidewalks. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day with a car driving through a foggy intersection. The car is seen driving down a street with other cars in the same lane, and there are traffic lights visible in the distance. The scene is set in a city with buildings in the background, and the weather is cloudy and rainy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky and bright sunlight. The road is lined with palm trees and houses, and there are several parked cars along the sides. As the camera moves forward, it captures a stop sign and a field in the distance. The street is relatively quiet, with no visible pedestrians or moving vehicles. The overall atmosphere is peaceful and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and houses, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is daytime. The cars are moving slowly, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a single-story house and a stop sign at the end of the street. The house has a large driveway and a garage, and there are several trees and bushes in front of it. The sky is clear, indicating a sunny day, and the street is empty except for a car that drives by at the end of the video.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is mostly empty, with only a few parked cars visible on the sides. The street is lined with tall trees and streetlights, casting shadows on the pavement. The houses along the street appear well-maintained, with neatly trimmed lawns and driveways. The overall atmosphere is calm and serene, with no visible pedestrians or vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is illuminated by streetlights, and houses line both sides of the road. A white truck is parked on the right side of the street, and a car is visible in the distance. The sky is dark, indicating it is nighttime. The overall scene is quiet and peaceful, with no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in an urban setting, with a white truck driving down a city street. The truck is surrounded by multiple orange traffic cones, indicating a construction zone or road closure. The street is wet, reflecting the rain, and there are several orange traffic cones placed at intervals along the road. The truck is moving slowly, possibly due to the construction or traffic conditions. Pedestrians can be seen walking on the sidewalk, and some are carrying umbrellas to shield themselves from the rain. The overall scene is typical of a rainy day in a busy city, with traffic and pedestrians navigating the wet and slippery conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet, tree-lined street with a clear blue sky overhead. The road is mostly empty, with only a few cars visible in the distance. The street is well-maintained, with well-kept sidewalks and lush greenery on either side. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not explicitly stated, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a two-lane road with a yellow center line and white lane dividers. The road is illuminated by streetlights, and there are several vehicles visible, including a white car in the left lane and a white truck in the right lane. The scene is set in a quiet neighborhood with houses and trees lining the sides of the road. The weather appears to be clear, and the overall atmosphere is calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a bus driving down the road. The bus is a large, white vehicle with the number 14 displayed on its front. It is traveling in the center of the street, surrounded by various cars and pedestrians. The street is lined with tall buildings on both sides, and there are traffic lights visible in the background. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day seems to be daytime, as the street is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with heavy traffic during what appears to be rush hour. The sun is setting, casting a warm glow over the scene. Multiple cars are stopped at a red light, with their brake lights illuminated. The traffic is dense, and the road is lined with various vehicles, including minivans, sedans, and trucks. The sky is clear, and the overall atmosphere is typical of a bustling urban environment during peak travel times.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a well-lit road with multiple lanes. The road is illuminated by numerous streetlights, and the headlights of approaching vehicles create a bright, dynamic scene. Several cars are visible, some of which are turning left at an intersection. The road appears to be in a suburban or semi-urban area, with some buildings and trees visible in the background. The weather is clear, and the sky is dark, indicating it is nighttime. The overall atmosphere is calm, with the steady flow of traffic creating a sense of routine and order.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various objects and actions. The street is filled with cars, some of which are parked along the side of the road, while others are driving. There are also several pedestrians walking on the sidewalks, and a few people are riding bicycles. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where a car is driving forward. The car passes a white truck and a white car, and there are several other cars on the road. The road is lined with trees and streetlights, and there are houses visible in the background. The weather appears to be clear and sunny, with a blue sky and some clouds. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street. The road is wet, and there are several cars driving slowly, with some parked along the sides. The sky is overcast, and the visibility is slightly reduced due to the rain. The street is lined with trees and streetlights, and there are a few buildings visible in the background. The overall atmosphere is calm and quiet, with no pedestrians or other significant activities observed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and bicycles. The street is lined with tall buildings, and there are several pedestrians walking on the sidewalks. The weather appears to be clear, and the time of day is likely daytime, as the street is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and traffic lights. The scene is set in a commercial area with a large building in the background. The weather is clear and sunny, and the time of day appears to be late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a white bus driving down a street with trees on both sides. The bus is moving slowly and is surrounded by several cars, including a white van and a black car. The street has a bike lane, and there are several pedestrians walking on the sidewalk. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a red truck driving down it. The road is lined with palm trees and has a median strip separating the lanes. There are traffic lights and street signs visible, indicating directions and speed limits. The sky is clear with some clouds, suggesting a sunny day. The road appears to be in a suburban or semi-rural area, with buildings and greenery visible in the background. The video captures the truck as it moves along the road, passing by other vehicles and infrastructure.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in an urban setting. The street is wet, and there are several pedestrians walking with umbrellas. A few cars are visible on the road, and traffic lights are present at the intersection. The scene is relatively quiet, with no signs of heavy traffic or congestion. The weather is cloudy and rainy, with raindrops visible on the ground and umbrellas held by pedestrians. The time of day appears to be daytime, as there is natural light illuminating the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street lined with houses and parked cars. The houses have a consistent architectural style, featuring tiled roofs and stucco exteriors. The street is relatively quiet, with no visible pedestrians or heavy traffic. The weather appears to be clear and sunny, as indicated by the bright lighting and shadows cast by the houses and trees. The time of day seems to be midday or early afternoon, given the intensity of the sunlight. The overall scene is peaceful and typical of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The scene includes several cars, some of which are turning left, while others are driving straight or making right turns. The road is lined with palm trees and has a median strip separating the lanes. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a bus, all moving in different directions. Pedestrians can be seen walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime. The street is flanked by tall buildings and construction sites, indicating an urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with trees and buildings, and there are traffic lights and billboards visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving along the street, and some pedestrians are walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a city street. The road is wet, and several cars are driving slowly, with some pedestrians walking with umbrellas. The street is lined with buildings, and there are traffic lights and street signs visible. The weather is overcast, and the overall scene is quiet and calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several cars parked along the curb. The road is relatively quiet, with only a few cars driving by. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The cars are parked along the sides of the road, and some are driving. A person is seen crossing the street, and another person is walking on the sidewalk. The street is lined with trees and buildings, and the weather appears to be clear and sunny. The time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars and a bus. Pedestrians are crossing the street at a crosswalk, and traffic lights are visible in the background. The street is flanked by tall buildings, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a city with a street scene. The weather is overcast, and the road is wet with visible puddles. Several cars are driving on the road, including a white car turning left and a black car passing by. There are also a few pedestrians walking on the sidewalk. The street is lined with trees and buildings, and a solar compactor is visible on the sidewalk. The overall atmosphere is quiet and calm, with the sound of rain and traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes various vehicles such as cars, a truck, and a van, all moving in different directions. There are traffic lights and street signs visible, indicating directions and speed limits. The environment is a mix of urban and suburban, with houses and trees lining the sides of the road. The weather appears to be clear and sunny, with shadows cast by the vehicles and streetlights. The time of day is likely daytime, as indicated by the bright sunlight and shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars and pedestrians. The road is lined with trees and has a median strip separating the lanes. The weather is clear and sunny, with shadows cast on the road. The time of day appears to be mid-morning or afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime street scene with a few cars driving and pedestrians walking. The street is illuminated by streetlights and the headlights of the cars. There are a few people walking on the sidewalks, and the traffic lights are visible. The street appears to be relatively quiet, with only a few cars and pedestrians present.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a rainy evening on a wet road with a car approaching the camera. The car's headlights are on, and the road is illuminated by streetlights. The traffic lights are visible, and the car is approaching a green light. The road is wet, and the sky is overcast, indicating cloudy weather. The car continues to move forward, and the traffic lights change to yellow, then red. The car comes to a stop at the intersection, and the traffic lights turn green. The car then continues to move forward, and the traffic lights remain green. The road is wet, and the sky is overcast, indicating cloudy weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white line in the middle and a white line on the right side. The road is wet, and there are cars driving on it. The sky is blue with some clouds, and the sun is shining brightly. The road has a few traffic lights, and there are buildings on the left side. The video shows a busy street with cars passing by, and the sun is setting in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. The street is lined with parked cars and pedestrians walking along the sidewalks. A truck is driving down the street, and a person is seen crossing the road. The sky is overcast, and the street is busy with activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane highway. The road is well-lit by streetlights, and numerous vehicles are visible, including cars and trucks. The traffic appears to be moderate, with cars moving in both directions. The highway has multiple lanes, and some vehicles are changing lanes. The surroundings are urban, with buildings and signs visible in the distance. The weather seems clear, and the overall scene is typical of a busy highway at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. A green car is driving down the street, while a man and a child cross the street. There are several cars parked and driving on the street, and a few pedestrians walking on the sidewalk. A traffic light is visible in the background, and a building with a sign is present on the right side of the street. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane highway with multiple lanes in each direction. The road is well-lit by streetlights and traffic signals, and there are several vehicles visible, including cars and trucks. The traffic appears to be moderate, with some cars moving and others stopped at traffic lights. The scene is set in an urban area, with buildings and commercial establishments visible in the distance. The weather is clear, and the overall atmosphere is typical of a busy city highway at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several parked cars along the sides of the road. As the camera moves forward, we can see a few pedestrians walking on the sidewalks and a few vehicles driving down the street. The street appears to be relatively quiet, with no signs of heavy traffic or congestion. The overall atmosphere is peaceful and serene, with the sound of birds chirping and the occasional car engine providing background noise.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and pedestrians. The scene includes traffic lights, street signs, and buildings in the background. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are stopped at a red light, and a person on a bicycle is crossing the intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes cars, trucks, and pedestrians. The traffic lights are visible, and some cars are turning left. The weather appears to be clear and sunny, and the time of day is daytime. The street is lined with palm trees and buildings, indicating a suburban or urban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet intersection with a clear blue sky and bright sunlight. The road is mostly empty, with only a few cars and a truck passing through. The traffic lights are red, and the surroundings are lined with trees and a few buildings. The scene is peaceful and serene, with no pedestrians or other significant activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime street scene with a focus on a two-way road. The road is illuminated by streetlights and has a yellow center line. Several cars are parked along both sides of the street, and a few are driving. The buildings on either side of the street are mostly residential, with some commercial establishments visible. The sky is dark, indicating it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and has a median strip separating the opposing traffic. There are traffic lights at the intersections, and the sky is clear, indicating a sunny day. The cars are moving smoothly, and there are no pedestrians visible in the scene. The overall environment appears to be a suburban area with well-maintained roads and greenery.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses and parked cars lining both sides of the street. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are two-story homes with garages and driveways. The weather appears to be overcast, and the time of day is likely daytime. The street is lined with parked cars, and there is a garbage truck parked on the side of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and traffic lights. The street is lined with trees and buildings, and there are multiple cars, trucks, and a school bus driving and parked along the road. The traffic lights are visible at different intersections, and some cars are waiting at the red light. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car approaching a stop sign. The car is moving forward, and the stop sign is clearly visible in the foreground. The street is lined with parked cars on both sides, and there are trees and buildings in the background. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a winding road with a yellow line in the middle, surrounded by greenery and a cloudy sky. The road leads to a stop sign and a parking area with a red building and a tower. The scene is quiet with no visible pedestrians or vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. The scene includes cars, trucks, and a bicycle, all moving along the road. The street is lined with tall buildings, and there are several traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars driving through. The road is lined with trees and buildings, and there are traffic lights at intersections. The weather appears to be overcast, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus lane. Pedestrians are crossing the street at a crosswalk, and some are carrying umbrellas, indicating that it might be raining. The traffic lights are visible, and the street is well-lit, suggesting it is daytime. The scene is bustling with activity, and the presence of the bus lane indicates a well-organized transportation system.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars and buildings. The road is relatively empty, with only a few pedestrians visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a parking lot with a few cars parked and a few people walking around. The weather appears to be sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The houses have tiled roofs and are surrounded by well-maintained lawns and driveways. The street is relatively quiet, with a few cars parked along the side and a few moving. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day is likely daytime, as indicated by the bright sunlight and shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a wide road and sidewalks on both sides. The street is lined with tall trees and a few houses, some of which have visible roofs and windows. The sky is clear with a few scattered clouds, indicating a sunny day. The road appears to be in good condition, with no visible cracks or potholes. The overall scene is peaceful and serene, with no visible pedestrians or vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides of the road. The street is lined with houses, and there are several parked cars in front of them. The weather appears to be clear and sunny, with shadows cast by the parked cars and streetlights. The street is relatively quiet, with no pedestrians or moving vehicles visible. The houses are of various styles, with some having driveways and others having garages. The overall scene is peaceful and typical of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy parking lot with numerous cars parked and a few people walking around. The weather appears to be clear and sunny, with shadows cast by the vehicles and people. The cars are of various types, including sedans and SUVs, and are parked in a line, filling the lot. Some people are standing near the cars, possibly looking at them or waiting for someone. The overall atmosphere is calm and orderly, with no signs of rush or panic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with tall trees and streetlights, and there are a few houses visible in the background. The street is mostly empty, with only a few cars parked along the side of the road. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few cars and pedestrians. The road is lined with trees and houses, and there are streetlights and signs along the sidewalk. The weather appears to be clear and sunny, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is dimly lit by streetlights and the headlights of the car. Several cars are parked along both sides of the street, and a few are driving. The road appears to be in good condition, with clear lane markings. The neighborhood is quiet, with no pedestrians visible. The weather seems clear, with no signs of rain or snow. The overall atmosphere is calm and peaceful, typical of a residential area at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white van driving down a road. The road is lined with palm trees and has a sidewalk on the right side. There are several cars parked along the side of the road, and a few pedestrians are walking on the sidewalk. The sky is clear and blue, indicating a sunny day. The street is relatively quiet, with only a few cars passing by.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The weather appears to be overcast, and the road is wet, possibly due to recent rain. Several vehicles, including cars and trucks, are visible, some with their brake lights on, indicating slow-moving traffic or a stop. The cars are driving in both directions, and there are streetlights and signs along the sides of the road. The overall atmosphere suggests a typical busy highway during a cloudy day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. A red car is turning left onto the street, while several pedestrians are crossing the street at a crosswalk. The street is lined with parked cars and buildings, and there are power lines and trees visible in the background. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street on a rainy day. The scene includes multiple cars, pedestrians, traffic lights, trees, and buildings. The traffic lights are red, causing vehicles to stop, while pedestrians cross the street holding umbrellas. The weather is cloudy and rainy, with visible raindrops on the ground and wet surfaces. The time of day appears to be daytime, as the lighting is bright but overcast.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked cars and moving vehicles. The street is lined with houses, trees, and street lamps. The weather appears to be overcast, and the time of day is likely late afternoon or early evening. The street is relatively quiet, with only a few cars driving and others parked along the side.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet city street. The road is illuminated by streetlights and reflects the lights, creating a glossy surface. Several cars are parked along both sides of the street, and a few are driving, their headlights cutting through the darkness. The street is lined with buildings, some of which have lights on. The overall atmosphere is quiet and still, with the sound of rain and occasional car noises adding to the ambiance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with various vehicles and pedestrians. A white van is seen turning left onto the main road, while a white car is driving straight through the intersection. Several people are crossing the street, and a bus is waiting at the stoplight. The scene is set in a city with a cloudy sky overhead.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with trees and houses, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving along the road, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The road is illuminated by streetlights and the headlights of various vehicles. Several cars are visible, some moving forward while others are stationary at traffic lights. The street is lined with buildings on both sides, and a few pedestrians can be seen walking along the sidewalks. The overall atmosphere is quiet, with minimal traffic and a calm urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a bike lane, where a car is driving down the road. The car is passing by a park with trees and a sidewalk. The road is lined with houses and trees, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white car and a blue car driving down it. The road is lined with trees and has a sidewalk on the right side. There are also some buildings visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bicycle lane. The street is lined with tall buildings, trees, and pedestrians walking on the sidewalks. The traffic lights are green, allowing vehicles to move through the intersection. The weather appears to be clear and sunny, with shadows cast by the buildings and trees. The time of day is likely daytime, as the street is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The road is lined with orange and white striped barriers, and there are several cars driving in different directions. The sky is clear and blue, indicating a sunny day. The surroundings include trees and buildings in the distance, and the overall scene appears to be a busy street in a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a traffic light and a truck. The traffic light is red, and a truck is seen driving through the intersection. The street is lined with trees and buildings, and there are several cars parked or driving on the sides of the road. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses, parked cars, and streetlights. The weather appears to be cloudy, and the time of day is likely evening or early morning. The scene is quiet, with no visible pedestrians or moving vehicles. The houses are well-maintained, and the streetlights are turned on, indicating it's getting dark.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The weather appears to be overcast, and the road is wet, possibly due to recent rain. Several cars are visible, some with their headlights on, indicating low visibility. The cars are moving in different directions, and there are street signs overhead providing directions. The overall atmosphere is calm, with no signs of congestion or emergency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and motorcycles. The street is lined with trees and buildings, and there are several pedestrians walking along the sidewalks. The traffic lights are visible, and the cars are moving in both directions. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The road is dimly lit by streetlights and the headlights of approaching vehicles. Several cars are parked along both sides of the street, and a few are driving. The surroundings are mostly dark, with some houses and trees visible in the distance. The overall atmosphere is quiet and still, with no pedestrians or other pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The street is illuminated by streetlights and the headlights of numerous vehicles. The scene includes a variety of cars, some of which are parked along the sides of the road, while others are in motion. Pedestrians can be seen crossing the street and walking on the sidewalks. The street is lined with trees and buildings, and there are traffic lights visible at intersections. The overall atmosphere is busy and active, typical of a city environment at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a pedestrian crossing the road. The street is lined with parked cars and a few pedestrians walking on the sidewalks. The traffic light is green, allowing vehicles to proceed. The weather appears to be overcast, and the time of day is likely daytime. The street is relatively quiet, with no heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and power lines, and there are streetlights along the sides. The weather appears to be clear and sunny, with shadows indicating it is daytime. The cars are maintaining a steady flow, and there are no pedestrians or other obstacles visible. The scene is typical of a suburban or semi-urban area with well-maintained roads and greenery.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a cloudy day. The road is wet, and there are several parked cars along the sides of the street. The street is lined with trees and houses, and there are a few pedestrians visible. The sky is overcast, and the overall atmosphere is quiet and calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white truck driving down the center lane, surrounded by palm trees and other vegetation. The truck is moving forward, and there are no other vehicles in the immediate vicinity. The road is well-maintained, with clear lane markings and a speed limit sign indicating 45 mph. The weather appears to be clear and sunny, with a blue sky overhead. The surroundings suggest a suburban or rural area, with buildings visible in the distance. The video captures the peaceful and serene atmosphere of a quiet road on a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic and parked cars on both sides. The street is lined with trees and buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The traffic is moderate, with cars moving in both directions and some turning at intersections. The street is well-lit, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a stop sign at an intersection. The street is lined with parked cars on both sides, and there are trees and houses visible in the background. The sky is clear, indicating a sunny day. The camera moves forward, capturing the intersection and the surrounding area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses and parked cars lining both sides of the street. The street is relatively quiet, with no visible pedestrians or moving vehicles. The houses are two-story homes with various architectural styles, and the street is lined with parked cars, including a black SUV in the foreground. The weather appears to be overcast, and the time of day is likely late afternoon or early evening, given the lighting conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. A white car is driving down the street, passing a white car parked on the side. A person is walking on the sidewalk, and a white car is parked in front of a building. The street is lined with trees and power lines, and there is a fire hydrant on the sidewalk. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white bus driving down a road. The bus is moving away from the camera, and the street is lined with parked cars on both sides. The weather appears to be overcast, and the road is wet, possibly from recent rain. The buildings on either side of the street are multi-story and have a residential or commercial appearance. There are no pedestrians visible in the scene. The overall atmosphere is quiet and calm, with no significant events occurring.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes several cars, some of which are moving while others are stationary. There are also a few pedestrians visible, walking along the sidewalks. The street is lined with trees and houses, and there are traffic lights and street signs present. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few trees lining the sides. The road is mostly empty, with only a few cars driving in the distance. The cars are moving slowly, and the road appears to be in good condition. The trees on the sides of the road are tall and green, and there are a few bushes and plants in the median. The weather is clear and sunny, with no clouds in sight. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street on a rainy day. Multiple cars are driving down the street, and pedestrians are crossing the road at a crosswalk. Some people are holding umbrellas, while others are carrying backpacks. The street is wet from the rain, and there are traffic lights and street signs visible. The overall atmosphere is busy and bustling, with people going about their daily routines despite the inclement weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with street lamps and trees, and there are sidewalks on either side. The weather appears to be clear and sunny, with no visible clouds. The time of day seems to be daytime, as the lighting is bright and natural. The road is relatively busy, with cars moving at a moderate pace.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked cars and moving vehicles. The street is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street lined with houses and parked vehicles. The houses are two-story homes with garages and driveways, and the street is lined with palm trees. The weather appears to be clear and sunny, with shadows indicating it is daytime. The video captures the movement of cars driving down the street, including a white truck and a silver SUV. The scene is peaceful and quiet, with no pedestrians or other significant activities observed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a suburban neighborhood. The road is wet, and there are several cars parked along the sides of the street. The sky is overcast, and the trees are bare, indicating it might be late fall or winter. The cars are driving cautiously, and some have their headlights on. The scene is quiet, with no pedestrians visible. The overall atmosphere is calm and subdued due to the weather conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions, including a car turning left and a car driving down the street. The street is lined with palm trees and houses, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a parking lot on the left side, featuring a large tower and a hill with a fence and a tree. The road curves around the hill, and there are several cars parked along the side of the road. The sky is cloudy, and the overall scene is quiet and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene of a busy street with multiple lanes of traffic. The street is illuminated by numerous streetlights, creating a well-lit environment. Several cars are visible, moving in both directions, and some are parked along the sides of the road. A few pedestrians can be seen walking on the sidewalks. The traffic lights are visible, and the overall atmosphere is vibrant and active despite the late hour.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot with various cars parked and moving around. The scene is set in a sunny day with clear skies, and the surroundings are filled with palm trees and other vegetation. The cars are parked in different directions, and some are driving in and out of the lot. The overall atmosphere is calm and relaxed, with no signs of rush or urgency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses, parked cars, and a street with a stop sign. The street is lined with parked cars, and there are several houses with driveways and garages. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a fire truck. Pedestrians are crossing the street at a crosswalk, and there are several buildings lining the street. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street intersection with multiple cars and pedestrians. The traffic lights are red, and the cars are stopped at the intersection. The scene is set in a city with tall buildings and trees in the background. The weather appears to be clear and sunny, and the time of day is likely morning or afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars, trucks, and a tram. The street is lined with tall buildings, and there are traffic lights and street signs visible. Pedestrians can be seen crossing the street, and the weather appears to be cloudy. The time of day is likely late afternoon or early evening, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a highway with multiple lanes of traffic, including cars and trucks. The weather appears to be foggy, as indicated by the reduced visibility and the presence of fog on the windshield. The time of day is likely early morning or late evening, as the sky is dimly lit. The traffic is moving slowly, and the cars are maintaining a safe distance from each other. The road is well-marked with white lines, and there are streetlights visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a large building with an orange and white facade, which appears to be a Walmart store. The building has a large parking lot in front of it, filled with numerous cars. The street is lined with trees and has a yield sign painted on the road. There are a few pedestrians walking on the sidewalk, and the sky is clear with a blue hue, indicating a sunny day. The overall atmosphere is calm and typical of a suburban shopping area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few cars and bicycles passing by. The street is lined with trees and houses, and there are power lines overhead. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including a bus lane and a taxi lane. The street is lined with parked cars and buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and a bus driving down the road. The road is lined with trees and has a sidewalk on the right side. The sky is cloudy, indicating an overcast day. The cars are moving in both directions, and the bus is driving in the center lane. The traffic appears to be moderate, with some cars stopped at a traffic light. The overall atmosphere is calm, with no signs of rush hour or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is lined with trees and streetlights, and there are several cars parked along the side of the road. The cars are of various colors, including white, black, and red. The road appears to be in a residential area, with houses visible in the background. The weather is sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street on a rainy day. Multiple cars are driving down the street, with some turning left and others continuing straight. Pedestrians are crossing the street at a crosswalk, and a few are walking on the sidewalk. The street is wet from the rain, and traffic lights are visible in the background. The scene is set in an urban environment with buildings lining the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. Several cars are driving in both directions, and some are parked along the sides of the road. The street is lined with trees and power lines, and there are traffic lights visible in the distance. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple lanes of traffic, including a red car in the center lane, a white car in the left lane, and a silver car in the right lane. The street is lined with palm trees and buildings, and there are several streetlights and traffic lights visible. The sky is blue with some clouds, indicating a clear day. The video captures the movement of cars and the overall atmosphere of a typical urban street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of parked cars along both sides. The street is lined with houses, some of which have visible porches and balconies. The weather appears to be overcast, suggesting a cloudy day. The street is relatively quiet, with no visible pedestrians or moving vehicles. The houses are of different architectural styles, and the street is bordered by a mix of greenery and paved areas.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is dimly lit by streetlights and the headlights of the vehicle. Several cars are parked along both sides of the street, and houses with lit windows can be seen in the background. The road is relatively empty, with no pedestrians or other vehicles in motion. The overall atmosphere is quiet and peaceful, typical of a residential area at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and trucks. The street is lined with buildings, some of which have storefronts and signs, such as a Coca-Cola sign and a ""Pumpkin Restaurant"" sign. There are also trees and power lines overhead. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and buses, as well as traffic lights and street signs. The weather appears to be clear and sunny, with the time of day being daytime. The street is lined with trees and buildings, creating a typical urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at dusk with numerous cars and trucks driving in both directions. The road is well-lit by streetlights and traffic signals, and there are palm trees lining the sides. The traffic is moving smoothly, and the sky is a mix of blue and orange hues, indicating the transition from day to night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street lined with houses and trees. The houses have tiled roofs and well-maintained front yards. The street is relatively quiet, with a few parked cars and a truck driving down the road. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day is likely midday or early afternoon, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars, buses, and pedestrians. The street is lined with tall buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a single car driving down the road. The street is lined with trees and houses, and there are no pedestrians or other vehicles visible. The weather appears to be clear and sunny, with shadows cast by the trees and the car. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a car driving forward, passing through an intersection with traffic lights. The road is lined with trees and houses, and there are several cars parked or driving on the side of the road. The sky is cloudy, and the overall scene is relatively quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and a tram. The street is lined with tall buildings, trees, and pedestrians walking on the sidewalks. The weather appears to be cloudy, and the time of day is daytime. The traffic is moving smoothly, and there are no visible accidents or incidents.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various vehicles and objects. The street is lined with parked cars and trees, and there is a stop sign at the intersection. A motorcycle is parked on the sidewalk, and a fire hydrant is visible near the curb. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a busy city street with heavy traffic. Multiple cars are stopped at a red light, and there are construction cones and barriers on the left side of the road. The street is flanked by tall buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and pedestrians. A large bus is seen driving down the street, while several cars are parked along the sides. Pedestrians are walking on the sidewalks, and a few are crossing the street. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street scene with multiple cars and pedestrians. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving along the street, and pedestrians are walking on the sidewalks. The scene is busy with traffic and people going about their day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with no pedestrians visible. The road has a speed bump in the middle, and there are signs indicating a school zone. The weather appears to be sunny, with good visibility. The video captures the peaceful atmosphere of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a bus, all moving in different directions. Pedestrians can be seen walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime. The street is lined with buildings and shops, creating a bustling urban atmosphere.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a train passing by on the left side, a truck stopped at a red light, and pedestrians walking on the sidewalk. The street is lined with buildings, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are houses visible on the sides. The weather appears to be clear and sunny, with a blue sky overhead. The cars are moving smoothly, and there is no visible traffic congestion. The scene is set in a suburban area, with residential houses and greenery surrounding the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and trucks. The street is lined with tall buildings, trees, and street signs. The weather appears to be cloudy, and the time of day is likely daytime. The traffic is moderate, with cars moving in both directions. The street is well-lit, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with parked cars along both sides. The street is lined with trees and houses, and there are no pedestrians or moving vehicles visible. The weather appears to be overcast, and the time of day is likely daytime, although the exact time cannot be determined. The street is relatively empty, with only a few parked cars and no visible traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a few cars driving in both directions. The road is lined with trees and houses on the right side. The sky is clear, indicating a sunny day. The cars are moving smoothly, and there are no pedestrians or other obstacles in the scene. The road appears to be in a suburban area, with houses and trees lining both sides.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential neighborhood with a clear blue sky and bright sunlight. The street is lined with palm trees and houses, and there are streetlights and stop signs visible. A silver car is seen driving down the street, and a white car is parked on the side of the road. The scene is peaceful and there are no pedestrians or other vehicles in sight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, traffic lights, trees, and buildings. The weather appears to be clear and sunny, and the time of day is daytime. The traffic is moving smoothly, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a large bus in the center of the frame. The bus is moving forward, and its brake lights are on, indicating it may be slowing down or stopping. There are several cars and other vehicles around the bus, some of which are also displaying brake lights. The street is lined with palm trees and buildings, and there are traffic lights and street signs visible. The weather appears to be overcast, and the time of day is likely late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene at night. The street is illuminated by streetlights and the headlights of numerous cars. There are several cars stopped at a red light, and others are driving through the intersection. A few pedestrians are crossing the street, and a cyclist is riding through the intersection. The street is lined with buildings and trees, and there are traffic lights and street signs visible. The overall atmosphere is bustling and active, with the glow of artificial lights contrasting against the dark sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and a bus driving down a road lined with trees and houses. The road has a double yellow line in the center and yellow crosswalks at the intersections. The weather appears to be overcast, and the time of day is likely morning or late afternoon. The cars are driving in both directions, and there are no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is empty, with no visible vehicles or pedestrians. The street is lined with tall trees and well-maintained lawns, and there are several houses visible in the background. The weather appears to be sunny, with bright sunlight illuminating the scene. The time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime urban scene with a focus on a street intersection and a parking lot. The street is dimly lit by streetlights, and several cars are parked along the curb. The parking lot is mostly empty, with a few vehicles visible. The buildings surrounding the area are dark, and the streetlights cast a yellowish glow. The video captures the quiet atmosphere of the city at night, with minimal traffic and activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered in the distance. The road is lined with trees and has a few cars driving in both directions. The cars are moving at a moderate pace, and there are no pedestrians visible. The road has a few traffic lights, and some cars are waiting at the red light. The surroundings are quiet and peaceful, with no signs of urban congestion. The weather is clear and sunny, with no signs of rain or storms. The time of day appears to be midday, as the sun is shining brightly and casting shadows on the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a yellow crosswalk in the foreground. A black SUV is driving down the street, and a white car is approaching the intersection. The traffic light is red, and the street is lined with trees and houses. The weather appears to be overcast, and the time of day is likely morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving down a tree-lined street on a foggy day. The car is following a silver sedan, which is driving in the right lane. The street is wet, and there are several cars visible in the distance. The sky is overcast, and the visibility is low due to the fog. The car continues to drive down the street, passing a few more cars and a white van parked on the side of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and trucks. The street is lined with buildings, trees, and streetlights. The weather appears to be cloudy, and the time of day is daytime. The traffic is moderate, with cars moving in both directions. The street is well-lit, and the overall scene is busy and typical of a city environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a white truck driving down the road. The street is lined with houses, trees, and parked cars. The sky is cloudy, and the overall scene is quiet and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city intersection with multiple lanes of traffic. A green van is driving down the street, while a silver SUV is waiting at the intersection. There are several cars and pedestrians in the area, and a traffic light is visible in the background. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. Pedestrians are crossing the street and walking on the sidewalks. The street is well-lit, suggesting it is daytime. There are traffic lights and street signs visible, indicating a well-organized urban environment. The weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. The street is lined with parked cars, and there are several buildings on both sides. A truck is parked on the side of the road, and a white van is driving down the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy street with parked cars on both sides. The camera moves forward, revealing more parked cars and a foggy sky. The street is wet, and there are trees and power lines visible. The fog obscures the view of the buildings and the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a traffic light and a person riding a bicycle. The traffic light is red, indicating that vehicles must stop. The person on the bicycle is waiting at the intersection, likely preparing to proceed when the light changes. The street is lined with trees and has a sidewalk on the right side. There are no other vehicles or pedestrians visible in the scene. The weather appears to be clear and sunny, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are a few cars parked along the side of the road. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a series of houses and parked cars on both sides. The street is lined with trees and has a few streetlights. The houses vary in size and color, with some having balconies or carports. The weather appears to be overcast, and the time of day is likely late afternoon or early evening, as the lighting is dim. The street is relatively quiet, with no pedestrians or moving vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene is set in a suburban area with palm trees lining the road. The weather appears to be clear and sunny, with shadows indicating it is daytime. Various cars are moving in different directions, and some pedestrians can be seen walking on the sidewalks. The traffic is moderate, with vehicles maintaining a steady flow.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a wet road, with raindrops on the windshield causing light reflections. The scene is illuminated by streetlights and vehicle headlights, creating a blurry and distorted view. The road is lined with traffic lights and street signs, and there are several cars visible, some of which are stopped at red lights. The overall atmosphere is dark and moody, with the rain adding a sense of mystery and intrigue.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by trees and street lights. The road is relatively empty, with a few cars driving in the opposite direction. The sky is clear, indicating a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street at night, with tall buildings lining both sides. The street is wet, reflecting the lights from the vehicles and street lamps. There are several people walking across the street, and some are carrying umbrellas. The traffic lights are red, and there are cars stopped at the intersection. The street is illuminated by street lamps and the headlights of the cars. The overall atmosphere is bustling and lively, typical of a city at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with parked cars and houses. The street is relatively quiet, with a few pedestrians walking and a few vehicles driving or parked. The houses are mostly two-story homes with wooden fences and driveways. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The scene is set in a suburban area with palm trees lining the sides of the road. The weather appears to be clear and sunny, with shadows cast by the vehicles and streetlights. The time of day is likely daytime, as indicated by the bright sunlight and shadows. The traffic is moderate, with cars moving in both directions and some vehicles parked along the side of the road. The streetlights are on, suggesting it might be early morning or late afternoon. Overall, the scene is a typical day in a suburban area with moderate traffic and clear weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. Several cars are stopped at a red light, including a blue car directly behind the camera. The traffic is dense, with cars of various colors and sizes, including a white truck and a black car. There are traffic lights and street signs visible, indicating directions and traffic rules. The sky is overcast, suggesting cloudy weather. The overall setting appears to be an urban area with trees and buildings in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street on a cloudy day. The road is lined with trees and houses, and there are a few cars driving slowly. The traffic lights are visible, and the road appears to be wet, possibly from recent rain. The overall atmosphere is calm and serene, with no pedestrians or other significant activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at an intersection. The street is lined with houses, trees, and parked cars. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the lighting is soft. The street is relatively quiet, with no pedestrians or heavy traffic visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with various vehicles and traffic lights. The scene includes cars, trucks, and a truck with a blue trailer. The traffic lights are red, and the vehicles are waiting at the intersection. The environment is a residential area with houses and trees in the background. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars, houses, and trees. The weather appears to be clear and sunny, and the time of day is likely daytime. The street is lined with parked cars and houses, and there are trees and bushes along the sidewalk.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with various vehicles, including cars, buses, and a bicycle lane. The scene is set in a city with buildings on both sides of the street, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. Several cars are driving through the intersection, while others are waiting at the traffic lights. Pedestrians can be seen crossing the street, and there are traffic lights and street signs visible. The scene is set in a suburban area with trees and buildings in the background. The weather appears to be clear and sunny, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street on a foggy day. The scene is characterized by a few cars driving slowly, with their headlights on, and a pedestrian crossing the road. The street is lined with tall trees and houses, and the overall atmosphere is calm and serene. The weather appears to be overcast, with a thick layer of fog covering the area. The time of day is not clearly visible due to the fog, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars and a bus. Pedestrians are walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a truck. The street is lined with palm trees and various buildings, including a Bank of America branch. Pedestrians can be seen walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various objects and actions taking place. A black SUV is driving down the street, while a person in a red jacket is crossing the street. Several pedestrians are walking on the sidewalk, and a cyclist is riding down the street. The street is lined with trees and buildings, and there are traffic lights visible in the scene. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a residential neighborhood. The street is wet, and several cars are parked along the curb. The camera moves forward, capturing the wet road and the parked cars. The scene is quiet, with no pedestrians visible. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a stop sign at the intersection. The road is wet, possibly from recent rain, and there are no visible vehicles or pedestrians. The surroundings include a sidewalk, a grassy area, and a building in the background. The sky is overcast, suggesting cloudy weather. The scene is relatively empty, with no signs of activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a wet road with a bridge in the background. The road is wet and slippery, and there are several cars driving on it. The weather is cloudy and rainy, and the road is surrounded by trees and power lines. The cars are driving carefully, and the road is empty except for a few cars.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and has a sidewalk on the right side. There are traffic lights and street signs visible, indicating directions and traffic rules. The weather appears to be clear and sunny, with shadows cast by the trees and vehicles. The time of day seems to be daytime, as the sky is bright and the road is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a car driving down the road. The car is seen turning left onto a driveway and then stopping at a stop sign. The street is lined with houses, trees, and a few parked cars. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions, including a white car in the center of the road and a white truck on the left side. The street is lined with trees and houses, and there are several traffic lights visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The road is illuminated by streetlights, and there are several cars parked along the side of the road. The street is relatively quiet, with only a few cars visible in motion. The buildings in the background are lit up, indicating that it is nighttime. The overall scene is well-lit, with no visible weather conditions affecting visibility.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a red truck driving down the center of the road. The truck is surrounded by other vehicles, including cars and trucks, moving in both directions. The road is lined with palm trees and other vegetation, and there are buildings visible in the background. The sky is clear and blue, indicating a sunny day. The video captures the movement of the vehicles as they navigate the road, with some turning and others continuing straight. The overall scene is a typical day on a busy road with clear weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a car driving down it. The car is seen passing a bus and several other vehicles, including a white van and a silver car. The road is lined with palm trees and has a median strip separating the lanes. The sky is overcast, and the road appears to be in a suburban area with some construction in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple cars parked along both sides of the road. The street is lined with various businesses, including a Wells Fargo bank and a Chase bank. The sky is overcast, and the overall lighting suggests it is daytime. The cars are parked in a neat row, and there are a few pedestrians walking on the sidewalks. The street is wide and has multiple lanes, with a stop sign visible at the intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a red taxi driving down the road, surrounded by tall buildings and pedestrians. The street is filled with cars and buses, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential area with a few cars driving through the intersection. The street is lined with palm trees and houses, and there are traffic lights at the intersection. The weather appears to be cloudy, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a hospital parking lot and entrance area. The camera pans around the area, showing a large building with a sign indicating the emergency entrance. There are several cars parked in the lot, including a white van and a black car. The building has large windows and a sign that reads ""Emergency Entrance."" The area is well-lit, suggesting it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with tall trees and well-maintained lawns, and there are several houses visible along the sides. The street is mostly empty, with only a few pedestrians and a cyclist visible. The houses are large and have driveways and garages. The weather appears to be sunny, with shadows cast by the trees and houses. The video captures the peaceful and serene atmosphere of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked and moving vehicles. The street is lined with houses, trees, and utility poles. The sky is overcast, suggesting cloudy weather. The road features a stop sign and a bicycle lane. As the camera moves forward, it captures various cars and trucks driving or parked along the street. The scene is typical of a suburban neighborhood with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The road is lined with trees and streetlights, and there are several construction zones with orange barriers and signs. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with trees lining both sides. The road is relatively empty, with a few cars parked along the curb and a few moving down the street. The weather appears to be clear and sunny, with shadows cast by the trees and the sun shining brightly. The street is well-maintained, with a sidewalk on one side and a curb on the other. There are no pedestrians visible in the video. The overall scene is peaceful and quiet, with no signs of rush hour or heavy traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by greenery and a cloudy sky. The road curves to the right, and there is a sign on the side of the road. The road is empty, and there are no other vehicles or pedestrians visible. The weather appears to be overcast, and the time of day is not specified.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions, including a black car in the left lane and a white car in the right lane. The street is lined with palm trees and has a sidewalk on the right side. There are traffic lights visible at the intersection, and a person is seen riding a bike on the sidewalk. The sky is clear, indicating a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The road is lined with trees and buildings, and there are several cars driving in both directions. The weather appears to be clear and sunny, with shadows cast on the road. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with houses, trees, and a few parked cars. The houses have various designs, with some featuring fences and others having open driveways. The street is relatively quiet, with no visible pedestrians or moving vehicles. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The video captures the peaceful and suburban atmosphere of the neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and traffic lights. The traffic lights are green, indicating that the cars can proceed. A silver car is stopped at the intersection, and a red car is turning left onto the main road. The street is lined with houses and trees, and there is a FedEx truck parked on the side of the road. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a rainy night on a city street with multiple cars driving through the intersection. The traffic lights are red, and the cars are stopped at the intersection. The street is wet, and the rain creates reflections on the pavement. The cars are moving in various directions, including turning and driving straight. The street is well-lit by streetlights and traffic lights, and there are no pedestrians visible. The overall atmosphere is dark and wet, with the rain creating a blurry effect on the cars and surroundings.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street. The road is wet, and several cars are driving slowly, with their headlights on. The sky is overcast, and the trees along the street are bare. The street is lined with streetlights and traffic signs, including a pedestrian crossing sign. The overall atmosphere is quiet and gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few cars driving through. The street is lined with trees and houses, and there are traffic lights at the intersection. The sky is cloudy, indicating an overcast day. The cars are driving in both directions, and some are turning at the intersection. The overall scene is calm and peaceful, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where cars are driving in both directions. The road is lined with trees and has a divider in the middle. There are traffic lights and street signs visible, indicating directions for drivers. The weather appears to be clear and sunny, with shadows cast on the road. The time of day seems to be daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with parked cars on both sides, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is daytime. The cars are moving in both directions, and there are no pedestrians crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. A silver minivan is driving down the street, passing a group of people walking on the sidewalk. There are several cars parked along the street, and a few pedestrians are walking or standing on the sidewalk. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by trees and bushes. The road is relatively empty, with only a few cars driving in both directions. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street intersection with various objects and actions taking place. The scene includes multiple cars, pedestrians, traffic lights, trees, and buildings. The cars are moving through the intersection, while pedestrians are crossing the street. The traffic lights are visible, and the weather appears to be cloudy. The time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few trees lining the sides. The road is mostly empty, with a few cars driving in different directions. The cars are moving smoothly, and the traffic lights are red, indicating that the cars are stopping at the intersection. The road is well-maintained, with white lines marking the lanes and a bike lane on the right side. The surroundings are quiet, with no pedestrians or other vehicles in sight. The weather is clear and sunny, with no signs of rain or clouds. The time of day appears to be daytime, as the sunlight is bright and the shadows are short.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a road that is mostly empty, with only a few cars and trucks visible. The road is lined with palm trees and has a sidewalk on the right side. There are various signs and streetlights along the road, and the sky is clear, indicating a sunny day. The video captures the movement of a few vehicles, including a bus and a truck, as they travel along the road. The overall atmosphere is calm and quiet, with no pedestrians or other significant activity observed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and power lines, and there are sidewalks on either side. The weather appears to be clear and sunny, with shadows cast by the trees and vehicles. The time of day seems to be daytime, as the sky is bright and the road is well-lit.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street at night, with heavy traffic and numerous vehicles. The street is illuminated by streetlights and vehicle headlights, creating a bustling urban environment. The traffic is dense, with cars stopped at a red light, and pedestrians can be seen walking on the sidewalks. The street is lined with buildings, including a tall skyscraper on the left side. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is well-marked with lane dividers and directional signs. Several vehicles, including cars and trucks, are visible, moving in both directions. The weather appears to be clear and sunny, with a blue sky overhead. The time of day seems to be daytime, as indicated by the bright sunlight. The surroundings include a barrier on the right side of the road and some greenery in the distance. The overall scene is typical of a busy highway with clear traffic flow.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city intersection with multiple lanes of traffic, including cars, trucks, and buses. The traffic lights are visible, and some cars are stopped at the red light. There are also pedestrians walking on the sidewalks and crossing the street. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses and parked cars lining both sides of the street. The houses are mostly two-story with white and light blue exteriors, and some have balconies or patios. The street is relatively quiet, with no visible pedestrians or traffic lights. The weather appears to be clear and sunny, with shadows indicating it is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street at night, with tall buildings lining both sides. The street is illuminated by streetlights and vehicle headlights, creating a well-lit environment. Multiple cars are visible, some moving in the same direction as the camera, while others are stationary or moving in the opposite direction. A few pedestrians can be seen walking along the sidewalks, and a few traffic lights are visible at intersections. The street appears to be a major thoroughfare, with tram tracks running down the center. The overall atmosphere is vibrant and active, typical of a bustling urban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and a truck. The scene is set in a residential area with houses and trees in the background. The weather appears to be cloudy, and the time of day is daytime. The traffic lights are visible, and the cars are stopped at a red light. A truck is seen turning left, and a pedestrian is crossing the road. The cars are parked on both sides of the street, and the overall atmosphere is calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including cars and a train. The weather appears to be overcast, and the time of day is likely early morning or late afternoon. The street is lined with palm trees and buildings, and there are traffic lights and streetlights visible. The traffic is moving slowly, and the overall atmosphere is typical of a busy urban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a rainy day. The street is wet, and there are several cars parked along the sides of the road. The houses are two-story buildings with garages and driveways. There are trees lining the street, and the sky is overcast. The street is relatively quiet, with no pedestrians or other vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a two-lane road that curves to the right. The road is lined with trees and has a sidewalk on the right side. There are several cars parked along the street, and a few are driving. The weather appears to be clear and sunny, with shadows cast by the trees and vehicles. The time of day seems to be late morning or early afternoon, as indicated by the bright sunlight and shadows. The overall atmosphere is calm and quiet, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a residential area. The street is lined with parked cars on both sides, and there are several houses and trees visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with various objects and actions. The street is lined with parked cars, and there are several pedestrians walking along the sidewalks. A traffic light is visible, and a person is seen crossing the street. The street is relatively busy, with cars driving and pedestrians moving about. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a white van. Pedestrians are walking on the sidewalks, and there are various buildings and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene is set during the day, with a mix of vehicles including cars, trucks, and a yellow taxi. The weather appears to be cloudy, and the street is wet, possibly from recent rain. The traffic is moderate, with cars moving at a steady pace. The buildings on either side of the street are tall and modern, and there are trees lining the sidewalk. The overall atmosphere is typical of a bustling urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward. The road is lined with trees and power lines, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, with shadows cast by the trees and the car. The car continues to drive forward, passing by other cars and pedestrians.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with two lanes of traffic. The road is lined with houses, trees, and street lamps. Several cars are parked along the side of the road, and a few are driving. The weather appears to be clear and sunny, with a blue sky and some clouds. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is well-lit, suggesting it is daytime. Several cars are visible, some moving in the same direction as the camera, while others are in the opposite lane. The sky is overcast, indicating cloudy weather. There are billboards and street signs along the side of the road, providing information and advertisements. The overall scene is busy but orderly, with vehicles maintaining a safe distance from each other.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street at night, with numerous cars and pedestrians visible. The street is illuminated by streetlights and vehicle headlights, creating a bustling urban environment. The traffic is moderate, with cars moving in both directions and some parked along the curb. Pedestrians can be seen walking on the sidewalks, and a few are crossing the street. The buildings lining the street are illuminated, adding to the city's vibrant atmosphere.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with heavy traffic. Multiple cars are stopped at a red light, and some are moving slowly. The street is lined with trees and power lines, and there are several cars parked along the side of the road. A bus is also visible in the distance. The weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a restaurant called ""Mongolian Grill."" The restaurant has a yellow exterior with a large awning and a sign indicating it is open. There are several parked cars in front of the restaurant, and a person can be seen walking out of the establishment. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a car driving down it. The street is lined with trees and houses, and there are several parked cars along the sides of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The street is relatively quiet, with a few cars driving and others parked along the side. The houses are two-story buildings with various colors and designs, and some have palm trees in front. The weather appears to be clear and sunny, with shadows cast on the ground. The video captures the peaceful atmosphere of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky and bright sunlight. The street is lined with trees and houses, and there are a few cars parked along the side of the road. The camera moves forward, capturing the street as it curves to the right, with a stop sign visible at the end of the street. The overall atmosphere is peaceful and serene, with no signs of traffic or pedestrians.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. Several cars are moving in both directions, and a few pedestrians are walking on the sidewalks. The scene is set in a suburban area with trees and houses visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a highway with a clear sky. The road is well-lit by streetlights, and the surrounding area is mostly empty. A few cars are visible on the road, and the camera moves forward, capturing the highway's expanse. The sky is a deep blue, indicating it is either early evening or late at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with various vehicles and pedestrians. A large bus is driving down the street, passing a grey car and a black car. There are several people walking on the sidewalk, including a woman pushing a stroller. The street is lined with trees and buildings, and there are yellow crosswalks and parking spaces. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes cars, pedestrians, and buildings. The weather appears to be cloudy, and the time of day is daytime. The street is lined with trees and has a red lane designated for buses and taxis. The traffic is moderate, with cars moving in both directions. Pedestrians are walking on the sidewalks, and the overall atmosphere is typical of a bustling urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides of the road. The street is lined with houses, trees, and utility poles. The weather appears to be overcast, and the time of day is likely daytime. The cars are parked in front of the houses, and there are no pedestrians visible in the scene. The street is relatively quiet, with no visible traffic or movement.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with tall trees and well-maintained lawns, and there are several houses visible along the sides. The street is mostly empty, with only a few cars parked along the curb. The weather appears to be sunny and pleasant, with no signs of rain or clouds. The time of day is likely daytime, as the sunlight is bright and casting shadows on the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street at night, with cars and pedestrians crossing the road. The street is illuminated by streetlights and traffic lights, and there are several buildings and shops along the sides. The scene is bustling with activity, and the traffic is moving smoothly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few cars parked along the curb. The street is lined with trees and a tall wall separates it from another property. The sky is clear, indicating a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a tram passing through the intersection. The tram is moving along the tracks, and several cars are parked or driving on the street. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene in a parking lot with a few cars parked and a person walking towards the building. The surroundings are dimly lit, with some streetlights illuminating the area. The parking lot is mostly empty, with a few cars parked at the far end. The person walking appears to be heading towards the building, possibly a store or a restaurant, as indicated by the illuminated sign. The overall atmosphere is quiet and still, with no other visible activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a train track running parallel to it. The road is lined with trees and has multiple lanes, with some cars parked on the side. A train is visible on the tracks, and there are traffic lights and streetlights along the road. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. The scene includes cars, buses, and a truck driving down the road, as well as people crossing the street and walking on the sidewalk. The traffic lights are visible, and the street is lined with trees and buildings. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic and pedestrians crossing the street. The street is illuminated by streetlights and traffic lights, and there are several cars and buses moving in both directions. Pedestrians are crossing the street at a crosswalk, and some are carrying backpacks. The buildings on either side of the street are tall and have a mix of commercial and residential uses. The weather appears to be clear, and the time of day is likely evening, as the streetlights are on and the sky is dark.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with various vehicles and pedestrians. The street is lined with parked cars and buildings on both sides. The weather appears to be overcast, and the time of day is daytime. The traffic is moderate, with cars moving in both directions. There are also a few pedestrians walking along the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, bordered by sidewalks on both sides. The road is lined with trees and streetlights, and there are yellow crosswalks at intervals. A white car is seen driving down the road, and a person is walking on the sidewalk. The sky is clear and blue, indicating a sunny day. The road appears to be in a suburban area with houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city intersection with various vehicles and pedestrians. The scene includes cars, bicycles, and a street cleaner machine. The traffic lights are visible, and the weather appears to be cloudy. The time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars and trees. The road has a center divider and is flanked by sidewalks. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting. The street is relatively quiet, with no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides of the road. The street is lined with various buildings, including apartment complexes and houses. The weather appears to be overcast, with no direct sunlight visible. The street is relatively quiet, with no pedestrians or other vehicles in motion. The buildings are mostly two to three stories high, and the overall atmosphere is calm and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street. The road is wet, and there are several cars driving slowly, with some turning left. The sky is overcast, and the trees along the street are visible. The traffic lights are green, and there are no pedestrians in the scene. The overall atmosphere is calm, with the sound of rain and traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene at dusk with a stop sign painted on the road. Several cars are parked along both sides of the street, and a few are driving. The street is illuminated by streetlights and the headlights of the cars. The sky is darkening, indicating it is either early morning or late evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. Multiple cars are parked along the street, and some are driving. Pedestrians are walking on the sidewalks, and a few are crossing the street. There are traffic lights and street signs visible, indicating traffic regulations. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day seems to be daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions. The road is lined with palm trees and streetlights, and there are traffic lights visible at intersections. The weather appears to be cloudy, and the time of day is likely early morning or late afternoon, given the lighting conditions. The cars are moving smoothly, and there are no pedestrians or other obstacles in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along both sides of the road. The street is lined with buildings, including a large beige building on the left and a two-story building with a balcony on the right. The sky is overcast, suggesting cloudy weather. The street appears to be relatively quiet, with no pedestrians visible. The cars are parked in a neat manner, and the overall atmosphere is calm and orderly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are stopped at a red light. There are also several traffic lights visible, some of which are red and others green. A person is seen riding a bike on the left side of the street, and there are orange cones placed on the road. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple lanes of traffic. The road is filled with various vehicles, including cars, trucks, and motorcycles, all moving in different directions. There are traffic lights and street signs visible, indicating directions and traffic rules. The weather appears to be clear and sunny, with shadows cast by the vehicles and objects. The environment is urban, with buildings and commercial establishments in the background. The time of day seems to be daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and a bicycle. The scene is set in a suburban area with trees and greenery in the background. The weather appears to be overcast, with no visible sunlight. The traffic lights are green, allowing vehicles to move through the intersection. A white car is seen turning left, while other cars are waiting at the stoplight. A cyclist is also visible, riding along the bike lane. The overall atmosphere is calm, with no signs of rush hour congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene of a city intersection. The street is dimly lit by streetlights and vehicle headlights, creating a somewhat eerie atmosphere. Several cars are stopped at a red traffic light, waiting to proceed. The intersection is marked with white lines and crosswalks, guiding pedestrians. In the background, there are buildings with illuminated windows, suggesting residential or office spaces. The overall scene is quiet, with no pedestrians visible, and the traffic is sparse, indicating it might be late at night or early morning.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The road is well-lit, suggesting it is daytime. Various vehicles, including cars and trucks, are visible on the highway. The sky is clear with a few clouds, indicating good weather conditions. The traffic appears to be moderate, with cars maintaining a steady pace. The highway is bordered by barriers and guardrails, and there are streetlights and signs along the sides of the road. The overall scene is typical of a busy highway during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is wet, likely from recent rain, and is illuminated by streetlights. Several cars are parked along the sides of the road, and a few are driving. The scene is quiet, with no pedestrians visible. The weather appears to be cloudy, and the overall atmosphere is dark and calm.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a wide, clean street and well-maintained houses. The street is lined with trees and has a few parked cars. The houses have tiled roofs and are surrounded by lawns and driveways. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The video captures the quiet and peaceful atmosphere of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. Several cars are visible, including a silver SUV in the foreground, a white sedan to the right, and a black sedan further back. Traffic lights are present, with one showing a green light. The street is lined with trees and has a sidewalk on the right side. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a motorcycle. The street is flanked by tall buildings, and there are traffic lights and street signs visible. Pedestrians can be seen crossing the street, and the weather appears to be clear and sunny. The time of day is likely daytime, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a few cars and pedestrians. The street is lined with shops and restaurants, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with houses, trees, and parked cars. A few pedestrians are walking on the sidewalks, and a stop sign is visible at an intersection. The scene is peaceful and quiet, with no signs of traffic or rush hour.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with trees and houses, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime. The cars are moving along the road, and some pedestrians are walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various vehicles and buildings. The camera captures a large truck and a car driving down the road, passing by a construction site with a building under construction. The street is lined with parked cars and a few pedestrians walking. The weather appears to be clear and sunny, with the time of day being daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving down a winding road with a scenic view of a city and the ocean in the background. The road is lined with yellow and white stripes, and there are several cars driving in the opposite direction. The weather is clear and sunny, with a few clouds in the sky. The cityscape includes buildings and houses, and the ocean is visible in the distance. The road is well-maintained and has a guardrail on the right side.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The road is lined with trees and buildings, and there are several cars driving in both directions. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a road intersection. The road is lined with streetlights and trees, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, with the sun shining brightly in the sky. The time of day is likely morning or afternoon, as the sun is high in the sky. The street is relatively quiet, with no pedestrians or cyclists visible. The overall atmosphere is calm and peaceful, with the sound of cars and birds in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy parking lot with numerous cars parked and a few pedestrians walking around. The scene is set in a commercial area with a large building on the right side and a sidewalk in front of it. The sky is clear and blue, indicating a sunny day. The parking lot is filled with various types of vehicles, including cars and trucks, and there are a few people walking around, some of whom are carrying shopping bags. The overall atmosphere is lively and bustling.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a quiet street. The street is lined with houses, trees, and street lamps. The houses are mostly two-story homes with driveways and garages. The street is relatively empty, with only a few parked cars and a few pedestrians visible. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, trucks, and pedestrians. The traffic is moving slowly, and there are several traffic lights and street signs visible. The weather appears to be clear, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and pedestrians. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The scene is bustling with activity, as people walk along the sidewalks and vehicles move through the intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. A red and white bus is seen driving down the street, passing by a building with a large American flag hanging from it. Several cars are parked along the street, and a few pedestrians are walking on the sidewalk. The street is lined with trees and power lines are visible overhead. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day at an intersection with multiple cars and traffic lights. The scene includes a white car in the foreground, a red car on the left, and various other vehicles in the background. The traffic lights are red, and the cars are stopped at the intersection. The sky is overcast, and the road is wet, reflecting the rain. Palm trees are visible in the background, and the overall atmosphere is calm and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night, with multiple vehicles, including cars and a bus, stopped at a red light. The traffic lights are red, and the bus is the closest vehicle to the camera. The street is well-lit by streetlights, and there are several cars waiting at the intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street with multiple cars and traffic lights visible. The street is illuminated by streetlights and traffic signals, and there are several cars parked or moving along the road. The traffic lights are green, allowing vehicles to proceed. The environment appears to be a typical urban setting with buildings lining the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and trucks passing through. The scene includes cars turning left, right, and straight, as well as a truck making a wide turn. The intersection is well-lit, suggesting it is daytime. The road is lined with trees and power lines, and there are traffic lights and street signs visible. The weather appears to be clear, with no visible rain or clouds.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a mountain visible in the distance. The road is lined with trees and power lines, and there are several cars driving in both directions. The traffic lights are green, allowing vehicles to proceed. The scene is well-lit, indicating it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a residential street. The road is wet, and there are several cars driving slowly, with some parked along the sides of the street. The trees lining the street are tall and leafless, suggesting it might be late fall or winter. The sky is overcast, and the overall atmosphere is calm and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including cars and a bus. There are several pedestrians walking on the sidewalks and crossing the street, some carrying bags. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely early evening, as the streetlights are on and the sky is darkening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple cars and pedestrians. The scene is set in a city with buildings on both sides of the road. The weather appears to be clear and sunny, with the time of day being daytime. The cars are moving in both directions, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The road is lined with parked cars and trees, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including a bike lane. The street is lined with parked cars and trees, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a hill in the background. The road is empty, and there are no visible objects or actions taking place. The weather appears to be cloudy, and the time of day is likely daytime. The road has a stop sign and a hill with some vegetation.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a few cars and a cyclist. The road is lined with trees and has a speed limit of 35 mph. The sky is clear and blue, indicating a sunny day. The cars are driving in both directions, and the cyclist is riding on the left side of the road. The road has a few signs and a speed limit sign.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars along both sides. The street is lined with houses, and there are power lines running above. The weather appears to be cloudy, and the time of day is likely daytime. The street is relatively quiet, with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with power lines and streetlights, and there are trees and houses on either side. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic and pedestrians crossing the road. The scene is set in a bustling urban environment with tall buildings lining both sides of the street. The weather appears to be clear and sunny, with the time of day being either late afternoon or early evening, as indicated by the lighting. The traffic is moderate, with cars moving in both directions, and pedestrians are crossing the street at designated crosswalks. The street is well-lit, and the overall atmosphere is dynamic and energetic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with numerous cars and pedestrians. The traffic is moving in both directions, and there are several traffic lights and street signs visible. The weather appears to be clear and sunny, with the sun shining brightly in the sky. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane highway. The road is illuminated by streetlights, and the sky is dark. Several cars are visible on the road, some with their headlights on. The highway has multiple lanes, and the road markings are clearly visible. The surrounding area is mostly dark, with some distant lights indicating urban or suburban development. The overall scene is typical of a busy highway at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy day with a road surrounded by greenery and a few buildings in the background. The road is empty, and there are no visible pedestrians or vehicles. The sky is overcast, and the fog obscures the view of the surroundings. The road curves gently to the right, and there are several signs and markings on the road, including a stop sign and a parking sign. The overall atmosphere is calm and serene, with the fog creating a sense of mystery and intrigue.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. A bus is driving down the street, and several cars are following behind it. Pedestrians are crossing the street at a crosswalk, and a few people are walking on the sidewalk. The street is lined with tall buildings and trees, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and a yellow taxi. Pedestrians are crossing the street at a crosswalk, and there are traffic lights and street signs visible. The scene is set in a city with tall buildings and trees lining the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. Pedestrians are walking on the sidewalks, and there are traffic lights and street signs visible. The street is lined with tall buildings, and the weather appears to be clear and sunny. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. The weather appears to be overcast, and the street is wet, possibly from recent rain. Several cars are stopped at a red light, and a train is passing by on the left side of the street. There are tall buildings on both sides of the street, and trees line the sidewalk. The traffic lights are visible, and the overall atmosphere is typical of a busy urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars and houses. The road is relatively empty, with only a few cars visible. The houses are mostly two-story homes with a mix of colors and styles. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely late afternoon, based on the angle of the sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky and bright sunlight. The road is lined with palm trees and well-maintained bushes, and there are several houses visible in the background. The street is mostly empty, with only a few cars driving by. The overall atmosphere is calm and peaceful, with no signs of traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a minivan. The street is lined with tall buildings, trees, and pedestrians walking on the sidewalks. The weather appears to be clear and sunny, with the time of day being daytime. The traffic is moving smoothly, and there are no visible traffic jams.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars driving in both directions. The road is lined with trees and streetlights, and there are orange traffic cones and barriers indicating construction or roadwork ahead. The sky is partly cloudy, suggesting a mix of sun and clouds. The cars are moving smoothly, and the overall atmosphere is calm and orderly.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. Several cars are stopped at a red light, including a silver minivan, a gray SUV, and a white car. The traffic light is visible in the background, and there are trees and buildings lining the street. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet, cloudy day with a wide, empty road stretching into the distance. The road is lined with palm trees and streetlights, and there are no visible vehicles or pedestrians. The sky is overcast, and the overall atmosphere is calm and serene.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street intersection with multiple cars and traffic lights. The traffic lights are red, and the cars are stopped at the intersection. The street is lined with houses and trees, and there are several cars waiting at the intersection. The weather appears to be cloudy, and the time of day is likely evening or early morning.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a bus lane, bike lane, and pedestrian crosswalks. The bus lane is marked with red paint and has a speed limit of 10 mph. A cyclist is riding in the bike lane, and a bus is approaching the stop. There are several pedestrians walking on the sidewalk and crossing the street. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather is cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings and traffic. The street is filled with cars, buses, and pedestrians. The traffic lights are visible, and the cars are moving in both directions. The buildings on either side of the street are tall and modern, with large windows and advertisements. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a tram passing through the intersection. The tram is moving from the left side of the frame towards the right, crossing the intersection. The street is lined with parked cars on both sides, and there are several pedestrians walking along the sidewalks. The weather appears to be overcast, and the overall atmosphere is calm and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The scene is set in a suburban area with palm trees lining the streets and a parking lot filled with cars. The sky is clear, indicating a sunny day. The traffic lights are visible, and the cars are moving smoothly, with some turning left and others driving straight. The overall atmosphere is calm and orderly, with no signs of congestion or chaos.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of houses, trees, and vehicles. The street is lined with trees and has a pedestrian crossing in the middle. The weather appears to be clear, and the time of day is likely daytime. The video shows a car turning left onto the street, and there are several other cars driving on the road. The houses are mostly single-story with a few two-story homes. The street is relatively quiet, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with a car driving through the rain. The car is moving forward, and the windshield wipers are in motion. The street is wet, and there are several parked cars on both sides of the road. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a clear blue sky and a few scattered clouds. The road is a two-lane street with a double yellow line in the center, and there are white lines marking the lanes. The street is lined with trees and houses on both sides. There are a few cars parked along the side of the road, and some cars are driving down the street. The street appears to be in a residential area, with houses and trees lining both sides. The weather is clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a mix of vehicles and pedestrians. The street is lined with buildings, including a large red building with a sign that reads ""Mission."" There are several cars parked along the street, and a few pedestrians walking on the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The street is relatively busy with traffic, including a black car driving down the road and other vehicles parked or moving along the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with parked cars on both sides of the road. The camera moves forward, capturing the wet pavement reflecting the overcast sky. Various cars are parked along the street, including a red car, a white car, and a black car. The scene is quiet, with no visible pedestrians or moving vehicles. The sky is cloudy, and the overall atmosphere is damp and misty.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward. The car passes by various parked cars, pedestrians, and buildings. The street is lined with trees and power lines, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with a bus lane in the center. A bus is stopped at a bus stop, and several pedestrians are walking around. There are cars driving on the street, and a few people are standing near the bus stop. The weather appears to be sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street on a rainy day. The scene is filled with various vehicles, including cars, buses, and a bicycle. Pedestrians are also present, some carrying umbrellas. The street is wet, and steam rises from the ground, indicating recent rain. Traffic lights are visible, and the overall atmosphere is bustling and typical of a city in the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a white truck driving down the road. The truck is the main object in motion, moving forward and turning left at an intersection. The street is lined with parked cars on both sides, and there are traffic lights visible in the background. The weather appears to be overcast, and the time of day is likely daytime. The overall setting is a typical urban street with buildings and trees in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where vehicles are moving in both directions. The road is lined with trees and streetlights, and there are traffic lights at intersections. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting. The scene is a typical urban or suburban street with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene during the day. The road is relatively empty, with a few cars driving in both directions. The street is lined with houses, trees, and street lamps. The sky is clear, indicating good weather conditions. The overall atmosphere is calm and quiet, with no pedestrians or other significant activities visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. Multiple cars are driving down the street, including a silver car turning left and a blue truck driving down the road. Pedestrians are crossing the street and walking on the sidewalks, with some carrying backpacks. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. A white van is stopped at a red light, while other vehicles are moving through the intersection. There are several cars and trucks on the road, and a few pedestrians are visible near the sidewalk. The street is lined with trees and buildings, and the sky is clear.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential neighborhood with a focus on a street and houses. The street is lined with trees and houses, and there are cars parked in driveways. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The video captures the peaceful atmosphere of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The scene is set during the day under a clear blue sky. Various vehicles, including cars and a white van, are moving along the road. The traffic appears to be moderate, with cars maintaining a steady pace. The highway is well-marked with clear lane dividers and traffic signs indicating directions and exits. The surrounding area includes a mix of greenery and man-made structures, such as a bridge and a wall with a fence. The overall atmosphere is typical of a busy urban or suburban highway during daylight hours.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene is set in a commercial area with various businesses and stores visible in the background. The weather appears to be overcast, with no direct sunlight visible. The time of day is likely late afternoon or early evening, as the traffic is heavy and the streetlights are on. The street is lined with trees and has a median in the middle. The traffic is moving slowly, and there are several cars and trucks visible on the road. Some cars are turning left at an intersection, while others are waiting at a traffic light. The overall atmosphere is busy and bustling, with people walking on the sidewalks and cars parked along the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked cars and moving vehicles. A person on a bicycle is riding down the street, passing by parked cars and a FedEx truck. The street is lined with houses and trees, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The scene is quiet and peaceful, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a focus on a driveway and a house. The street is lined with trees and has a few parked cars. The driveway leads to a garage with a car parked inside. The house has a well-maintained lawn and a few potted plants. The sky is overcast, suggesting a cloudy day. The street appears quiet and there are no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is lined with palm trees and power lines, and there are a few cars driving in both directions. The road appears to be in a suburban area, with houses and buildings visible on either side. The weather is sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a road that curves to the right. The road is lined with trees and houses, and there are several cars parked along the side of the road. The sky is clear and blue, indicating a sunny day. The road is relatively empty, with only a few cars driving in the distance. The houses along the street are mostly two-story homes with a variety of architectural styles. The overall atmosphere is calm and peaceful, with no signs of rush hour traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with visible traffic lights and streetlights. The road is well-lit, and there are several cars on the road, some of which are moving while others are stationary. The traffic lights are red, indicating that the cars are stopped. The scene is set in a city or urban area, with buildings and street signs visible in the background. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving through an intersection. The car is seen turning left onto a road with a speed limit of 45 mph. The street is lined with trees and has a sidewalk on the right side. The sky is clear, indicating a sunny day. The traffic lights are green, allowing the car to proceed. The scene is quiet, with no pedestrians or other vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including a bus lane. The scene features various vehicles, such as cars, buses, and trucks, moving along the road. There are also construction cones and barriers set up along the street, indicating ongoing roadwork or maintenance. Pedestrians can be seen walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime, as indicated by the natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with trees and houses. The car passes by several parked cars and continues down the street, eventually stopping at a stop sign. The street is relatively quiet, with no pedestrians or other vehicles in sight. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene at an intersection with traffic lights. The traffic lights are red, indicating that vehicles must stop. There are several cars visible, some of which are turning left and others waiting at the intersection. The road is wet, suggesting recent rain. The scene is well-lit by streetlights and traffic lights, creating a clear view of the surroundings.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with various cars and pedestrians. The traffic is moving smoothly, and there are no visible traffic lights or pedestrians crossing the road. The environment is a typical urban setting with buildings and trees in the background. The weather appears to be clear and sunny, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and trucks. The street is flanked by tall buildings, and there are several pedestrians walking on the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The traffic is moving slowly, and there are traffic lights and street signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is wet, likely from recent rain, and the headlights of the car provide illumination. Several cars are parked along the street, and a few are moving. The scene is quiet, with no pedestrians visible. The sky is dark, indicating it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a bus driving down a street in a suburban area. The bus is white and has a logo on its rear end. The street is lined with palm trees and has a sidewalk on the right side. There are several cars parked along the street, and a few pedestrians are walking on the sidewalk. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with a car driving through the rain. The street is lined with parked cars and houses, and there are trees and power lines visible. The car's headlights are on, and the windshield wipers are in motion. The overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with parked cars and houses, and there are traffic lights and streetlights visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving in both directions, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with tall palm trees on the right side, and there are streetlights and a sidewalk on the left. The sky is clear and blue, indicating a sunny day. The cars are moving smoothly, and there are no pedestrians visible. The overall scene suggests a typical day in a suburban or semi-urban area with good weather conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The sky is partly cloudy, and the sun is shining brightly, casting shadows on the road. The road is well-lit, and there are streetlights on both sides. The cars are moving smoothly, and there are no pedestrians or other obstacles in the scene. The road appears to be in a suburban area with trees and houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a two-lane road with a yellow line in the middle. The road is wet, and there are several cars driving at different speeds. The weather is overcast, and the trees on both sides of the road are bare. There are also some houses visible in the background. The road is relatively empty, with only a few cars passing by.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with trees and houses, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is likely daytime. The cars are moving slowly, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a cyclist and a pedestrian walking down the center of the road. The cyclist is riding a bike, while the pedestrian is carrying a backpack. The street is lined with trees and buildings, and there are several vehicles parked or driving on the sides of the road. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with various businesses, including a U-Haul truck parked on the side. The weather appears to be cloudy, and the time of day is daytime. The cars are moving slowly, and some are stopped at a stop sign. Pedestrians are crossing the street and walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is relatively clear, with a few cars moving in both directions. The weather appears to be overcast, and the surroundings are a mix of trees and buildings. The cars are driving at a moderate speed, and there are no pedestrians or other obstacles visible. The overall atmosphere is calm and typical of a busy highway.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward. The road is lined with trees and houses, and there are traffic lights and streetlights visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the street. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be sunny, with shadows cast by the trees and houses. The time of day is likely daytime, as the lighting is bright and clear.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy day on a multi-lane highway with a speed limit of 45 mph. The road is lined with trees and has a bridge in the background. Several cars are driving on the highway, and a few are parked on the side of the road. The sky is overcast, and the overall atmosphere is hazy.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a parking lot with several cars parked and a few pedestrians walking around. The weather appears to be clear and sunny, with the time of day being daytime. The objects in the scene include cars, pedestrians, and palm trees. The actions of the objects include cars parked in the lot and pedestrians walking around. The scene setting is a busy parking lot with palm trees in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene during twilight, with a focus on the road and surrounding environment. The road is lined with palm trees and has multiple lanes, with a few cars visible. The sky is painted with hues of pink and blue, indicating the time of day. The streetlights are on, and the traffic is light, with cars moving in both directions. The overall atmosphere is calm and serene, with no pedestrians or other significant activities observed.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, trucks, and a cyclist. The traffic lights are visible, and the road is well-paved with clear lane markings. The weather appears to be clear and sunny, with trees and buildings in the background. The time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with houses, each enclosed by a white fence. The houses are mostly one-story structures with tiled roofs and palm trees in the front yards. The street is relatively empty, with only a few cars parked along the side. The trees cast shadows on the road, indicating that the sun is shining brightly. The overall atmosphere is calm and peaceful, with no signs of rush or hurry.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at the intersection. The street is lined with parked cars and houses, and there are trees and bushes along the sidewalk. The sky is overcast, indicating cloudy weather. The street appears to be quiet, with no pedestrians or moving vehicles visible. The stop sign is clearly visible at the intersection, and the houses are painted in various colors.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The street is lined with trees and well-maintained lawns, and there are several houses visible along the sides. A few pedestrians can be seen walking along the sidewalks, and a few cars are parked or driving on the street. The overall atmosphere is peaceful and serene, with no signs of traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where vehicles are moving in both directions. The road is lined with palm trees and has a few traffic lights and streetlights. There are also some construction barriers and signs indicating directions. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy highway at dusk. The road is wet, and the sky is overcast. The headlights of cars are on, and the road is illuminated by streetlights. The camera is positioned in the middle of the highway, and the windshield wipers are visible. The scene is quiet, with no pedestrians or other vehicles in the immediate vicinity. The overall atmosphere is somber and reflective, with the rain creating a sense of isolation and melancholy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a clear blue sky overhead. The road is mostly empty, with only a few cars driving in the distance. The street is lined with trees and streetlights, and there are some buildings visible in the background. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a white car driving down the road. The street is lined with trees and houses, and there are no other vehicles or pedestrians visible. The weather appears to be clear and sunny, and the time of day is likely morning or late afternoon. The street is well-maintained, with a bike lane and speed limit signs visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The scene is set in a suburban area with a clear blue sky and a few clouds. The road is relatively busy, with several cars and trucks driving in different directions. The traffic lights are green, allowing vehicles to proceed. The road is well-maintained, with clear lane markings and a median strip separating the lanes. There are also trees and buildings visible in the background, indicating a developed area. The weather is sunny, with no signs of rain or clouds. The time of day appears to be daytime, as the lighting is bright and clear.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a busy street with multiple lanes of traffic. The traffic lights are red, and cars are stopped at the intersection. As the traffic light changes to green, cars begin to move, and the scene shows a mix of cars and trucks driving through the intersection. The road is wet, and the sky is overcast, indicating that it is raining. The street is lined with palm trees, and there are several buildings visible in the background. The overall atmosphere is calm, and the traffic flows smoothly as the cars continue to move through the intersection.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a few houses and parked cars. The road is lined with trees and has a double yellow line in the center. There are no pedestrians or vehicles moving on the road. The weather appears to be clear and sunny, with shadows cast by the trees. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy urban street with multiple lanes of traffic, including cars and a bicycle lane. The street is lined with palm trees and buildings, and there is a bridge in the background. The weather appears to be clear and sunny, and the time of day is likely daytime. The traffic is moderate, with cars moving in both directions and a cyclist riding in the designated lane.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a single car driving through. The road is lined with trees and houses, and there are no other vehicles or pedestrians visible. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The street is relatively empty, with no other cars or people in sight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The street is illuminated by streetlights and traffic lights, and the sky is clear with a blue hue, indicating it is either early morning or late evening. The cars are parked in a neat row, and the street appears to be quiet with no visible pedestrians or moving vehicles. The overall atmosphere is calm and serene, with the parked cars suggesting a residential or less busy area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The sky is clear and blue, indicating a sunny day. The road is well-maintained, and there are several cars driving in both directions. The cars are of various sizes and colors, including a white van and a black SUV. The highway has a barrier on the left side, and there are trees and bushes on the right side. The traffic appears to be moving smoothly, and there are no pedestrians or other obstacles in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night with multiple cars and pedestrians. The street is illuminated by streetlights, and there are several cars parked or moving along the road. A few pedestrians are walking on the sidewalk, and a few cars are parked in the parking lot. The weather appears to be clear, and the time of day is night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The road is well-paved and has clear lane markings. Vehicles, including cars and trucks, are visible, maintaining a steady flow of traffic. The sky is clear and blue, indicating good weather conditions. The surrounding area features a mix of greenery and urban elements, with some billboards and signs visible. The time of day appears to be daytime, as evidenced by the bright sunlight and shadows cast by the vehicles and objects.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The scene is set during the day under a clear blue sky. Various vehicles, including cars, trucks, and buses, are moving along the road. The traffic appears to be moderate, with cars maintaining a steady pace. The road is well-lit, suggesting it is daytime. The surrounding area includes a mix of trees and buildings, indicating an urban or suburban setting. The overall atmosphere is calm, with no signs of congestion or emergency.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are two-story homes with various colors and styles, and the street is lined with parked cars of different colors and sizes. The weather appears to be overcast, with no direct sunlight visible. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with palm trees and houses on both sides. The road is lined with parked cars and a few pedestrians walking. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The street is relatively quiet, with no visible traffic lights or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a wide road and sidewalks on both sides. The street is lined with tall trees and a few houses, some of which have palm trees in their front yards. The sky is clear and blue, indicating a sunny day. The road appears to be in good condition, with no visible cracks or potholes. The houses are well-maintained, and the overall atmosphere is peaceful and serene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a variety of vehicles, including cars, buses, and trucks, moving through the intersection. The scene is set in a residential area with multi-story buildings and trees lining the streets. The weather appears to be clear and sunny, with a blue sky and bright sunlight illuminating the scene. The time of day is likely daytime, as indicated by the bright lighting and shadows cast by the vehicles and buildings.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic, including cars, buses, and trucks. The scene is set in a suburban area with trees and buildings in the background. The weather appears to be clear and sunny, with shadows cast by the vehicles and objects. The time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a mix of parked and moving vehicles, including cars and a yellow taxi. The street is lined with trees and buildings, and there are pedestrians crossing the road. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. A white pickup truck is driving on the left side of the road, while a black SUV is stopped at a red light. Pedestrians are crossing the street at a crosswalk, and several traffic lights are visible throughout the scene. The street is lined with tall buildings and flags, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene of a busy intersection with multiple traffic lights and vehicles. The intersection is well-lit, and various cars are seen driving through the intersection, some turning left and others continuing straight. The traffic lights change from red to green, allowing vehicles to proceed. The environment appears to be a typical urban setting with buildings and streetlights visible in the background. The weather is clear, and the time of day is nighttime, as indicated by the artificial lighting and darkness in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with a tram, cars, and pedestrians. The tram is moving along the tracks, while cars are stopped at a red light. There are several people walking on the sidewalk, and a few cars are parked along the street. The weather is clear and sunny, and the time of day appears to be mid-afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple cars and pedestrians. The scene includes a white truck, a blue car, and several other vehicles. The street is lined with buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and pedestrians. The street is lined with trees and buildings, and there are multiple lanes of traffic. A blue bus is visible in the distance, and several cars are driving down the road. Pedestrians can be seen crossing the street at a crosswalk, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street at night. The street is illuminated by streetlights and the headlights of a car approaching from the left. The car passes by a sidewalk with a stop sign and a mailbox, and continues down the street. The street is lined with houses and trees, and there are no pedestrians or other vehicles visible. The weather appears to be clear, and the overall atmosphere is calm and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are stopped at a traffic light. There are pedestrians walking on the sidewalks, and the street is well-lit with streetlights and building lights. The weather appears to be clear, and the time of day is likely early evening, as the streetlights are on and the sky is darkening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes of traffic, including a bus lane on the left side. The road is lined with trees and has a speed limit of 40 mph. The weather is clear and sunny, and the time of day appears to be daytime. The traffic is moderate, with cars moving in both directions. The road has a few traffic lights and signs, including a ""No U-turn"" sign and a ""Speed Limit 40"" sign. The overall scene is a typical urban road with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few clouds scattered in the distance. The road is mostly empty, with only a few cars driving in the opposite direction. The road is well-maintained, with white lines marking the lanes and a median strip separating the two directions of traffic. There are also several trees and bushes lining the sides of the road, providing a natural barrier between the road and the surrounding area. The road curves slightly to the right, and there are traffic lights and street signs visible in the distance. The overall scene is peaceful and quiet, with no pedestrians or other people visible in the video.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are several parked cars along the curb. As the camera moves forward, it captures a black car driving down the street, passing by a white house with a large palm tree in front. The street appears to be relatively quiet, with no pedestrians or other vehicles in sight. The weather is sunny and clear, with no signs of rain or clouds. The time of day is not explicitly stated, but the lighting suggests it is daytime. Overall, the video provides a peaceful and serene view of a typical suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. Several cars are stopped at a red light, including a dark-colored SUV in the foreground and a white van further back. Pedestrians are visible on the sidewalks, and there are traffic lights and street signs present. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street intersection. The scene includes a parked car, a person on a scooter, and a large inflatable figure on the road. The street is lined with trees and houses, and there is a clear blue sky overhead. The video captures the movement of the inflatable figure as it moves across the street, while the car and scooter remain stationary. The overall atmosphere is calm and peaceful, with no signs of traffic or other vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and a motorcycle driving down the road. The cars are moving in both directions, and some are turning left. The street is lined with trees and houses, and there are traffic lights visible in the background. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet neighborhood with a few cars driving down the street. The street is lined with trees and houses, and there are a few parked cars along the curb. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a rainy day in an urban setting, with traffic moving under a large overpass. Multiple cars are visible, some with their brake lights on, indicating a stop or slow movement. The road is wet, reflecting the lights and creating a glossy surface. The overpass is supported by large concrete pillars, and the surrounding area is lined with buildings and trees. The weather appears to be overcast, contributing to the wet conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a cyclist. The scene is set in a bustling urban environment with tall buildings and trees lining the street. The weather appears to be clear and sunny, with shadows cast by the buildings and trees. The time of day is likely daytime, as indicated by the bright sunlight. The traffic lights are visible, and the cars are moving in both directions, while the cyclist is riding in the designated bike lane. Pedestrians can be seen crossing the street and walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at the intersection. The road is lined with trees and houses, and there are cars parked along the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with palm trees lining both sides. The street is relatively quiet, with a few parked cars and a few pedestrians visible. The weather appears to be clear and sunny, with shadows indicating that it is likely daytime. The street is lined with palm trees, and there are a few houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The street is lined with houses and trees, and there are orange traffic cones placed at intervals. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a truck driving down the road, surrounded by trees and other vehicles. The truck is seen passing a cyclist and a person on a bicycle. The street is lined with trees and has a speed limit of 35 mph. The weather is cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is lined with trees and streetlights, and there are a few cars driving on it. The road has a double yellow line in the center and a white line on the right side. The cars are driving in both directions, and there are a few pedestrians walking on the sidewalks. The weather is clear and sunny, and the time of day appears to be late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and buses. The street is lined with palm trees and various buildings, including a Walgreens store. The weather appears to be cloudy, and the time of day is daytime. The traffic is moving smoothly, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and power lines, and there are several cars parked along the sides of the street. As the camera moves forward, it captures the movement of cars driving down the road and parked cars on the sides. The street appears to be relatively quiet, with no pedestrians visible. The weather is sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with various vehicles and buildings. The street is lined with parked cars, including a red convertible and a gray minivan. There are also several buildings, such as a pink building with a black awning and a green building with a red awning. The street is busy with traffic, including a black car turning left and a blue car driving down the street. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple cars driving in both directions. The weather appears to be overcast, and the road is wet, possibly due to recent rain. The cars are maintaining a safe distance from each other, and the headlights of the vehicles are on, indicating low visibility. The highway is surrounded by a few trees and a hillside with sparse vegetation. The overall atmosphere is calm, with no signs of heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of cars parked along the sides. The street is lined with houses, and there are several parked cars in front of them. The road is relatively empty, with only a few cars driving down the street. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The houses are two-story homes with a mix of architectural styles, and the street is lined with streetlights and signs. The overall scene is peaceful and quiet, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a white van parked in front of a house. The street is lined with parked cars and houses, and there are trees and power lines visible. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The sky is clear and blue, indicating a sunny day. The cars are moving in both directions, and there are several trucks and buses on the road. The traffic appears to be moderate, with some cars driving slowly. The highway is well-maintained, and there are signs overhead providing directions. The surrounding area has buildings and construction cranes, suggesting urban development.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with visible traffic lights and streetlights illuminating the scene. The road is lined with trees and has a few parked cars on the side. The traffic appears to be moderate, with several cars moving in both directions. The sky is dark, indicating it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along the side of the road. The cars are of different colors and types, including sedans and SUVs. The street is lined with trees and streetlights, and there are some buildings visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a car turning left onto a road. The scene is set in a residential area with trees lining the streets and a house visible in the background. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night with numerous cars and pedestrians. The street is illuminated by streetlights and traffic lights, and there are several cars parked along the side of the road. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a view of the city in the distance. The street is lined with houses, trees, and parked cars. The sky is overcast, and the road is wet, indicating recent rain. The camera moves forward, capturing the street as it curves and ascends, revealing more of the cityscape.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a pedestrian crossing the road at a traffic light. The traffic light is green, allowing vehicles to proceed. Several cars are visible, including a white van, a silver car, and a red car. The street is lined with parked cars and trees, and there is a fire hydrant on the sidewalk. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple lanes of traffic. Several cars are stopped at a red light, including a white car directly in front of the camera, a black car to its right, and a white truck further back. A white van is also visible on the left side of the intersection. Pedestrians are crossing the street, with one person wearing a blue shirt and shorts and another in a white shirt and shorts. The traffic lights are red for both directions, and there are street signs indicating directions. The weather appears to be clear and sunny, with a blue sky overhead. The time of day seems to be midday, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a traffic light and a stop sign. The traffic light is green, allowing vehicles to proceed. A silver minivan is seen driving through the intersection, and a red car is also visible. The stop sign is located at the corner of the intersection, and a white truck is parked nearby. The street is lined with trees and houses, and the sky is clear, indicating a sunny day. The video captures the movement of vehicles and the interaction with traffic signals in a residential area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and motorcycles. The street is flanked by tall buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be clear and sunny, with shadows cast by the buildings and vehicles. The time of day seems to be midday, as indicated by the bright sunlight and long shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars on both sides. The street is lined with trees and power lines, and there are houses visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city intersection on a rainy day. Pedestrians are crossing the street, some holding umbrellas, while others are walking without them. Traffic lights are visible, and cars are stopped at the intersection. The scene is bustling with activity, and the wet pavement reflects the city lights.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few trees lining the sides. The road is mostly empty, with only a few cars driving in both directions. The cars are moving at a moderate pace, and there are no pedestrians visible. The road appears to be well-maintained, with clearly marked lanes and a sidewalk on the right side. The weather is clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a residential neighborhood. The street is wet, and several cars are parked along the sides of the road. The camera moves forward, capturing the wet pavement and the reflections of the raindrops. As the camera approaches an intersection, a car stops at a stop sign, and other cars can be seen waiting at the intersection. The scene is quiet, with no pedestrians visible. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along the sides of the road. The street is lined with buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. The street is lined with parked cars, and there are several orange traffic cones placed along the road. A person wearing an orange safety vest and a hard hat is holding a stop sign and standing near the cones. There are also construction vehicles parked on the side of the road. The street is surrounded by houses and trees, and the sky is clear, indicating a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and buses. The street is flanked by tall buildings, including a Chase bank and a UPS truck parked on the side. Pedestrians can be seen walking on the sidewalks, and traffic lights control the flow of vehicles. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a house and a parked truck in the driveway. The house has a garage and a driveway with a parked truck. The street is lined with trees and bushes, and there is a stop sign visible. The sky is clear, indicating a sunny day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot with various cars parked and a few pedestrians walking around. The scene is set in a sunny day with clear skies, and the surroundings are filled with trees and shrubs. The cars are parked in different directions, and some are closer to the camera than others. The pedestrians are walking around the parking lot, and a few are carrying bags. The overall atmosphere is calm and peaceful, with no signs of any traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a blue truck driving down the road. The truck is seen passing by a sidewalk with a few pedestrians walking. The street is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a highway with a focus on the road ahead. The camera captures the motion of the vehicle as it moves forward, showing the headlights illuminating the road and the taillights of other cars. The road is flanked by concrete barriers and occasional streetlights that cast a yellowish glow. The sky is dark, indicating it is nighttime. The camera angle remains steady, providing a clear view of the road and the surrounding area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is well-marked with clear lane dividers and speed limit signs. Vehicles, including cars and trucks, are moving in both directions. The weather appears to be clear and sunny, with a blue sky overhead. The surroundings include a mix of greenery and man-made structures, such as overpasses and barriers. The overall atmosphere is typical of a busy highway during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a single car driving down the road. The street is lined with trees and houses, and there are no pedestrians or other vehicles visible. The weather appears to be clear and sunny, and the time of day is likely late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes various vehicles such as cars, trucks, and a bus, all moving in different directions. There are also several pedestrians walking on the sidewalks and crossing the street. The street is lined with buildings, including commercial establishments and residential structures. The weather appears to be cloudy, and the time of day is likely daytime, as indicated by the natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a steep incline. The road is wet, indicating recent rain, and there are several parked cars along the sides of the street. A black SUV is driving down the hill, and a black car is parked on the side of the road. The street is lined with houses and trees, and there are streetlights and signs visible. The weather appears to be overcast, and the time of day is likely morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a few cars driving on it. The road is lined with orange and white striped poles, and there are several orange and white striped signs on the side of the road. The sky is blue with some clouds, and there are palm trees visible in the background. The road appears to be under construction, with a large orange and white striped construction vehicle parked on the side of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with trees and houses, and there are a few cars parked along the side of the road. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is lined with trees and has a median strip in the middle. There are several cars driving on the road, including a white car in the left lane, a black car in the right lane, and a white van in the center lane. The road appears to be in a suburban area with houses and buildings visible in the background. The weather is sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars parked along both sides of the road. The street is lined with trees and buildings, and there are several pedestrians walking on the sidewalks. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and pedestrians. The scene includes cars driving and stopping at the intersection, a person walking on the sidewalk, and a fire hydrant on the corner. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with only a few cars driving by. The weather appears to be sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a sidewalk on the right side and a median in the middle. The road is lined with trees and has a few orange and white striped poles on both sides. The sky is clear and blue, indicating a sunny day. The road appears to be in a suburban area, with a few cars driving on it. The video captures the movement of the cars and the trees swaying in the wind.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street lined with houses and parked vehicles. The street is relatively quiet, with a few parked cars and a truck. The houses are single-story with garages and driveways. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely morning or late afternoon, as the sunlight is bright but not harsh. The street is well-maintained, with a sidewalk on one side and a stop sign at the end of the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are mostly two-story homes with a mix of colors, including white, gray, and blue. The street is well-maintained, with a stop sign at the intersection and a fire hydrant near the curb. The weather appears to be clear, with sunlight illuminating the scene. The time of day is likely morning or late afternoon, as the shadows are long and the sunlight is bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime city street scene with several cars and pedestrians. The street is illuminated by streetlights and vehicle headlights, creating a well-lit environment. Multiple cars are parked along the sides of the street, and a few are driving, with their brake lights visible. Pedestrians can be seen walking on the sidewalks, and a few are standing near the crosswalks. The street is lined with buildings, some of which have illuminated windows, suggesting active businesses or residences. The overall atmosphere is busy yet orderly, typical of an urban setting at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. Multiple cars are driving down the street, some turning left and others continuing straight. Pedestrians are crossing the street and walking on the sidewalks. There are several storefronts and businesses along the street, including a sushi restaurant. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including a police car with its lights on. The street is lined with palm trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a foggy day. The road is lined with parked cars and houses, and there are trees and power lines visible in the background. The weather is overcast, and the visibility is low due to the fog. The street is relatively quiet, with a few cars driving and others parked along the side of the road. The video captures the peaceful and serene atmosphere of a suburban neighborhood on a foggy day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy urban street scene with multiple lanes of traffic, including cars and a truck. The street is lined with parked cars and a few pedestrians. A large white truck is seen driving through the intersection, while other vehicles are stopped at a red light. The sky is partly cloudy, and the overall atmosphere is typical of a city environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a city street. The road is illuminated by streetlights and the headlights of various vehicles. The street is lined with palm trees and a few buildings, including one with a large sign that reads ""Chandler High School."" The traffic is moderate, with cars moving in both directions and some parked along the side of the road. The overall atmosphere is calm, with the streetlights casting a warm glow over the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign painted on the road. The street is lined with houses, some of which have stairs leading up to their entrances. The houses are of various colors, including beige, white, and brown. The street is relatively quiet, with only a few cars parked along the side. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day is likely midday or early afternoon, as the sun is bright and casting shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a residential neighborhood. The street is wet, and there are cars parked along the curb. The houses are colorful, with one having a bright yellow exterior and another with a blue and orange facade. A blue car is parked in front of a house with a garage. The weather is overcast, and the street is quiet with no pedestrians or other vehicles visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a city street. The road is wet, reflecting the streetlights and creating a glossy surface. A bus is seen driving away from the camera, and several cars are visible, including a white car in the foreground and a black car in the background. The street is lined with parked cars and streetlights, and there is a pedestrian crossing the street. The scene is illuminated by streetlights, and the overall atmosphere is dark and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street intersection with various vehicles and pedestrians. A white postal truck is stopped at a red light, while other cars are moving through the intersection. There are traffic lights, streetlights, and parked cars on both sides of the road. The scene is set in a suburban area with houses and trees in the background. The weather appears to be cloudy, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The road is illuminated by streetlights and the headlights of the moving vehicle. Several cars are parked along the side of the road, and a few are in motion. The houses are modern and well-lit, with some having visible lights on. The sky is dark, indicating it is late evening or night. The overall atmosphere is quiet and peaceful, with no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a cyclist riding down the bike lane, surrounded by cars and buses. The street is lined with tall buildings, trees, and street lamps. The weather appears to be sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic, including cars and trucks. The scene is set in a suburban area with palm trees lining the road and buildings visible in the background. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including cars, buses, and trucks. Pedestrians are walking on the sidewalks, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime. The street is lined with trees and buildings, creating a typical urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. A truck is seen driving down the street, and a car is turning left. Pedestrians are crossing the street, and a fire hydrant is visible on the sidewalk. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few houses and trees on both sides. The road is mostly empty, with a few cars and pedestrians visible. The weather is clear and sunny, with shadows indicating it is daytime. The street is well-maintained, with streetlights and sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The road is well-marked with lane dividers and directional signs overhead. The weather appears to be clear and sunny, with a blue sky overhead. The traffic is moderate, with cars and trucks visible in both lanes. The surrounding area includes a concrete barrier with trees and shrubs growing on top, and a bridge overpass in the distance. The overall scene is typical of a busy highway during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection on a rainy day. The scene is set in a city with palm trees lining the streets. Traffic lights are visible, and various vehicles, including cars and trucks, are driving through the intersection. The road is wet, reflecting the lights and creating a glossy surface. The sky is overcast, indicating cloudy weather conditions. The overall atmosphere is typical of a busy urban area during a rainy day.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. A large blue bus is driving down the left lane, while several cars are stopped at a red light. A construction zone is visible ahead, with orange cones and a sign indicating ""Road Work Ahead."" The street is flanked by tall buildings, and the sky appears overcast, suggesting cloudy weather. The time of day seems to be daytime, as indicated by the natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. The scene includes cars, pedestrians, and traffic lights. The cars are moving in both directions, and some are parked along the sides of the street. The weather appears to be clear, and the time of day is likely daytime. The street is lined with tall buildings and trees, and there are various signs and streetlights visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign painted on the road. The street is lined with parked cars and houses, and there are trees and power lines visible in the background. The weather appears to be clear, and the time of day is likely morning or afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where a car is driving forward. The road is lined with tall palm trees on both sides, and there are several other vehicles visible in the scene. The weather appears to be clear and sunny, with shadows cast by the trees and vehicles. The road is well-maintained, and the traffic seems to be moving smoothly. The time of day is likely daytime, as indicated by the bright sunlight and shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic and a sidewalk. The street is lined with tall buildings, trees, and parked cars. The traffic is moderate, with cars moving in both directions. Pedestrians can be seen walking on the sidewalk, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and trucks driving in both directions. The weather appears to be overcast, and the road is wet, possibly due to recent rain. The traffic is moving slowly, and there are several traffic lights visible in the scene. The cars are driving on a multi-lane road with clear lane markings. The surrounding area includes trees and buildings, suggesting an urban environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a two-lane road with a white line down the center. The road is illuminated by streetlights, and there are trees on both sides. The sky is dark, indicating it is nighttime. The road appears to be relatively empty, with no other vehicles or pedestrians visible. The scene is quiet and peaceful, with the only sounds being the hum of the engine and the occasional chirp of an insect.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a white van driving down the road. The street is lined with houses, trees, and power lines. The weather appears to be clear and sunny, and the time of day is likely daytime. The van is the only vehicle visible in the video, and it is driving down the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and a bicycle lane. The street is lined with tall buildings, trees, and street lamps. The weather appears to be cloudy, and the time of day is daytime. The traffic is moving smoothly, and there are no visible pedestrians. The street is well-maintained, with clear lane markings and traffic signals.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The road is lined with palm trees and has a few cars driving in both directions. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The road is lined with palm trees and houses, and there are a few parked cars visible. The sky is dark, indicating it is late evening or night. The streetlights are on, illuminating the road and the surrounding area. The camera moves forward, capturing the quiet and peaceful atmosphere of the neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a residential street. The camera moves forward, capturing a series of parked cars along both sides of the street. The street is wet from the rain, and the sky is overcast. The trees lining the street are lush and green, and the overall atmosphere is calm and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by trees and greenery. A white car is parked on the side of the road, and a person is walking on the sidewalk. The road appears to be empty, with no other vehicles or pedestrians visible. The weather is clear and sunny, with blue skies and bright sunlight. The trees are tall and lush, providing shade and a natural backdrop. The road is well-maintained and appears to be in good condition.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street. The street is illuminated by streetlights and the headlights of vehicles. Several cars are parked along the sides of the road, and a few are in motion, driving or waiting at traffic lights. The buildings lining the street have lit windows, indicating that it is likely a residential area. The traffic lights are visible, and some vehicles are stopped at them. The overall atmosphere is quiet, with minimal pedestrian activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic and parked cars on both sides. The street is lined with buildings, and there are several pedestrians walking along the sidewalks. The weather appears to be clear and sunny, with shadows cast by the buildings and people. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.",The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a hill on the right side and a group of people walking on the side of the road. The road is surrounded by greenery and there are some barriers and signs on the side of the road. The sky is cloudy and the road is empty.,"The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars driving on a road. The cars are moving in different directions, and some are turning left. The road is lined with trees and houses, and there are traffic lights visible in the scene. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked and moving vehicles. The street is lined with trees and houses, and there are several cars parked along the curb. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the lighting is soft and the sky is not overly bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are two-story homes with various colors and designs, and the street is lined with parked cars. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of parked cars and houses. The street is lined with trees and has a few parked vehicles, including a white van, a black truck, and a white car. The houses are large and have multiple stories, with some featuring green garages and brick exteriors. The street is relatively quiet, with no visible pedestrians or moving vehicles. The weather appears to be clear and sunny, with a blue sky and some clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a quiet neighborhood. The road is dimly lit by streetlights, and there are a few parked cars and a fire hydrant visible. The camera captures the road as it curves to the right, and a yellow school bus is seen driving in the opposite direction. The scene is peaceful, with no pedestrians or other vehicles in sight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street with a large building in the background. The street is illuminated by streetlights and the headlights of a car approaching the camera. The building has a large sign with red neon lights, and there are several smaller signs and lights visible on the street. The car continues to approach the building, and the camera captures the details of the street and the building's facade.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a city street during twilight, with a pedestrian crossing the road. The street is lined with palm trees and has multiple lanes for vehicles. There are traffic lights and street signs visible, and a few cars are present, some of which are stopped at the red light. The sky is transitioning from day to night, with a mix of blue and pink hues.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with a bus and several cars. The bus is stopped at a bus stop, and people are boarding and exiting it. The street is filled with cars, some of which are passing by the bus, while others are waiting at the traffic light. The traffic light is red, and the cars are stopped. The weather appears to be cloudy, and the time of day is daytime. The street is lined with trees and buildings in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes of traffic, including cars and trucks, moving in both directions. The scene is set in a suburban area with palm trees lining the sides of the road. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is likely daytime, as the lighting is bright and natural. The road is well-maintained and has clear lane markings, with traffic lights visible at intersections. The overall atmosphere is calm and orderly, with vehicles following traffic rules and maintaining a steady pace.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with various objects and actions taking place. A silver car is seen driving away from the camera, while a white car is approaching the intersection. Several pedestrians are crossing the street, including a woman with a child and another woman with a suitcase. Traffic lights are visible in the scene, with one showing a green light. The environment is a busy street with multiple lanes and parked cars on both sides. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a few cars driving in both directions. The road is lined with trees and power lines, and there are some traffic lights visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes cars, pedestrians, and traffic lights. The weather appears to be clear and sunny, with the time of day being daytime. The street is lined with palm trees and buildings, creating a suburban atmosphere.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road. The road is lined with trees and houses on both sides. The car passes by a park with a sign indicating ""Speed Bumps 20 mph"" and a yellow diamond-shaped sign. The sky is clear and blue, indicating a sunny day. The car continues down the road, passing by more trees and houses.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a white van driving down the road. The street is lined with parked cars and houses, and there are trees and bushes along the sidewalk. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign painted on the road. The street is lined with parked cars and houses, and there are power lines overhead. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are traffic lights at intersections. The weather appears to be clear and sunny, with shadows cast by the trees and streetlights. The time of day seems to be daytime, as indicated by the bright sunlight and shadows. The road is relatively busy with moderate traffic, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a row of houses on the left side and parked cars along the right side. The street is lined with trees, and there are several pedestrians walking on the sidewalk. A person is seen riding a bicycle on the street, and a few cars are driving or parked along the road. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a house in the background. The street is lined with trees and has a sidewalk on the right side. A person is seen walking on the sidewalk, and a fire hydrant is visible near the curb. The sky is clear, indicating a sunny day. The video captures the peaceful atmosphere of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and a tram. Pedestrians are walking on the sidewalks, and there are traffic lights and street signs visible. The street is lined with tall buildings and trees, and the weather appears to be clear and sunny. The time of day is likely daytime, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet city street. The road is slick with rain, and the headlights of cars create a glare on the pavement. Several cars are parked along the sides of the street, and a few are driving slowly. The traffic lights are visible, and the red light is on, indicating that the cars are stopped. The street is illuminated by streetlights and the headlights of the cars, creating a somewhat eerie atmosphere. The overall scene is quiet and still, with only the sound of raindrops and occasional car horns breaking the silence.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street scene with a focus on a white FedEx truck driving down the street. The truck is seen passing by a group of people sitting on a wall, and a red car is also visible on the street. The video captures the movement of the truck and the red car as they navigate through the city, with the truck eventually turning onto a different street. The scene is set in a city with tall buildings and trees lining the streets.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot surrounded by trees, with a few cars parked and a few others driving through. The scene is set in a quiet neighborhood with a mix of parked cars and moving vehicles. The weather appears to be sunny, with shadows cast by the trees. The time of day is likely daytime, as the lighting is bright and clear.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with heavy traffic. Numerous cars are stopped at a red light, while others are moving slowly through the intersection. Pedestrians are crossing the street at a crosswalk, and a few are walking on the sidewalk. The street is lined with tall buildings, and the sky is overcast, indicating cloudy weather. The time of day appears to be late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential neighborhood with a clear blue sky and bright sunlight. The street is lined with houses, trees, and street lamps. A stop sign is visible at the intersection, and there are no visible pedestrians or vehicles. The houses are single-story with driveways and garages. The scene is peaceful and typical of a suburban area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a stop sign and a building with a sign that reads ""FLORIDA."" The street is lined with palm trees and power lines, and there are several cars parked along the side of the road. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving on a highway with a cloudy sky overhead. The car is seen driving under a bridge and passing by a billboard. The road is relatively empty, with only a few other vehicles visible in the distance. The car continues to drive on the highway, passing under another bridge and approaching a cityscape in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with various cars and pedestrians. The scene is set in a commercial area with multiple buildings and businesses, including a bank and a restaurant. The weather appears to be cloudy, and the time of day is daytime. The cars are moving slowly, and some pedestrians are crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with trees and houses, and there are several cars parked along the sides of the road. As the camera moves forward, it captures a person walking on the sidewalk and a stop sign at the intersection. The street is relatively quiet, with no visible traffic or pedestrians crossing the road. The overall atmosphere is peaceful and serene, with the sound of birds chirping in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a two-lane road flanked by trees and streetlights. The road is relatively empty, with a few cars visible in the distance. The trees line both sides of the road, casting shadows on the pavement. The sky is clear, indicating a sunny day. The time of day appears to be either early morning or late afternoon, as the sunlight is bright and casting long shadows. The overall atmosphere is calm and serene, with no signs of heavy traffic or bustling activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential area. The road is wet, likely from recent rain, and is illuminated by streetlights. Several cars are parked along the side of the road, and a few are driving. The scene is quiet, with no pedestrians visible. The weather appears to be clear, with no signs of rain at the moment. The overall atmosphere is calm and peaceful, typical of a suburban neighborhood at night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and pedestrians. The scene includes cars turning left, a pedestrian crossing the road, and a traffic light changing from red to green. The environment is a busy street with trees and buildings in the background, and the weather appears to be cloudy. The time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with palm trees and houses, and there are a few parked cars along the curb. The road is relatively empty, with only a few vehicles visible in the distance. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. The street is lined with palm trees and various buildings, including a large brick structure with arched windows. A bridge spans the background, and a few pedestrians can be seen walking along the sidewalks. The weather appears to be overcast, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few scattered clouds. The road is lined with tall trees on both sides, and there are several streetlights along the way. The road appears to be in a suburban area, with houses visible in the background. There are a few cars driving on the road, and some pedestrians can be seen walking along the sidewalk. The overall scene is peaceful and quiet, with no signs of rush hour traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and motorcycles. Pedestrians are walking on the sidewalks, and there are various storefronts and businesses along the street. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a winding road and houses on both sides. The road is lined with parked cars, and there are several houses with well-maintained front yards featuring bushes and trees. The houses vary in color, including white, blue, and pink. The weather appears to be overcast, and the time of day is likely early morning or late afternoon, as the lighting is soft and not overly bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a car driving down it. The car is moving forward, and the road is lined with trees and houses on both sides. The weather appears to be clear and sunny, with shadows cast on the road. The road is relatively empty, with no other vehicles or pedestrians visible. The houses on the right side of the road are residential, and the trees provide shade and greenery. The overall scene is peaceful and quiet, with no signs of traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with palm trees and houses. The street is lined with parked cars, and there are sidewalks and driveways visible. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely daytime, as the lighting is bright and there are no visible streetlights turned on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where cars are driving in both directions. The road is lined with palm trees and has a median strip separating the opposing traffic. There are traffic lights at intersections, and the sky is clear, indicating a sunny day. The cars are maintaining a safe distance from each other, and the overall scene is calm and orderly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead. The road is mostly empty, with only a few cars driving in the distance. There are several orange and white striped poles lining the side of the road, and a few palm trees can be seen in the background. The road appears to be in a suburban area, with a few buildings visible in the distance. The weather is clear and sunny, with no clouds in sight. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a white truck driving down the road. The truck is followed by several cars, including a white SUV and a black car. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes several cars, some of which are turning left, while others are driving straight or making right turns. The street is lined with palm trees and has a few traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The overall setting is a typical urban or suburban area with moderate traffic flow.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at dusk with numerous cars and traffic lights. The traffic is moving slowly, and the street is well-lit with streetlights and traffic lights. The sky is a mix of purple and blue hues, indicating the time of day is either early morning or late evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are several buildings on either side. The weather appears to be cloudy, and the time of day is likely daytime. The cars are driving down the street, and pedestrians are crossing the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a bustling city street with tall buildings on both sides. The street is filled with cars, some of which are stopped at traffic lights, while others are moving. Pedestrians are crossing the street at a crosswalk, and some are walking on the sidewalks. The weather appears to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. The street is lined with parked cars and buildings, and there are trees and power lines visible. A few pedestrians are walking on the sidewalk, and a car is turning left onto the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a street closed sign and a white truck. The street is lined with trees and power lines, and there are several cars and pedestrians visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot with several cars and a bus parked or moving around. The cars are of various colors and sizes, and some are parked while others are driving or turning. The bus is white and has a logo on its side. The parking lot is surrounded by trees and a stone wall, and there is a sign indicating parking and directions. The sky is overcast, suggesting cloudy weather. The scene appears to be during the day, as there is natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along both sides of the road. The street is lined with trees and power lines, and there are buildings on either side. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are parked in a neat manner, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street on a rainy day. Multiple cars are driving on the road, with some turning left and others continuing straight. The traffic lights are visible, and the road is wet, reflecting the lights and surroundings. The weather is cloudy and rainy, with raindrops visible on the cars and the ground. The street is lined with buildings and power lines, and the overall atmosphere is typical of a busy urban area during inclement weather.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a variety of objects and actions. The street is lined with palm trees and buildings, and there are several cars driving and parked along the road. A rainbow flag is visible on a pole in the distance. The weather appears to be cloudy, and the time of day is likely early evening or dusk.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and pedestrians. A bus is driving down the road, and several cars are following behind it. The traffic lights are green, allowing the vehicles to move forward. Pedestrians are crossing the street at a crosswalk, and there are multiple cars parked along the side of the road. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and traffic lights. The scene is set in a suburban area with clear blue skies and bright sunlight. The traffic lights are visible at various points in the intersection, and cars are moving in different directions. The cars are of various types, including sedans and SUVs. The intersection is well-lit, and the traffic is flowing smoothly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with visible traffic lights and street signs. The road is well-lit by streetlights, and there are several cars on the road, some of which are turning left. The scene is set in a suburban area with houses and trees visible in the background. The weather appears to be clear, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and pedestrians. A white van is prominently visible, stopped at a traffic light. The street is lined with parked cars and a few pedestrians walking along the sidewalks. There are traffic lights, street signs, and power lines overhead. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars driving through. The road is wet, indicating recent rain, and there are trees lining both sides of the street. The sky is overcast, suggesting cloudy weather. The street appears to be in a residential area, with houses visible in the background. The cars are moving at a moderate pace, and there are no pedestrians or other vehicles in sight. The overall atmosphere is calm and serene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and streetlights. The road is relatively empty, with a few cars driving in both directions. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as the sky is bright but not fully illuminated.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. The street is lined with buildings, some of which have signs and advertisements. There are also several pedestrians walking along the sidewalks, and a few bicycles parked near the buildings. The weather appears to be clear and sunny, with the sun shining brightly in the sky. The time of day is likely midday, as the street is well-lit and there are no visible signs of the sun setting.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple cars and pedestrians. The traffic light is red, causing vehicles to stop. There are several cars waiting at the intersection, including a white van, a black SUV, and a silver car. Pedestrians are crossing the street, and a construction site is visible in the background. The weather is clear and sunny, and the time of day appears to be midday.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a residential neighborhood. The street is wet, and there are several parked cars along the sides of the road. The camera moves forward, capturing the wet pavement and the reflections of the raindrops. The trees lining the street are lush and green, and the sky is overcast. The overall atmosphere is calm and quiet, with no visible pedestrians or moving vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and buildings. The road is mostly clear, with a few cars driving in both directions. The weather appears to be sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a car driving forward. The car passes a yellow SUV and several parked cars, including a white truck and a black car. The street is lined with trees and houses, and there are traffic lights visible in the distance. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video shows a residential neighborhood with a street lined with parked cars and houses. The street is relatively quiet, with no visible pedestrians or traffic lights. The houses are single-story with a mix of brick and stucco exteriors, and some have large front yards with cacti and other desert plants. The weather appears to be clear and sunny, with shadows indicating it is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are traffic lights and streetlights visible. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving slowly, and some pedestrians are walking on the sidewalks.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential area. The road is wet, and the headlights illuminate the surroundings. Several cars are visible, some with their lights on. The scene includes a speed bump, a stop sign, and a speed limit sign. The area is relatively quiet, with minimal traffic and no pedestrians. The weather appears to be clear, and the lighting suggests it is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a woman walking across the road. The street is lined with trees and houses, and there are several cars parked or driving on the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with parked cars on both sides. The street is lined with trees and houses, and there are power lines overhead. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a truck. Pedestrians are walking on the sidewalks, and there are various signs and traffic lights visible. The street is lined with tall buildings, and the weather appears to be clear and sunny. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a two-lane road with a center divider. The road is illuminated by streetlights, and there are occasional vehicles passing by. The surroundings are mostly dark, with some faint lights visible in the distance. The road appears to be in a suburban or rural area, with a low wall and some vegetation on the side. The weather seems clear, and the overall scene is quiet and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes of traffic, including cars and trucks. The scene is set in a suburban area with palm trees lining both sides of the road. The weather appears to be clear and sunny, with a blue sky and white clouds visible. The time of day is likely daytime, as the lighting is bright and natural. The road is well-maintained and has clear lane markings.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene at dusk with a garbage truck driving down the road. The truck is the main focus of the video, and it is surrounded by parked cars on both sides of the street. The sky is dark, indicating that it is either early morning or late evening. The street is illuminated by streetlights, and there are no pedestrians visible in the scene. The overall atmosphere is quiet and calm, with no signs of rush hour traffic or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with tall palm trees and white fences, and there are a few houses visible in the background. A red car is seen driving down the street, and a person is walking on the sidewalk. The scene is peaceful and sunny, with no other vehicles or pedestrians in sight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a suburban area with a bus and several cars driving down a wet road. The bus is driving down the road, and several cars are following behind it. The road is wet, and there are puddles on the ground. The sky is overcast, and the overall lighting is dim due to the rain. The cars are driving cautiously, and the bus is moving slowly. The area is lined with trees and buildings, and there are traffic lights visible in the distance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a street lined with houses and parked cars. The street is relatively quiet, with a few pedestrians visible. The houses are predominantly two-story homes with driveways and garages. The weather appears to be clear and sunny, casting shadows on the ground. The time of day is likely morning or late afternoon, as indicated by the angle of the sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white car turning left onto a road, followed by a line of cars driving down the road. The street is lined with parked cars and trees, and there are several street signs and traffic lights visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day with a focus on a building with large windows and a stop sign in front of it. The camera moves from left to right, capturing the building's exterior and the wet road. The scene is quiet, with no visible pedestrians or vehicles. The weather is overcast, and the building's windows reflect the cloudy sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet road, with cars driving through the rain. The road is illuminated by streetlights and vehicle headlights, creating reflections on the wet surface. Traffic lights are visible, and some cars are stopped at red lights. The weather is rainy, and the road appears slippery. The scene is a typical urban street at night, with cars moving slowly due to the wet conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including cars, buses, and a trolley. The street is lined with palm trees and has several traffic lights and streetlights. Pedestrians can be seen walking on the sidewalks, and there are a few bicycles visible. The weather appears to be clear and sunny, with a blue sky overhead. The time of day seems to be late afternoon, as indicated by the shadows cast by the objects in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a two-lane road with a double yellow line in the center. The road is illuminated by streetlights, and there are trees and houses on both sides. The sky is dark, indicating it is nighttime. The road appears to be relatively empty, with only a few cars visible in the distance. The scene is quiet and peaceful, with no pedestrians or other significant activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple cars and pedestrians. The street is lined with buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street with several cars and trucks driving down the road. The traffic lights are red, causing the cars to stop at the intersection. The street is wet, and the trees on both sides of the road are visible. The sky is overcast, and the overall atmosphere is gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a rainy day. The street is lined with parked cars and houses, and the wet pavement reflects the overcast sky. The camera moves forward, capturing the parked cars and houses on both sides of the street. The weather is rainy, and the street is wet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few cars parked along the curb. The street is lined with trees and houses, and there are some blue trash cans visible. The weather appears to be overcast, and the time of day is likely morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The street is lined with trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with no pedestrians visible. The weather appears to be sunny, with bright sunlight illuminating the scene. The time of day is likely daytime, as the lighting is bright and clear.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and pedestrians. The scene is set in a well-lit urban area with tall buildings and trees lining the streets. The weather appears to be clear and sunny, with shadows cast by the buildings and trees. The time of day is likely late afternoon or early evening, as the traffic is heavy and the streetlights are on.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white car driving down a road. The car is surrounded by trees and houses, and there are several other cars parked or driving on the street. The road has a stop sign and a no parking sign, and there are power lines overhead. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including a red SUV, a silver SUV, and a gray car. The traffic lights are red, causing the vehicles to stop. There are several pedestrians on the sidewalks, and a 7-Eleven store is visible in the background. The weather is clear and sunny, and the time of day appears to be midday.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy urban intersection with multiple lanes of traffic, including cars, trucks, and pedestrians. The scene is set under a bridge with a large white building in the background. The weather appears to be clear and sunny, and the time of day is likely daytime. The traffic lights are visible, and the cars are moving in different directions, including turning and driving straight. Pedestrians are crossing the street, and the overall atmosphere is bustling and dynamic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including a bus lane. The street is lined with tall buildings, and there are several pedestrians walking on the sidewalks. A large white bus is seen driving down the street, and a yellow taxi is also visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic moving in both directions. The weather appears to be overcast, with a cloudy sky and no visible precipitation. The road is well-lit, suggesting it is either early morning or late afternoon. Several vehicles are visible, including cars and trucks, all maintaining a moderate speed. The highway is flanked by tall streetlights and a few trees, with a large sign indicating the direction to Warner Rd. The overall atmosphere is calm, with no signs of congestion or emergency vehicles.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a road running through it. The road is lined with trees and houses, and there are a few cars parked along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video shows a residential neighborhood with houses, trees, and parked cars. The weather is clear and sunny, and the time of day is daytime. The video captures the movement of cars and pedestrians in the area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and a church in the background. The street is lined with trees and has a tram track running down the middle. The sky is overcast, and the time of day appears to be daytime. The cars are moving in both directions, and there are traffic lights and street signs visible. The scene is busy with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a bus. The street is lined with buildings, some of which have large windows and others with signs indicating businesses. Pedestrians can be seen walking on the sidewalks, and a few are carrying umbrellas. The traffic lights are visible, and the street is well-lit, suggesting it is daytime. The weather appears to be clear, with no signs of rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are a few pedestrians visible on the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. Pedestrians are crossing the street at various points, and there are traffic lights and street signs visible. The street is flanked by tall buildings, and the weather appears to be clear and sunny. The time of day is likely daytime, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white car driving down the center of the road. The road is surrounded by trees and a construction site on the right side. The sky is clear and blue, indicating a sunny day. The road is relatively empty, with only a few cars passing by. The construction site appears to be a large area of dirt and sand, with some equipment visible in the distance. The overall scene is peaceful and quiet, with no signs of traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy street scene with multiple cars and a white van driving on the road. The cars are moving slowly, and some are stopped at a red light. The street is lined with trees and buildings, and the sky is overcast. The overall atmosphere is hazy due to the fog.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a foggy street scene with a car driving forward. The car is seen turning left onto a street with a stop sign and a building with palm trees in the background. The street is wet, and there are several cars parked along the sides of the road. The sky is overcast, and the overall atmosphere is hazy due to the fog.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and a bicycle. The street is lined with trees and buildings, and there are several pedestrians walking on the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime. The traffic lights are visible, and the cars are moving in both directions.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. The street is lined with tall buildings, trees, and various businesses. Numerous cars are parked along the sides of the road, and others are driving in both directions. The traffic appears to be moving smoothly, with some cars changing lanes and others waiting at traffic lights. Pedestrians can be seen walking on the sidewalks, and a few traffic lights are visible at intersections. The weather is clear, and the time of day seems to be daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of parked cars along both sides. The street is lined with houses, and there are trees and power lines overhead. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, trucks, and a red car in the foreground. The street is lined with trees and buildings, and pedestrians can be seen walking on the sidewalks. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various objects and actions. The street is lined with parked cars, and several pedestrians are walking along the sidewalks. There are traffic lights and street signs visible, indicating the presence of an intersection. The weather appears to be clear and sunny, with shadows cast by the objects in the scene. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few cars parked along the sides of the road. The street is lined with trees and houses, and there are a few blue trash cans placed at intervals. The sky is overcast, suggesting a cloudy day. The street appears to be quiet, with no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with palm trees and houses, and there are several parked cars along the sides of the street. The street is relatively quiet, with no visible pedestrians or moving vehicles. The weather appears to be clear and sunny, with shadows cast by the trees and houses indicating the position of the sun. The time of day is likely late morning or early afternoon, as the sun is high in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet street with a few cars parked along the side of the road. The street is lined with trees and has a bike lane on the right side. The weather is clear and sunny, and the time of day appears to be daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene during sunset. Numerous cars are visible, some moving while others are stationary. The traffic lights are green, allowing vehicles to proceed. The sky is filled with clouds, and the sun is setting in the distance, casting a warm glow over the scene. The street is lined with palm trees and other vegetation, adding to the picturesque setting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a white car driving down it. The road is lined with trees and has a sidewalk on the right side. The sky is clear and blue, indicating a sunny day. The road appears to be in a residential area, with houses visible in the background. The car is driving towards a hotel, which is located at the end of the road. The video captures the car passing by the hotel and continuing down the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a traffic jam on a wet highway, with numerous cars stopped in traffic under an overpass. The scene is set on a rainy day, with the overpass casting a shadow over the highway, and the wet road reflecting the red taillights of the vehicles. The traffic is moving slowly, and the overpass is supported by several pillars. The weather conditions are overcast, and the overall atmosphere is one of congestion and dampness.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, trucks, and pedestrians. The traffic lights are green, allowing vehicles to move through the intersection. The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as indicated by the bright sunlight. The road is well-paved and marked with lanes and traffic signs.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic. Several cars are visible, some moving in the same direction as the viewer, while others are moving in the opposite direction. The traffic lights are red, indicating that the cars are stopped at the intersection. The sky is clear and blue, suggesting a sunny day. The time of day appears to be late afternoon, as the sun is low in the sky.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a mix of parked cars and a few moving vehicles. The street is lined with houses, trees, and utility poles. The weather appears to be overcast, with no direct sunlight visible. The street is relatively empty, with only a few cars driving and others parked along the sides. The overall atmosphere is calm and peaceful, with no signs of heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with houses, each featuring a garage and a driveway. The houses have various architectural styles, with some having a more modern design and others appearing older. The driveways are mostly empty, with only a few parked cars visible. The street is relatively quiet, with no pedestrians or vehicles in motion. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day is likely midday, as the sunlight is strong and the shadows are short.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic and a sidewalk where a large group of pedestrians is waiting to cross. The scene is set in a suburban area with houses and trees visible in the background. The weather appears to be clear and sunny, with shadows cast by the people and objects. The time of day is likely midday or early afternoon, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The street is illuminated by streetlights and the headlights of passing vehicles. The neighborhood is lined with palm trees and houses, some of which have lights on. The road is relatively quiet, with only a few cars visible. The sky is dark, indicating it is late evening or night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with orange and white striped barriers, and there are traffic cones placed at intervals. The surroundings include a mix of greenery and construction areas, with a large building visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. Pedestrians are crossing the street at various points, and there are traffic lights and street signs visible. The street is flanked by tall buildings, and there are trees and greenery along the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and pedestrians. The scene is set in a large urban area with tall buildings and trees lining the streets. The weather appears to be clear and sunny, with the time of day being daytime. The traffic is moving smoothly, with cars and buses passing each other and pedestrians crossing the street. The street signs and traffic lights are visible, indicating that the area is well-organized and regulated.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street with multiple lanes of traffic, including cars and trucks. The weather appears to be cloudy, and the time of day is likely early evening or late afternoon. The traffic is moving slowly, and there are several traffic lights visible in the distance. The street is lined with trees and houses, and there is a train passing by in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The scene includes several cars, some of which are stopped at a red light, while others are moving. There are also pedestrians visible on the sidewalks, and a few traffic lights can be seen regulating the flow of traffic. The street is lined with trees and power lines, and the weather appears to be clear. The time of day is likely daytime, as indicated by the natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a wet road, with the windshield wipers in motion. The scene is illuminated by various lights, including streetlights, taillights, and headlights from other vehicles. The road appears to be a multi-lane highway or major road, with visible lane markings and a barrier separating the lanes. The weather conditions are rainy, as evidenced by the wet road surface and the windshield wipers. The overall atmosphere is dark and somewhat eerie, with the lights creating a ghostly effect on the windshield.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a mix of vehicles, including cars, trucks, and a motorcycle. The street is lined with buildings, some of which have scaffolding and signs. A large Coca-Cola billboard is visible in the background. The sky is partly cloudy, and the lighting suggests it is daytime. The traffic is moderate, with cars moving in both directions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where vehicles are moving in both directions. The road is lined with palm trees and has a speed limit of 45 mph. There are traffic lights at intersections, and the weather appears to be clear and sunny. The scene is a typical suburban street with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a truck driving down the road, surrounded by parked cars and buildings. The truck has graffiti on its back and is moving forward. The street is lined with trees and power lines are visible overhead. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a mix of vehicles and pedestrians. The scene includes cars, buses, and a white van with the word ""Magnolia"" on its back. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at the intersection. A large truck is parked on the left side of the street, and several cars are parked along the right side. The street is lined with houses and trees, and there are orange traffic cones and barriers set up in the middle of the road. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a street lined with houses and parked cars. The street is relatively quiet, with a few cars driving and others parked along the side. The houses are two-story homes with various colors and designs, and some have balconies or patios. The weather appears to be clear and sunny, with shadows cast by the houses and trees. The time of day is likely midday or early afternoon, as the sunlight is bright and the shadows are short.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day in a suburban area. The camera pans from a parking lot with several cars parked to a street with a stop sign and a crosswalk. The road is wet, and there are trees and houses in the background. The weather is cloudy and rainy, and the time of day appears to be daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with multiple lanes of traffic, including cars and trucks. The street is lined with palm trees and has a bike lane on the right side. There are traffic lights and street signs throughout the scene, and a construction crane is visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video captures a busy intersection with various vehicles and pedestrians. A UPS truck is seen making a turn, while cars and trucks navigate through the intersection. A yellow sign warns of a school zone, and a billboard for ""Cars 4 Kids"" is visible. The scene is set in a city with tall buildings in the background, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple cars and pedestrians. The scene is set in a suburban area with trees and houses visible in the background. The weather appears to be clear and sunny, with the time of day being daytime. The traffic lights are red, causing vehicles to stop and pedestrians to cross the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a school zone. The camera captures a road with a no passing sign, a school zone sign, and a fire hydrant. The street is lined with parked cars and houses, and there are trees and palm trees in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic and pedestrians crossing the road. The scene is bustling with activity, as cars and buses move through the intersection, while people walk along the sidewalks. The traffic lights change, allowing vehicles to proceed and pedestrians to cross. The street is lined with tall buildings, and various signs and banners are visible, indicating different businesses and directions. The weather appears to be clear, and the time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street with palm trees lining the sidewalk. The street is wet, and the traffic lights are green, allowing cars to move through the intersection. A few pedestrians are walking on the sidewalk, and the sky is overcast with clouds. The overall atmosphere is calm and quiet, with the sound of raindrops and occasional traffic noise.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of cars and trucks parked along the sides. The street is lined with power lines and trees, and there are several houses visible in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with palm trees and has a median strip separating the lanes. There are traffic lights and street signs visible, indicating directions and traffic rules. The sky is clear with a few clouds, suggesting a sunny day. The cars are moving smoothly, and there is no visible congestion. The overall scene appears to be a typical day in a suburban or semi-urban area with well-maintained roads and infrastructure.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. A blue van with the SuperShuttle logo is prominently visible, stopped at a red light. Other cars are also present, some moving and others waiting. Pedestrians are crossing the street, some holding umbrellas. The street is wet, indicating recent rain. Tall buildings and construction cranes are visible in the background, suggesting an urban environment. The weather appears to be cloudy and rainy.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a highway with multiple lanes. The scene is illuminated by streetlights and vehicle headlights, creating a bright and busy atmosphere. The road is filled with cars, some of which are changing lanes, while others are driving in their respective lanes. The camera angle captures the road stretching into the distance, with a bridge visible overhead. The weather appears to be clear, and the overall setting is a typical highway environment during the evening or night.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is mostly empty, with only a few cars and a bicycle visible. The street is lined with trees and houses, and there are streetlights and signs along the sides. The weather appears to be sunny and clear, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and traffic lights. The traffic lights are green, indicating that the cars can proceed. The cars are moving forward, and the scene appears to be a typical urban street with trees and buildings in the background. The weather is clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene is set in a suburban area with palm trees lining the streets. The sky is clear and blue, indicating a sunny day. The traffic lights are visible, and the cars are moving in different directions, including turning and driving straight. The road is well-paved, and there are various signs and streetlights along the sides. The overall atmosphere is calm and orderly, with vehicles following traffic rules.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, pedestrians, traffic lights, trees, and buildings. The traffic lights are red, causing vehicles to stop. The weather appears to be clear and sunny, and the time of day is daytime. The road is well-paved, and there are no visible pedestrians crossing the street.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with tram tracks running down the middle. There are several pedestrians walking on the sidewalks, and a few cars are driving on the road. The street is lined with buildings, and there are traffic lights and streetlights visible. The weather appears to be clear, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a focus on a two-story house with a beige exterior and a red roof. The house has a driveway with a parked car and a garage. The street is lined with trees and other houses, and there are a few cars parked along the curb. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with tall palm trees and houses, and there are several parked cars along the sides of the street. The street is mostly empty, with only a few cars driving by. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street. The road is illuminated by streetlights and the headlights of numerous vehicles. The street is lined with parked cars on both sides, and there are a few moving vehicles. The buildings along the street appear to be residential or mixed-use, with some having balconies and others with signs. The sky is dark, indicating it is late evening or night. The overall atmosphere is calm, with the streetlights casting a warm glow over the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple lanes of traffic, including cars, buses, and trucks. The road is lined with palm trees and has a median with a fence separating the lanes. There are traffic lights and street signs visible, indicating directions and traffic rules. The weather appears to be cloudy, and the time of day is likely daytime, as the lighting is bright but not overly harsh. The overall atmosphere is typical of a bustling urban area with moderate traffic flow.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving through an intersection and approaching a hospital complex. The car passes by a sign for Dignity Health and continues down the road, passing by palm trees and other buildings. The sky is clear and blue, indicating a sunny day. The road is relatively empty, with only a few cars visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a stop sign at an intersection. The street is lined with trees and houses, and there are cars parked along the curb. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars, buses, and a trolley. The street is lined with palm trees and tall buildings, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic, including a dedicated lane for taxis. The street is lined with tall buildings, and there are several pedestrians walking along the sidewalks. The traffic is moving smoothly, with cars and buses traveling in both directions. The weather appears to be clear, and the time of day is likely late afternoon or early evening, based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day with a focus on a wet road and a building in the background. The road is wet and reflective, with a bike lane visible. The building in the background has a parking lot with several cars parked. The sky is overcast, and the overall scene is dark and gloomy due to the rain.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple lanes of traffic. The camera vehicle is stopped at a red light, and there are numerous cars in front, including a white truck on the left and a silver sedan directly ahead. The traffic appears congested, with cars stopped and moving slowly. The street is lined with buildings, and there is a pedestrian crossing nearby. The weather is overcast, and the time of day is likely late afternoon or early evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a street with multiple lanes of traffic, including a white car directly ahead and several other vehicles in the surrounding lanes. The road is lined with trees and houses, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely early morning or late afternoon, as indicated by the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a truck. The scene is set in a city with tall buildings and palm trees lining the street. The weather appears to be cloudy, and the time of day is daytime. The traffic lights are visible, and some pedestrians are crossing the street. The overall atmosphere is bustling and typical of a city environment.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic. A white car is stopped at a red light, while a train passes by on the left side of the street. Several other cars are visible, some of which are moving while others are stationary. The street is lined with palm trees and tall buildings, indicating an urban environment. The weather appears to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a variety of parked cars along both sides. The street is lined with houses, some of which have colorful facades and awnings. There are also trees and power lines visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy street at night with numerous cars and pedestrians. The street is wet, likely due to recent rain, and the cars are stopped at a red light. The traffic lights are visible, and there are buildings on both sides of the street. The weather appears to be rainy, and the time of day is nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked cars and moving vehicles. The street is lined with houses, trees, and street lamps. The weather appears to be overcast, and the time of day is likely daytime. The street is relatively quiet, with a few cars driving and others parked along the sides. The video captures the essence of a typical suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city intersection with multiple lanes of traffic and pedestrians. The scene includes cars, trucks, and a bus, all moving in various directions. The traffic lights are visible, and the road is well-marked with lane dividers. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with a car driving down a residential road. The car is moving forward, and the street is wet with visible steam rising from the ground. Several cars are parked along the sides of the road, and there are houses and trees lining the street. The sky is overcast, indicating cloudy weather conditions. The overall atmosphere is quiet and calm, with no pedestrians or other vehicles in motion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street on a foggy day. The scene includes a house with a driveway, a speed limit sign, and a school zone sign. A white car is seen driving down the street, and a red car is parked in the driveway. The street is lined with parked cars and has a speed bump in the middle. The sky is overcast, and the overall atmosphere is quiet and still.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, pedestrians, and traffic lights. The weather appears to be cloudy, and the time of day is daytime. The street is bustling with activity, and the traffic lights are changing frequently.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. Cars are moving in both directions, and there are several buildings with balconies and trees lining the street. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky and bright sunlight. The road is lined with trees and houses, and there are several cars parked along the side of the road. The street is relatively quiet, with only a few cars driving by. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is likely daytime, as the sunlight is bright and the shadows are short. Overall, the scene is peaceful and typical of a suburban neighborhood.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway at dusk with a white car driving in the center lane. The car is approaching a bridge, and the road is wet, possibly due to recent rain. The sky is overcast, and the headlights of the car are on. The road is lined with streetlights, and there are other cars visible in the distance. The overall scene is quiet and calm, with no pedestrians or other vehicles in the immediate vicinity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a car driving down a winding road with a speed limit of 30 mph. The road is lined with trees and houses, and there is a FedEx truck parked on the side of the road. The sky is clear and the weather is sunny. The car passes under a bridge and continues down the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy day on a city street with multiple lanes of traffic. The windshield wipers are in motion, indicating ongoing rain. The street is lined with palm trees, and there are several cars driving in both directions. The traffic appears to be moving smoothly, with no visible congestion. The sky is overcast, and the overall atmosphere is misty and damp. The scene is typical of a rainy urban environment, with vehicles navigating through the wet conditions.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and a tram. Pedestrians are crossing the street at a crosswalk, and there are tall buildings in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a few cars and pedestrians. The street is lined with palm trees and buildings, and there are traffic lights and signs indicating bike lanes. A cyclist is seen riding through the bike lane, and a few cars are driving on the road. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a city street. The road is illuminated by streetlights, and there are several cars visible, some with their headlights on. The street is relatively quiet, with no pedestrians or other vehicles in the immediate vicinity. The surroundings are urban, with buildings and trees lining the street. The weather appears to be clear, with no signs of rain or other adverse conditions. The time of day is nighttime, as indicated by the darkness and artificial lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a residential road. The road is lined with parked cars and houses, and there are trees and a hill in the background. The sky is cloudy, and the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is well-marked with clear lane dividers and directional signs overhead. Vehicles, including cars and trucks, are moving in both directions, with some cars changing lanes. The weather appears to be clear and sunny, with a blue sky overhead. The surroundings include a mix of greenery and man-made structures, such as overpasses and barriers. The overall atmosphere is typical of a busy highway during the day.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and trucks. Pedestrians are crossing the street at a crosswalk, and there are traffic lights and street signs visible. The scene is set in a city with tall buildings in the background, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a highway scene with multiple lanes of traffic. The road is well-marked with clear lane dividers and lane numbers. Vehicles, including cars and a truck, are moving in both directions. The sky is clear, indicating good weather conditions. The surroundings are urban, with buildings and a bridge visible in the background. The time of day appears to be daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings and a mix of pedestrians and vehicles. The street is lined with various storefronts and banners, and there are traffic lights and streetlights scattered throughout the scene. The weather appears to be clear, and the time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars and pedestrians. The street is flanked by multi-story buildings, and overhead wires stretch across the scene. The weather appears to be cloudy, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, surrounded by trees and buildings. The road is mostly clear, with a few cars and trucks driving in both directions. The weather appears to be sunny, and the time of day is likely daytime. The road has a few traffic lights and signs, and there are some orange barriers and cones on the side of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with multiple cars and pedestrians. The street is lined with parked cars and has a speed bump in the middle. There are traffic lights at the intersection, and a person is seen crossing the street. The sky is overcast, indicating cloudy weather. The time of day appears to be either early morning or late afternoon, as the lighting is not very bright.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with various vehicles and pedestrians. A bus is seen turning left onto the street, while cars are parked along the sides of the road. Pedestrians are crossing the street and walking on the sidewalks. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street at night. The street is illuminated by streetlights and the headlights of parked cars. The houses along the street are two-story homes with porches and windows. The sky is dark, indicating it is nighttime. The street is wet, suggesting recent rain. There are no pedestrians or moving vehicles visible in the scene. The overall atmosphere is calm and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene in a residential area. The street is wet, and raindrops are visible on the windshield. Several cars are parked along the sides of the street, and a few are driving. The traffic lights are visible, and some cars are waiting at the stop sign. The street is lined with trees and buildings, and the overall atmosphere is calm and quiet.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The road is wet, likely from recent rain, and is illuminated by streetlights. Several cars are parked along the sides of the road, and the headlights of oncoming vehicles create a blurred effect. The scene is quiet, with no pedestrians visible. The overall atmosphere is dark and calm, with the wet road reflecting the streetlights.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy city street with multiple lanes of traffic. Several cars are stopped at a red light, including a black SUV directly in front of the camera. Pedestrians are crossing the street at a crosswalk, and tall buildings line both sides of the street. The weather appears to be clear, and it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars on both sides. The road is flanked by trees and buildings, and there is a bus stop visible on the right side of the street. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a highway. The road is illuminated by streetlights, and the headlights of various vehicles are visible. The camera angle suggests it is from inside a car, and the road appears to be relatively clear with minimal traffic. The sky is dark, indicating it is nighttime. The overall scene is well-lit by artificial lights, and there are no visible pedestrians or other obstacles on the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward. The road is lined with parked cars on both sides, and there are several pedestrians walking along the sidewalks. The street is flanked by tall buildings, and there are trees and power lines visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is surrounded by trees and buildings, and there is a bridge visible in the background. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear sky overhead and a few clouds scattered across the horizon. The road is lined with trees and power lines, and there are several cars driving in both directions. The cars are moving at a moderate pace, and there are no pedestrians visible. The road appears to be in a suburban area, with houses and a few businesses visible on either side. The weather is clear and sunny, with no signs of rain or other adverse weather conditions. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with various vehicles and pedestrians. A silver van is stopped at a red light, while other cars are driving around it. There are several trees and buildings lining the street, and a few pedestrians can be seen walking. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are traffic lights at intersections. The weather appears to be clear and sunny, and the time of day is likely daytime. The cars are moving smoothly, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street scene with multiple cars and pedestrians. The street is lined with parked cars and trees, and there are traffic lights and street signs visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with houses, each featuring a beige or light brown exterior and a tiled roof. The houses are well-maintained, with neatly trimmed lawns and a variety of trees and shrubs. Several cars are parked along the street, and a few are driving or parked on the road. A blue trash can is visible on the sidewalk in front of one of the houses. The street is relatively quiet, with minimal traffic and no pedestrians visible. The overall atmosphere is peaceful and suburban.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy highway with multiple lanes of traffic. The scene is set during the evening, as indicated by the dim lighting and artificial lights illuminating the area. The sky is overcast, suggesting cloudy weather conditions. The highway is filled with various vehicles, including cars, trucks, and a school bus, all moving in different directions. The traffic appears to be moderate, with some vehicles driving at a steady pace while others are stopped at red lights. The road is well-marked with lane dividers and traffic signs, ensuring the safety of the drivers. The surrounding area includes a mix of trees and buildings, indicating an urban or suburban setting. Overall, the video captures the typical hustle and bustle of a busy highway during the evening.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a road lined with parked cars on both sides. The street is flanked by a variety of buildings, including houses and businesses, with some featuring colorful facades. The sky is overcast, suggesting cloudy weather conditions. The time of day appears to be daytime, as indicated by the natural light.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a clear blue sky overhead and a few palm trees lining the sides. The road is mostly empty, with a few cars driving in the distance. The traffic lights are green, allowing vehicles to proceed. The road is well-maintained, with clear lane markings and orange and white striped barriers on the side. The surroundings are quiet and peaceful, with no pedestrians or other people visible. The weather is sunny and clear, with no signs of rain or clouds. The time of day appears to be daytime, as the sunlight is bright and the shadows are short.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a rainy street scene with parked cars on both sides of the road. The sky is overcast, and the street is wet from the rain. The camera moves forward, capturing the parked cars and the wet pavement. The scene is quiet, with no visible pedestrians or moving vehicles. The streetlights are on, indicating it is evening or night. The overall atmosphere is calm and serene, with the sound of raindrops adding to the ambiance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street with a red curb and a building with palm trees in the background. The street is lined with trees and has a few cars parked along the side. The sky is cloudy, and the overall scene is quiet and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a busy street scene at night, with numerous cars stopped at a red light. The traffic is dense, and the cars are illuminated by the red lights, creating a red hue throughout the scene. The street is wet, reflecting the lights and creating a glossy surface. The buildings on either side of the street are dimly lit, and the overall atmosphere is dark and urban.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward. The road is lined with trees and has a bike lane on the right side. There are several cars parked along the street, and a few pedestrians are walking on the sidewalk. The sky is clear, indicating a sunny day. The street appears to be in a residential area, with houses visible in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a mix of parked and moving vehicles. The street is lined with trees and houses, and there are several cars parked along the side of the road. The weather appears to be clear and sunny, with a blue sky overhead. The time of day is likely daytime, as the lighting is bright and natural. The street is relatively quiet, with only a few cars passing by.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with tall buildings on both sides. The street is filled with cars, some of which are parked along the curb while others are driving. Pedestrians can be seen walking on the sidewalks, and there are traffic lights at intersections. The weather appears to be clear, and the time of day is likely daytime based on the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a parking lot with a few scattered trees and bushes. The weather appears to be clear and sunny, with shadows cast by the trees indicating the time of day is likely morning or afternoon. The parking lot is mostly empty, with only a few cars parked and a few people visible in the distance. The scene is peaceful and quiet, with no signs of heavy traffic or activity.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy intersection with multiple lanes of traffic. The scene includes cars, pedestrians, traffic lights, trees, and buildings. The traffic lights change from red to green, allowing vehicles to move through the intersection. The weather appears to be clear and sunny, with shadows cast by the objects in the scene. The time of day is likely daytime, as indicated by the bright sunlight.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a wet road, with cars driving slowly in traffic. The road is illuminated by streetlights, and the wet surface reflects the lights, creating a blurry effect. The cars' brake lights are visible, indicating a slow-moving or stopped traffic situation. The overall atmosphere is dark and rainy, with the wet road surface and the reflections of the lights creating a somewhat eerie ambiance.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with cars parked along both sides. The street is lined with trees and houses, and there are power lines running above. The weather appears to be clear and sunny, and the time of day is likely morning or afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a city street with multiple lanes of traffic, including cars and a bicycle. The street is lined with trees and buildings, and there are several pedestrians visible. The weather appears to be cloudy, and the time of day is likely early evening or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a truck in the center of the frame, surrounded by parked cars on both sides. The truck is moving forward, and the cars are parked along the curb. The street is lined with trees and houses, and the sky is clear, indicating a sunny day. The overall atmosphere is calm and residential.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street with a clear blue sky overhead. The road is lined with palm trees and has a median in the middle. There are several cars driving on the road, including a white van and a black SUV. The traffic lights are green, allowing vehicles to move through the intersection. The street is relatively quiet, with no pedestrians visible. The buildings on either side of the street appear to be commercial or office buildings. The overall atmosphere is bright and sunny, with shadows cast by the palm trees and traffic lights.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a white truck driving down the road, passing a gas station and a tree-lined sidewalk. The truck is followed by a white SUV, and there are several other vehicles on the road. The sky is clear and blue, indicating a sunny day. The street is relatively busy, with multiple lanes of traffic and a sidewalk on the right side.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street. The street is illuminated by streetlights and the headlights of vehicles. Several cars are parked along the sides of the road, and a few are driving. A person is seen riding a bicycle on the street. The street appears to be relatively quiet, with minimal pedestrian activity. The buildings lining the street have illuminated windows, suggesting that some businesses or residences are occupied. The overall atmosphere is calm, with the streetlights casting a warm glow over the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with a variety of vehicles, including cars, trucks, and a yellow van. The scene is set in a suburban area with trees lining the street and a speed limit sign visible. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street during the early morning hours. The road is lined with parked cars and houses, and there are trees and streetlights along the sides. The sky is clear, indicating a sunny day. As the camera moves forward, several cars can be seen driving or parked on the side of the road. The street is relatively quiet, with no pedestrians visible. The overall atmosphere is peaceful and calm, with the sound of birds chirping in the background.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet neighborhood street at dusk. The street is lined with houses, and cars are parked along the curb. The sky is dark, indicating it is nighttime. The street is illuminated by streetlights, and there are some trees visible in the background. The houses appear to be residential, and the overall atmosphere is calm and peaceful.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various cars parked along the sides of the road. The street is lined with houses and trees, and there are several cars driving down the road. The weather appears to be cloudy, and the time of day is likely daytime. The cars are moving in both directions, and there are no pedestrians visible in the scene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive down a two-lane road with a yellow center line. The road is illuminated by streetlights, and there are no other vehicles or pedestrians visible. The surroundings are dark, with trees and a fence on the right side of the road. The camera angle suggests a forward motion, capturing the road ahead.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a cement mixer truck driving down a road lined with palm trees and white buildings. The truck is white and has a large drum attached to the back. The road is lined with white curbs and has a median strip with flowers and grass. The sky is cloudy, and the overall scene appears to be a residential area.","The video is captured from a camera mounted on a car. The camera is facing forward. The video captures a busy intersection with various vehicles and buildings in the background. A silver car is seen driving away from the camera, while a white truck is parked nearby. A red car is also visible in the distance. The scene is set in a city with multiple buildings, including one with a sign that reads ""Office Leasing Now."" The weather appears to be clear and sunny, with shadows cast on the ground. The time of day is likely daytime, as the lighting is bright and natural.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with various objects and actions. A car is seen turning left onto the street, while another car is driving straight ahead. A pedestrian is crossing the street, and a person with an umbrella is walking on the sidewalk. The street is lined with buildings, including a glass shop, and there are traffic lights and streetlights visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet, empty road with no visible pedestrians or other vehicles. The road is lined with palm trees and has a few traffic lights and street signs. The sky is overcast, suggesting cloudy weather. The road appears to be in a suburban or rural area, with no buildings or other structures in the immediate vicinity. The video captures the peacefulness of the area, with no signs of activity or movement.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a bus driving down the road. The bus is passing by a sidewalk where several pedestrians are walking. The street is lined with tall buildings, and there are traffic lights and street signs visible. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes and traffic lights. The road is lined with trees and bushes, and there are several cars driving in different directions. The weather appears to be clear, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The scene depicts a busy intersection with multiple cars and pedestrians. The traffic lights are red, causing vehicles to stop and allowing pedestrians to cross. The street is lined with trees and houses, and the weather appears to be clear and sunny.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on a white car driving through a parking lot. The car is seen turning left onto the street, passing a speed limit sign, and continuing down the road. The parking lot is filled with parked cars, and there are trees and buildings in the background. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with a clear blue sky and bright sunlight. The street is lined with palm trees and houses, and there are several cars parked along the side of the road. The camera moves forward, capturing the houses and trees on both sides of the street. The video ends with a view of a house with a white fence and a palm tree in the foreground.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive on a multi-lane road with visible traffic lights and streetlights illuminating the scene. The road is relatively clear, with a few vehicles visible in the distance. The traffic lights are green, indicating that the vehicles can proceed. The environment appears to be an urban area with buildings and commercial establishments lining the sides of the road. The weather conditions are clear, with no visible signs of rain or adverse weather. The time of day is nighttime, as indicated by the darkness and artificial lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The image depicts a scene on a highway during what appears to be either dawn or dusk, given the dim lighting. The sky is overcast, and the road is wet, likely due to recent rain. Several cars are visible, with their brake lights illuminated, suggesting slow or stopped traffic. Streetlights are on, providing illumination for the scene. The cars are moving in both directions, and there are multiple lanes visible. The overall atmosphere is calm, with no signs of urgency or panic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with a silver SUV driving down the road. The street is lined with parked cars and pedestrians walking on the sidewalks. The sky is overcast, and the buildings in the background are tall and modern. The traffic lights change as the SUV moves forward, and the street is wide with multiple lanes.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime street scene with several cars parked along both sides of the road. The street is illuminated by streetlights and the headlights of the cars. There are a few pedestrians walking on the sidewalks, and some buildings with lit windows can be seen in the background. The overall atmosphere is quiet and calm, with no signs of heavy traffic or congestion.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with a clear blue sky overhead. The road is lined with trees and power lines, and there are a few cars parked along the side of the road. The street is relatively empty, with only a few cars driving by. The weather appears to be clear and sunny, with no signs of rain or clouds. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a residential street with parked cars on both sides. The street is illuminated by streetlights and the headlights of passing vehicles. The camera moves forward, capturing the parked cars and the occasional pedestrian. The street appears to be in a neighborhood with houses and trees lining the sides. The weather is clear, and the overall atmosphere is quiet and still.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a car driving through a neighborhood. The street is lined with trees and houses, and there are several parked cars along the side of the road. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with multiple cars parked along both sides. The street is lined with trees and buildings, and the weather appears to be overcast. The cars are parked in a neat row, and there are no pedestrians visible. The street is relatively quiet, with no visible traffic or movement.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a clear blue sky and a few scattered clouds. The road is a two-lane street with a double yellow line in the center, and there are several parked cars on both sides of the street. The street is lined with trees and bushes, and there are a few pedestrians walking on the sidewalks. The weather appears to be sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are several cars parked along the side of the street. The street is relatively quiet, with no pedestrians or other vehicles in motion. The weather appears to be clear and sunny, with good visibility. The time of day is not specified, but the lighting suggests it is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and has a median strip separating the opposing traffic. There are traffic lights and street signs visible, indicating directions and traffic rules. The weather appears to be clear, and the time of day is likely daytime, as indicated by the bright lighting. The scene is a typical urban or suburban road with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy street with multiple lanes of traffic. The weather appears to be cloudy, and the time of day is likely daytime. The scene includes various cars, buses, and pedestrians. The traffic is moving smoothly, and there are no visible accidents or incidents. The street is well-lit, and the traffic lights are functioning properly.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a quiet residential street with houses and trees lining both sides. The street is relatively empty, with a few parked cars and a few moving vehicles. The weather appears to be clear and sunny, with shadows cast by the trees and houses. The time of day is likely morning or late afternoon, as the sunlight is bright and casting long shadows.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, bordered by trees and houses on both sides. The road is relatively empty, with a few cars and bicycles visible. The sky is clear and blue, indicating a sunny day. The video captures the movement of cars and bicycles as they navigate the road, with some parked cars visible in the background. The overall scene is peaceful and quiet, with no signs of traffic congestion or rush hour.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime drive through a residential neighborhood. The road is illuminated by streetlights, and the surroundings are dimly lit. The camera moves forward, capturing houses with lights on, parked cars, and occasional trees and bushes along the sides of the road. The scene is quiet and peaceful, with no visible pedestrians or other vehicles. The weather appears to be clear, and the overall atmosphere is calm and serene.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a clear blue sky overhead. The road is lined with trees and houses, and there are a few cars parked along the side of the road. The street is relatively quiet, with no pedestrians or other vehicles in motion. The houses are mostly one-story with red-tiled roofs, and the overall atmosphere is peaceful and suburban.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a city street. The road is illuminated by streetlights and the headlights of vehicles. Several cars are visible, some of which are stopped at a red traffic light. The street is lined with parked cars and buildings on both sides. The weather appears to be clear, and the overall atmosphere is quiet and still.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a nighttime scene on a busy street with multiple lanes of traffic. The street is well-lit by numerous streetlights and traffic lights, creating a bright and clear view of the surroundings. Several cars are visible, some moving in the same direction as the camera, while others are stationary at traffic lights. The street appears to be in a commercial area, with buildings and businesses visible in the background. The weather seems to be clear, with no signs of rain or fog. The overall atmosphere is active and bustling, typical of a city street during nighttime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with multiple lanes, where several cars are driving in both directions. The road is lined with trees and streetlights, and there are houses visible on the sides. The weather appears to be clear and sunny, with shadows cast by the trees and vehicles. The time of day seems to be daytime, as indicated by the bright sunlight and shadows. The cars are moving smoothly, and there is no visible traffic congestion. The overall scene is calm and orderly, with vehicles following the rules of the road.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with houses on both sides. The street is lined with palm trees and has a sidewalk on the right side. There are several parked cars along the street, and a few vehicles are driving. The sky is clear, indicating a sunny day. The overall scene is quiet and peaceful, with no pedestrians visible.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving forward and passing through a traffic light. The car is seen turning left onto the street, and the traffic light is green. The street is lined with trees and houses, and there are orange and white striped barriers on the road. The weather appears to be clear and sunny, and the time of day is daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential neighborhood with houses, trees, and parked cars. The street is relatively quiet, with a few pedestrians walking on the sidewalks. The weather appears to be clear and sunny, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a car driving down a steep hill. The car is seen approaching a stop sign and then continues down the hill, passing parked cars and houses. The street is lined with trees and houses, and the sky is clear. The car eventually comes to a stop at the bottom of the hill.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a residential street with a few cars parked along the sides. The street is lined with trees and houses, and there is a stop sign visible at the intersection. The weather appears to be overcast, and the time of day is likely early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene with a focus on parked cars and a few moving vehicles. The street is lined with parked cars on both sides, and there are a few vehicles driving down the road. The scene is set in a residential area with houses visible in the background. The weather appears to be overcast, and the time of day is likely early morning or late afternoon, given the lighting.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a city street scene with a red and white trolley car moving along the tracks. The trolley car is surrounded by various vehicles, including cars and a van, which are either stopped or moving slowly. The street is lined with palm trees and buildings, and the sky appears to be overcast. The overall atmosphere suggests a typical urban environment with moderate traffic.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a road with a yellow line in the middle, surrounded by trees and street lights. The road is relatively empty, with a few cars driving and a person walking on the sidewalk. The weather appears to be clear, and the time of day is either early morning or late afternoon.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a busy city street with multiple lanes of traffic, including cars and pedestrians. The street is lined with trees and buildings, and there are traffic lights and street signs visible. The weather appears to be cloudy, and the time of day is likely daytime.","The video is captured from a camera mounted on a car. The camera is facing forward. The video depicts a street scene on a foggy day. The camera captures a street with parked cars on both sides, including a white truck and a black car. The fog creates a hazy atmosphere, obscuring the background and giving the scene a mysterious ambiance. The street is lined with houses and trees, and the overall mood is quiet and serene." diff --git a/packages/terasim-cosmos/terasim_cosmos/converter.py b/packages/terasim-cosmos/terasim_cosmos/converter.py deleted file mode 100644 index bc44614..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/converter.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -TeraSim to Cosmos-Drive Converter - -Main converter class that orchestrates the conversion pipeline from TeraSim simulation -outputs (SUMO map and FCD) to Cosmos-Drive compatible inputs for world model training. -""" - -from pathlib import Path -import json -import yaml -from typing import Optional - -from .convert_terasim_to_rds_hq import convert_terasim_to_wds -from .render_from_rds_hq import render_sample_hdmap -from .street_view_analysis import StreetViewRetrievalAndAnalysis - - -class TeraSimToCosmosConverter: - """ - Main converter class for converting TeraSim simulation outputs to Cosmos-Drive inputs. - - This class orchestrates the entire pipeline: - 1. Load configuration - 2. Extract vehicle information from collision records - 3. Optionally retrieve and analyze street view imagery - 4. Convert TeraSim data to WebDataset (WDS) format compatible with Cosmos-Drive - 5. Render HD map videos and sensor data for world model training - """ - - def __init__(self, config_path: Optional[Path] = None, config_dict: Optional[dict] = None): - """ - Initialize the converter with configuration. - - Args: - config_path: Path to YAML configuration file - config_dict: Configuration dictionary (alternative to config_path) - """ - if config_path and config_dict: - raise ValueError("Provide either config_path or config_dict, not both") - - if config_path: - with open(config_path, "r") as f: - self.config = yaml.safe_load(f) - elif config_dict: - self.config = config_dict - else: - raise ValueError("Must provide either config_path or config_dict") - - # Extract configuration parameters - self.path_to_output = Path(self.config["path_to_output"]) - self.path_to_fcd = Path(self.config["path_to_fcd"]) - self.path_to_map = Path(self.config["path_to_map"]) - self.camera_setting_name = self.config["camera_setting_name"] - self.vehicle_id = self.config.get("vehicle_id") - self.time_start = self.config["time_start"] - self.time_end = self.config["time_end"] - self.agent_clip_distance = self.config.get("agent_clip_distance", 30.0) - self.map_clip_distance = self.config.get("map_clip_distance", 100.0) - self.streetview_retrieval = self.config.get("streetview_retrieval", True) - - self.path_to_output = self.path_to_output / f"{self.vehicle_id}_{self.time_start:.1f}_{self.time_end:.1f}".replace(".", "_") - - # Initialize street view analyzer - self.streetview_analyzer = StreetViewRetrievalAndAnalysis() - - def _load_vehicle_id_from_monitor(self) -> str: - """ - Load vehicle ID from monitor.json collision record. - - Returns: - Vehicle ID from collision record - - Raises: - Exception: If monitor.json cannot be loaded or parsed - """ - try: - path_to_collision_record = self.path_to_output / "monitor.json" - with open(path_to_collision_record, "r") as f: - collision_record = json.load(f) - vehicle_id = collision_record["veh_1_id"] - print(f"Using vehicle id from monitor.json: {vehicle_id}") - return vehicle_id - except Exception as e: - raise Exception(f"Error loading monitor.json: {e}") - - def _get_camera_settings(self) -> dict: - """ - Load camera settings based on camera_setting_name. - - Returns: - Camera settings dictionary - - Raises: - ValueError: If invalid camera setting name is provided - """ - # Get path to config directory within this package - package_root = Path(__file__).parent - config_dir = package_root / "config" - - if self.camera_setting_name == "waymo": - config_path = config_dir / "dataset_waymo_mv.json" - elif self.camera_setting_name == "default": - config_path = config_dir / "dataset_rds_hq_mv_terasim.json" - else: - raise ValueError(f"Invalid camera setting name: {self.camera_setting_name}") - - with open(config_path, "r") as f: - settings = json.load(f) - return settings - - def convert(self) -> bool: - """ - Execute the full conversion pipeline. - """ - print(f"Processing fcd: {self.path_to_fcd}") - print(f"Processing map: {self.path_to_map}") - - # Create output directory - self.path_to_output.mkdir(parents=True, exist_ok=True) - - # Resolve vehicle ID - if self.vehicle_id is None: - print("No vehicle id provided, trying to load from monitor.json") - self.vehicle_id = self._load_vehicle_id_from_monitor() - - # Street view retrieval and analysis - if self.streetview_retrieval: - print("Retrieving and analyzing street view imagery...") - self.streetview_analyzer.get_streetview_image_and_description( - path_to_output=self.path_to_output, - path_to_fcd=self.path_to_fcd, - path_to_map=self.path_to_map, - vehicle_id=self.vehicle_id, - target_time=self.time_start - ) - - # Convert TeraSim data to WebDataset format - print("Converting TeraSim data to WebDataset format...") - convert_terasim_to_wds( - terasim_record_root=self.path_to_output, - path_to_fcd=self.path_to_fcd, - path_to_map=self.path_to_map, - output_wds_path=self.path_to_output / "wds", - single_camera=False, - camera_setting_name=self.camera_setting_name, - av_id=self.vehicle_id, - time_start=self.time_start, - time_end=self.time_end, - agent_clip_distance=self.agent_clip_distance, - map_clip_distance=self.map_clip_distance - ) - - # Load camera settings and render HD maps - print("Rendering HD maps and sensor data...") - settings = self._get_camera_settings() - - render_sample_hdmap( - input_root=self.path_to_output / "wds", - output_root=self.path_to_output / "render", - clip_id=self.path_to_output.stem, - settings=settings, - camera_type="ftheta", - ) - - print("Conversion completed successfully!") - return True - - @classmethod - def from_config_file(cls, config_path: Path) -> 'TeraSimToCosmosConverter': - """ - Create converter instance from configuration file. - - Args: - config_path: Path to YAML configuration file - - Returns: - TeraSimToCosmosConverter instance - """ - return cls(config_path=config_path) - - @classmethod - def from_config_dict(cls, config_dict: dict) -> 'TeraSimToCosmosConverter': - """ - Create converter instance from configuration dictionary. - - Args: - config_dict: Configuration dictionary - - Returns: - TeraSimToCosmosConverter instance - """ - return cls(config_dict=config_dict) \ No newline at end of file diff --git a/packages/terasim-cosmos/terasim_cosmos/street_view_analysis.py b/packages/terasim-cosmos/terasim_cosmos/street_view_analysis.py deleted file mode 100644 index 8275fe7..0000000 --- a/packages/terasim-cosmos/terasim_cosmos/street_view_analysis.py +++ /dev/null @@ -1,229 +0,0 @@ -import sumolib -import dotenv -import os -import requests -from openai import OpenAI -from pathlib import Path -import base64 -import xml.etree.ElementTree as ET - -# Load environment variables -dotenv.load_dotenv() - -class StreetViewRetrievalAndAnalysis: - """ - Class for retrieving and analyzing street view images using Google Street View API and GPT-4 Vision - """ - - def __init__(self): - """ - Initialize StreetViewRetrievalAndAnalysis - - Args: - google_maps_api_key: Google Maps API key for street view retrieval - openai_api_key: OpenAI API key for image analysis - """ - # Load API keys from environment if not provided - self.google_maps_api_key = os.getenv('GOOGLE_MAPS_API_KEY') - self.openai_api_key = os.getenv('OPENAI_API_KEY') - - if not self.google_maps_api_key: - raise ValueError("Google Maps API key is required") - if not self.openai_api_key: - raise ValueError("OpenAI API key is required") - - # Initialize OpenAI client - self.client = OpenAI(api_key=self.openai_api_key) - - def get_street_view_image(self, latitude: float, longitude: float, heading: int = 0, pitch: int = 0, fov: int = 90) -> bytes: - """ - Get a street view image from Google Street View API - - Args: - latitude: Latitude coordinate - longitude: Longitude coordinate - heading: Heading angle in degrees (0-360) - pitch: Pitch angle in degrees (-90 to 90) - fov: Field of view in degrees (10-120) - - Returns: - Image data as bytes - """ - url = f"https://maps.googleapis.com/maps/api/streetview" - params = { - 'size': '600x400', # Image size - 'location': f'{latitude},{longitude}', - 'heading': heading, - 'pitch': pitch, - 'fov': fov, - 'key': self.google_maps_api_key - } - - response = requests.get(url, params=params) - if response.status_code == 200: - return response.content - else: - raise Exception(f"Failed to get street view image: {response.status_code}") - - def analyze_image_with_llm(self, image_data: list) -> str: - """ - Analyze the image using GPT-4 Vision and generate environment description - - Args: - image_data_list: List of image data as bytes - - Returns: - Environment description as string - """ - # Convert images to base64 - base64_image = base64.b64encode(image_data).decode('utf-8') - - # Construct message content with multiple images - content = [ - { - "type": "text", - "text": "Please describe the environment and setting of this street view image. Focus on static elements like buildings, roads, vegetation, weather conditions, and overall atmosphere. Ignore any moving objects or people. This description will be used as a prompt for video generation." - }, - ] - - # Add each image to the content - content.append({ - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{base64_image}" - } - }) - - response = self.client.chat.completions.create( - model="gpt-4o", - messages=[{ - "role": "user", - "content": content - }], - max_tokens=500 - ) - - return response.choices[0].message.content - - def get_vehicle_position_at_time(self, path_to_fcd: Path, - vehicle_id: str, - target_time: float) -> tuple: - """ - Get vehicle position and angle data from FCD file at a specific time - - Args: - path_to_fcd: Path to FCD XML file - vehicle_id: Vehicle ID to track - target_time: Target time in seconds - - Returns: - Tuple of (x, y, angle) for vehicle position, or None if not found - """ - tree = ET.parse(path_to_fcd) - root = tree.getroot() - all_timesteps = list(root.findall("timestep")) - all_timesteps.sort(key=lambda x: float(x.get("time"))) - - # Find the closest timestep to target_time - target_timestep = None - min_diff = float('inf') - for timestep in all_timesteps: - time_diff = abs(float(timestep.get("time")) - target_time) - if time_diff < min_diff: - min_diff = time_diff - target_timestep = timestep - - if target_timestep is None: - return None - - # Find the vehicle in this timestep - for vehicle in target_timestep.findall("vehicle"): - if vehicle.get("id") == vehicle_id: - return ( - float(vehicle.get("x")), - float(vehicle.get("y")), - float(vehicle.get("angle")) - ) - return None - - def get_streetview_image_and_description(self, path_to_output: Path, - path_to_fcd: Path, - path_to_map: Path, - vehicle_id: str = None, - target_time: float = 0.0) -> str: - """ - Get street view image and generate environment description at a specific time - - Args: - path_to_output: Output directory path - path_to_fcd: Path to FCD XML file - path_to_map: Path to SUMO network file - vehicle_id: Vehicle ID to track - target_time: Target time in seconds to capture street view - - Returns: - Environment description as string - """ - # Load SUMO network - sumo_net = sumolib.net.readNet(path_to_map) - - # Get vehicle position at target time - vehicle_position = self.get_vehicle_position_at_time( - path_to_fcd=path_to_fcd, - vehicle_id=vehicle_id, - target_time=target_time - ) - - if vehicle_position is None: - return "Vehicle not found at the specified time" - - x, y, angle = vehicle_position - # Convert coordinates to lat/lon - lon, lat = sumo_net.convertXY2LonLat(x, y) - - # Get street view image from front view - print(f"Processing location at lon: {lon}, lat: {lat}, angle: {angle}") - - # Get street view images from 6 directions around the vehicle - camera_angle_list = {'front': 0, "front_left": -66, "front_right": 66, "rear": 180, "rear_left": -152, "rear_right": 152} - fov_list = {'front': 120, "front_left": 120, "front_right": 120, "rear": 30, "rear_left": 70, "rear_right": 70} - default_prompt_list = { - "front": "The video is captured from a camera mounted on a car. The camera is facing forward. ", - "front_left": "The video is captured from a camera mounted on a car. The camera is facing to the left. ", - "front_right": "The video is captured from a camera mounted on a car. The camera is facing to the right. ", - "rear": "The video is captured from a camera mounted on a car. The camera is facing backwards. ", - "rear_left": "The video is captured from a camera mounted on a car. The camera is facing the rear left side. ", - "rear_right": "The video is captured from a camera mounted on a car. The camera is facing the rear right side. ", - } - - descriptions = [] - for camera_name, camera_angle in camera_angle_list.items(): - try: - heading = angle + camera_angle - fov = fov_list[camera_name] - image_data = self.get_street_view_image(lat, lon, heading=heading, fov=fov) - - # Save image to file - image_filename = f"streetview_image_{camera_name}.jpg" - with open(path_to_output / image_filename, 'wb') as f: - f.write(image_data) - print(f"Street view image saved as {path_to_output / image_filename}") - - # Generate environment description - description = self.analyze_image_with_llm(image_data) - # Add default prompt at the beginning - full_description = default_prompt_list[camera_name] + description - desc_filename = f"prompt_{camera_name}.txt" - with open(path_to_output / desc_filename, 'w') as f: - f.write(full_description) - print(f"Environment description saved as {path_to_output / desc_filename}") - - descriptions.append(f"{camera_name}: {full_description}") - - except Exception as e: - print(f"Error retrieving street view for {camera_name}: {e}") - descriptions.append(f"{camera_name}: Failed to retrieve street view") - - # Combine all descriptions - combined_description = "\n\n".join(descriptions) - return combined_description diff --git a/packages/terasim-datazoo/README.md b/packages/terasim-datazoo/README.md index 0aac1bd..b170c97 100644 --- a/packages/terasim-datazoo/README.md +++ b/packages/terasim-datazoo/README.md @@ -43,7 +43,7 @@ TeraSim Data Zoo is an extensible framework designed to bridge the gap between d ``` terasim-data-zoo/ ├── src/ -│ ├── terasim_datazoo/ # Core scenario parsing framework +│ ├── scenparse/ # Core scenario parsing framework │ ├── converters/ # Dataset-specific converters │ │ ├── waymo/ # Waymo dataset converter │ │ ├── nuscenes/ # nuScenes converter (planned) diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Additionals.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Additionals.py new file mode 100644 index 0000000..e75c3c3 --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Additionals.py @@ -0,0 +1,509 @@ +""" +Main classes and functions for dealing with Sumo "additional" files. +""" + +import warnings +import xml.etree.ElementTree as ET +from shapely.geometry import * +from shapely import ops +import numpy as np +import matplotlib.patches +import matplotlib.pyplot as plt +from SumoNetVis import _Utils +from SumoNetVis import Net as _Net + + +BUS_STOP_STYLE_SUMO = "SUMO" +BUS_STOP_STYLE_GER = "GER" +BUS_STOP_STYLE_UK = "UK" +BUS_STOP_STYLE_USA = "USA" +BUS_STOP_STYLE = BUS_STOP_STYLE_SUMO + +BUS_STOP_AREA_COLOR = { + BUS_STOP_STYLE_SUMO: "#008853", + BUS_STOP_STYLE_USA: "#C0422C" +} + + +def set_bus_stop_style(style): + """ + Sets the bus stop plotting style. Valid values are 'SUMO', 'GER', 'UK', and 'USA'. + + :param style: desired bus stop plotting style + :return: None + """ + global BUS_STOP_STYLE + if BUS_STOP_STYLE not in [BUS_STOP_STYLE_SUMO, BUS_STOP_STYLE_GER, BUS_STOP_STYLE_UK, BUS_STOP_STYLE_USA]: + raise ValueError("Invalid bus stop style '" + style + "'.") + BUS_STOP_STYLE = style + + +class _Poly: + def __init__(self, attrib): + """ + Initializes a Sumo additionals polygon. + + :param attrib: a dict of all the poly's XML attributes + :type attrib: dict + """ + self.id = attrib["id"] + coords = [[float(coord) for coord in xy.split(",")] for xy in attrib["shape"].split(" ")] + self.fill = attrib.get("fill", "f") in ["t", "true", "1"] + self.shape = Polygon(coords) if self.fill else LineString(coords) + self.color = _Utils.convert_sumo_color(attrib["color"]) + self.geo = attrib.get("geo", "f") in ["t", "true", "1"] + if self.geo: + warnings.warn("Geographic coordinates not supported for polygons in additional files.") + self.lineWidth = float(attrib.get("lineWidth", 1)) + self.layer = float(attrib.get("layer", "0")) + self.type = attrib.get("type", "") + self.imgFile = attrib.get("imgFile", None) + if self.imgFile is not None: + warnings.warn("Display of polygons in additional files as images not supported.") + self.angle = float(attrib.get("angle", 0)) + self.params = dict() + + def get_as_3d_object(self, z=0, extrude_height=0, include_bottom_face=False, material_param=None, + extrude_height_param=None, extrude_height_param_transform=None): + """ + Generates a list of Object3D objects from the bus stop area and markings. + + :param z: desired z coordinate of base of object + :param extrude_height: amount by which to extrude the polygon along the z axis. + :param include_bottom_face: whether to include the bottom face when extruding. + :param material_param: generic parameter to use to override material, if present + :param extrude_height_param: generic parameter to use to override extrude height, if present + :param extrude_height_param_transform: function to apply to extrude_height_param values. Defaults to str->float conversion. + :return: Object3D representing the polygon + :type z: float + :type extrude_height: float + :type include_bottom_face: bool + :type material_param: str + :type extrude_height_param: str + """ + if extrude_height_param is not None and extrude_height_param in self.params: + if extrude_height_param_transform is None: + extrude_height_param_transform = lambda x: float(x) if x is not None else extrude_height + extrude_height = extrude_height_param_transform(self.params[extrude_height_param]) + material = self.params.get(material_param, self.type+"_poly") + return _Utils.Object3D.from_shape(self.shape, self.id, material, z=z, extrude_height=extrude_height, + include_bottom_face=include_bottom_face, include_top_face=self.fill) + + def plot(self, ax, **kwargs): + """ + Plot the polygon. + + :param ax: matplotlib Axes object + :param kwargs: kwargs to pass to the plotting function + :return: artist + :type ax: plt.Axes + """ + kwargs = {"zorder": self.layer-110 if self.layer <= 0 else self.layer-90, "color": self.color, **kwargs} + if self.fill is True: + if "lw" not in kwargs and "linewidth" not in kwargs: + kwargs["lw"] = 0 + poly = matplotlib.patches.Polygon(self.shape.boundary.coords, True, **kwargs) + poly.sumo_object = self + ax.add_patch(poly) + return poly + else: + x, y = zip(*self.shape.coords) + line = _Utils.LineDataUnits(x, y, linewidth=self.lineWidth, **kwargs) + line.sumo_object = self + ax.add_line(line) + return line + + +class _POI: + def __init__(self, attrib, reference_net=None): + """ + Initializes a Sumo additionals POI. + + :param attrib: a dict of all the POI's XML attributes + :param reference_net: reference network to use for POIs whose position is specified based on a lane + :type attrib: dict + :type reference_net: SumoNetVis.Net + """ + self.id = attrib["id"] + self.color = _Utils.convert_sumo_color(attrib["color"]) + self.reference_net = reference_net + self.x, self.y = None, None + if "x" in attrib and "y" in attrib: + self.x = float(attrib["x"]) + self.y = float(attrib["y"]) + elif "lane" in attrib and "pos" in attrib: + if self.reference_net is None: + warnings.warn("Reference Net required for POIs with locations defined relative to lane.") + else: + edge_id = "_".join(attrib["lane"].split("_")[:-1]) + lane_num = int(attrib["lane"].split("_")[-1]) + try: + lane = reference_net.edges.get(edge_id, None).get_lane(lane_num) + except (AttributeError, IndexError) as err: + raise IndexError("Lane " + attrib["lane"] + " does not exist in reference network.") from err + lane_pos = float(attrib["pos"]) + lane_pos_lat = float(attrib.get("posLat", 0)) + side = "right" if lane_pos_lat < 0 else "left" + idx = 0 if side == "right" else -1 # shapely parallel_offset flips direction if side is "right" + assert hasattr(ops, "substring"), "Shapely>=1.7.0 is required for POIs with lane-based locations." + self.x, self.y = ops.substring(lane.alignment, 0, lane_pos).parallel_offset(abs(lane_pos_lat), side=side).coords[idx] + elif "lat" in attrib and "lon" in attrib: + warnings.warn("POI locations defined as lat/lon not supported.") + else: + raise ValueError("POI " + self.id + " has no valid position attributes.") + self.type = attrib.get("type", "") + self.layer = float(attrib.get("layer", "0")) + self.imgFile = attrib.get("imgFile", None) + if self.imgFile is not None: + warnings.warn("Display of POIs in additional files as images not supported.") + self.width = float(attrib.get("width", 0)) + self.height = float(attrib.get("height", 0)) + self.angle = float(attrib.get("angle", 0)) + self.params = dict() + + def plot(self, ax, **kwargs): + """ + Plot the POI. + + :param ax: matplotlib Axes object + :param kwargs: kwargs to pass to the plotting function + :return: artist + :type ax: plt.Axes + """ + kwargs = {"color": self.color, "radius": 1, + "zorder": self.layer-110 if self.layer <= 0 else self.layer-90, **kwargs} + if self.x is not None and self.y is not None: + circle = matplotlib.patches.Circle((self.x, self.y), **kwargs) + circle.sumo_object = self + ax.add_patch(circle) + return circle + + +class _BusStop: + def __init__(self, attrib, reference_net): + """ + Initialize a bus stop object. + + :param attrib: dict of all bus stop XML attributes + :param reference_net: reference Sumo network object + :type attrib: dict + :type reference_net: SumoNetVis.Net + """ + self.id = attrib["id"] + self.lane_id = attrib["lane"] + edge_id = "_".join(attrib["lane"].split("_")[:-1]) + lane_num = int(attrib["lane"].split("_")[-1]) + try: + self.lane = reference_net.edges.get(edge_id, None).get_lane(lane_num) + except (AttributeError, IndexError) as err: + raise IndexError("Lane " + attrib["lane"] + " does not exist in reference network.") from err + self.startPos = float(attrib.get("startPos", 0)) + self.endPos = float(attrib.get("endPos", self.lane.alignment.length)) + self.friendlyPos = attrib.get("friendlyPos", "f") in ["t", "true", "1"] + self.name = attrib.get("name", "") + self.lines = attrib.get("lines", "").split(" ") + + def _get_shape(self): + """ + Return the outline shape of the bus stop based on the style setting. None if shape not to be drawn. + + :return: shapely geometry corresponding to bus stop outline + """ + assert hasattr(ops, "substring"), "Shapely>=1.7.0 is required to plot bus stops." + lane_cl_seg = ops.substring(self.lane.alignment, self.startPos, self.endPos) + if BUS_STOP_STYLE == BUS_STOP_STYLE_SUMO: + outline = lane_cl_seg.parallel_offset(self.lane.width/2, "right").buffer(1, cap_style=CAP_STYLE.flat) + elif BUS_STOP_STYLE == BUS_STOP_STYLE_GER: + outline = None + elif BUS_STOP_STYLE == BUS_STOP_STYLE_UK: + outline = None + elif BUS_STOP_STYLE == BUS_STOP_STYLE_USA: + outline = lane_cl_seg.buffer(self.lane.width/2, cap_style=CAP_STYLE.flat) + return outline + + def _get_markings(self): + """ + Returns a list of lane marking objects for the bus stop based on the style setting. + + :return: list of _LaneMarking objects + """ + assert hasattr(ops, "substring"), "Shapely>=1.7.0 is required to plot bus stops." + lane_cl_seg = ops.substring(self.lane.alignment, self.startPos, self.endPos) + markings = [] + if BUS_STOP_STYLE == BUS_STOP_STYLE_SUMO: + pass # no markings for Sumo-style bus stops + elif BUS_STOP_STYLE == BUS_STOP_STYLE_GER: + # generate german zig-zag style markings + lw, dashes = 0.12, (100, 0) + area_width = 1.5 + curb_align = lane_cl_seg.parallel_offset(self.lane.width/2, "right") + inner_align = curb_align.parallel_offset(area_width, "right") + n_zags = round(lane_cl_seg.length / area_width / 2) + if n_zags % 2 == 0: + n_zags += 1 + zig_coords = [curb_align.interpolate(u).coords[0] for u in np.linspace(0, curb_align.length, n_zags)] + zag_coords = [inner_align.interpolate(u).coords[0] for u in np.linspace(curb_align.length, 0, n_zags)] + zigzag_coords = [curb_align.coords[0], inner_align.coords[-1]] + for i in range(n_zags): + if i % 2 == 0: + zigzag_coords.append(tuple(zag_coords[i])) + else: + zigzag_coords.append(tuple(zig_coords[i])) + zigzag_coords.append(curb_align.coords[-1]) + zigzag_line = LineString(zigzag_coords) + markings.append(_Net._LaneMarking(zigzag_line, lw, "w", dashes, purpose="busstop", parent=self)) + elif BUS_STOP_STYLE == BUS_STOP_STYLE_UK: + # generate UK-style inset dashed line box markings + inset = 0.2 + heavy_lw, light_lw = 0.3, 0.1 + curb_dashes, end_dashes, inner_dashes = (100, 0), (1, 0.5), (0.75, 0.75) + curb_align = lane_cl_seg.parallel_offset(self.lane.width/2-inset-heavy_lw/2, "right") + inner_align = lane_cl_seg.parallel_offset(self.lane.width/2-inset-light_lw/2, "left") + start_edge = LineString([curb_align.coords[0], inner_align.coords[-1]]) + end_edge = LineString([curb_align.coords[-1], inner_align.coords[0]]) + curb_align = ops.substring(curb_align, 2*light_lw, curb_align.length-2*light_lw).\ + parallel_offset(heavy_lw/2, "right") + markings.append(_Net._LaneMarking(curb_align, heavy_lw, "y", curb_dashes, purpose="busstop", parent=self)) + markings.append(_Net._LaneMarking(start_edge, light_lw, "y", end_dashes, purpose="busstop", parent=self)) + markings.append(_Net._LaneMarking(end_edge, light_lw, "y", end_dashes, purpose="busstop", parent=self)) + markings.append(_Net._LaneMarking(inner_align, light_lw, "y", end_dashes, purpose="busstop", parent=self)) + elif BUS_STOP_STYLE == BUS_STOP_STYLE_USA: + # return simple USA-style solid outline markings + lw, dashes = 0.1, (100, 0) + outline = lane_cl_seg.buffer(self.lane.width/2, cap_style=CAP_STYLE.flat).boundary + markings.append(_Net._LaneMarking(outline, lw, "w", dashes, purpose="busstop", parent=self)) + return markings + + def plot(self, ax, area_kwargs=None, marking_kwargs=None, **kwargs): + """ + Plot the bus stop. + Kwargs are passed to the plotting functions, with object-specific kwargs overriding general ones. + + :param ax: matplotlib Axes object + :param area_kwargs: kwargs to pass to area plotting function + :param marking_kwargs: kwargs to pass to marking plotting function + :return: list of artists + :type ax: plt.Axes + :type area_kwargs: dict + :type marking_kwargs: dict + """ + artists = [] + outline = self._get_shape() + if area_kwargs is None: + area_kwargs = dict() + if marking_kwargs is None: + marking_kwargs = dict() + area_zorder = -80 if BUS_STOP_STYLE == BUS_STOP_STYLE_SUMO else -96 + area_kwargs = {"zorder": area_zorder, **kwargs, **area_kwargs} + marking_kwargs = {"zorder": -94, **kwargs, **marking_kwargs} + if outline is not None: + area_color = BUS_STOP_AREA_COLOR.get(BUS_STOP_STYLE, "#00000000") + area_kwargs = {"color": area_color, **area_kwargs} + poly = matplotlib.patches.Polygon(outline.boundary.coords, True, **area_kwargs) + poly.sumo_object = self + ax.add_patch(poly) + artists.append(poly) + for marking in self._get_markings(): + artist = marking.plot(ax, **marking_kwargs) + artists.append(artist) + return artists + + def get_as_3d_objects(self, area_kwargs=None, markings_kwargs=None, **kwargs): + """ + Generates a list of Object3D objects from the bus stop area and markings. + + Object-specific kwargs override general kwargs. Options are: "z", "extrude_height", and "include_bottom_face". + Default for area_kwargs: 0.002, 0, False + Default for markings_kwargs: 0.003, 0, False + + :param area_kwargs: kwargs for 3D area object generation. + :param markings_kwargs: kwargs for 3D lane markings object generation. + :type area_kwargs: dict + :type markings_kwargs: dict + """ + if area_kwargs is None: + area_kwargs = dict() + if markings_kwargs is None: + markings_kwargs = dict() + area_kwargs = {"z": 0.002, "extrude_height": 0, "include_bottom_face": False, **kwargs, **area_kwargs} + markings_kwargs = {"z": 0.003, "extrude_height": 0, "include_bottom_face": False, **kwargs, **markings_kwargs} + objs = [] + outline = self._get_shape() + if outline is not None: + objs.append(_Utils.Object3D.from_shape(outline, "busstop_area", "busstop_area", **area_kwargs)) + for marking in self._get_markings(): + objs.append(marking.get_as_3d_object(**markings_kwargs)) + return objs + + +class Additionals: + """ + Stores objects from a Sumo additional XML file. + + :param file: path to Sumo additional file + :param reference_net: network to use for objects which reference network elements (optional) + :type file: str + :type reference_net: SumoNetVis.Net + """ + + def __init__(self, file, reference_net=None): + """ + Reads objects from a Sumo additional XML file. + + :param file: path to Sumo additional file + :param reference_net: network to use for objects which reference network elements (optional) + :type file: str + :type reference_net: SumoNetVis.Net + """ + self.reference_net = reference_net + self.polys = dict() + self.pois = dict() + self.bus_stops = dict() + root = ET.parse(file).getroot() + for obj in root: + if obj.tag == "poly": + poly = _Poly(obj.attrib) + self.polys[poly.id] = poly + for polyChild in obj: + if polyChild.tag == "param": + poly.params[polyChild.attrib["key"]] = polyChild.attrib["value"] + elif obj.tag == "poi": + poi = _POI(obj.attrib, reference_net=reference_net) + self.pois[poi.id] = poi + for poiChild in obj: + if poiChild.tag == "param": + poi.params[poiChild.attrib["key"]] = poiChild.attrib["value"] + elif obj.tag in ["busStop", "trainStop"]: + bus_stop = _BusStop(obj.attrib, reference_net=reference_net) + self.bus_stops[bus_stop.id] = bus_stop + + def plot_polygons(self, ax=None, **kwargs): + """ + Plot all polygons. + + :param ax: matplotlib Axes object + :param kwargs: kwargs to pass to the plotting function + :return: list of artists + :type ax: plt.Axes + """ + artists = [] + if ax is None: + ax = plt.gca() + for poly in self.polys.values(): + artist = poly.plot(ax, **kwargs) + artists.append(artist) + return artists + + def plot_pois(self, ax=None, **kwargs): + """ + Plot all POIs. + + :param ax: matplotlib Axes object + :param kwargs: kwargs to pass to the plotting function + :return: list of artists + :type ax: plt.Axes + """ + artists = [] + if ax is None: + ax = plt.gca() + for poi in self.pois.values(): + artist = poi.plot(ax, **kwargs) + artists.append(artist) + return artists + + def generate_bus_stops_obj_text(self, area_kwargs=None, markings_kwargs=None, **kwargs): + """ + Generates the contents for a Wavefront-OBJ file which represents the bus stops as a 3D model. + + This text can be saved as text to a file with the ``*.obj`` extension and then imported into a 3D software. + The axis configuration in the generated file is Y-Forward, Z-Up. + + Object-specific kwargs override general kwargs. Options are: "z", "extrude_height", and "include_bottom_face". + + :param area_kwargs: kwargs for 3D area object generation. + :param markings_kwargs: kwargs for 3D lane markings object generation. + :type area_kwargs: dict + :type markings_kwargs: dict + """ + objs = [] + for bus_stop in self.bus_stops.values(): + objs += bus_stop.get_as_3d_objects(area_kwargs, markings_kwargs, **kwargs) + return _Utils.generate_obj_text_from_objects(objs) + + def generate_polygons_obj_text(self, **kwargs): + """ + Generates the contents for a Wavefront-OBJ file which represents the polygons as a 3D model. + + This text can be saved as text to a file with the ``*.obj`` extension and then imported into a 3D software. + The axis configuration in the generated file is Y-Forward, Z-Up. + + Possible kwargs are: "z", "extrude_height", and "include_bottom_face". Defaults are 0, 0, False. + """ + objs = [] + kwargs = {"z": 0, "extrude_height": 0, "include_bottom_face": False, **kwargs} + for poly in self.polys.values(): + objs.append(poly.get_as_3d_object(**kwargs)) + return _Utils.generate_obj_text_from_objects(objs) + + def plot_bus_stops(self, ax=None, area_kwargs=None, marking_kwargs=None, **kwargs): + """ + Plots all bus stops. + + :param ax: matplotlib Axes object + :param area_kwargs: kwargs to pass to the bus stop area plotting function + :param marking_kwargs: kwargs to pass to the bus stop markings plotting function + :return: list of artists + """ + artists = [] + if ax is None: + ax = plt.gca() + for bus_stop in self.bus_stops.values(): + artist = bus_stop.plot(ax, area_kwargs, marking_kwargs, **kwargs) + artists += artist + return artists + + def plot(self, ax=None, polygon_kwargs=None, poi_kwargs=None, bus_stop_area_kwargs=None, + bus_stop_marking_kwargs=None, **kwargs): + """ + Plot all supported objects contained within the Additionals object. + Kwargs are passed to the plotting functions, with object-specific kwargs overriding general ones. + + :param ax: matplotlib Axes object + :param polygon_kwargs: kwargs to pass to the polygon plotting function + :param poi_kwargs: kwargs to pass to the POI plotting function + :param bus_stop_area_kwargs: kwargs to pass to the bus stop area plotting function + :param bus_stop_marking_kwargs: kwargs to pass to the bus stop markings plotting function + :return: SumoNetVis.ArtistCollection object containing all generated artists + :type ax: plt.Axes + :type polygon_kwargs: dict + :type poi_kwargs: dict + :type bus_stop_area_kwargs: dict + :type bus_stop_marking_kwargs: dict + """ + if ax is None: + ax = plt.gca() + if polygon_kwargs is None: + polygon_kwargs = dict() + if poi_kwargs is None: + poi_kwargs = dict() + artist_collection = _Utils.ArtistCollection() + for poly in self.polys.values(): + artist = poly.plot(ax, **{**kwargs, **polygon_kwargs}) + artist_collection.polys.append(artist) + for poi in self.pois.values(): + artist = poi.plot(ax, **{**kwargs, **poi_kwargs}) + artist_collection.pois.append(artist) + for bus_stop in self.bus_stops.values(): + artists = bus_stop.plot(ax, area_kwargs=bus_stop_area_kwargs, marking_kwargs=bus_stop_marking_kwargs, **kwargs) + artist_collection.bus_stops += artists + return artist_collection + + +if __name__ == "__main__": + net = _Net.Net("../Sample/test.net.xml") + net.plot() + set_bus_stop_style(BUS_STOP_STYLE_GER) + addls = Additionals("../Sample/test.add.xml", reference_net=net) + addls.plot() + plt.gca().set_aspect("equal") + plt.show() diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Net.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Net.py new file mode 100644 index 0000000..50c0c08 --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Net.py @@ -0,0 +1,1115 @@ +""" +Main classes and functions for dealing with a Sumo network. +""" + +import warnings +import xml.etree.ElementTree as ET +from shapely.geometry import * +from shapely.geometry.polygon import orient +import shapely.ops as ops +import matplotlib.patches +import matplotlib.transforms as transforms +import matplotlib.pyplot as plt +import numpy as np +from typing import Union +from SumoNetVis import _Utils +from SumoNetVis import Additionals as _Addls + +DEFAULT_LANE_WIDTH = 3.2 +STRIPE_WIDTH_SCALE_FACTOR = 1 # factor by which to scale striping widths +COLOR_SCHEME = { + "junction": "#660000", + "pedestrian": "#808080", + "bicycle": "#C0422C", + "ship": "#96C8C8", + "authority": "#FF0000", + "none": "#FFFFFF", + "no_passenger": "#5C5C5C", + "crosswalk": "#00000000", + "other": "#000000" +} +USA_STYLE = "USA" +EUR_STYLE = "EUR" +LANE_MARKINGS_STYLE = EUR_STYLE # desired lane marking style +PLOT_STOP_LINES = True # whether to plot stop lines + +OBJ_TERRAIN_CLEANUP_TOLERANCE = 0.01 # clean terrain boundaries by dilating then eroding the net bounds by this amount + + +def set_style(style=None, plot_stop_lines=None): + """ + Sets the lane marking style settings. + + :param style: desired style ("USA" or "EUR") + :param plot_stop_lines: whether to plot stop lines + :return: None + :type style: str + :type plot_stop_lines: bool + """ + global LANE_MARKINGS_STYLE, PLOT_STOP_LINES + if style is not None: + if style not in [USA_STYLE, EUR_STYLE]: + raise IndexError("Specified lane marking style not supported: " + style) + LANE_MARKINGS_STYLE = style + if plot_stop_lines is not None: + PLOT_STOP_LINES = plot_stop_lines + + +def set_stripe_width_scale(factor=1): + """ + Sets the lane striping width scale factor. + + :param factor: desired scale factor + :return: None + :type factor: float + """ + global STRIPE_WIDTH_SCALE_FACTOR + STRIPE_WIDTH_SCALE_FACTOR = factor + + +class _Edge: + def __init__(self, attrib): + """ + Initializes an Edge object. + + :param attrib: dict of Edge attributes + :type attrib: dict + """ + self.id = attrib["id"] + self.function = attrib["function"] if "function" in attrib else "normal" + self.from_junction_id = attrib["from"] if "from" in attrib else None + self.to_junction_id = attrib["to"] if "to" in attrib else None + self.from_junction = None + self.to_junction = None + self.lanes = [] + self.stop_offsets = [] + self.params = dict() + + def append_lane(self, lane): + """ + Makes the specified Lane a child of the Edge + + :param lane: child Lane object + :return: None + :type lane: _Lane + """ + self.lanes.append(lane) + lane.parentEdge = self + + def get_lane(self, index): + """ + Returns the lane on the Edge with the given index + + :param index: lane index of Lane to retrieve + :return: Lane + """ + for lane in self.lanes: + if lane.index == index: + return lane + raise IndexError("Edge contains no Lane with given index.") + + def lane_count(self): + """ + Returns the number of lanes to which this Edge is a parent + + :return: lane count + """ + return len(self.lanes) + + def intersects(self, other): + """ + Checks if any lane in the edge intersects a specified geometry + + :param other: the geometry against which to check + :return: True if any lane intersects other, else False + :type other: BaseGeometry + """ + for lane in self.lanes: + if other.intersects(lane.shape): + return True + return False + + def append_stop_offset(self, attrib): + value = float(attrib["value"]) + vc = attrib["vClasses"] if "vClasses" in attrib else "" + exceptions = attrib["exceptions"] if "exceptions" in attrib else "" + vClasses = _Utils.Allowance(allow_string=vc, disallow_string=exceptions) + self.stop_offsets.append((value, vClasses)) + + def plot(self, ax, lane_kwargs=None, lane_marking_kwargs=None, **kwargs): + """ + Plots the lane. + The lane_kwargs and lane_markings_kwargs override the general kwargs for their respective functions. + + :param ax: matplotlib Axes object + :param lane_kwargs: kwargs to pass to the lane plotting function (matplotlib.patches.Polygon()) + :param lane_marking_kwargs: kwargs to pass to the lane markings plotting function (matplotlib.lines.Line2D()) + :return: list of lane artists, list of lane marking artists + :type ax: plt.Axes + """ + lane_artists, lane_marking_artists = [], [] + if lane_kwargs is None: + lane_kwargs = dict() + if lane_marking_kwargs is None: + lane_marking_kwargs = dict() + for lane in self.lanes: + lane_artist = lane.plot_shape(ax, **{**kwargs, **lane_kwargs}) + lane_marking_artist = lane.plot_lane_markings(ax, **{**kwargs, **lane_marking_kwargs}) + lane_artists.append(lane_artist) + lane_marking_artists += lane_marking_artist + return lane_artists, lane_marking_artists + + +class _LaneMarking: + def __init__(self, alignment, linewidth, color, dashes, purpose=None, parent=None): + """ + Initialize a lane marking object. + + :param alignment: the centerline alignment of the lane marking + :param linewidth: the width of the marking + :param color: the color of the marking + :param dashes: dash pattern of the marking + :param purpose: string describing what function the marking serves + :param parent: _Lane object which created the lane marking + """ + self.purpose = "" if purpose is None else purpose + self.alignment = alignment + self.linewidth = linewidth + self.color = color + self.dashes = dashes + self.parent_lane = parent + + def plot(self, ax, **kwargs): + """ + Plots the lane marking. + + :param ax: matplotlib Axes object + :param kwargs: kwargs to pass to Line2D + :return: artist + :type ax: plt.Axes + """ + color = kwargs.pop("color") if "color" in kwargs else self.color + x, y = zip(*self.alignment.coords) + line = _Utils.LineDataUnits(x, y, linewidth=self.linewidth, color=color, dashes=self.dashes, **kwargs) + line.sumo_object = self + ax.add_line(line) + return line + + def get_as_shape(self, cap_style=CAP_STYLE.flat): + """ + Get marking as a shapely Polygon or MultiPolygon + + :param cap_style: cap style to use when performing buffer + :return: shapely Polygon or MultiPolygon + """ + if self.dashes[1] == 0: # if solid line + buffer = self.alignment.buffer(self.linewidth / 2, cap_style=cap_style) + else: # if dashed line + buffer = MultiPolygon() + dash_length, gap = self.dashes + for s in np.arange(0, self.alignment.length, dash_length + gap): + assert hasattr(ops, "substring"), "Shapely>=1.7.0 is required for OBJ export of dashed lines." + dash_segment = ops.substring(self.alignment, s, min(s + dash_length, self.alignment.length)) + buffer = buffer.union(dash_segment.buffer(self.linewidth / 2, cap_style=cap_style)) + return buffer + + def get_as_3d_object(self, z=0.001, extrude_height=0, include_bottom_face=False): + """ + Generates an Object3D from the marking. + + :param z: z coordinate of marking + :param extrude_height: distance by which to extrude the marking + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :return: Object3D + :type z: float + :type extrude_height: float + :type include_bottom_face: bool + """ + shape = self.get_as_shape() + if shape.geometryType() == "Polygon": + oriented_shape = MultiPolygon([orient(shape)]) + elif shape.geometryType() in ["MultiPolygon", "GeometryCollection"]: + oriented_geoms = [] + for geom in shape: + if geom.geometryType() == "Polygon": + oriented_geoms.append(orient(geom)) + oriented_shape = MultiPolygon(oriented_geoms) + return _Utils.Object3D.from_shape(oriented_shape, self.purpose+"_marking", self.color+"_marking", z=z, extrude_height=extrude_height, include_bottom_face=include_bottom_face) + + +class _Lane: + def __init__(self, attrib): + """ + Initialize a Lane object. + + :param attrib: dict of all of the lane attributes + :type attrib: dict + """ + self.id = attrib["id"] + self.index = int(attrib["index"]) + self.speed = float(attrib["speed"]) + allow_string = attrib["allow"] if "allow" in attrib else "" + disallow_string = attrib["disallow"] if "disallow" in attrib else "" + self.allows = _Utils.Allowance(allow_string, disallow_string) + self.width = float(attrib["width"]) if "width" in attrib else DEFAULT_LANE_WIDTH + self.endOffset = attrib["endOffset"] if "endOffset" in attrib else 0 + self.acceleration = attrib["acceleration"] if "acceleration" in attrib else "False" + coords = [[float(coord) for coord in xy.split(",")] for xy in attrib["shape"].split(" ")] + self.alignment = LineString(coords) + self.shape = self.alignment.buffer(self.width/2, cap_style=CAP_STYLE.flat) + if self.shape.geometryType() != "Polygon": + self.shape = self.shape.buffer(0) + self.parentEdge = None + self.stop_offsets = [] + self.incoming_connections = [] + self.outgoing_connections = [] + self.requests = [] # type: list[_Request] + self.params = dict() + + def lane_type(self): + """ + Returns a string descriptor of the type of lane, based on vehicle permissions. + + :return: lane type + """ + if self.allows == "pedestrian": + if self.parentEdge is not None and self.parentEdge.function == "crossing": + return "crosswalk" + else: + return "pedestrian" + if self.allows == "bicycle": + return "bicycle" + if self.allows == "ship": + return "ship" + if self.allows == "authority": + return "authority" + if self.allows == "none": + return "none" + if not self.allows["passenger"]: + return "no_passenger" + else: + return "other" + + def lane_color(self): + """ + Returns the Sumo-GUI default lane color for this lane. + + :return: lane color + """ + type = self.lane_type() + return COLOR_SCHEME[type] if type in COLOR_SCHEME else COLOR_SCHEME["other"] + + def plot_alignment(self, ax): + """ + Plots the centerline alignment of the lane + + :param ax: matplotlib Axes object + :return: artist + :type ax: plt.Axes + """ + x, y = zip(*self.alignment.coords) + artist, = ax.plot(x, y) + return artist + + def plot_shape(self, ax, **kwargs): + """ + Plots the entire shape of the lane + + :param ax: matplotlib Axes object + :return: artist + :type ax: plt.Axes + """ + if "lw" not in kwargs and "linewidth" not in kwargs: + kwargs["lw"] = 0 + if "color" not in kwargs: + kwargs["color"] = self.lane_color() + + try: + poly = matplotlib.patches.Polygon(self.shape.boundary.coords, closed = True, **kwargs) + except NotImplementedError: + warnings.warn("Can't plot non-polygonal geometry of lane " + self.id, stacklevel=2) + else: + poly.sumo_object = self + ax.add_patch(poly) + return poly + + def inverse_lane_index(self): + """ + Returns the inverted lane index (i.e. counting from inside out) + + :return: inverted lane index + """ + return self.parentEdge.lane_count() - self.index - 1 + + def append_stop_offset(self, attrib): + """ + Add a stop offset to the lane. + + :param attrib: dict of all the stop offset attributes + :return: None + :type attrib: dict + """ + value = float(attrib["value"]) + vc = attrib["vClasses"] if "vClasses" in attrib else "" + exceptions = attrib["exceptions"] if "exceptions" in attrib else "" + vClasses = _Utils.Allowance(allow_string=vc, disallow_string=exceptions) + self.stop_offsets.append((value, vClasses)) + + def get_stop_line_locations(self): + """ + Return a list of stop line locations for the lane based on the stop offsets of the lane and its parent Edge. + + :return: list of stop line locations (distance from end of lane) + """ + if len(self.stop_offsets) > 0: + stop_offsets = self.stop_offsets + else: + stop_offsets = self.parentEdge.stop_offsets if self.parentEdge is not None else [] + stop_line_locations = [] + accrued_vClasses = _Utils.Allowance("none") + for stop_offset, vClasses in stop_offsets: + accrued_vClasses += vClasses + stop_line_locations.append(stop_offset) + if not accrued_vClasses.is_superset_of(self.allows) and 0 not in stop_line_locations: + stop_line_locations.append(0) + return stop_line_locations + + def _requires_stop_line(self): + """ + Determines whether the Lane should be drawn with a stop line based on its priority and to-Junction. + + :return: True if Lane should be drawn with stop line, else False + """ + if self.parentEdge.to_junction.type in ["internal", "zipper"]: + return False + if self.parentEdge.to_junction.type == "always_stop": + return True + for request in self.requests: + if "1" in request.response: + return True + return False + + def get_markings_as_3d_objects(self, z_lane=0, extrude_height=0, include_bottom_face=False): + """ + Generates list of Object3D objects from the lane markings. + + :param z_lane: z coordinate of the lane. Markings will be generated slightly above this to prevent z fighting. + :param extrude_height: distance by which to extrude the markings + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :return: Object3D + :type z_lane: float + :type extrude_height: float + :type include_bottom_face: bool + """ + objects = [] + for marking in self._guess_lane_markings(): + z = z_lane+0.002 if marking.purpose == "crossing" else z_lane+0.001 + try: + obj = marking.get_as_3d_object(z=z, extrude_height=extrude_height, include_bottom_face=include_bottom_face) + except NotImplementedError: + warnings.warn("Could not generate geometry for " + marking.purpose + " marking of lane " + self.id, stacklevel=2) + else: + objects.append(obj) + return objects + + def get_as_3d_object(self, z=0, include_bottom_face=False, material_param=None, extrude_height_param=None, + extrude_height_param_transform=None): + """ + Generates an Object3D from the lane. + + :param z: z coordinate of junction + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :param material_param: generic parameter to use to override material, if present + :param extrude_height_param: generic parameter to use to override extrude height, if present + :param extrude_height_param_transform: function to apply to extrude_height_param values. Defaults to str->float conversion. + :return: Object3D + :type z: float + :type include_bottom_face: bool + :type material_param: str + :type extrude_height_param: str + """ + if self.shape.is_empty: + return None + h = 0.15 if self.lane_type() == "pedestrian" else 0 + if extrude_height_param is not None and extrude_height_param in self.params: + if extrude_height_param_transform is None: + extrude_height_param_transform = lambda x: float(x) if x is not None else h + h = extrude_height_param_transform(self.params[extrude_height_param]) + material = self.params.get(material_param, self.lane_type()+"_lane") + return _Utils.Object3D.from_shape(orient(self.shape), self.id, material, z=z, extrude_height=h, include_bottom_face=include_bottom_face) + + def _guess_lane_markings(self): + """ + Guesses lane markings based on lane configuration and globally specified lane marking style. + + :return: dict containing the marking alignment, line width, color, and dash pattern. + """ + markings = [] + if self.parentEdge.function == "internal" or self.allows == "ship" or self.allows == "rail": + return markings + if self.parentEdge.function == "crossing": + color, dashes = "w", (0.5, 0.5) + markings.append(_LaneMarking(self.alignment, self.width, color, dashes, purpose="crossing", parent=self)) + return markings + # US-style markings + if LANE_MARKINGS_STYLE == USA_STYLE: + lw = 0.1 * STRIPE_WIDTH_SCALE_FACTOR + # Draw centerline stripe if necessary + if self.inverse_lane_index() == 0: + leftEdge = self.alignment.parallel_offset(self.width/2-lw, side="left") + color, dashes = "y", (100, 0) + markings.append(_LaneMarking(leftEdge, lw, color, dashes, purpose="center", parent=self)) + # Draw non-centerline markings + else: + adjacent_lane = self.parentEdge.get_lane(self.index+1) + leftEdge = self.alignment.parallel_offset(self.width/2, side="left") + color, dashes = "w", (3, 9) # set default settings + if self.allows("bicycle") != adjacent_lane.allows("bicycle"): + dashes = (100, 0) # solid line where bicycles may not change lanes + elif self.allows("passenger") != adjacent_lane.allows("passenger"): + if self.allows("bicycle"): + dashes = (1, 3) # short dashed line where bikes may change lanes but passenger vehicles not + else: + dashes = (100, 0) # solid line where neither passenger vehicles nor bikes may not change lanes + markings.append(_LaneMarking(leftEdge, lw, color, dashes, purpose="lane", parent=self)) + # draw outer lane marking if necessary + if self.index == 0 and not (self.allows("pedestrian") and not self.allows("all")): + rightEdge = self.alignment.parallel_offset(self.width/2, side="right") + color, dashes = "w", (100, 0) + markings.append(_LaneMarking(rightEdge, lw, color, dashes, purpose="outer", parent=self)) + # European-style markings + elif LANE_MARKINGS_STYLE == EUR_STYLE: + lw = 0.1 * STRIPE_WIDTH_SCALE_FACTOR + # Draw centerline stripe if necessary + if self.inverse_lane_index() == 0: + leftEdge = self.alignment.parallel_offset(self.width/2, side="left") + color, dashes = "w", (100, 0) + markings.append(_LaneMarking(leftEdge, lw, color, dashes, purpose="center", parent=self)) + # Draw non-centerline markings + else: + adjacent_lane = self.parentEdge.get_lane(self.index + 1) + leftEdge = self.alignment.parallel_offset(self.width / 2, side="left") + color, dashes = "w", (3, 9) # set default settings + if self.allows("bicycle") != adjacent_lane.allows("bicycle"): + dashes = (100, 0) # solid line where bicycles may not change lanes + elif self.allows("passenger") != adjacent_lane.allows("passenger"): + if self.allows("bicycle"): + dashes = (1, 3) # short dashed line where bikes may change lanes but passenger vehicles not + else: + dashes = (100, 0) # solid line where neither passenger vehicles nor bikes may not change lanes + markings.append(_LaneMarking(leftEdge, lw, color, dashes, purpose="lane", parent=self)) + # draw outer lane marking if necessary + if self.index == 0 and not (self.allows("pedestrian") and not self.allows("all")): + rightEdge = self.alignment.parallel_offset(self.width / 2, side="right") + color, dashes = "w", (100, 0) + markings.append(_LaneMarking(rightEdge, lw, color, dashes, purpose="outer", parent=self)) + # Stop line markings (all styles) + slw = 0.5 + if PLOT_STOP_LINES and self.allows not in ["pedestrian", "ship"] and self._requires_stop_line(): + for stop_line_location in self.get_stop_line_locations(): + if not hasattr(ops, "substring"): + warnings.warn("Shapely >=1.7.0 required for drawing stop lines.", stacklevel=2) + break + pos = self.alignment.length - stop_line_location - slw/2 + end_cl = ops.substring(self.alignment, pos-1, pos) + if pos < 1: + warnings.warn("Unable to generate stop line for short lane " + self.id) + continue + if not hasattr(end_cl, "parallel_offset"): + warnings.warn("Unable to generate stop line for short lane " + self.id) + continue + if end_cl.is_empty or not end_cl.is_valid: + warnings.warn("Can't generate stopline geometry for lane " + self.id) + continue + try: + end_left = end_cl.parallel_offset(self.width / 2, side="left") + end_right = end_cl.parallel_offset(self.width / 2, side="right") + stop_line = LineString([end_left.coords[-1], end_right.coords[0]]) + except (NotImplementedError, IndexError, ValueError): + warnings.warn("Can't generate stopline geometry for lane " + self.id) + else: + markings.append(_LaneMarking(stop_line, slw, "w", (100, 0), purpose="stopline", parent=self)) + return markings + + def plot_lane_markings(self, ax, **kwargs): + """ + Guesses and plots some simple lane markings. + + :param ax: matplotlib Axes object + :return: list of artists + :type ax: plt.Axes + """ + artists = [] + for marking in self._guess_lane_markings(): + try: + artist = marking.plot(ax, **kwargs) + except NotImplementedError: + warnings.warn("Can't plot center stripe for lane " + self.id, stacklevel=2) + except ValueError: + warnings.warn("Generated lane marking geometry is empty for lane " + self.id, stacklevel=2) + else: + artists.append(artist) + return artists + + +class _Connection: + def __init__(self, attrib): + """ + Initialize a _Connection object. + + :param attrib: dict of all of the connection attributes + :type attrib: dict + """ + self.from_edge_id = attrib["from"] + self.to_edge_id = attrib["to"] + self.from_edge = None + self.to_edge = None + self.from_lane_index = int(attrib["fromLane"]) + self.to_lane_index = int(attrib["toLane"]) + self.from_lane = None + self.to_lane = None + self.via_id = attrib["via"] if "via" in attrib else None + self.via_lane = None + self.dir = attrib["dir"] + self.state = attrib["state"] + + if "shape" in attrib: + coords = [[float(coord) for coord in xy.split(",")] for xy in attrib["shape"].split(" ")] + self.shape = LineString(coords) + else: + self.shape = None + + def _generate_shape(self): + """ + Generate the shape of the lane in two dimensions based on the from_lane, via_lane, and to_lane. + + The alignment is taken from the via_lane, with the extruded points being adjusted to match the corners of the + from_lane and to_lane. The width of the Connection is taken from the from_lane. + + :return: Polygon of the Connection shape + """ + if self.from_lane is None or self.to_lane is None or self.via_lane is None: + raise ReferenceError("Valid reference to from-, to-, and via-lanes required to generate connection shape.") + # Get lane edges + from_lane_left_edge = [list(c) for c in self.from_lane.alignment.parallel_offset(self.from_lane.width/2, side="left").coords] + from_lane_right_edge = [list(c) for c in self.from_lane.alignment.parallel_offset(self.from_lane.width/2, side="right").coords] + to_lane_left_edge = [list(c) for c in self.to_lane.alignment.parallel_offset(self.to_lane.width/2, side="left").coords] + to_lane_right_edge = [list(c) for c in self.to_lane.alignment.parallel_offset(self.to_lane.width/2, side="right").coords] + try: + left_edge = [list(c) for c in self.via_lane.alignment.parallel_offset(self.from_lane.width/2, side="left").coords] + except (ValueError, NotImplementedError): + left_edge = [] # if offset fails, don't use any intermediate coordinates + try: + right_edge = [list(c) for c in self.via_lane.alignment.parallel_offset(self.from_lane.width/2, side="right").coords] + except (ValueError, NotImplementedError): + right_edge = [] # if offset fails, don't use any intermediate coordinates + right_edge.reverse() + # Generate coordinates + left_coords = [from_lane_left_edge[-1]] + left_edge[1:-1] + [to_lane_left_edge[0]] + right_coords = [from_lane_right_edge[0]] + right_edge[1:-1] + [to_lane_right_edge[-1]] + left_coords.reverse() + boundary_coords = right_coords + left_coords + [right_coords[0]] + return Polygon(boundary_coords) + + def get_as_3d_object(self, z=0, include_bottom_face=False): + """ + Generates an Object3D from the connection. + + :param z: z coordinate of connection + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :return: Object3D + :type z: float + :type include_bottom_face: bool + """ + shape = self.shape if self.shape is not None else self._generate_shape() + if shape.is_empty: + return None + h = 0.15 if self.from_lane.lane_type() == "pedestrian" and self.to_lane.lane_type() == "pedestrian" else 0 + material = "pedestrian_connection" if self.from_lane.lane_type() == "pedestrian" and self.to_lane.lane_type() == "pedestrian" else "connection" + return _Utils.Object3D.from_shape(orient(shape), "cxn_via_" + self.via_id, material, z=z, extrude_height=h, include_bottom_face=include_bottom_face) + + def plot_alignment(self, ax): + """ + Plot the centerline of the connection. + :param ax: matplotlib Axes object + :return: artist + :type ax: plt.Axes + """ + if self.shape: + x, y = zip(*self.shape.coords) + line, = ax.plot(x, y) + line.sumo_object = self + return line + + +class _Request: + def __init__(self, attrib, parent_junction=None): + """ + Initializes a Request object + + :param attrib: dict of xml attributes + :param parent_junction: parent Junction of this Request + :type attrib: dict + :type parent_junction: _Junction + """ + self.index = int(attrib["index"]) + self.response = attrib["response"] + self.foes = attrib["foes"] + if "cont" in attrib: + self.cont = attrib["cont"] + else: + self.cont = "0" + warnings.warn("Request object missing attribute 'cont'. Defaulting to false.", stacklevel=2) + self.parentJunction = parent_junction + + +class _Junction: + def __init__(self, attrib): + """ + Initializes a Junction object. + + :param attrib: dict of junction attributes. + :type attrib: dict + """ + self.id = attrib["id"] + self.type = attrib["type"] + self.incLane_ids = attrib["incLanes"].split(" ") if attrib["incLanes"] != "" else [] + self.intLane_ids = attrib["intLanes"].split(" ") if attrib["intLanes"] != "" else [] + self.incLanes = [] + self.intLanes = [] + self._requests = [] + self.params = dict() + self.shape = None + if "shape" in attrib: + coords = [[float(coord) for coord in xy.split(",")] for xy in attrib["shape"].split(" ")] + if len(coords) > 2: + self.shape = Polygon(coords) + + def append_request(self, request): + """ + Add a Request object to the Junction. + + :param request: request to add to the junction + :return: None + :type request: _Request + """ + request.parentJunction = self + self._requests.append(request) + + def get_request_by_index(self, index): + """ + Returns the Request with the given index. + + :param index: index of Request to get + :return: Request with given index + :type index: int + """ + for req in self._requests: + if req.index == index: + return req + raise IndexError("Junction " + self.id + " has no request with index " + str(index)) + + def get_request_by_int_lane(self, lane_id): + """ + Returns the Request corresponding to the internal lane with the specified id. + + :param lane_id: id of the internal lane for which to get the corresponding Request + :return: Request corresponding to the specified internal lane + """ + try: + index = self.intLane_ids.index(lane_id) + except ValueError as err: + raise IndexError("Junction " + self.id + " does not include lane " + lane_id) from err + else: + return self.get_request_by_index(index) + + def get_as_3d_object(self, z=0, extrude_height=0, include_bottom_face=False, material_param=None, + extrude_height_param=None, extrude_height_param_transform=None): + """ + Generates an Object3D from the junction. + + :param z: z coordinate of junction + :param extrude_height: distance by which to extrude the junction + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :param material_param: generic parameter to use to override material, if present + :param extrude_height_param: generic parameter to use to override extrude height, if present + :param extrude_height_param_transform: function to apply to extrude_height_param values. Defaults to str->float conversion. + :return: Object3D + :type z: float + :type extrude_height: float + :type include_bottom_face: bool + :type material_param: str + :type extrude_height_param: str + """ + if self.shape.is_empty: + return None + if extrude_height_param is not None and extrude_height_param in self.params: + if extrude_height_param_transform is None: + extrude_height_param_transform = lambda x: float(x) if x is not None else extrude_height + extrude_height = extrude_height_param_transform(self.params[extrude_height_param]) + material = self.params.get(material_param, "junction") + return _Utils.Object3D.from_shape(orient(self.shape), self.id, "junction", z=z, extrude_height=extrude_height, include_bottom_face=include_bottom_face) + + def plot(self, ax, **kwargs): + """ + Plots the Junction. + + :param ax: matplotlib Axes object + :return: artist + :type ax: plt.Axes + """ + if self.shape is not None: + if "lw" not in kwargs and "linewidth" not in kwargs: + kwargs["lw"] = 0 + if "color" not in kwargs: + kwargs["color"] = COLOR_SCHEME["junction"] + try: + coord2d = [(x, y) for x, y,_ in self.shape.boundary.coords] + except: + coord2d = [(x, y) for x, y in self.shape.boundary.coords] + poly = matplotlib.patches.Polygon(coord2d, closed = True, **kwargs) + poly.sumo_object = self + ax.add_patch(poly) + return poly + + +class Net: + """ + :param file: path to Sumo network file + :param additional_files: optional path to additional file (or list of paths) to include with the network. + :type file: str + :type additional_files: Union[str, list[str]] + + :ivar edges: dict with edge IDs as keys and _Edge objects as values + :ivar junctions: dict with junction IDs as keys and _Junction objects as values + :ivar connections: list of all _Connection objects + :ivar netOffset: (x, y) tuple of the netOffset parameter from the net file + :ivar projParameter: the projParameter from the net file + """ + def __init__(self, file, additional_files=None): + """ + Initializes a Net object from a Sumo network file + + :param file: path to Sumo network file + :param additional_files: optional path to additional file (or list of paths) to include with the network. + :type file: str + :type additional_files: Union[str, list[str]] + """ + self.additionals = [] + self.edges = dict() + self.junctions = dict() + self.connections = [] + self.netOffset = (0, 0) + self.projParameter = "!" + net = ET.parse(file).getroot() + for obj in net: + if obj.tag == "location": + if "netOffset" in obj.attrib: + self.netOffset = tuple(float(i) for i in obj.attrib["netOffset"].split(",")) + if "projParameter" in obj.attrib: + self.projParameter = obj.attrib["projParameter"] + if obj.tag == "edge": + if "function" in obj.attrib and obj.attrib["function"] == "walkingarea": + continue + edge = _Edge(obj.attrib) + for edgeChild in obj: + if edgeChild.tag == "stopOffset": + edge.append_stop_offset(edgeChild.attrib) + elif edgeChild.tag == "param": + edge.params[edgeChild.attrib["key"]] = edgeChild.attrib["value"] + elif edgeChild.tag == "lane": + lane = _Lane(edgeChild.attrib) + for laneChild in edgeChild: + if laneChild.tag == "stopOffset": + lane.append_stop_offset(laneChild.attrib) + elif laneChild.tag == "param": + lane.params[laneChild.attrib["key"]] = laneChild.attrib["value"] + edge.append_lane(lane) + self.edges[edge.id] = edge + elif obj.tag == "junction": + junction = _Junction(obj.attrib) + for jnChild in obj: + if jnChild.tag == "request": + req = _Request(jnChild.attrib) + junction.append_request(req) + elif jnChild.tag == "param": + junction.params[jnChild.attrib["key"]] = jnChild.attrib["value"] + self.junctions[junction.id] = junction + elif obj.tag == "connection": + connection = _Connection(obj.attrib) + self.connections.append(connection) + self._link_objects() + if additional_files is not None: + if type(additional_files) == str: + self.load_additional_file(additional_files) + else: + for addl_file in additional_files: + self.load_additional_file(addl_file) + + def _link_objects(self): + """ + Adds links between objects in the Network as necessary for certain functions. + + :return: None + """ + # link junctions to edges + for edge in self.edges.values(): + edge.from_junction = self.junctions.get(edge.from_junction_id, None) + edge.to_junction = self.junctions.get(edge.to_junction_id, None) + # link edges and lanes to connections + for connection in self.connections: + if connection.via_id is not None: + connection.via_lane = self._get_lane(connection.via_id) + connection.from_edge = self.edges.get(connection.from_edge_id, None) + if connection.from_edge is not None: + connection.from_lane = connection.from_edge.get_lane(connection.from_lane_index) + connection.from_lane.outgoing_connections.append(connection) + connection.to_edge = self.edges.get(connection.to_edge_id, None) + if connection.to_edge is not None: + connection.to_lane = connection.to_edge.get_lane(connection.to_lane_index) + connection.to_lane.incoming_connections.append(connection) + # make junction-related links + for junction in self.junctions.values(): + if junction.type == "internal": + continue + # link incoming lanes to junction + for i in junction.incLane_ids: + incLane = self._get_lane(i) + if incLane is not None: + junction.incLanes.append(incLane) + # link internal lanes to junction + for i in junction.intLane_ids: + intLane = self._get_lane(i) + if intLane is not None: + junction.intLanes.append(intLane) + # link connections and requests to incoming lanes + for lane in junction.incLanes: + for cxn in lane.outgoing_connections: + if cxn.via_id is not None: + reqs = [] + try: + req = junction.get_request_by_int_lane(cxn.via_id) + except IndexError: # if no request found for via, look one level deeper + cxns_internal = self._get_connections_from_lane(cxn.via_id) + for cxni in cxns_internal: + req = junction.get_request_by_int_lane(cxni.via_id) + reqs.append(req) + else: + reqs.append(req) + for req in reqs: + lane.requests.append(req) + + def load_additional_file(self, file): + """ + Load the specified additional file and associate it with this Net. + + :param file: path to additionals file + :return: None + """ + addl = _Addls(file, reference_net=self) + self.additionals.append(addl) + + def _get_extents(self, apply_netOffset=False): + lane_geoms = [] + for edge in self.edges.values(): + for lane in edge.lanes: + lane_geoms.append(lane.shape) + polygons = MultiPolygon(lane_geoms) + xoff, yoff = self.netOffset if apply_netOffset else (0, 0) + bounds = [sum(i) for i in zip(polygons.bounds, (-xoff, -yoff, -xoff, -yoff))] + return bounds + + def _get_connections_from_lane(self, lane_id): + cxns = [] + for connection in self.connections: + if connection.from_edge_id + "_" + str(connection.from_lane_index) == lane_id: + cxns.append(connection) + return cxns + + def _get_connections_to_lane(self, lane_id): + cxns = [] + for connection in self.connections: + if connection.to_edge_id + "_" + str(connection.to_lane_index) == lane_id: + cxns.append(connection) + return cxns + + def _get_connections_via_lane(self, via): + cxns = [] + for connection in self.connections: + if connection.via_id == via: + cxns.append(connection) + return cxns + + def _get_lane(self, lane_id): + edge_id = "_".join(lane_id.split("_")[:-1]) + lane_num = int(lane_id.split("_")[-1]) + edge = self.edges.get(edge_id, None) + return edge.get_lane(lane_num) if edge is not None else None + + def _get_mask(self): + """ + Returns a shape representing the area(s) covered by network lane and junction shapes. + + :return: result of shapely.ops.unary_union(polys), where polys contains all junction and lane shapes. + """ + polys = [] + for junction in self.junctions.values(): + if junction.shape is not None: + polys.append(junction.shape) + for edge in self.edges.values(): + for lane in edge.lanes: + if lane.shape is not None: + polys.append(lane.shape) + mask = ops.unary_union(polys) + return mask + + def generate_obj_text(self, style=None, stripe_width_scale=1, terrain_distance=0, terrain_z=0, terrain_hi_q=False, + material_mapping=None, material_param=None, extrude_height_param=None, + extrude_height_param_transform=None): + """ + Generates the contents for a Wavefront-OBJ file which represents the network as a 3D model. + + This text can be saved as text to a file with the ``*.obj`` extension and then imported into a 3D software. + The axis configuration in the generated file is Y-Forward, Z-Up. + + Sumo "generic parameters" can be used to override the extrude height and material of lanes, junctions, and polys. + + :param style: lane marking style to use for rendering ("USA" or "EUR"). Defaults to last used or "EUR". + :param stripe_width_scale: scale factor for lane striping widths. Defaults to 1. + :param terrain_distance: if > 0: distance from network to which to generate terrain plane. + :param terrain_z: z value for terrain plane + :param terrain_hi_q: if True, generates "high-quality" mesh for terrain (no interior angles > 20°). WARNING: this can be very computationally intensive for large or complex networks. + :param material_mapping: a dictionary mapping SumoNetVis-generated material names to user-defined ones + :param material_param: generic parameter to use to override material, if present. material_mapping is applied also to this value. + :param extrude_height_param: generic parameter to use to override extrude height, if present + :param extrude_height_param_transform: function to apply to extrude_height_param values. Defaults to str->float conversion. + :return: None + :type style: str + :type stripe_width_scale: float + :type terrain_distance: float + :type terrain_z: float + :type terrain_hi_q: bool + :type material_mapping: dict + :type material_param: str + :type extrude_height_param: str + """ + if style is not None: + set_style(style) + set_stripe_width_scale(stripe_width_scale) + objects = [] + for edge in self.edges.values(): + if edge.function == "internal": + continue + for lane in edge.lanes: + if edge.function not in ["crossing", "walkingarea"]: + objects.append(lane.get_as_3d_object(material_param=material_param, + extrude_height_param=extrude_height_param, + extrude_height_param_transform=extrude_height_param_transform)) + objects += lane.get_markings_as_3d_objects() + for junction in self.junctions.values(): + if junction.shape is not None: + objects.append(junction.get_as_3d_object(material_param=material_param, + extrude_height_param=extrude_height_param, + extrude_height_param_transform=extrude_height_param_transform)) + for connection in self.connections: + if connection.via_id is not None: + if connection.from_lane.lane_type() == "pedestrian" and connection.to_lane.lane_type() == "pedestrian": + objects.append(connection.get_as_3d_object()) + for additional in self.additionals: + for bus_stop in additional.bus_stops.values(): + objects += bus_stop.get_as_3d_objects() + for poly in additional.polys.values(): + objects.append(poly.get_as_3d_object(material_param=material_param, + extrude_height_param=extrude_height_param, + extrude_height_param_transform=extrude_height_param_transform)) + while None in objects: + objects.remove(None) + if terrain_distance > 0: + net_mask = self._get_mask() + if OBJ_TERRAIN_CLEANUP_TOLERANCE > 0: + net_mask = net_mask.buffer(OBJ_TERRAIN_CLEANUP_TOLERANCE).buffer(-OBJ_TERRAIN_CLEANUP_TOLERANCE) + net_buffer = net_mask.buffer(terrain_distance, cap_style=2, join_style=2) + terrain_shape = net_buffer.difference(net_mask) + additional_opts = "q" if terrain_hi_q else "" + objects.append(_Utils.Object3D.from_shape_triangulated(terrain_shape, "terrain", "terrain", terrain_z, + additional_opts=additional_opts)) + return _Utils.generate_obj_text_from_objects(objects, material_mapping=material_mapping) + + def plot(self, ax=None, clip_to_limits=False, zoom_to_extents=True, style=None, stripe_width_scale=1, + plot_stop_lines=None, apply_netOffset=False, lane_kwargs=None, lane_marking_kwargs=None, + junction_kwargs=None, additionals_kwargs=None, **kwargs): + """ + Plots the Net. Kwargs are passed to the plotting functions, with object-specific kwargs overriding general ones. + + :param ax: matplotlib Axes object. Defaults to current axes. + :param clip_to_limits: if True, only objects in the current view will be drawn. Speeds up saving of animations. + :param zoom_to_extents: if True, window will be set to the network extents. Ignored if clip_to_limits is True + :param style: lane marking style to use for plotting ("USA" or "EUR"). Defaults to last used or "EUR". + :param stripe_width_scale: scale factor for lane striping widths + :param plot_stop_lines: whether to plot stop lines + :param apply_netOffset: whether to translate the network by the inverse of the netOffset value + :param lane_kwargs: kwargs to pass to the lane plotting function (matplotlib.patches.Polygon()) + :param lane_marking_kwargs: kwargs to pass to the lane markings plotting function (matplotlib.lines.Line2D()) + :param junction_kwargs: kwargs to pass to the junction plotting function (matplotlib.patches.Polygon()) + :param additionals_kwargs: kwargs to pass to the additionals plotting function (Additionals.plot()) + :return: SumoNetVis.ArtistCollection object containing all generated artists + :type ax: plt.Axes + :type clip_to_limits: bool + :type zoom_to_extents: bool + :type style: str + :type stripe_width_scale: float + :type plot_stop_lines: bool + :type apply_netOffset: bool + """ + if style is not None: + set_style(style=style) + if plot_stop_lines is not None: + set_style(plot_stop_lines=plot_stop_lines) + set_stripe_width_scale(stripe_width_scale) + if ax is None: + ax = plt.gca() + xoff, yoff = self.netOffset + if apply_netOffset: + tr = transforms.Affine2D().translate(-xoff, -yoff) + ax.transData + if "transform" in kwargs: + tr += kwargs["transform"] + kwargs["transform"] = tr + if junction_kwargs is None: + junction_kwargs = dict() + if lane_kwargs is None: + lane_kwargs = dict() + if lane_marking_kwargs is None: + lane_marking_kwargs = dict() + if additionals_kwargs is None: + additionals_kwargs = dict() + if zoom_to_extents and not clip_to_limits: + x_min, y_min, x_max, y_max = self._get_extents(apply_netOffset) + ax.set_xlim(x_min, x_max) + ax.set_ylim(y_min, y_max) + ax.set_clip_box(ax.get_window_extent()) + xmin, xmax = ax.get_xlim() + ymin, ymax = ax.get_ylim() + bounds = [[xmin, ymax], [xmax, ymax], [xmax, ymin], [xmin, ymin]] + window = Polygon(bounds) + artist_collection = _Utils.ArtistCollection() + for edge in self.edges.values(): + if edge.function != "internal" and (not clip_to_limits or edge.intersects(window)): + la, lma = edge.plot(ax, {"zorder": -100, **lane_kwargs}, {"zorder": -90, **lane_marking_kwargs}, **kwargs) + artist_collection.lanes += la + artist_collection.lane_markings += lma + for junction in self.junctions.values(): + if not clip_to_limits or (junction.shape is not None and junction.shape.intersects(window)): + ja = junction.plot(ax, **{"zorder": -110, **kwargs, **junction_kwargs}) + artist_collection.junctions.append(ja) + for additional in self.additionals: + addls_ac = additional.plot(ax, **{**kwargs, **additionals_kwargs}) + artist_collection += addls_ac + return artist_collection + + +if __name__ == "__main__": + net = Net('../Sample/test.net.xml') + fig, ax = plt.subplots() + # ax.set_facecolor("green") + net.plot(ax, style=USA_STYLE, stripe_width_scale=3) + plt.show() diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Trajectory.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Trajectory.py new file mode 100644 index 0000000..50db007 --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/Trajectory.py @@ -0,0 +1,428 @@ +""" +Tools for plotting trajectories. +""" + +import xml.etree.ElementTree as ET +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection +from matplotlib.colors import Normalize +import numpy as np +import warnings + + +GENERIC_PARAM_MISSING_VALUE = None # value to assign for timesteps when a generic parameter is missing + + +class Trajectory: + """ + Class containing a single trajectory. + + :ivar mappable: ``ScalarMappable`` object. Useful for generating colorbars. None if no applicable colorization. + """ + def __init__(self, id, type, time=None, x=None, y=None, speed=None, angle=None, lane=None, colors=None, params=None): + self.id = id + self.type = type + self.point_plot_kwargs = {"color": "blue", "ms": 5, "markeredgecolor": "black", "zorder": 200} + self.time = time if time is not None else [] + self.x = x if x is not None else [] + self.y = y if y is not None else [] + self.speed = speed if speed is not None else [] + self.angle = angle if angle is not None else [] + self.lane = lane if lane is not None else [] + self.colors = colors if colors is not None else [] + self.params = params if params is not None else dict() + self._mappable = None # type: plt.cm.ScalarMappable + + @property + def mappable(self): + """ + ``ScalarMappable`` object corresponding to colorization of trajectory. Useful for generating colorbars, like so: + ``plt.colorbar(trajectory.mappable)`` + """ + return self._mappable + + def _append_point(self, time, x, y, speed=None, angle=None, lane=None, color="#000000", params=None): + """ + Appends a point to the trajectory + + :type time: float + :type x: float + :type y: float + :type speed: float + :type angle: float + :type lane: str + :type color: str + :type params: dict + :return: None + """ + self.time.append(time) + self.x.append(x) + self.y.append(y) + self.speed.append(speed) + self.angle.append(angle) + self.lane.append(lane) + self.colors.append(color) + params = params if params is not None else dict() + for key in params: + if key not in self.params: + self.params[key] = [] + for key in self.params: + while len(self.params[key]) < len(self.time)-1: + self.params[key].append(GENERIC_PARAM_MISSING_VALUE) + self.params[key].append(params[key] if key in params else GENERIC_PARAM_MISSING_VALUE) + + def assign_colors_constant(self, color): + """ + Assigns a constant color to the trajectory + + :param color: desired color + :return: None + """ + self.colors = [color for i in self.x] + + def assign_colors_speed(self, cmap=None, min_speed=0, max_speed=None): + """ + Assigns colors to trajectory points based on the speed. + + :param cmap: cmap object or name of cmap to use + :param min_speed: speed corresponding to low end of the color scale. If None, trajectory's min value is used + :param max_speed: speed corresponding to high end of the color scale. If None, trajectory's max value is used + :return: None + :type min_speed: float + :type max_speed: float + """ + if cmap is None: + cmap = plt.cm.get_cmap("viridis") + elif type(cmap) == str: + cmap = plt.cm.get_cmap(cmap) + if min_speed is None: + min_speed = min(self.speed) + if max_speed is None: + max_speed = max(self.speed) + self._mappable = plt.cm.ScalarMappable(cmap=cmap, norm=Normalize(vmin=min_speed, vmax=max_speed)) + for i in range(len(self.x)): + self.colors[i] = self._mappable.to_rgba(self.speed[i]) + + def assign_colors_angle(self, cmap=None, angle_mode="deg"): + """ + Assigns colors to trajectory points based on the angle. + + :param cmap: cmap object or name of cmap to use + :param angle_mode: units of the angle value. "deg", "rad", or "grad" + :type angle_mode: str + :return: None + """ + if cmap is None: + cmap = plt.cm.get_cmap("hsv") + elif type(cmap) == str: + cmap = plt.cm.get_cmap(cmap) + max_angles = {"deg": 360, "rad": 2*np.pi, "grad": 400} + max_angle = max_angles[angle_mode] + self._mappable = plt.cm.ScalarMappable(cmap=cmap, norm=Normalize(vmin=0, vmax=max_angle)) + for i in range(len(self.x)): + self.colors[i] = self._mappable.to_rgba(self.angle[i]) + + def assign_colors_lane(self, cmap=None, color_dict=None): + """ + Assigns colors to the trajectory points based on the lane value + + :param cmap: cmap object or name of cmap to use to color lanes + :param color_dict: dict to override random color selection. Keys are lane IDs, values are colors. + :return: None + :type color_dict: dict + """ + if cmap is None: + cmap = plt.cm.get_cmap("tab10") + elif type(cmap) == str: + cmap = plt.cm.get_cmap(cmap) + cmapList = cmap.colors + if color_dict is None: + color_dict = dict() + lane_list = set(self.lane) + for i, lane in enumerate(lane_list): + color_dict[lane] = cmapList[i % len(cmapList)] + for i in range(len(self.x)): + self.colors[i] = color_dict[self.lane[i]] + + def assign_colors_param(self, key, transformation=None, cmap=None, vmin=None, vmax=None): + """ + Assigns colors based on values of the generic parameter with the given key. Colors can be assigned in one of + two ways: + + * Provide a cmap. ``transformation`` will be interpreted as a matplotlib norm (default Normalize(vmin, vmax)). + * Provide a transformation and no cmap, where ``transformation`` has signature transformation(param) -> color. + + In the first case, the trajectory mappable will be generated, allowing automatic colorbar creation. + If neither a transformation nor a cmap is given, the parameter value will be interpreted as a color. + + :param key: generic parameter key + :param transformation: (optional) callable if no cmap provided or matplotlib norm if cmap provided + :param cmap: (optional): cmap to use to assign colors + :param vmin: minimum value for norm (used to scale values onto cmap) + :param vmax: maximum value for norm (used to scale values onto cmap) + :return: None + :type key: str + """ + if cmap is not None: + vmin = vmin if vmin is not None else 0 + vmax = vmax if vmax is not None else 1 + norm = transformation if transformation is not None else Normalize(vmin=vmin, vmax=vmax) + self._mappable = plt.cm.ScalarMappable(cmap=cmap, norm=norm) + transformation = self._mappable.to_rgba + elif transformation is None: + transformation = lambda x: x + if vmin is not None or vmax is not None: + warnings.warn("Parameters vmin and vmax ignored because no cmap was specified.") + if not callable(transformation): + raise TypeError("Transformation must be callable.") + for i, val in enumerate(self.params[key]): + _val = val if cmap is None else float(val) + self.colors[i] = transformation(_val) + + def _get_values_at_time(self, time): + """ + Returns all of the values at the given simulation time + + :param time: Sumo simulation time for which to fetch values + :return: dict containing x, y, speed, angle, lane, color, and generic parameter values at time + """ + try: + idx = self.time.index(time) + except ValueError: + return {"x": None, + "y": None, + "speed": None, + "angle": None, + "lane": None, + "color": None, + **{key: None for key in self.params}} + else: + return {"x": self.x[idx], + "y": self.y[idx], + "speed": self.speed[idx], + "angle": self.angle[idx], + "lane": self.lane[idx], + "color": self.colors[idx], + **{key: self.params[key][idx] for key in self.params}} + + def plot(self, ax=None, start_time=0, end_time=np.inf, zoom_to_extents=False, **kwargs): + """ + Plots the trajectory + + :param ax: matplotlib Axes object. Defaults to current axes. + :param start_time: time at which to start drawing + :param end_time: time at which to end drawing + :param zoom_to_extents: if True, window will be set to Trajectory extents + :param kwargs: keyword arguments to pass to LineCollection or matplotlib.pyplot.plot() + :type ax: plt.Axes + :type start_time: float + :type end_time: float + :type zoom_to_extents: bool + :return: artist (LineCollection) + """ + if ax is None: + ax = plt.gca() + if len(self.x) < 2: + return + segs, colors = [], [] # line segments and colors + x_min, y_min, x_max, y_max = np.inf, np.inf, -np.inf, -np.inf + for i in range(len(self.x)-2): + if self.time[i] < start_time: + continue + if self.time[i+1] > end_time: + break + if zoom_to_extents: + x_min, x_max = min(x_min, self.x[i]), max(x_max, self.x[i]) + y_min, y_max = min(y_min, self.y[i]), max(y_max, self.y[i]) + segs.append([[self.x[i], self.y[i]], [self.x[i+1], self.y[i+1]]]) + colors.append(self.colors[i]) + lc = LineCollection(segs, colors=colors, **kwargs) + lc.sumo_object = self + ax.add_collection(lc) + if zoom_to_extents: + dx, dy = x_max - x_min, y_max - y_min + ax.set_xlim([x_min-0.05*dx, x_max+0.05*dx]) + ax.set_ylim([y_min-0.05*dy, y_max+0.05*dy]) + return lc + + +class Trajectories: + """ + Object storing a collection of trajectories. + + Individual trajectories can be retrieved by indexing with a number or by vehID. The object is also iterable. + + :param file: file from which to read trajectories. Currently only FCD exports supported. + :type file: str + + :ivar mappables: dict of ``vehID: ScalarMappable`` pairs. Useful for generating colorbars. + """ + def __init__(self, file=None): + """ + Initializes a Trajectories object. + + :param file: file from which to read trajectories + :type file: str + """ + self.trajectories = [] # type: list[Trajectory] + self.graphics = dict() + self.start = None + self.end = None + self.timestep = None + if file is not None: + if file.endswith("fcd-output.xml"): + self.read_from_fcd(file) + else: + raise NotImplementedError("Reading from this type of file not implemented: " + file) + + def __iter__(self): + return iter(self.trajectories) + + def __next__(self): + return next(self.trajectories) + + def __getitem__(self, i): + if type(i) == str: + for trajectory in self.trajectories: + if trajectory.id == i: + return trajectory + raise IndexError + elif type(i) == int: + return self.items[i] + else: + raise TypeError("Index type " + type(i).__name__ + " not supported by class " + type(self).__name__) + + def timestep_range(self): + """ + Returns a numpy ndarray consisting of every simulation time + + :return: ndarray of all simulation times + """ + return np.arange(self.start, self.end, self.timestep) + + def _append(self, trajectory): + self.trajectories.append(trajectory) + + def read_from_fcd(self, file): + """ + Reads trajectories from Sumo floating car data (fcd) output file. + + :param file: Sumo fcd output file + :return: None + :type file: str + """ + root = ET.parse(file).getroot() + trajectories = dict() + for timestep in root: + time = float(timestep.attrib["time"]) + if self.timestep is None and self.start is not None: + self.timestep = time - self.start + if self.start is None: + self.start = time + self.end = time + for veh in timestep: + if veh.tag in ["vehicle", "person", "container"]: + vehID = veh.attrib["id"] + type = veh.attrib.get("type", "") + if vehID not in trajectories: + trajectories[vehID] = Trajectory(vehID, type) + x = float(veh.attrib["x"]) + y = float(veh.attrib["y"]) + lane = veh.attrib.get("lane", "") + speed = float(veh.attrib["speed"]) + angle = float(veh.attrib["angle"]) + params = {key: veh.attrib[key] for key in veh.attrib if key not in ["id", "type", "x", "y", "lane", "speed", "angle"]} + trajectories[vehID]._append_point(time, x, y, speed, angle, lane, params=params) + for vehChild in veh: + if vehChild.tag in ["person", "container"]: + objID = vehChild.attrib["id"] + type = vehChild.attrib.get("type", "") + if objID not in trajectories: + trajectories[objID] = Trajectory(objID, type) + x = float(vehChild.attrib["x"]) if "x" in vehChild.attrib else x + y = float(vehChild.attrib["y"]) if "y" in vehChild.attrib else y + lane = vehChild.attrib.get("lane", "") + speed = float(vehChild.attrib["speed"]) if "speed" in vehChild.attrib else speed + angle = float(vehChild.attrib["angle"]) if "angle" in vehChild.attrib else angle + params = {key: vehChild.attrib[key] for key in vehChild.attrib if key not in ["id", "type", "x", "y", "lane", "speed", "angle"]} + params = {"_parent_vehicle": vehID, **params} + trajectories[objID]._append_point(time, x, y, speed, angle, lane, params=params) + for vehID in trajectories: + self._append(trajectories[vehID]) + + @property + def mappables(self): + """ + dict of ``vehID: ScalarMappable`` pairs. Useful for generating colorbars, like so: + ``plt.colorbar(trajectories.mappables[vehID])`` + """ + return {traj.id: traj.mappable for traj in self.trajectories if traj.mappable is not None} + + def plot(self, ax=None, start_time=0, end_time=np.inf, **kwargs): + """ + Plots all of the trajectories contained in this object. + + :param ax: matplotlib Axes object. Defaults to current axes. + :param start_time: time at which to start drawing + :param end_time: time at which to stop drawing + :param kwargs: keyword arguments to pass to plot function + :return: list of artists (LineCollection objects) + :type ax: plt.Axes + :type start_time: float + :type end_time: float + """ + artists = [] + if ax is None: + ax = plt.gca() + for trajectory in self: + artist = trajectory.plot(ax, start_time, end_time, **kwargs) + artists.append(artist) + return artists + + def plot_points(self, time, ax=None, animate_color=False): + """ + Plots the position of each vehicle at the specified time as a point. + The style for each point is controlled by each Trajectory's point_plot_kwargs attribute. + + :param time: simulation time for which to plot vehicle positions. + :param ax: matplotlib Axes object. Defaults to current axes. + :param animate_color: If True, the color of the marker will be animated using the Trajectory's color values. + :return: matplotlib Artist objects corresponding to the rendered points. Required for blitting animation. + :type time: float + :type ax: plt.Axes + :type animate_color: bool + """ + if ax is None: + ax = plt.gca() + for traj in self.trajectories: + values = traj._get_values_at_time(time) + x, y = values["x"], values["y"] + angle = values["angle"] + color = values["color"] + if x is None or y is None: + if time >= np.nanmax(traj.time): + if traj in self.graphics: + self.graphics[traj].remove() + self.graphics.pop(traj) + continue + if animate_color and color is not None: + traj.point_plot_kwargs["color"] = color + angle = (360 - angle) % 360 + if traj not in self.graphics: + self.graphics[traj], = ax.plot(x, y, marker=(3, 0, angle), **traj.point_plot_kwargs) + self.graphics[traj].sumo_object = traj + else: + self.graphics[traj].set_xdata(x) + self.graphics[traj].set_ydata(y) + self.graphics[traj].set_marker((3, 0, angle)) + if animate_color: + self.graphics[traj].set_color(traj.point_plot_kwargs["color"]) + return tuple(self.graphics[traj] for traj in self.graphics) + + +if __name__ == "__main__": + trajectories = Trajectories("../2019-08-30-17-01-38fcd-output.xml") + fig, ax = plt.subplots() + trajectories["TESIS_0"].assign_colors_angle() + trajectories["TESIS_0"].plot(ax, lw=3) + plt.show() diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/_Utils.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/_Utils.py new file mode 100644 index 0000000..f020b55 --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/_Utils.py @@ -0,0 +1,427 @@ +""" +Contains miscellaneous utility classes and functions for internal library use. +""" + +import warnings +import numpy as np +from matplotlib.lines import Line2D +import matplotlib.colors +from shapely.geometry import Polygon as shapelyPolygon +try: + from shapely.ops import polylabel +except ImportError: + _POLYLABEL_IMPORTED = False +else: + _POLYLABEL_IMPORTED = True +try: + import triangle +except ImportError: + _TRIANGLE_IMPORTED = False +else: + _TRIANGLE_IMPORTED = True + + +class Object3D: + def __init__(self, name, material, vertices, faces, lines=None): + """ + Create a 3D object. + + :param name: name of the object + :param material: name of the material to associate to the object + :param vertices: list of vertex coordinates + :param faces: list of faces, each a list of indices of the vertices making up the face + :param lines: list of lines, each a list of indices of the vertices making up the line + :type name: str + :type material: str + :type vertices: list[list[float]] + :type faces: list[list[int]] + :type lines: list[list[int]] + """ + self.vertices = vertices + self.faces = faces + self.lines = lines if lines is not None else [] + self.name = name + self.material = material + + @classmethod + def from_shape(cls, shape, name, material, z=0, extrude_height=0, include_bottom_face=False, include_top_face=True): + """ + Generates an Object3D from a shapely shape, either as a flat plane or by extrusion along the z axis + + :param shape: shapely Polygon or MultiPolygon from which to create 3D object + :param name: name of the object + :param material: name of the material to associate to the object + :param z: the desired z coordinate for the base of the object. Defaults to zero. + :param extrude_height: distance by which to extrude the face vertically. + :param include_bottom_face: whether to include the bottom face of the extruded geometry. + :param include_top_face: whether to include the top face of the geometry. + :type name: str + :type material: str + :type z: float + :type extrude_height: float + :type include_bottom_face: bool + :type include_top_face: bool + """ + vertices, faces, lines = [], [], [] + # get coordinate sequences from shape + if shape.geometryType() == "MultiPolygon": + outlines = [polygon.boundary.coords for polygon in shape] + elif shape.geometryType() == "Polygon": + outlines = [shape.boundary.coords] + elif shape.geometryType() == "MultiLineString": + outlines = [line.coords for line in shape] + elif shape.geometryType() == "LineString": + outlines = [shape.coords] + else: + raise NotImplementedError("Can't generate 3D object from " + shape.geometryType()) + if shape.geometryType() in ["MultiLineString", "LineString"]: + if include_top_face or include_bottom_face: + warnings.warn("Ignoring 3D geometry top and bottom faces for geometry type "+shape.geometryType()) + include_bottom_face = include_top_face = False + # calculate vertices and faces + for outline in outlines: + # generate coordinates of top and bottom face + top_vertices = [[v[0], v[1], z+extrude_height] for v in outline] + v_offset = len(vertices) + edge_len = len(top_vertices) + # add top vertices and face + vertices += top_vertices + if include_top_face: + faces += [[i+1 for i in range(v_offset, v_offset+edge_len)]] + elif extrude_height == 0 and not include_bottom_face: + lines = [[i+1 for i in range(v_offset, v_offset+edge_len)]] + # perform extrusion + if extrude_height != 0: + bottom_vertices = [[v[0], v[1], z] for v in outline] + vertices += bottom_vertices + # add side faces + faces += [[i+edge_len+1, i+edge_len+2, i+2, i+1] for i in range(v_offset, v_offset+edge_len-1)] + # add bottom face + if include_bottom_face: + faces += [[i+edge_len+1 for i in reversed(range(v_offset, v_offset+edge_len))]] + return cls(name, material, vertices, faces, lines) + + @classmethod + def from_shape_triangulated(cls, shape, name, material, z=0, **kwargs): + """ + Generate a planar triangulated object from a shapely shape. Supports multi-geometries and polygons with holes. + + :param shape: shapely shape from which to generate Object3D + :param name: name of the object + :param material: name of the material to associate to the object. + :param z: the z coordinate for the object + :param kwargs: kwargs to pass to triangulation function. + :type name: str + :type material: str + :type z: float + """ + vertices, faces = triangulate_polygon_constrained(shape, **kwargs) + vertices = [[v[0], v[1], z] for v in vertices] + return cls(name, material, vertices, faces) + + +def triangulate_polygon_constrained(shape, additional_opts=""): + """ + Perform constrained polygon triangulation. Essentially a compatibility layer between shapely and triangle. + + For more information about the triangulation, see documentation for triangle: https://rufat.be/triangle/API.html + + :param shape: shapely shape to triangulate + :param additional_opts: additional options to pass to triangle.triangulate(). "p" option is always used. + :type additional_opts: str + :return: vertices, faces; where vertices is a list of coordinates, and faces a list of 1-indexed face definitions. + """ + if not _TRIANGLE_IMPORTED: + raise EnvironmentError("Library 'triangle' required for triangulation.") + if not _POLYLABEL_IMPORTED: + raise EnvironmentError("Constrained polygon triangulation requires shapely>=1.7.0") + # Polygon case + if shape.geometryType() == "Polygon": + tri = {"vertices": [], "segments": [], "holes": []} + # add exterior edge + ext_pt_cnt = len(shape.exterior.coords) - 1 + tri["vertices"] += shape.exterior.coords[:-1] + tri["segments"] += [[i, i+1] for i in range(ext_pt_cnt-1)] + [[ext_pt_cnt-1, 0]] + # add interior edges and holes + offset = ext_pt_cnt + for hole in shape.interiors: + hole_pt_cnt = len(hole.coords) - 1 + tri["vertices"] += list(hole.coords[:-1]) + tri["segments"] += [[i, i+1] for i in range(offset, offset+hole_pt_cnt-1)] + [[offset+hole_pt_cnt-1, offset]] + rp = shapelyPolygon(hole.coords).representative_point() + tri["holes"].append(list(*rp.coords)) + offset += hole_pt_cnt + if len(tri["holes"]) == 0: + tri.pop("holes") + # perform triangulation + t = triangle.triangulate(tri, "p"+additional_opts) + vertices = t["vertices"] + faces = [[i+1 for i in j] for j in t["triangles"]] # switch from 0- to 1-indexing + return vertices, faces + # MultiPolygon/GeometryCollection case (recursive) + elif shape.geometryType() in ["MultiPolygon", "GeometryCollection"]: + vertices, faces = [], [] + for part in shape: + if part.geometryType() == "Polygon": + v, f = triangulate_polygon_constrained(part, additional_opts) + offset = len(vertices) + vertices += [list(i) for i in v] + faces += [[i+offset for i in j] for j in f] + return vertices, faces + # Unsupported geometry case + else: + raise NotImplementedError("Can't do constrained triangulation on geometry type " + shape.geometryType()) + + +def generate_obj_text_from_objects(objects, material_mapping=None): + """ + Generate Wavefront OBJ text from a list of Object3D objects + + :param objects: list of Object3D objects + :param material_mapping: a dictionary mapping SumoNetVis-generated material names to user-defined ones + :return: Wavefront OBJ text + :type objects: list[Object3D] + :type material_mapping: dict + """ + if material_mapping is None: + material_mapping = dict() + content = "" + vertex_count = 0 + for object in objects: + content += "o " + object.name + content += "\nusemtl " + material_mapping.get(object.material, object.material) + content += "\nv " + "\nv ".join([" ".join([str(c) for c in vertex]) for vertex in object.vertices]) + if len(object.faces) > 0: + content += "\nf " + "\nf ".join([" ".join([str(v + vertex_count) for v in face]) for face in object.faces]) + if len(object.lines) > 0: + content += "\nl " + "\nl ".join([" ".join([str(v + vertex_count) for v in line]) for line in object.lines]) + content += "\n\n" + vertex_count += len(object.vertices) + return content + + +class Allowance: + """ + A class for handling vehicle class lane allowances. + """ + vClass_list = np.array( + ["private", "emergency", "authority", "army", "vip", "pedestrian", "passenger", "hov", "taxi", + "bus", "coach", "delivery", "truck", "trailer", "motorcycle", "moped", "bicycle", "evehicle", + "tram", "rail_urban", "rail", "rail_electric", "rail_fast", "ship", "custom1", "custom2"]) + + def __init__(self, allow_string="all", disallow_string=""): + """ + Initializes an Allowance object. + + :param allow_string: string containing space-separated list of allowed vehicle classes + :param disallow_string: string containing space-separated list of disallowed vehicle classes + :type allow_string: str + :type disallow_string: str + """ + if allow_string in ["all", ""]: + allows = self.vClass_list + elif allow_string == "none": + allows = np.array([]) + else: + allows = np.array(allow_string.split(" ")) + if disallow_string == "all": + disallows = self.vClass_list + elif disallow_string == "": + disallows = np.full(len(self.vClass_list), False) + else: + disallows = np.array(disallow_string.split(" ")) + allow_mask = np.isin(self.vClass_list, allows) + disallow_mask = np.isin(self.vClass_list, disallows) + self.mask = np.logical_and(allow_mask, ~disallow_mask) + + def allows(self, vClass): + """ + Checks if the specified vClass is allowed by this Allowance. + + :param vClass: vClass to check + :return: True if vClass allowed, else False + :type vClass: str + """ + if vClass == "all": + return self.mask.all() + if vClass == "none": + return np.logical_not(self.mask).all() + if vClass not in self.vClass_list: + raise IndexError("Invalid vehicle class " + str(vClass)) + return self.mask[np.where(self.vClass_list == vClass)[0]].all() + + def get_allow_string(self): + """Return the 'allow' string as it would appear in a Net file.""" + if self.mask.all(): + return "all" + elif not self.mask.any(): + return "none" + else: + return " ".join(self.vClass_list[self.mask]) + + def get_disallow_string(self): + """Return the 'disallow' string as it would appear in a Net file.""" + if self.mask.all(): + return "none" + elif not self.mask.any(): + return "all" + else: + return " ".join(self.vClass_list[~self.mask]) + + def is_superset_of(self, other): + return self.mask[other.mask].all() + + def __getitem__(self, vClass): + return self.allows(vClass) + + def __call__(self, *vClasses, operation="all"): + if operation not in ["all", "any"]: + raise ValueError("Invalid operation " + str(operation)) + op = np.all if operation == "all" else np.any + return op([self.allows(vClass) for vClass in vClasses]) + + def __invert__(self): + inverted = Allowance() + inverted.mask = ~self.mask + return inverted + + def __eq__(self, other): + if type(other) == str: + other = type(self)(other) + if type(other) == type(self): + return np.array_equal(self.mask, other.mask) + else: + raise NotImplementedError("Can't compare " + str(type(self)) + " to " + str(type(other))) + + def __add__(self, other): + if type(other) == str: + other = type(self)(other) + result = Allowance() + result.mask = np.logical_or(self.mask, other.mask) + return result + + def __repr__(self): + return "Allowance('" + self.get_allow_string() + "')" + + +class LineDataUnits(Line2D): + """ + A Line2D object, but with the linewidth and dash properties defined in data coordinates. + """ + def __init__(self, *args, **kwargs): + _lw_data = kwargs.pop("linewidth", 1) + _dashes_data = kwargs.pop("dashes", (1, 0)) + super().__init__(*args, **kwargs) + if _dashes_data != (1, 0): + self.set_linestyle("--") + self._lw_data = _lw_data + self._dashes_data = _dashes_data + self._dashOffset = 0 + + def _get_lw(self): + if self.axes is not None: + ppd = 72./self.axes.figure.dpi + trans = self.axes.transData.transform + return ((trans((1, self._lw_data))-trans((0, 0)))*ppd)[1] + else: + return 1 + + def _set_lw(self, lw): + self._lw_data = lw + + def _get_dashes(self): + if self.axes is not None: + ppd = 72./self.axes.figure.dpi + trans = self.axes.transData.transform + dpu = (trans((1, 1)) - trans((0, 0)))[0] + return tuple([u*dpu*ppd for u in self._dashes_data]) + else: + return tuple((1, 0)) + + def _set_dashes(self, dashes): + self._dashes_data = dashes + + _linewidth = property(_get_lw, _set_lw) + _dashSeq = property(_get_dashes, _set_dashes) + + +def convert_sumo_color(sumo_color): + """ + Convert a Sumo-compatible color string to a matplotlib-compatible format. + + :param sumo_color: the color as specified in the sumo file + :return: a matplotlib-compatible representation of the color + :type sumo_color: str + """ + if matplotlib.colors.is_color_like(sumo_color): + return sumo_color + elif "," in sumo_color: + c = tuple([float(i) for i in sumo_color.split(",")]) + if max(c) > 1: + c = tuple([ci/255 for ci in c]) + if len(c) not in [3, 4] or max(c) > 1: + raise ValueError("Invalid color tuple '" + sumo_color + "'.") + return c + else: + raise ValueError("Invalid color '" + sumo_color + "'.") + + +class NonelessList(list): + """A special list-like object that will ignore any Nones added to it.""" + def append(self, item): + if item is not None: + super().append(item) + + def __iadd__(self, other): + for item in other: + self.append(item) + return self + + def __add__(self, other): + result = type(self)(self) + result += other + return result + + +class ArtistCollection: + """ + Collection of Artist objects generated by various SumoNetVis plotting functions. + + Consists of multiple lists of artists broken down by the type of Sumo object that generated them. + The object can also be iterated and indexed just like a list. For example: + + for artist in artist_collection: + artist.do_something() + + :ivar lanes: list of artists created by lanes + :ivar lane_markings: list of artists created by lane markings + :ivar junctions: list of artists created by junctions + :ivar polys: list of artists created by additionals polygons + :ivar pois: list of artists created by additionals POIs + :ivar bus_stops: list of artists created by bus stops + """ + def __init__(self): + self.lanes = NonelessList() + self.lane_markings = NonelessList() + self.junctions = NonelessList() + self.polys = NonelessList() + self.pois = NonelessList() + self.bus_stops = NonelessList() + + def _as_list(self): + return self.lanes + self.lane_markings + self.junctions + self.polys + self.pois + self.bus_stops + + def __iter__(self): + return iter(self._as_list()) + + def __getitem__(self, item): + return self._as_list()[item] + + def __iadd__(self, other): + self.lanes += other.lanes + self.lane_markings += other.lane_markings + self.junctions += other.junctions + self.polys += other.polys + self.pois += other.pois + self.bus_stops += other.bus_stops + return self diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/__init__.py new file mode 100644 index 0000000..9e1aefb --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/SumoNetVis/__init__.py @@ -0,0 +1,11 @@ +""" +A library for visualizing Sumo network files + +Author: Patrick Malcolm +""" + +__all__ = ["Net", "Trajectory", "Additionals"] + +from .Net import * +from .Trajectory import * +from .Additionals import * diff --git a/packages/terasim-datazoo/terasim_datazoo/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/__init__.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/__init__.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/__init__.py diff --git a/packages/terasim-datazoo/terasim_datazoo/core/intersection.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/intersection.py similarity index 95% rename from packages/terasim-datazoo/terasim_datazoo/core/intersection.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/core/intersection.py index d852a20..a124140 100644 --- a/packages/terasim-datazoo/terasim_datazoo/core/intersection.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/intersection.py @@ -1,4 +1,4 @@ -from terasim_datazoo.utils import Pt, Direction, TLS, classify_direction +from scenparse.utils import Pt, Direction, TLS, classify_direction class VehicleState: def __init__(self, object_id: int, lane_pos_idx: int, speed: float, acceleration: float = None): diff --git a/packages/terasim-datazoo/terasim_datazoo/core/osm.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/osm.py similarity index 91% rename from packages/terasim-datazoo/terasim_datazoo/core/osm.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/core/osm.py index f478174..8a23690 100644 --- a/packages/terasim-datazoo/terasim_datazoo/core/osm.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/osm.py @@ -1,4 +1,4 @@ -from terasim_datazoo.utils import xy_to_latlon +from scenparse.utils import xy_to_latlon class OSMNode: diff --git a/packages/terasim-datazoo/terasim_datazoo/core/sumo.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/sumo.py similarity index 98% rename from packages/terasim-datazoo/terasim_datazoo/core/sumo.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/core/sumo.py index 37e45eb..96a8465 100644 --- a/packages/terasim-datazoo/terasim_datazoo/core/sumo.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/sumo.py @@ -6,7 +6,7 @@ from shapely.ops import unary_union from .waymo import LaneCenter, Boundary -from terasim_datazoo.utils import Pt, Direction, classify_direction, polygon_remove_holes, multipolygon_force_union, points_to_vector +from scenparse.utils import Pt, Direction, classify_direction, polygon_remove_holes, multipolygon_force_union, points_to_vector class LaneTypeSUMO(Enum): NORMAL = "normal" diff --git a/packages/terasim-datazoo/terasim_datazoo/core/waymo.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/waymo.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/core/waymo.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/core/waymo.py index 96e40e6..243ad1d 100644 --- a/packages/terasim-datazoo/terasim_datazoo/core/waymo.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/core/waymo.py @@ -1,5 +1,5 @@ from enum import Enum -from terasim_datazoo.utils import Pt, TLS +from scenparse.utils import Pt, TLS class LaneType(Enum): UNDEFINED = 0 diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/__init__.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/__init__.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/__init__.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/osm2waymo.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/osm2waymo.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/osm2waymo.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/osm2waymo.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/__init__.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/__init__.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/__init__.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/osmic.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/osmic.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/osmic.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/osmic.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/osmizer.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/osmizer.py similarity index 97% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/osmizer.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/osmizer.py index 9f699b4..534deb8 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/osmizer.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/osmizer.py @@ -1,5 +1,5 @@ -from terasim_datazoo.core.osm import * -from terasim_datazoo.core.waymo import LaneType +from scenparse.core.osm import * +from scenparse.core.waymo import LaneType class Osmizer: diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/scenario_processor.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/scenario_processor.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/scenario_processor.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/scenario_processor.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic.py index 0ea611f..d5591e9 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic.py @@ -16,9 +16,9 @@ from .sumonizer import Sumonizer from .sumonic_tlsgen import SumonicTLSGenerator -from terasim_datazoo.core.sumo import * -from terasim_datazoo.core.waymo import * -from terasim_datazoo.utils import Direction, shape_str, polyline_length +from scenparse.core.sumo import * +from scenparse.core.waymo import * +from scenparse.utils import Direction, shape_str, polyline_length class Sumonic(Sumonizer, SumonicTLSGenerator): diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic_tlsgen.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic_tlsgen.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic_tlsgen.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic_tlsgen.py index 3165749..a8a416b 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonic_tlsgen.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonic_tlsgen.py @@ -2,7 +2,7 @@ from pathlib import Path import os -from terasim_datazoo.core.sumo import * +from scenparse.core.sumo import * from .traffic_lights import * diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonizer.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonizer.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonizer.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonizer.py index 045d731..64d67df 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/sumonizer.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/sumonizer.py @@ -5,9 +5,9 @@ import shapely from shapely import Point, unary_union -from terasim_datazoo.core.sumo import * -from terasim_datazoo.core.waymo import * -from terasim_datazoo.utils import * +from scenparse.core.sumo import * +from scenparse.core.waymo import * +from scenparse.utils import * class Sumonizer: diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/__init__.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/__init__.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/__init__.py diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/metrics.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/metrics.py similarity index 97% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/metrics.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/metrics.py index 2c67125..8893bdf 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/metrics.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/metrics.py @@ -1,5 +1,5 @@ -from terasim_datazoo.utils import Direction, TLS -from terasim_datazoo.core.intersection import ApproachingLane, InJunctionLane +from scenparse.utils import Direction, TLS +from scenparse.core.intersection import ApproachingLane, InJunctionLane def has_red_light_running( diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/tlsgenerator.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/tlsgenerator.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/tlsgenerator.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/tlsgenerator.py index 0d557c2..9611d16 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/tlsgenerator.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/tlsgenerator.py @@ -2,8 +2,8 @@ import copy from typing import Union -from terasim_datazoo.utils import UnionFind, Direction, TLS -from terasim_datazoo.core.intersection import ApproachingLane +from scenparse.utils import UnionFind, Direction, TLS +from scenparse.core.intersection import ApproachingLane class TLSGenerator: diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/utils.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/utils.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/utils.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/utils.py index 7339c56..53aaa09 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/traffic_lights/utils.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/traffic_lights/utils.py @@ -5,9 +5,9 @@ import os from typing import Any -from terasim_datazoo.core.intersection import ApproachingLane, VehicleState +from scenparse.core.intersection import ApproachingLane, VehicleState -from terasim_datazoo.utils import ( +from scenparse.utils import ( Pt,TLS, Direction, points_to_vector, diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic.py index 7421b79..efae8e2 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic.py @@ -8,7 +8,7 @@ from .waymonizer import Waymonizer from .waymonic_tlsgen import WaymonicTLSGenerator -from terasim_datazoo.core.waymo import * +from scenparse.core.waymo import * class Waymonic(Waymonizer, WaymonicTLSGenerator): diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic_tlsgen.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic_tlsgen.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic_tlsgen.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic_tlsgen.py index e61aae3..e36e29e 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonic_tlsgen.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonic_tlsgen.py @@ -4,9 +4,9 @@ import json from waymo_open_dataset.protos import scenario_pb2, map_pb2 -from terasim_datazoo.core.waymo import * +from scenparse.core.waymo import * from .traffic_lights import * -from terasim_datazoo.utils import distance_between_points +from scenparse.utils import distance_between_points class WaymonicTLSGenerator: def __init__(self, scenario, lanecenters: dict[int, LaneCenter], signalized_intersections) -> None: diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonizer.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonizer.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonizer.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonizer.py index d3ee9e7..7a41fba 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_processor/waymonizer.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_processor/waymonizer.py @@ -1,7 +1,7 @@ from typing import Union -from terasim_datazoo.core.waymo import * -from terasim_datazoo.utils import ( +from scenparse.core.waymo import * +from scenparse.utils import ( UnionFind, polyline_length, distance_between_points, diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_visualizer.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_visualizer.py similarity index 99% rename from packages/terasim-datazoo/terasim_datazoo/processors/scenario_visualizer.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_visualizer.py index 21b75b4..76b7475 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/scenario_visualizer.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/scenario_visualizer.py @@ -3,7 +3,7 @@ import os from pathlib import Path from typing import Union -from terasim_datazoo.utils.pack_h5_womd import * +from scenparse.utils.pack_h5_womd import * COLOR_BLACK = (0, 0, 0) COLOR_WHITE = (255, 255, 255) diff --git a/packages/terasim-datazoo/terasim_datazoo/processors/sumo2waymo.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/sumo2waymo.py similarity index 91% rename from packages/terasim-datazoo/terasim_datazoo/processors/sumo2waymo.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/processors/sumo2waymo.py index e8ab347..88af47e 100644 --- a/packages/terasim-datazoo/terasim_datazoo/processors/sumo2waymo.py +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/processors/sumo2waymo.py @@ -11,9 +11,9 @@ from waymo_open_dataset.protos import map_pb2, scenario_pb2 -from terasim_datazoo.utils import * -from terasim_datazoo.utils.geometry import interpolate -from terasim_datazoo.utils.generic import ms_to_mph +from scenparse.utils import * +from scenparse.utils.geometry import interpolate +from scenparse.utils.generic import ms_to_mph import numpy as np class SUMO2Waymo: @@ -52,7 +52,7 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa Args: starter_edges (list[str], optional): List of starter edges. Defaults to None. """ - print("Converting SUMO network format to Waymo map format...") + print("Parsing SUMO data to Waymo...") if starter_edges: edge_set: set[Edge] = self._find_neighboring_edges(starter_edges) @@ -60,6 +60,7 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa edge_set = set(self.sumonet.getEdges()) # I. parse edges + print(f"Parsing edges...") for edge in edge_set: # Skip crosswalks if edge.allows("pedestrian") and not edge.allows("passenger"): @@ -71,8 +72,10 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa self.normal_edges[edge.getID()] = edge else: self.internal_edges[edge.getID()] = edge + print(f"there are {len(self.normal_edges)} normal edges, {len(self.internal_edges)} internal edges") # II. normal edges + print("creating lanecenters for normal edges...") for _, edge in self.normal_edges.items(): # 1. create lanecenter for each lane lanes: list[Lane] = edge.getLanes() @@ -96,6 +99,7 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa for i in range(0, len(vehicle_lanes) - 1): self._create_roadline(vehicle_lanes[i], side="left") + print("creating lanecenters for internal edges...") # III. internal edges for _, edge in self.internal_edges.items(): # 1. create lanecenter for each lane @@ -119,6 +123,7 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa self._set_connectionship(con.getFromLane(), con.getToLane()) # IV. crosswalks + print("creating crosswalks...") for _, edge in self.crosswalk_edges.items(): # Create crosswalk polygon from edge shape crosswalk = map_pb2.Crosswalk() @@ -145,15 +150,15 @@ def parse(self, starter_edges: list[str] = None, have_road_edges=False, have_roa self.crosswalks[self.feature_counter] = crosswalk self.feature_counter += 1 + print(f"crosswalk {self.feature_counter-1} created") # V. junctions (nodes) + print("creating junctions...") all_node_types = [node.getType() for node in self.sumonet.getNodes()] + print(all_node_types) for node in self.sumonet.getNodes(): self._create_junction_outline_shape(node) - print("Sumo2Waymo parsing completed") - - def _create_junction_outline_shape(self, node: Node): """ given a sumo node, create a closed polyline of the node's outline @@ -198,6 +203,8 @@ def _create_junction_outline_shape(self, node: Node): right_connection_shapes = [lane.getShape3D() for lane in right_connection_internal_lanes] right_connection_polylines = [LineString(shape) for shape in right_connection_shapes] right_connection_polyline_right_half_width = [polyline.parallel_offset(lane.getWidth()/2, 'right') for polyline, lane in zip(right_connection_polylines, right_connection_internal_lanes)] + if "NODE_17" in node.getID(): + self.plot_right_line_and_boundary(node.getID(), node_shape, right_connection_polyline_right_half_width) external_polylines = [[(x,y) for x,y in zip(*polyline.xy)] for polyline in right_connection_polyline_right_half_width] for i, polyline in enumerate(external_polylines): for j, pt in enumerate(polyline): @@ -212,6 +219,16 @@ def _create_junction_outline_shape(self, node: Node): self.road_edges[self.feature_counter] = roadedge self.feature_counter += 1 + def plot_right_line_and_boundary(self, node_id: str, node_shape: list[tuple], connection_polylines: list[LineString]): + import matplotlib.pyplot as plt + plt.figure() + plt.plot(*zip(*node_shape), 'r-', label='Node Shape') + for polyline in connection_polylines: + plt.plot(*polyline.xy, 'b-', label='Connection Polylines') + plt.legend() + plt.axis('equal') + plt.savefig(f"{node_id}_right_line_and_boundary.png") + plt.close() def _create_junction_outline_shape_new(self, node: Node): """ @@ -228,6 +245,8 @@ def _create_junction_outline_shape_new(self, node: Node): lane = self.sumonet.getLane(lane_id) if lane is not None: lane_objects.append(lane) + if "clusterJ0_NODE_3" in node.getID(): + print("aaa") # Make a closed polyline by appending the first point to the end @@ -245,6 +264,19 @@ def _create_junction_outline_shape_new(self, node: Node): # all_connection_edge_shapes_union_polygon = Polygon(all_edge_polygons_union) + if "NODE_18" in node.getID(): + print("bbb") + import matplotlib.pyplot as plt + plt.figure() + # plt.plot(*zip(*node_shape), 'r-', label='Node Shape') + x, y = all_edge_polygons_union.exterior.xy + plt.plot(x, y, 'b-', label='Connection Edges Union') + x, y = all_internal_lanes_polygons_union.exterior.xy + plt.plot(x, y, 'g-', label='Internal Lanes Union') + plt.legend() + plt.axis('equal') + plt.savefig(f"{node.getID()}_connection_edges_union.png") + plt.close() external_polylines = [node_shape] @@ -271,6 +303,7 @@ def _create_lanecenter(self, lane: Lane): self.lane_centers[self.feature_counter] = lanecenter self.feature_counter += 1 + print(f"lanecenter {self.feature_counter-1} created") def _create_roadline(self, lane: Lane, side: str): """ @@ -363,6 +396,7 @@ def _create_roadedge(self, lane: Lane, side: str): if type(boundaries_2d) == LineString: boundaries_2d = [boundaries_2d] else: + print(f"{self.map_lane2featureid[lane]}, {side}") boundaries_2d = list(boundaries_2d.geoms) for bd_2d in boundaries_2d: @@ -514,6 +548,7 @@ def save_scenario(self, scenario_id: str = "test", output_dir: str = None, plot_ save the parsed data into a scenario file """ + print("saving Waymo scenario file...") scenario = self.convert_to_scenario(scenario_id=scenario_id) if output_dir is not None and plot_map: diff --git a/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/__init__.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/__init__.py new file mode 100644 index 0000000..b82ba4c --- /dev/null +++ b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/__init__.py @@ -0,0 +1,2 @@ +from scenparse.utils.generic import * +from scenparse.utils.geometry import * \ No newline at end of file diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/gen_sumocfg.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/gen_sumocfg.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/gen_sumocfg.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/gen_sumocfg.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/generic.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/generic.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/generic.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/generic.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/geometry.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/geometry.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/geometry.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/geometry.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/pack_h5.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/pack_h5.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/pack_h5.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/pack_h5.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/pack_h5_womd.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/pack_h5_womd.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/pack_h5_womd.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/pack_h5_womd.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/transform_utils.py b/packages/terasim-datazoo/terasim_datazoo/scenparse/utils/transform_utils.py similarity index 100% rename from packages/terasim-datazoo/terasim_datazoo/utils/transform_utils.py rename to packages/terasim-datazoo/terasim_datazoo/scenparse/utils/transform_utils.py diff --git a/packages/terasim-datazoo/terasim_datazoo/utils/__init__.py b/packages/terasim-datazoo/terasim_datazoo/utils/__init__.py deleted file mode 100644 index 20db7eb..0000000 --- a/packages/terasim-datazoo/terasim_datazoo/utils/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from terasim_datazoo.utils.generic import * -from terasim_datazoo.utils.geometry import * \ No newline at end of file diff --git a/packages/terasim-envgen/terasim_envgen/core/integrated_generator.py b/packages/terasim-envgen/terasim_envgen/core/integrated_generator.py index e4f55c7..01b6901 100644 --- a/packages/terasim-envgen/terasim_envgen/core/integrated_generator.py +++ b/packages/terasim-envgen/terasim_envgen/core/integrated_generator.py @@ -141,8 +141,7 @@ def generate_from_latlon( "--junctions.join", "--tls.guess-signals", "--tls.discard-simple", - "--tls.join", - "--no-turnarounds" + "--tls.join" ] subprocess.run(cmd, check=True, capture_output=True) if net_file.exists(): diff --git a/packages/terasim-envgen/terasim_envgen/core/traffic_flow_generator.py b/packages/terasim-envgen/terasim_envgen/core/traffic_flow_generator.py index 8c6a7d7..ec74c81 100644 --- a/packages/terasim-envgen/terasim_envgen/core/traffic_flow_generator.py +++ b/packages/terasim-envgen/terasim_envgen/core/traffic_flow_generator.py @@ -93,21 +93,21 @@ def generate_av_route(self, map_path, map_metadata_path): sumo_net_no_internal = sumolib.net.readNet(map_path) # Load the map metadata - with open(map_metadata_path, 'r') as f: - map_metadata = json.load(f) + # with open(map_metadata_path, 'r') as f: + # map_metadata = json.load(f) - if "av_route" in map_metadata and map_metadata["av_route"] is not None: - # Get AV route coordinates (expected format is a list of [lat, lon] points) - av_route = map_metadata["av_route"] - av_route_xy = [sumo_net.convertLonLat2XY(point[1], point[0]) for point in av_route] - # Verify format and convert if necessary - # Map the lat/lon coordinates to SUMO edges - # delta parameter controls how far to search for edges (in meters) - av_route_sumo_edges = sumolib.route.mapTrace(av_route_xy, sumo_net, delta=10, fillGaps=100, verbose=True) - # av_route_sumo_edges_no_internal = sumolib.route.mapTrace(av_route_xy, sumo_net_no_internal, delta=10, verbose=True) - av_route_sumo_with_internal = sumolib.route.addInternal(sumo_net, av_route_sumo_edges) - else: - av_route_sumo_edges, av_route_sumo_with_internal = self.generate_av_fallback_route(map_path) + # if "av_route" in map_metadata and map_metadata["av_route"] is not None: + # # Get AV route coordinates (expected format is a list of [lat, lon] points) + # av_route = map_metadata["av_route"] + # av_route_xy = [sumo_net.convertLonLat2XY(point[1], point[0]) for point in av_route] + # # Verify format and convert if necessary + # # Map the lat/lon coordinates to SUMO edges + # # delta parameter controls how far to search for edges (in meters) + # av_route_sumo_edges = sumolib.route.mapTrace(av_route_xy, sumo_net, delta=10, fillGaps=100, verbose=True) + # # av_route_sumo_edges_no_internal = sumolib.route.mapTrace(av_route_xy, sumo_net_no_internal, delta=10, verbose=True) + # av_route_sumo_with_internal = sumolib.route.addInternal(sumo_net, av_route_sumo_edges) + # else: + av_route_sumo_edges, av_route_sumo_with_internal = self.generate_av_fallback_route(map_path) av_route_sumo_with_internal_xy = [] for edge in av_route_sumo_with_internal: @@ -117,11 +117,11 @@ def generate_av_route(self, map_path, map_metadata_path): av_route_sumo_points_latlon = [(point[1], point[0]) for point in av_route_sumo_with_internal_xy] # save av_route_sumo_points_latlon to metadata.json - map_metadata["av_route_sumo"] = av_route_sumo_points_latlon - if "av_route" not in map_metadata: - map_metadata["av_route"] = av_route_sumo_points_latlon - with open(map_metadata_path, "w") as f: - json.dump(map_metadata, f) + # map_metadata["av_route_sumo"] = av_route_sumo_points_latlon + # if "av_route" not in map_metadata: + # map_metadata["av_route"] = av_route_sumo_points_latlon + # with open(map_metadata_path, "w") as f: + # json.dump(map_metadata, f) return av_route_sumo_edges, av_route_sumo_points_latlon diff --git a/packages/terasim-envgen/traffic_gen.py b/packages/terasim-envgen/traffic_gen.py new file mode 100644 index 0000000..e11383f --- /dev/null +++ b/packages/terasim-envgen/traffic_gen.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +""" +Traffic generation script for TeraSim +Generates traffic flows for SUMO network files +""" +import os +import sys + +# Add SUMO tools to Python path to fix sumolib import in subprocess +sumo_home = os.getenv("SUMO_HOME", "/home/sdai/.terasim/deps/sumo") +sumo_tools = os.path.join(sumo_home, "tools") +if sumo_tools not in sys.path: + sys.path.insert(0, sumo_tools) + +# Set PYTHONPATH environment variable so subprocess calls can also import sumolib +os.environ["PYTHONPATH"] = f"{sumo_tools}:{os.environ.get('PYTHONPATH', '')}" + +from terasim_envgen.core.traffic_flow_generator import TrafficFlowGenerator + +# Initialize traffic generator +traffic_gen = TrafficFlowGenerator("configs/config.yaml") + +# Generate traffic for single map +print("Generating traffic flows for jupiter_eb.net.xml...") +routes_file = traffic_gen.generate_flows( + net_path="/home/sdai/harry/TeraSim/jupiter/eb/eb.net.xml", + end_time=3600, + traffic_level="high", + vehicle_types=["vehicle"] +) + +if routes_file: + print(f"\n✅ Traffic generation complete!") + print(f" Routes file: {routes_file}") +else: + print("\n⚠️ Traffic generation completed with fallback routes") + +# Note: generate_multi_level_flows() removed because it searches for map.net.xml +# which doesn't exist in this directory. Use generate_flows() above for specific network files. \ No newline at end of file diff --git a/packages/terasim-nde-nade/pyproject.toml b/packages/terasim-nde-nade/pyproject.toml index 10ad468..9e1c9af 100644 --- a/packages/terasim-nde-nade/pyproject.toml +++ b/packages/terasim-nde-nade/pyproject.toml @@ -6,7 +6,7 @@ authors = [ {name = "Haowei Sun", email = "haoweis@umich.edu"}, ] readme = "README.md" -license = {text = "Apache-2.0"} +license = {text = "CC-BY-NC-4.0"} requires-python = ">=3.10,<3.13" dependencies = [ "terasim>=0.2.0", # Depends on main package (inherits numpy and SUMO) diff --git a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/construction.py b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/construction.py index 6927695..bfce530 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/construction.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/construction.py @@ -25,6 +25,25 @@ def create_construction_cone_type(): traci.vehicletype.setColor(custom_type_id, (255, 140, 0, 255)) # Orange color return custom_type_id +def create_invisible_cone_type(): + """Create a custom vehicle type for invisible cones. + + Returns: + str: The ID of the custom vehicle type. + """ + custom_type_id = "INVISIBLE_CONE" + + if custom_type_id not in traci.vehicletype.getIDList(): + traci.vehicletype.copy("DEFAULT_VEHTYPE", custom_type_id) + traci.vehicletype.setVehicleClass(custom_type_id, "passenger") + traci.vehicletype.setShapeClass(custom_type_id, "passenger") + traci.vehicletype.setLength(custom_type_id, 0.3) # Smaller cone + traci.vehicletype.setWidth(custom_type_id, 0.3) # Smaller cone + traci.vehicletype.setHeight(custom_type_id, 0.7) # Cone height + traci.vehicletype.setMinGap(custom_type_id, 0.1) # Minimal gap + traci.vehicletype.setColor(custom_type_id, (0, 255, 0, 255)) # Green color + return custom_type_id + def create_construction_barrier_type(): """Create a custom vehicle type for construction barriers. @@ -68,6 +87,12 @@ def create_construction_sign_type(): class ConstructionAdversity(AbstractStaticAdversity): def __init__(self, **kwargs): + # Extract lane_ids parameter (backward compatible with lane_id) + self._lane_ids = kwargs.pop("lane_ids", None) + + # Extract closure direction for multiple lanes + self._closure_direction = kwargs.pop("closure_direction", "right") # "left" or "right" + # Extract our custom parameters before passing to parent self._construction_mode = kwargs.pop("construction_mode", "full_lane") # "full_lane" or "partial_lane" self._start_position = kwargs.pop("start_position", None) @@ -97,14 +122,93 @@ def __init__(self, **kwargs): # Call parent constructor with remaining kwargs super().__init__(**kwargs) - + + # Handle backward compatibility for lane_id/lane_ids + if self._lane_ids is None: + # Check if parent class set _lane_id from kwargs + if hasattr(self, '_lane_id') and self._lane_id: + self._lane_ids = [self._lane_id] + else: + self._lane_ids = [] + elif not isinstance(self._lane_ids, list): + # Convert single lane_id string to list + self._lane_ids = [self._lane_ids] + + # For backward compatibility, set _lane_id to first lane if available + if self._lane_ids and len(self._lane_ids) > 0: + self._lane_id = self._lane_ids[0] + elif not hasattr(self, '_lane_id'): + self._lane_id = "" + # Initialize other attributes self._construction_object_ids = [] - + + # Dictionary to store lane information for multiple lanes + self._lane_info = {} # {lane_id: {'length': float, 'width': float}} + # If work_zone_offset not specified, use lane_offset if self._work_zone_offset is None: self._work_zone_offset = self._lane_offset - + + def get_boundary_lane(self): + """Get the boundary lane ID based on closure direction. + + For multiple lane closures, returns the lane at the boundary of the closure: + - If closure_direction is "right", returns the leftmost closed lane (highest index) + - If closure_direction is "left", returns the rightmost closed lane (lowest index) + + In SUMO: Lane 0 is rightmost, higher numbers are further left. + + Returns: + str: The lane ID at the closure boundary, or empty string if no lanes. + """ + if not self._lane_ids: + return "" + + if len(self._lane_ids) == 1: + return self._lane_ids[0] + + # Sort lanes by their index (number at the end of the ID) + sorted_lanes = sorted(self._lane_ids, key=lambda x: int(x.split('_')[-1])) + + if self._closure_direction == "right": + # Right closure (closing right lanes): return leftmost closed lane (highest index) + # Example: closing lanes 0,1,2 -> return lane 2 (leftmost of the closed lanes) + return sorted_lanes[-1] + else: # "left" + # Left closure (closing left lanes): return rightmost closed lane (lowest index) + # Example: closing lanes 2,3 -> return lane 2 (rightmost of the closed lanes) + return sorted_lanes[0] + + def _calculate_other_lanes_width(self, exclude_lane_id): + """Calculate the total width of all lanes in the construction zone except the specified lane. + + Args: + exclude_lane_id (str): Lane ID to exclude from the calculation + + Returns: + float: Total width of other construction zone lanes in meters. + """ + # Sort lanes by their index to ensure consistent results regardless of input order + sorted_lanes = sorted(self._lane_ids, key=lambda x: int(x.split('_')[-1])) + + total_width = 0.0 + for lane_id in sorted_lanes: + if lane_id == exclude_lane_id: + continue # Skip the excluded lane + + if lane_id in self._lane_info: + total_width += self._lane_info[lane_id]['width'] + else: + # Fallback to querying SUMO if not in cache + try: + width = traci.lane.getWidth(lane_id) + total_width += width + except: + logger.warning(f"Could not get width for lane {lane_id}, using default 3.2m") + total_width += 3.2 # Standard lane width fallback + return total_width + def is_effective(self): """Check if the adversarial event is effective. @@ -114,14 +218,35 @@ def is_effective(self): if self._lane_id == "": logger.warning("Lane ID is not provided.") return False - try: - allowed_type_list = traci.lane.getAllowed(self._lane_id) - lane_length = traci.lane.getLength(self._lane_id) - self._lane_width = traci.lane.getWidth(self._lane_id) - except: - logger.warning(f"Failed to get lane information for {self._lane_id}.") + + # Populate lane information dictionary for all configured lanes + for lane_id in self._lane_ids: + try: + allowed_type_list = traci.lane.getAllowed(lane_id) + lane_length = traci.lane.getLength(lane_id) + lane_width = traci.lane.getWidth(lane_id) + + # Store in dictionary + self._lane_info[lane_id] = { + 'length': lane_length, + 'width': lane_width + } + + # Set backward compatibility attribute for primary lane + if lane_id == self._lane_id: + self._lane_width = lane_width + + except: + logger.warning(f"Failed to get lane information for {lane_id}.") + return False + + # Get primary lane info for validation + if self._lane_id in self._lane_info: + lane_length = self._lane_info[self._lane_id]['length'] + else: + logger.warning(f"Primary lane {self._lane_id} not found in lane info.") return False - + # Additional validation for partial lane mode if self._construction_mode == "partial_lane": if self._start_position is None or self._end_position is None: @@ -133,7 +258,7 @@ def is_effective(self): if self._start_position >= self._end_position: logger.warning("Start position must be less than end position.") return False - + return True def _calculate_zone_positions(self): @@ -201,7 +326,8 @@ def _calculate_lateral_offset(self, position, zone_type, zone_start, zone_end, o float: Lateral offset in meters """ lane_index = int(self._lane_id.split('_')[-1]) - is_left_lane = lane_index > 1 + # Use closure direction to determine placement side + is_left_closure = self._closure_direction == "left" # Special handling for warning signs - place on shoulder if object_type == 'sign' and zone_type in ['warning', 'termination']: return self._warning_sign_offset # Negative value places on right shoulder @@ -211,21 +337,28 @@ def _calculate_lateral_offset(self, position, zone_type, zone_start, zone_end, o return 0.0 elif zone_type == 'taper_in': - # Gradual offset increase from right edge to work zone + # Gradual offset increase from edge of current lane plus other lanes to work zone zone_length = zone_end - zone_start + # Use closure direction to determine placement side + is_left_closure = self._closure_direction == "left" + + # Get boundary lane for reference + boundary_lane = self.get_boundary_lane() + other_lanes_width = self._calculate_other_lanes_width(boundary_lane) + if zone_length <= 0: - # Start at appropriate edge based on lane type - if is_left_lane: - return self._lane_width / 2 - 0.3 # Start at left edge (positive = left) + # Start at appropriate edge based on closure direction and other lanes + if is_left_closure: + return self._lane_width / 2 - 0.3 + other_lanes_width # Current lane edge + other lanes else: - return -(self._lane_width / 2 - 0.3) # Start at right edge (negative = right) + return -(self._lane_width / 2 - 0.3 + other_lanes_width) # Current lane edge + other lanes progress = (position - zone_start) / zone_length - - if is_left_lane: - edge_offset = self._lane_width / 2 - 0.3 # Positive for left side + # Calculate edge offset: current lane's half-width + width of other lanes in construction zone + if is_left_closure: + edge_offset = self._lane_width / 2 - 0.3 + other_lanes_width # Positive for left side else: - edge_offset = -(self._lane_width / 2 - 0.3) # Negative for right side + edge_offset = -(self._lane_width / 2 - 0.3 + other_lanes_width) # Negative for right side if self._taper_type == 'linear': offset = edge_offset + progress * (self._work_zone_offset - edge_offset) @@ -235,29 +368,33 @@ def _calculate_lateral_offset(self, position, zone_type, zone_start, zone_end, o offset = edge_offset + s_curve * (self._work_zone_offset - edge_offset) else: offset = edge_offset + progress * (self._work_zone_offset - edge_offset) - - # Ensure offset stays within lane boundaries - max_left_offset = self._lane_width / 2 - 0.3 # Leave 0.3m margin - max_right_offset = -(self._lane_width / 2 - 0.3) - return max(max_right_offset, min(offset, max_left_offset)) + + + return offset elif zone_type in ['buffer', 'work']: - # Full offset in work zone, but ensure within lane boundaries - max_left_offset = self._lane_width / 2 - 0.3 # Leave 0.3m margin on left - max_right_offset = -(self._lane_width / 2 - 0.3) # Leave 0.3m margin on right - return max(max_right_offset, min(self._work_zone_offset, max_left_offset)) + # Full offset in work zone (already validated during initialization) + return self._work_zone_offset elif zone_type == 'taper_out': - # Gradual offset decrease from work zone to right edge + # Gradual offset decrease from work zone to edge of current lane plus other lanes zone_length = zone_end - zone_start + # Use closure direction to determine placement side + is_left_closure = self._closure_direction == "left" + + # Get boundary lane for reference + boundary_lane = self.get_boundary_lane() + other_lanes_width = self._calculate_other_lanes_width(boundary_lane) + if zone_length <= 0: return self._work_zone_offset progress = (position - zone_start) / zone_length - - if is_left_lane: - edge_offset = self._lane_width / 2 - 0.3 # Positive for left side + + # Calculate edge offset: current lane's half-width + width of other lanes in construction zone + if is_left_closure: + edge_offset = self._lane_width / 2 - 0.3 + other_lanes_width # Positive for left side else: - edge_offset = -(self._lane_width / 2 - 0.3) # Negative for right side + edge_offset = -(self._lane_width / 2 - 0.3 + other_lanes_width) # Negative for right side if self._taper_type == 'linear': offset = self._work_zone_offset + progress * (edge_offset - self._work_zone_offset) @@ -267,11 +404,8 @@ def _calculate_lateral_offset(self, position, zone_type, zone_start, zone_end, o offset = self._work_zone_offset + s_curve * (edge_offset - self._work_zone_offset) else: offset = self._work_zone_offset + progress * (edge_offset - self._work_zone_offset) - - # Ensure offset stays within lane boundaries - max_left_offset = self._lane_width / 2 - 0.3 # Leave 0.3m margin - max_right_offset = -(self._lane_width / 2 - 0.3) - return max(max_right_offset, min(offset, max_left_offset)) + + return offset return 0.0 @@ -288,7 +422,8 @@ def _calculate_shoulder_coordinates(self, lane_position): edge_id = traci.lane.getEdgeID(self._lane_id) lane_index = int(self._lane_id.split('_')[-1]) # Extract lane index from lane ID x_center, y_center = traci.simulation.convert2D(edge_id, lane_position, lane_index) - is_left_lane = lane_index > 1 + # Use closure direction to determine placement side + is_left_closure = self._closure_direction == "left" # Get lane angle at this position lane_angle = traci.lane.getAngle(self._lane_id, lane_position) @@ -303,28 +438,30 @@ def _calculate_shoulder_coordinates(self, lane_position): # Calculate shoulder coordinates # Note: SUMO uses a different coordinate system where y increases northward - if is_left_lane: - # For left lane, place sign on left shoulder (subtract offset) + if is_left_closure: + # For left closure, place sign on left shoulder (subtract offset) x_shoulder = x_center - offset_distance * math.cos(perpendicular_rad) y_shoulder = y_center - offset_distance * math.sin(perpendicular_rad) else: - # For right lane, place sign on right shoulder (add offset) + # For right closure, place sign on right shoulder (add offset) x_shoulder = x_center + offset_distance * math.cos(perpendicular_rad) y_shoulder = y_center + offset_distance * math.sin(perpendicular_rad) return x_shoulder, y_shoulder, lane_angle - def _place_object(self, position, lateral_offset, object_type, zone_type): + def _place_object(self, position, lateral_offset, object_type, zone_type, lane_id=None, visible_to_AV=True): """Place a single construction object at the specified position. - + Args: position: Longitudinal position on the lane lateral_offset: Lateral offset from lane center object_type: Type of object ('cone', 'barrier', 'sign') zone_type: Zone type for logging and ID generation + lane_id: Optional lane ID to place object on (defaults to self._lane_id) """ + current_lane = lane_id or self._lane_id # Create unique object ID - object_id = f"CONSTRUCTION_{zone_type}_{self._lane_id}_{len(self._construction_object_ids)}" + object_id = f"CONSTRUCTION_{zone_type}_{current_lane}_{len(self._construction_object_ids)}" self._construction_object_ids.append(object_id) # Add vehicle to simulation @@ -360,7 +497,7 @@ def _place_object(self, position, lateral_offset, object_type, zone_type): logger.debug(f"Placed warning sign {object_id} on shoulder at ({x_shoulder:.1f}, {y_shoulder:.1f})") else: # Normal placement for cones and barriers - traci.vehicle.moveTo(object_id, self._lane_id, position) + traci.vehicle.moveTo(object_id, current_lane, position) # Apply lateral offset for non-sign objects if lateral_offset != 0: @@ -404,97 +541,172 @@ def _calculate_dynamic_spacing(self, zone_type): def _create_construction_objects(self): """Create construction objects with proper zone-based placement.""" - edge_id = traci.lane.getEdgeID(self._lane_id) - - # Create route for construction objects - self._route_id = f"r_construction_{self._lane_id}" - if self._route_id not in traci.route.getIDList(): - traci.route.add(self._route_id, [edge_id]) - + # Get boundary lane for cone placement in work zone + boundary_lane = self.get_boundary_lane() + # Create object types and store them as instance variables for comparison self._cone_type = create_construction_cone_type() + self._invisible_cone_type = create_invisible_cone_type() self._barrier_type = create_construction_barrier_type() self._sign_type = create_construction_sign_type() - - # Calculate zones + + # Calculate zones based on first lane (they should be same for all lanes) zones = self._calculate_zone_positions() - + # Process each zone for zone_type, (zone_start, zone_end) in zones.items(): # Calculate dynamic spacing based on speed limit spacing = self._calculate_dynamic_spacing(zone_type) - - # Determine object type for this zone - if zone_type == 'warning': - object_types = ['sign'] # Only warning signs in warning zone - elif zone_type in ['taper_in', 'taper_out']: - object_types = ['cone'] - elif zone_type == 'buffer': - object_types = ['cone', 'cone', 'barrier'] # Mostly cones, some barriers - elif zone_type == 'work': - if self._construction_type == 'mixed': - object_types = ['cone', 'cone', 'barrier'] - else: - object_types = [self._construction_type] - elif zone_type == 'termination': - object_types = ['sign'] + + # For work zone, only place cones on boundary lane + if zone_type == 'work': + if not boundary_lane: + continue + + # Create route for this lane if not exists + edge_id = traci.lane.getEdgeID(boundary_lane) + route_id = f"r_construction_{boundary_lane}" + if route_id not in traci.route.getIDList(): + traci.route.add(route_id, [edge_id]) + self._route_id = route_id + + # Place cones only on boundary lane + current_pos = zone_start + while current_pos < zone_end: + # Calculate lateral offset for this position + lateral_offset = self._calculate_lateral_offset( + current_pos, zone_type, zone_start, zone_end, 'cone' + ) + + # Place cone on boundary lane + object_id = f"CONSTRUCTION_{zone_type}_{boundary_lane}_{len(self._construction_object_ids)}" + self._construction_object_ids.append(object_id) + + traci.vehicle.add( + object_id, + routeID=route_id, + typeID=self._cone_type, + ) + + traci.vehicle.setSpeedMode(object_id, 0) + traci.vehicle.setLaneChangeMode(object_id, 0) + traci.vehicle.moveTo(object_id, boundary_lane, current_pos) + + if lateral_offset != 0: + try: + traci.vehicle.changeSublane(object_id, lateral_offset) + except: + logger.debug(f"Could not apply lateral offset {lateral_offset} to {object_id}") + + traci.vehicle.setSpeed(object_id, 0) + current_pos += spacing + else: - continue - - # Place objects in this zone - current_pos = zone_start - object_index = 0 - - while current_pos < zone_end: - # Select object type - obj_type_name = object_types[object_index % len(object_types)] - if obj_type_name == 'cone': - type_id = self._cone_type - elif obj_type_name == 'barrier': - type_id = self._barrier_type - elif obj_type_name == 'sign': - type_id = self._sign_type - - # Calculate lateral offset for this position - lateral_offset = self._calculate_lateral_offset( - current_pos, zone_type, zone_start, zone_end, obj_type_name - ) - - # Place the object - self._place_object(current_pos, lateral_offset, type_id, zone_type) - - current_pos += spacing - object_index += 1 - - logger.info(f"Created {len(self._construction_object_ids)} construction objects in {len(zones)} zones on lane {self._lane_id}") + # For non-work zones, also place on boundary lane for consistency + if not boundary_lane: + continue + + edge_id = traci.lane.getEdgeID(boundary_lane) + route_id = f"r_construction_{boundary_lane}" + if route_id not in traci.route.getIDList(): + traci.route.add(route_id, [edge_id]) + self._route_id = route_id + + # Determine object type for this zone + if zone_type == 'warning': + object_types = ['sign'] # Only warning signs in warning zone + elif zone_type in ['taper_in', 'taper_out']: + object_types = ['cone'] + elif zone_type == 'buffer': + object_types = ['cone', 'cone', 'barrier'] # Mostly cones, some barriers + elif zone_type == 'termination': + object_types = ['sign'] + else: + continue + + # Place objects in this zone + current_pos = zone_start + object_index = 0 + + while current_pos < zone_end: + # Select object type + obj_type_name = object_types[object_index % len(object_types)] + if obj_type_name == 'cone': + type_id = self._cone_type + elif obj_type_name == 'barrier': + type_id = self._barrier_type + elif obj_type_name == 'sign': + type_id = self._sign_type + + # Calculate lateral offset for this position + lateral_offset = self._calculate_lateral_offset( + current_pos, zone_type, zone_start, zone_end, obj_type_name + ) + + # Place the object on boundary lane + self._place_object(current_pos, lateral_offset, type_id, zone_type, boundary_lane, visible_to_AV=True) + # Only place extra invisible cones in taper_in, taper_out, work, and buffer zones + if self._spacing > 0 and zone_type in ['taper_in', 'taper_out', 'work', 'buffer']: + next_visible_pos = current_pos + spacing + intermediate_pos = current_pos + self._spacing + while intermediate_pos < next_visible_pos and intermediate_pos < zone_end: + additional_offset = self._calculate_lateral_offset( + intermediate_pos, zone_type, zone_start, zone_end, obj_type_name) + self._place_object( + intermediate_pos, + additional_offset, + self._invisible_cone_type, + zone_type, + boundary_lane, + visible_to_AV=False, + ) + intermediate_pos += self._spacing + current_pos += spacing + object_index += 1 + + logger.info(f"Created {len(self._construction_object_ids)} construction objects in zones, with work zone cones on boundary lane {boundary_lane}") def initialize(self, time: float): """Initialize the adversarial event. """ assert self.is_effective(), "Adversarial event is not effective." + # Validate and correct work zone offset at initialization + max_left_offset = self._lane_width / 2 - 0.3 # Leave 0.3m margin on left + max_right_offset = -(self._lane_width / 2 - 0.3) # Leave 0.3m margin on right + + # Clamp work zone offset to valid range + if self._work_zone_offset > max_left_offset: + logger.warning(f"Work zone offset {self._work_zone_offset} exceeds max left offset {max_left_offset}, clamping to max") + self._work_zone_offset = max_left_offset + elif self._work_zone_offset < max_right_offset: + logger.warning(f"Work zone offset {self._work_zone_offset} exceeds max right offset {max_right_offset}, clamping to max") + self._work_zone_offset = max_right_offset + # Check for and remove vehicles in the construction zone (except stalled vehicle) if self._start_position is not None and self._end_position is not None: - # Get all vehicles on the lane - vehicles_on_lane = traci.lane.getLastStepVehicleIDs(self._lane_id) - - for vehicle_id in vehicles_on_lane: - # Skip if this is a stalled vehicle (check if it's marked as stalled) - # Stalled vehicles typically have "stalled" or "STALLED" in their ID - if "stalled" in vehicle_id.lower() or "STALLED" in vehicle_id: - logger.debug(f"Skipping stalled vehicle {vehicle_id} in construction zone") - continue + # Check all lanes in the construction zone + for lane_id in self._lane_ids: + # Get all vehicles on each construction lane + vehicles_on_lane = traci.lane.getLastStepVehicleIDs(lane_id) - # Get vehicle position on the lane - try: - vehicle_pos = traci.vehicle.getLanePosition(vehicle_id) + for vehicle_id in vehicles_on_lane: + # Skip if this is a stalled vehicle (check if it's marked as stalled) + # Stalled vehicles typically have "stalled" or "STALLED" in their ID + if "stalled" in vehicle_id.lower() or "STALLED" in vehicle_id: + logger.debug(f"Skipping stalled vehicle {vehicle_id} in construction zone on lane {lane_id}") + continue + + # Get vehicle position on the lane + try: + vehicle_pos = traci.vehicle.getLanePosition(vehicle_id) - # Check if vehicle is inside the construction zone - if self._start_position <= vehicle_pos <= self._end_position: - logger.info(f"Removing vehicle {vehicle_id} from construction zone at position {vehicle_pos}") - traci.vehicle.remove(vehicle_id) - except Exception as e: - logger.debug(f"Could not check/remove vehicle {vehicle_id}: {e}") + # Check if vehicle is inside the construction zone + if self._start_position <= vehicle_pos <= self._end_position: + logger.info(f"Removing vehicle {vehicle_id} from construction zone at position {vehicle_pos} on lane {lane_id}") + traci.vehicle.remove(vehicle_id) + except Exception as e: + logger.debug(f"Could not check/remove vehicle {vehicle_id} on lane {lane_id}: {e}") if self._construction_mode == "full_lane": # Original behavior: block entire lane @@ -539,4 +751,4 @@ def update(self, time: float): traci.lane.setAllowed(self._lane_id, []) # Empty list means all allowed except: logger.debug(f"Failed to re-open lane {self._lane_id}") - self._is_active = False \ No newline at end of file + self._is_active = False diff --git a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/dynamic_object.py b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/dynamic_object.py index 1bbe8ed..3b9fda9 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/dynamic_object.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/dynamic_object.py @@ -22,9 +22,11 @@ def set_vehicle_feature(self, vehicle_id: str): traci.vehicle.setMaxSpeed(vehicle_id,33) def set_vehicle_route(self, vehicle_id): - route_id = f"r_dynamic_object" + # Use unique vehicle_id to avoid route conflicts when multiple dynamic objects exist + route_id = f"r_dynamic_object_{vehicle_id}" dynamic_route = self._other_settings.get("route") - traci.route.add(route_id, dynamic_route) + if route_id not in traci.route.getIDList(): + traci.route.add(route_id, dynamic_route) return route_id def add_vehicle(self, vehicle_id): diff --git a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/stalled_object.py b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/stalled_object.py index 3b46743..b03382f 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/stalled_object.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/adversity/static/stalled_object.py @@ -74,7 +74,7 @@ def is_effective(self): Returns: bool: Flag to indicate if the adversarial event is effective. """ - + if self._placement_mode == "lane_position": if self._lane_id == "": logger.warning("Lane ID is not provided.") @@ -97,8 +97,15 @@ def is_effective(self): if self._angle is None: logger.warning("Angle is not provided for xy_angle placement mode.") return False + elif self._placement_mode == "latlon_degree": + if self._lon is None or self._lat is None: + logger.warning("Longitude and latitude are not provided for latlon_degree placement mode.") + return False + if self._degree is None: + logger.warning("Degree (heading angle) is not provided for latlon_degree placement mode.") + return False else: - logger.warning(f"Invalid placement mode: {self._placement_mode}. Must be 'lane_position' or 'xy_angle'.") + logger.warning(f"Invalid placement mode: {self._placement_mode}. Must be 'lane_position', 'xy_angle', or 'latlon_degree'.") return False if self._object_type == "": @@ -124,17 +131,37 @@ def set_vehicle_feature(self, vehicle_id: str): def add_vehicle(self, vehicle_id: str): if self._placement_mode == "lane_position": stalled_object_route_id = self.set_vehicle_route(vehicle_id) + # Handle optional _vclass attribute + add_kwargs = { + "vehID": vehicle_id, + "routeID": stalled_object_route_id, + "typeID": self._object_type, + } + if hasattr(self, '_vclass') and self._vclass is not None: + add_kwargs["vclass"] = self._vclass + traci.vehicle.add(**add_kwargs) + self.set_vehicle_feature(vehicle_id) + traci.vehicle.moveTo(vehicle_id, self._lane_id, self._lane_position) + traci.vehicle.setSpeed(vehicle_id, 0) + elif self._placement_mode == "xy_angle": + edge_id = self._get_edge_from_xy() + stalled_object_route_id = self.set_vehicle_route_for_xy(vehicle_id, edge_id) traci.vehicle.add( vehicle_id, routeID=stalled_object_route_id, typeID=self._object_type, - vclass=self._vclass ) self.set_vehicle_feature(vehicle_id) - traci.vehicle.moveTo(vehicle_id, self._lane_id, self._lane_position) + traci.vehicle.moveToXY(vehicle_id, "", -1, self._x, self._y, self._angle, keepRoute=2) traci.vehicle.setSpeed(vehicle_id, 0) - elif self._placement_mode == "xy_angle": - edge_id = self._get_edge_from_xy() + elif self._placement_mode == "latlon_degree": + # Convert lat/lon to x/y coordinates + x, y = self._convert_latlon_to_xy() + if x is None or y is None: + logger.error(f"Failed to convert lat/lon to x/y coordinates. Cannot place vehicle {vehicle_id}.") + return + + edge_id = self._get_edge_from_latlon() stalled_object_route_id = self.set_vehicle_route_for_xy(vehicle_id, edge_id) traci.vehicle.add( vehicle_id, @@ -142,18 +169,21 @@ def add_vehicle(self, vehicle_id: str): typeID=self._object_type, ) self.set_vehicle_feature(vehicle_id) - traci.vehicle.moveToXY(vehicle_id, "", -1, self._x, self._y, self._angle, keepRoute=2) + # Use moveToXY with converted coordinates and degree as angle + traci.vehicle.moveToXY(vehicle_id, "", -1, x, y, self._degree, keepRoute=2) traci.vehicle.setSpeed(vehicle_id, 0) def set_vehicle_route(self, vehicle_id: str): edge_id = traci.lane.getEdgeID(self._lane_id) - stalled_object_route_id = f"r_stalled_object" + # Use edge_id in route name to allow different routes for different edges + stalled_object_route_id = f"r_stalled_object_{edge_id}" if stalled_object_route_id not in traci.route.getIDList(): traci.route.add(stalled_object_route_id, [edge_id]) return stalled_object_route_id - + def set_vehicle_route_for_xy(self, vehicle_id: str, edge_id: str): - stalled_object_route_id = f"r_stalled_object_xy" + # Use edge_id in route name to allow different routes for different edges + stalled_object_route_id = f"r_stalled_object_xy_{edge_id}" if stalled_object_route_id not in traci.route.getIDList(): traci.route.add(stalled_object_route_id, [edge_id]) return stalled_object_route_id @@ -165,15 +195,47 @@ def _get_edge_from_xy(self): except: logger.warning(f"Failed to get edge from coordinates ({self._x}, {self._y}). Using default edge.") return "1" + + def _convert_latlon_to_xy(self): + """Convert latitude/longitude to SUMO x/y coordinates. + + Returns: + tuple: (x, y) coordinates in SUMO coordinate system + """ + try: + x, y = traci.simulation.convertGeo(self._lon, self._lat, fromGeo=True) + return x, y + except Exception as e: + logger.warning(f"Failed to convert lat/lon ({self._lat}, {self._lon}) to x/y coordinates: {e}") + return None, None + + def _get_edge_from_latlon(self): + """Get edge ID from latitude/longitude coordinates. + + Returns: + str: Edge ID + """ + try: + x, y = self._convert_latlon_to_xy() + if x is None or y is None: + logger.warning("Failed to convert lat/lon to x/y. Using default edge.") + return "1" + edge_id = traci.simulation.convertRoad(x, y, isGeo=False)[0] + return edge_id + except Exception as e: + logger.warning(f"Failed to get edge from lat/lon ({self._lat}, {self._lon}): {e}. Using default edge.") + return "1" def initialize(self, time: float): """Initialize the adversarial event. """ assert self.is_effective(), "Adversarial event is not effective." + # Use unique adversity_id to avoid conflicts when multiple stalled objects share the same object_type + unique_suffix = str(self._adversity_id).replace("-", "")[:8] # Use first 8 chars of UUID if self._object_type == "PEDESTRIAN": - stalled_object_id = f"VRU_{self._object_type}_stalled_object" + stalled_object_id = f"VRU_{self._object_type}_stalled_object_{unique_suffix}" else: - stalled_object_id = f"BV_{self._object_type}_stalled_object" + stalled_object_id = f"BV_{self._object_type}_stalled_object_{unique_suffix}" self._static_adversarial_object_id_list.append(stalled_object_id) if self._placement_mode == "lane_position": @@ -186,7 +248,12 @@ def initialize(self, time: float): self.edge_id = edge_id self.lane_index = 0 self.lane_position = None - + elif self._placement_mode == "latlon_degree": + edge_id = self._get_edge_from_latlon() + self.edge_id = edge_id + self.lane_index = 0 + self.lane_position = None + self.add_vehicle(stalled_object_id) self._duration=0 @@ -206,6 +273,11 @@ def update(self, time: float): elif self._placement_mode == "xy_angle": edge_id = self._get_edge_from_xy() traci.vehicle.moveToXY(self.stalled_object_id, "", -1, self._x, self._y, self._angle, keepRoute=2) + elif self._placement_mode == "latlon_degree": + # Convert lat/lon to x/y coordinates for each update to maintain position + x, y = self._convert_latlon_to_xy() + if x is not None and y is not None: + traci.vehicle.moveToXY(self.stalled_object_id, "", -1, x, y, self._degree, keepRoute=2) traci.vehicle.setSpeed(self.stalled_object_id, 0) \ No newline at end of file diff --git a/packages/terasim-nde-nade/terasim_nde_nade/envs/nade.py b/packages/terasim-nde-nade/terasim_nde_nade/envs/nade.py index 225f73c..3352472 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/envs/nade.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/envs/nade.py @@ -203,6 +203,7 @@ def on_step(self, ctx): self.NADE_decision_and_control(env_command_information, env_observation) self.try_insert_emergency_vehicle() # self.respond_to_emergency_vehicle() + print(traci.simulation.getTime(), end="\r") return should_continue_simulation_flag def try_insert_emergency_vehicle(self): diff --git a/packages/terasim-nde-nade/terasim_nde_nade/envs/nade_with_av.py b/packages/terasim-nde-nade/terasim_nde_nade/envs/nade_with_av.py index 8a97af6..f33706b 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/envs/nade_with_av.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/envs/nade_with_av.py @@ -181,7 +181,7 @@ def add_av_safe(self): if hasattr(self.av_cfg, "initial_lane_index"): possible_lane_indexes = [int(self.av_cfg.initial_lane_index)] else: - possible_lane_indexes = list(range(0, lanes - 1)) + possible_lane_indexes = list(range(0, lanes)) for attempt in range(max_attempts): if not len(possible_lane_indexes): diff --git a/packages/terasim-nde-nade/terasim_nde_nade/utils/adversity/abstract_adversity.py b/packages/terasim-nde-nade/terasim_nde_nade/utils/adversity/abstract_adversity.py index 0281f23..82d80be 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/utils/adversity/abstract_adversity.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/utils/adversity/abstract_adversity.py @@ -73,7 +73,10 @@ def __init__( placement_mode="lane_position", x=None, y=None, - angle=None + angle=None, + lon=None, + lat=None, + degree=None ): """Initialize the AbstractStaticAdversity class. This class is an abstract class that defines the interface for the different types of adversities that can be triggered in the simulation. @@ -84,10 +87,13 @@ def __init__( end_time (float): End time of the adversarial event. Default is -1 (infinite). object_type (str): Type of the object. Default is an empty string. other_settings (dict): Other settings for the adversarial event. Default is None. - placement_mode (str): Placement mode - "lane_position" or "xy_angle". Default is "lane_position". + placement_mode (str): Placement mode - "lane_position", "xy_angle", or "latlon_degree". Default is "lane_position". x (float): X coordinate for xy_angle placement mode. Default is None. y (float): Y coordinate for xy_angle placement mode. Default is None. angle (float): Angle for xy_angle placement mode. Default is None. + lon (float): Longitude for latlon_degree placement mode. Default is None. + lat (float): Latitude for latlon_degree placement mode. Default is None. + degree (float): Degree (heading angle) for latlon_degree placement mode. Default is None. """ self._adversity_id = uuid.uuid4() self._lane_id = lane_id @@ -101,6 +107,9 @@ def __init__( self._x = x self._y = y self._angle = angle + self._lon = lon + self._lat = lat + self._degree = degree @property def start_time(self): diff --git a/packages/terasim-nde-nade/terasim_nde_nade/utils/collision/collision_utils.py b/packages/terasim-nde-nade/terasim_nde_nade/utils/collision/collision_utils.py index c9fb841..2fbd27e 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/utils/collision/collision_utils.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/utils/collision/collision_utils.py @@ -76,7 +76,7 @@ def get_location( Returns: str: Location type. """ - return "roundabout" + return "highway" # TEMPORARY OVERRIDE FOR TESTING if sumo_net is not None: # Cache the sumo net globally global sumo_net_cache diff --git a/packages/terasim-nde-nade/terasim_nde_nade/vehicle/conflict_generation_model.py b/packages/terasim-nde-nade/terasim_nde_nade/vehicle/conflict_generation_model.py index dd8b8e5..e443270 100644 --- a/packages/terasim-nde-nade/terasim_nde_nade/vehicle/conflict_generation_model.py +++ b/packages/terasim-nde-nade/terasim_nde_nade/vehicle/conflict_generation_model.py @@ -40,7 +40,6 @@ def derive_control_command_from_observation(self, obs_dict): vehicle_location = get_location( obs_dict["ego"]["veh_id"], obs_dict["ego"]["lane_id"], obs_dict=obs_dict ) - command, command_dict = self.adversity_manager.derive_command(obs_dict) return command, {"ndd_command_distribution": command_dict} diff --git a/packages/terasim-service/terasim_service/plugins/cosim.py b/packages/terasim-service/terasim_service/plugins/cosim.py index c499c0b..8058c34 100644 --- a/packages/terasim-service/terasim_service/plugins/cosim.py +++ b/packages/terasim-service/terasim_service/plugins/cosim.py @@ -597,8 +597,19 @@ def _write_simulation_state(self, simulator): simulation_state.agent_details["vru"] = vrus # Add construction objects + # Filter out invisible construction cones from AV perception construction_objects = {} + for cid in construction_ids: + # Check if this construction object is an invisible cone type + # Invisible cones have type "INVISIBLE_CONE" and should not be visible to AV + cone_type = traci.vehicle.getTypeID(cid) + + # Skip invisible cones for AV perception + if cone_type == "INVISIBLE_CONE": + self.logger.debug(f"Filtering out invisible construction cone: {cid}") + continue + construction_state = AgentStateSimplified() construction_state.x, construction_state.y, construction_state.z = traci.vehicle.getPosition3D(cid) construction_state.lon, construction_state.lat = traci.simulation.convertGeo(construction_state.x, construction_state.y) @@ -612,9 +623,15 @@ def _write_simulation_state(self, simulator): construction_state.type = traci.vehicle.getTypeID(cid) construction_state.angular_velocity = 0.0 construction_objects[cid] = construction_state - + simulation_state.construction_objects = construction_objects + # Log visibility statistics + total_construction = len(construction_ids) + visible_construction = len(construction_objects) + if total_construction > visible_construction: + self.logger.info(f"Construction objects: {visible_construction} visible to AV (orange cones), {total_construction - visible_construction} hidden (green invisible cones)") + # Add traffic light states traffic_lights = {} for tl_id in traci.trafficlight.getIDList(): diff --git a/packages/terasim-vis/terasim_vis/Net.py b/packages/terasim-vis/terasim_vis/Net.py index df95fdd..f08d231 100644 --- a/packages/terasim-vis/terasim_vis/Net.py +++ b/packages/terasim-vis/terasim_vis/Net.py @@ -106,10 +106,6 @@ def get_lane(self, index): for lane in self.lanes: if lane.index == index: return lane - # if error occurs, check the index is correct - print(f"Edge contains no Lane with given index: {index}") - print(f"Edge: {self.id}") - print(f"Lanes: {self.lanes}") raise IndexError("Edge contains no Lane with given index.") def lane_count(self): @@ -140,7 +136,7 @@ def append_stop_offset(self, attrib): vClasses = Utils.Allowance(allow_string=vc, disallow_string=exceptions) self.stop_offsets.append((value, vClasses)) - def plot(self, ax, lane_kwargs=None, lane_marking_kwargs=None, tl_phases=None, **kwargs): + def plot(self, ax, lane_kwargs=None, lane_marking_kwargs=None, **kwargs): """ Plots the lane. The lane_kwargs and lane_markings_kwargs override the general kwargs for their respective functions. @@ -158,7 +154,7 @@ def plot(self, ax, lane_kwargs=None, lane_marking_kwargs=None, tl_phases=None, * lane_marking_kwargs = dict() for lane in self.lanes: lane_artist = lane.plot_shape(ax, **{**kwargs, **lane_kwargs}) - lane_marking_artist = lane.plot_lane_markings(ax, tl_phases=tl_phases, **{**kwargs, **lane_marking_kwargs}) + lane_marking_artist = lane.plot_lane_markings(ax, **{**kwargs, **lane_marking_kwargs}) lane_artists.append(lane_artist) lane_marking_artists += lane_marking_artist return lane_artists, lane_marking_artists @@ -444,7 +440,7 @@ def get_as_3d_object(self, z=0, include_bottom_face=False, material_param=None, material = self.params.get(material_param, self.lane_type()+"_lane") return Utils.Object3D.from_shape(orient(self.shape), self.id, material, z=z, extrude_height=h, include_bottom_face=include_bottom_face) - def _guess_lane_markings(self, tl_phases=None): + def _guess_lane_markings(self): """ Guesses lane markings based on lane configuration and globally specified lane marking style. @@ -454,7 +450,7 @@ def _guess_lane_markings(self, tl_phases=None): if self.parentEdge.function == "internal" or self.allows == "ship" or self.allows == "rail": return markings if self.parentEdge.function == "crossing": - color, dashes = "0.7", (0.2, 0.2) + color, dashes = "w", (0.5, 0.5) markings.append(_LaneMarking(self.alignment, self.width, color, dashes, purpose="crossing", parent=self)) return markings # US-style markings @@ -489,13 +485,13 @@ def _guess_lane_markings(self, tl_phases=None): # Draw centerline stripe if necessary if self.inverse_lane_index() == 0: leftEdge = self.alignment.parallel_offset(self.width/2, side="left") - color, dashes = "0.2", (100, 0) + color, dashes = "w", (100, 0) markings.append(_LaneMarking(leftEdge, lw, color, dashes, purpose="center", parent=self)) # Draw non-centerline markings else: adjacent_lane = self.parentEdge.get_lane(self.index + 1) leftEdge = self.alignment.parallel_offset(self.width / 2, side="left") - color, dashes = "0.2", (3, 9) # set default settings + color, dashes = "w", (3, 9) # set default settings if self.allows("bicycle") != adjacent_lane.allows("bicycle"): dashes = (100, 0) # solid line where bicycles may not change lanes elif self.allows("passenger") != adjacent_lane.allows("passenger"): @@ -507,7 +503,7 @@ def _guess_lane_markings(self, tl_phases=None): # draw outer lane marking if necessary if self.index == 0 and not (self.allows("pedestrian") and not self.allows("all")): rightEdge = self.alignment.parallel_offset(self.width / 2, side="right") - color, dashes = "0.2", (100, 0) + color, dashes = "w", (100, 0) markings.append(_LaneMarking(rightEdge, lw, color, dashes, purpose="outer", parent=self)) # Stop line markings (all styles) slw = 0.5 @@ -534,14 +530,10 @@ def _guess_lane_markings(self, tl_phases=None): except (NotImplementedError, IndexError, ValueError): warnings.warn("Can't generate stopline geometry for lane " + self.id) else: - if tl_phases is not None and self.id in tl_phases.get('green', []): - color = "lime" - else: - color = "lightcoral" - markings.append(_LaneMarking(stop_line, slw, color, (100, 0), purpose="stopline", parent=self)) + markings.append(_LaneMarking(stop_line, slw, "w", (100, 0), purpose="stopline", parent=self)) return markings - def plot_lane_markings(self, ax, tl_phases=None, **kwargs): + def plot_lane_markings(self, ax, **kwargs): """ Guesses and plots some simple lane markings. @@ -550,7 +542,7 @@ def plot_lane_markings(self, ax, tl_phases=None, **kwargs): :type ax: plt.Axes """ artists = [] - for marking in self._guess_lane_markings(tl_phases=tl_phases): + for marking in self._guess_lane_markings(): try: artist = marking.plot(ax, **kwargs) except NotImplementedError: @@ -1078,7 +1070,7 @@ def generate_obj_text(self, style=None, stripe_width_scale=1, terrain_distance=0 def plot(self, ax=None, clip_to_limits=False, zoom_to_extents=True, style=None, stripe_width_scale=1, plot_stop_lines=None, apply_netOffset=False, lane_kwargs=None, lane_marking_kwargs=None, - junction_kwargs=None, additionals_kwargs=None, tl_phases=None, **kwargs): + junction_kwargs=None, additionals_kwargs=None, **kwargs): """ Plots the Net. Kwargs are passed to the plotting functions, with object-specific kwargs overriding general ones. @@ -1135,7 +1127,7 @@ def plot(self, ax=None, clip_to_limits=False, zoom_to_extents=True, style=None, artist_collection = Utils.ArtistCollection() for edge in self.edges.values(): if edge.function != "internal" and (not clip_to_limits or edge.intersects(window)): - la, lma = edge.plot(ax, {"zorder": -100, **lane_kwargs}, {"zorder": -90, **lane_marking_kwargs}, tl_phases=tl_phases, **kwargs) + la, lma = edge.plot(ax, {"zorder": -100, **lane_kwargs}, {"zorder": -90, **lane_marking_kwargs}, **kwargs) artist_collection.lanes += la artist_collection.lane_markings += lma for junction in self.junctions.values(): diff --git a/packages/terasim-vis/terasim_vis/Trajectory.py b/packages/terasim-vis/terasim_vis/Trajectory.py index 602d45c..5ce42f8 100644 --- a/packages/terasim-vis/terasim_vis/Trajectory.py +++ b/packages/terasim-vis/terasim_vis/Trajectory.py @@ -63,8 +63,6 @@ def _append_point(self, time, x, y, speed=None, angle=None, lane=None, color="#0 self.angle.append(angle) self.lane.append(lane) self.colors.append(color) - self.length = 4.8 - self.width = 2 params = params if params is not None else dict() for key in params: if key not in self.params: @@ -302,7 +300,7 @@ class Trajectories: :ivar mappables: dict of ``vehID: ScalarMappable`` pairs. Useful for generating colorbars. """ - def __init__(self, file=None, start_time=None, end_time=None, vehicle_only=False): + def __init__(self, file=None, start_time=None, end_time=None): """ Initializes a Trajectories object. @@ -322,7 +320,7 @@ def __init__(self, file=None, start_time=None, end_time=None, vehicle_only=False if type(file) == ET.Element: self.read_from_fcd_root(file) elif file.endswith("fcd-output.xml") or file.endswith("fcd.xml") or file.endswith("fcd_all.xml"): - self.read_from_fcd(file, start_time, end_time, vehicle_only=vehicle_only) + self.read_from_fcd(file, start_time, end_time) # check if the file is the xml parsed root else: raise NotImplementedError("Reading from this type of file not implemented: " + file) @@ -400,7 +398,7 @@ def read_from_fcd_root(self, root): self._append(trajectories[vehID]) - def read_from_fcd(self, file, start_time=None, end_time=None, vehicle_only=False): + def read_from_fcd(self, file, start_time=None, end_time=None): """ Reads trajectories from Sumo floating car data (fcd) output file. Uses iterparse to stream the XML file instead of loading it all at once. @@ -435,14 +433,9 @@ def read_from_fcd(self, file, start_time=None, end_time=None, vehicle_only=False if self.start is None: self.start = time self.end = time - - if vehicle_only: - vehicle_tags = ["vehicle", "container"] - else: - vehicle_tags = ["vehicle", "person", "container"] - + for veh in elem: - if veh.tag in vehicle_tags: + if veh.tag in ["vehicle", "person", "container"]: vehID = veh.attrib["id"] type = veh.attrib.get("type", "") if vehID not in trajectories: @@ -511,11 +504,10 @@ def cal_box(self, x, y, length=5, width=2, angle=0): x, y = center[0], center[1] upper_left = self.rotate(x-0.5*length, y+0.5*width, x, y, angle=angle) lower_left = self.rotate(x-0.5*length, y-0.5*width, x, y, angle=angle) - upper_right = self.rotate(x+0.2*length, y+0.5*width, x, y, angle=angle) - center_right = self.rotate(x+0.5*length, y, x, y, angle=angle) - lower_right = self.rotate(x+0.2*length, y-0.5*width, x, y, angle=angle) - xs = [upper_left[0], upper_right[0], center_right[0], lower_right[0], lower_left[0], upper_left[0], upper_right[0], lower_right[0]] - ys = [upper_left[1], upper_right[1], center_right[1], lower_right[1], lower_left[1], upper_left[1], upper_right[1], lower_right[1]] + upper_right = self.rotate(x+0.5*length, y+0.5*width, x, y, angle=angle) + lower_right = self.rotate(x+0.5*length, y-0.5*width, x, y, angle=angle) + xs = [upper_left[0], upper_right[0], lower_right[0], lower_left[0], upper_left[0]] + ys = [upper_left[1], upper_right[1], lower_right[1], lower_left[1], upper_left[1]] return xs, ys def plot_points(self, time, ax=None, animate_color=False, lanes=None): @@ -560,7 +552,7 @@ def plot_points(self, time, ax=None, animate_color=False, lanes=None): self.graphics.pop(traj) continue # angle = (360 - angle) % 360 - xs, ys = self.cal_box(x, y, length=traj.length, width=traj.width, angle=-radians(angle-90)) + xs, ys = self.cal_box(x, y, length=4.8, angle=-radians(angle-90)) if animate_color and color is not None: traj.point_plot_kwargs["color"] = color diff --git a/packages/terasim-cosmos/terasim_cosmos/CLAUDE.md b/packages/terasim-world/CLAUDE.md similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/CLAUDE.md rename to packages/terasim-world/CLAUDE.md diff --git a/packages/terasim-cosmos/README.md b/packages/terasim-world/README.md similarity index 54% rename from packages/terasim-cosmos/README.md rename to packages/terasim-world/README.md index ecfbf25..5249027 100644 --- a/packages/terasim-cosmos/README.md +++ b/packages/terasim-world/README.md @@ -1,33 +1,34 @@ -# TeraSim-Cosmos Bridge Package +# TeraSim-World -TeraSim-Cosmos is a bridge package that converts TeraSim traffic simulation data (SUMO map and FCD) into NVIDIA Cosmos-Drive compatible inputs for autonomous vehicle world model training and video generation. This package enables seamless integration between TeraSim simulations and NVIDIA's Cosmos-Drive platform. +TeraSim-World is a bridge package that converts TeraSim traffic simulation data into world model inputs compatible with NVIDIA Cosmos Transfer1 models. This package enables the generation of photorealistic driving scenarios from TeraSim simulations for advanced autonomous vehicle testing and validation. This package is adapted from [Cosmos-Drive-Dreams toolkits](https://github.com/nv-tlabs/Cosmos-Drive-Dreams/tree/main/cosmos-drive-dreams-toolkits) and extended with TeraSim-specific functionality for seamless integration with TeraSim's simulation outputs. ## Overview -TeraSim-Cosmos provides: +TeraSim-World provides: -* **TeraSim-to-Cosmos-Drive Conversion**: Convert TeraSim simulation outputs (SUMO map and FCD files) into RDS-HQ format fully compatible with NVIDIA Cosmos-Drive platform -* **HD Map Video Generation**: Generate high-quality HD map videos for world model training and autonomous vehicle simulation -* **Street View Integration**: Retrieve and analyze real-world street view images to enhance simulation realism and provide textual descriptions -* **Multi-Camera Support**: Process data from multiple camera viewpoints (f-theta and pinhole camera models) matching Cosmos-Drive requirements +* **TeraSim-to-Cosmos Conversion**: Convert TeraSim simulation outputs (FCD files, map data) into RDS-HQ format compatible with Cosmos Transfer1 models +* **HD Map Rendering**: Generate HD map visualizations from simulation data +* **Street View Integration**: Retrieve and analyze real-world street view images to enhance simulation realism +* **Multi-Camera Support**: Process data from multiple camera viewpoints (f-theta and pinhole camera models) -The package enables direct integration with NVIDIA Cosmos-Drive by generating properly formatted HD map videos and associated metadata that can be seamlessly used for world model training and video generation. +The main entry point is `terasim_to_cosmos_input.py`, which orchestrates the entire conversion pipeline from TeraSim outputs to Cosmos-compatible inputs. ## Key Components -### Core Conversion Pipeline (`TeraSimToCosmosConverter`) -Main converter class that: -- Processes TeraSim FCD (Floating Car Data) and SUMO map files +### Core Conversion Pipeline (`terasim_to_cosmos_input.py`) +Main function that: +- Processes TeraSim FCD (Floating Car Data) and map files - Extracts vehicle trajectories and collision information -- Converts data to WebDataset (WDS) format compatible with Cosmos-Drive -- Renders HD map videos and sensor data for world model training +- Converts data to WebDataset (WDS) format +- Renders HD maps and sensor data for world model input ### Data Processing Modules -- `convert_terasim_to_rds_hq.py`: Converts TeraSim data to RDS-HQ format for Cosmos-Drive compatibility -- `street_view_analysis.py`: Integrates street view imagery and generates textual descriptions -- `render_from_rds_hq.py`: Renders HD map videos and depth visualizations for Cosmos-Drive input +- `convert_terasim_to_rds_hq.py`: Converts TeraSim data to RDS-HQ format +- `convert_waymo_to_rds_hq.py`: Processes Waymo Open Dataset +- `street_view_analysis.py`: Integrates street view imagery and descriptions +- `render_from_rds_hq.py`: Renders HD maps and LiDAR visualizations ### Visualization Tools - `visualize_rds_hq.py`: Interactive 3D visualization using Viser @@ -39,60 +40,41 @@ Main converter class that: - Point cloud processing - WebDataset utilities -## Integration with TeraSim and Cosmos-Drive +## Integration with TeraSim This package seamlessly integrates with TeraSim's output format, reading: - **FCD files** (`fcd_all.xml`): Vehicle trajectory and state information - **Map files** (`map.net.xml`): Road network topology from SUMO -- Monitor files (`monitor.json`): Collision and event records (optional) +- **Monitor files** (`monitor.json`): Collision and event records -The converted outputs are fully compatible with NVIDIA Cosmos-Drive platform and can be directly used for: -- **World Model Training**: HD map videos for autonomous vehicle simulation -- **Video Generation**: High-quality driving scenario videos -- **Scene Understanding**: Multi-camera view rendering with depth information +The converted outputs can then be used with NVIDIA Cosmos Transfer1 models to generate photorealistic driving scenarios based on TeraSim simulations. ## Quick Start -### Installation and Usage +### Using TeraSim Data -Install the package: -```bash -pip install -e packages/terasim-cosmos -``` - -Convert TeraSim simulation outputs to Cosmos-Drive compatible inputs: +To convert TeraSim simulation outputs to Cosmos-compatible inputs: ```python -from terasim_cosmos import TeraSimToCosmosConverter - -# Create converter from configuration file -converter = TeraSimToCosmosConverter.from_config_file('configs/converter/scenario.yaml') - -# Run conversion with street view retrieval -converter.convert(streetview_retrieval=True) -``` - -### Configuration File - -Create a YAML configuration file: - -```yaml -path_to_output: "path/to/output" -path_to_fcd: "path/to/fcd_all.xml" -path_to_map: "path/to/map.net.xml" -camera_setting_name: "default" # or "waymo" -vehicle_id: "vehicle_001" -time_start: 460.0 -time_end: 464.0 -agent_clip_distance: 30.0 -map_clip_distance: 100.0 -``` - -### Command Line Usage - -```bash -python convert_terasim_to_cosmos.py --path_to_config configs/converter/scenario.yaml --streetview_retrieval True +from pathlib import Path +from terasim_to_cosmos_input import terasim_to_cosmos_input + +# Define paths to TeraSim output +path_to_output = Path("/path/to/terasim/output") +path_to_fcd = path_to_output / "fcd_all.xml" +path_to_map = path_to_output / "map.net.xml" + +# Convert to Cosmos input +terasim_to_cosmos_input( + path_to_output=path_to_output, + path_to_fcd=path_to_fcd, + path_to_map=path_to_map, + camera_setting_name="default", # or "waymo" + vehicle_id=None, # Auto-detect from monitor.json + timestep_start=0, + timestep_end=100 +) ``` ### Parameters @@ -129,8 +111,9 @@ After conversion, the output directory will contain: ### Setup ```bash # From the TeraSim root directory -cd packages/terasim-cosmos -pip install -e . +cd packages/terasim-world +conda env create -f environment.yaml +conda activate cosmos-av-toolkits ``` ### Additional Dependencies diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/default_ftheta_intrinsic.tar b/packages/terasim-world/assets/default_ftheta_intrinsic.tar similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/default_ftheta_intrinsic.tar rename to packages/terasim-world/assets/default_ftheta_intrinsic.tar diff --git a/packages/terasim-world/assets/example/3d_crosswalks/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_crosswalks/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..7a434a1 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_crosswalks/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_lanelines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_lanelines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..8a3e2ff Binary files /dev/null and b/packages/terasim-world/assets/example/3d_lanelines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_lanes/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_lanes/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..714f123 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_lanes/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_poles/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_poles/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..3280081 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_poles/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_road_boundaries/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_road_boundaries/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..79391f3 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_road_boundaries/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_road_markings/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_road_markings/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..a75bf08 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_road_markings/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_traffic_lights/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_traffic_lights/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..26603aa Binary files /dev/null and b/packages/terasim-world/assets/example/3d_traffic_lights/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_traffic_signs/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_traffic_signs/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..439ff32 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_traffic_signs/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/3d_wait_lines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/3d_wait_lines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..65bdfa3 Binary files /dev/null and b/packages/terasim-world/assets/example/3d_wait_lines/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/all_object_info/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/all_object_info/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..e14a5ce Binary files /dev/null and b/packages/terasim-world/assets/example/all_object_info/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/captions/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.txt b/packages/terasim-world/assets/example/captions/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.txt new file mode 100644 index 0000000..47014cb --- /dev/null +++ b/packages/terasim-world/assets/example/captions/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.txt @@ -0,0 +1 @@ +The video shows a highway scene during twilight or early evening, with a clear sky transitioning from blue to darker shades. Several cars are visible on the road, some moving forward while others appear stationary, indicating moderate traffic. The road is flanked by trees and a concrete barrier on one side, with utility poles and wires running parallel to the highway. A billboard is visible in the distance, and the overall atmosphere suggests a calm urban or suburban setting. The lighting indicates that it is either dusk or dawn, with the sky showing signs of fading light. \ No newline at end of file diff --git a/packages/terasim-world/assets/example/car_mask_coarse/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.png b/packages/terasim-world/assets/example/car_mask_coarse/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.png new file mode 100644 index 0000000..46d67e9 Binary files /dev/null and b/packages/terasim-world/assets/example/car_mask_coarse/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.png differ diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_left_120fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_left_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_left_120fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_left_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_right_120fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_right_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_right_120fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_cross_right_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_tele_30fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_tele_30fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_tele_30fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_tele_30fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_wide_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_wide_120fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_front_wide_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_left_70fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_left_70fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_left_70fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_left_70fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_right_70fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_right_70fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_right_70fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_right_70fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_tele_30fov.npy b/packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_tele_30fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_tele_30fov.npy rename to packages/terasim-world/assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.ftheta_intrinsic.camera_rear_tele_30fov.npy diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..09754a4 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000000.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000000.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..754564d Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000000.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000001.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000001.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..754564d Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000001.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000002.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000002.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..2b96f8c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000002.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000003.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000003.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..2b96f8c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000003.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000004.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000004.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..2b96f8c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000004.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000005.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000005.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..2b96f8c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000005.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000006.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000006.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..2b96f8c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000006.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000007.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000007.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..04b8b74 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000007.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000008.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000008.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..6400a99 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000008.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000009.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000009.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..ec1267c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000009.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000010.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000010.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..ec1267c Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000010.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000011.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000011.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000011.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000012.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000012.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000012.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000013.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000013.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000013.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000014.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000014.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000014.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000015.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000015.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000015.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000016.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000016.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000016.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000017.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000017.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000017.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000018.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000018.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9cdf57f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000018.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000019.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000019.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000019.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000020.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000020.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000020.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000021.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000021.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000021.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000022.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000022.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000022.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000023.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000023.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000023.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000024.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000024.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000024.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000025.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000025.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000025.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000026.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000026.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000026.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000027.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000027.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000027.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000028.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000028.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000028.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000029.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000029.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000029.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000030.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000030.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000030.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000031.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000031.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..626298b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000031.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000032.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000032.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..b26083f Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000032.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000033.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000033.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..dfa972e Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000033.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000034.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000034.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..dfa972e Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000034.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000035.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000035.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000035.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000036.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000036.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000036.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000037.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000037.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000037.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000038.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000038.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000038.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000039.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000039.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000039.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000040.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000040.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000040.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000041.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000041.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000041.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000042.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000042.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000042.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000043.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000043.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000043.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000044.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000044.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000044.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000045.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000045.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000045.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000046.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000046.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000046.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000047.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000047.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000047.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000048.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000048.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000048.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000049.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000049.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000049.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000050.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000050.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000050.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000051.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000051.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000051.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000052.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000052.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000052.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000053.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000053.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000053.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000054.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000054.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000054.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000055.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000055.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000055.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000056.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000056.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000056.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000057.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000057.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000057.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000058.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000058.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000058.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000059.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000059.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000059.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000060.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000060.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000060.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000061.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000061.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000061.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000062.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000062.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000062.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000063.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000063.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..d9ffd67 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000063.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000064.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000064.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..b59dc05 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000064.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000065.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000065.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..0a7beaa Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000065.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000066.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000066.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..0a7beaa Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000066.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000067.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000067.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000067.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000068.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000068.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000068.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000069.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000069.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000069.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000070.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000070.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000070.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000071.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000071.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000071.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000072.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000072.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000072.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000073.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000073.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000073.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000074.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000074.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000074.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000075.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000075.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000075.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000076.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000076.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000076.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000077.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000077.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000077.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000078.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000078.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000078.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000079.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000079.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000079.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000080.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000080.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000080.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000081.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000081.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000081.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000082.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000082.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000082.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000083.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000083.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000083.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000084.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000084.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000084.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000085.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000085.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000085.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000086.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000086.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000086.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000087.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000087.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000087.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000088.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000088.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000088.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000089.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000089.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000089.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000090.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000090.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000090.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000091.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000091.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000091.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000092.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000092.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000092.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000093.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000093.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000093.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000094.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000094.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000094.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000095.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000095.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000095.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000096.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000096.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000096.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000097.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000097.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000097.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000098.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000098.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000098.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000099.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000099.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000099.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000100.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000100.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000100.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000101.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000101.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000101.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000102.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000102.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000102.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000103.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000103.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000103.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000104.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000104.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000104.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000105.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000105.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000105.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000106.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000106.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000106.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000107.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000107.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000107.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000108.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000108.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000108.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000109.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000109.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000109.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000110.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000110.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000110.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000111.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000111.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000111.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000112.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000112.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000112.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000113.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000113.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000113.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000114.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000114.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000114.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000115.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000115.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000115.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000116.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000116.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000116.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000117.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000117.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000117.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000118.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000118.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000118.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000119.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000119.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000119.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000120.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000120.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000120.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000121.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000121.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000121.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000122.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000122.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000122.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000123.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000123.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000123.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000124.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000124.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000124.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000125.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000125.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000125.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000126.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000126.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000126.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000127.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000127.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..4f14926 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000127.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000128.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000128.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..06e8a9b Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000128.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000129.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000129.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..97915a9 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000129.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000130.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000130.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..97915a9 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000130.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000131.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000131.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000131.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000132.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000132.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000132.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000133.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000133.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000133.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000134.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000134.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000134.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000135.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000135.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000135.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000136.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000136.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000136.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000137.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000137.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000137.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000138.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000138.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000138.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000139.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000139.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000139.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000140.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000140.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000140.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000141.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000141.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000141.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000142.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000142.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000142.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000143.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000143.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000143.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000144.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000144.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000144.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000145.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000145.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000145.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000146.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000146.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000146.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000147.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000147.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000147.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000148.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000148.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000148.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000149.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000149.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000149.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000150.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000150.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000150.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000151.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000151.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000151.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000152.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000152.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000152.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000153.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000153.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000153.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000154.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000154.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000154.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000155.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000155.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000155.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000156.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000156.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000156.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000157.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000157.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000157.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000158.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000158.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000158.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000159.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000159.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000159.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000160.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000160.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000160.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000161.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000161.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000161.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000162.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000162.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000162.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000163.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000163.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000163.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000164.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000164.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000164.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000165.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000165.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000165.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000166.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000166.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000166.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000167.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000167.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000167.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000168.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000168.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000168.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000169.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000169.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000169.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000170.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000170.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000170.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000171.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000171.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000171.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000172.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000172.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000172.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000173.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000173.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000173.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000174.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000174.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000174.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000175.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000175.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000175.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000176.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000176.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000176.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000177.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000177.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000177.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000178.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000178.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000178.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000179.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000179.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000179.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000180.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000180.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000180.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000181.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000181.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000181.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000182.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000182.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000182.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000183.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000183.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000183.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000184.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000184.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000184.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000185.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000185.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000185.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000186.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000186.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000186.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000187.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000187.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000187.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000188.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000188.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000188.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000189.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000189.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000189.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000190.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000190.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000190.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000191.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000191.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000191.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000192.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000192.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000192.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000193.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000193.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000193.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000194.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000194.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000194.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000195.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000195.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000195.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000196.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000196.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000196.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000197.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000197.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000197.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000198.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000198.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000198.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000199.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000199.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000199.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000200.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000200.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000200.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000201.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000201.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000201.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000202.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000202.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000202.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000203.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000203.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000203.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000204.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000204.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000204.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000205.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000205.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000205.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000206.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000206.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000206.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000207.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000207.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000207.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000208.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000208.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000208.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000209.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000209.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000209.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000210.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000210.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000210.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000211.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000211.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000211.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000212.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000212.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000212.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000213.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000213.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000213.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000214.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000214.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000214.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000215.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000215.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000215.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000216.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000216.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000216.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000217.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000217.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000217.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000218.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000218.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000218.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000219.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000219.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000219.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000220.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000220.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000220.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000221.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000221.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000221.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000222.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000222.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000222.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000223.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000223.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000223.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000224.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000224.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000224.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000225.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000225.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000225.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000226.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000226.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000226.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000227.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000227.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000227.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000228.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000228.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000228.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000229.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000229.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000229.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000230.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000230.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000230.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000231.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000231.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000231.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000232.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000232.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000232.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000233.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000233.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000233.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000234.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000234.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000234.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000235.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000235.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000235.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000236.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000236.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000236.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000237.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000237.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000237.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000238.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000238.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000238.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000239.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000239.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000239.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000240.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000240.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000240.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000241.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000241.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000241.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000242.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000242.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000242.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000243.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000243.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000243.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000244.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000244.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000244.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000245.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000245.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000245.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000246.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000246.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000246.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000247.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000247.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000247.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000248.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000248.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000248.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000249.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000249.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000249.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000250.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000250.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000250.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000251.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000251.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000251.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000252.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000252.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000252.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000253.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000253.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000253.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000254.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000254.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000254.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000255.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000255.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..208d1b8 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000255.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000256.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000256.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..3baaa00 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000256.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000257.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000257.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..a1cd5a4 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000257.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000258.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000258.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..a1cd5a4 Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000258.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000259.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000259.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000259.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000260.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000260.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000260.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000261.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000261.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000261.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000262.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000262.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000262.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000263.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000263.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000263.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000264.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000264.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000264.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000265.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000265.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000265.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000266.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000266.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000266.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000267.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000267.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000267.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000268.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000268.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000268.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000269.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000269.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000269.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000270.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000270.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000270.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000271.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000271.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000271.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000272.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000272.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000272.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000273.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000273.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000273.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000274.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000274.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000274.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000275.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000275.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000275.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000276.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000276.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000276.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000277.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000277.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000277.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000278.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000278.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000278.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000279.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000279.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000279.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000280.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000280.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000280.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000281.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000281.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000281.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000282.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000282.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000282.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000283.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000283.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000283.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000284.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000284.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000284.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000285.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000285.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000285.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000286.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000286.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000286.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000287.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000287.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000287.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000288.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000288.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000288.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000289.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000289.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000289.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000290.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000290.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000290.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000291.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000291.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000291.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000292.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000292.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000292.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000293.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000293.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000293.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000294.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000294.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000294.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000295.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000295.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000295.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000296.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000296.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000296.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000297.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000297.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000297.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000298.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000298.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..9e2aabc Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000298.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000299.pose.camera_front_wide_120fov.npy b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000299.pose.camera_front_wide_120fov.npy new file mode 100644 index 0000000..754564d Binary files /dev/null and b/packages/terasim-world/assets/example/novel_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.000299.pose.camera_front_wide_120fov.npy differ diff --git a/packages/terasim-world/assets/example/pinhole_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/pinhole_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar new file mode 100644 index 0000000..460bd47 Binary files /dev/null and b/packages/terasim-world/assets/example/pinhole_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar differ diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar rename to packages/terasim-world/assets/example/pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar diff --git a/packages/terasim-cosmos/terasim_cosmos/assets/example/vehicle_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar b/packages/terasim-world/assets/example/vehicle_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/assets/example/vehicle_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar rename to packages/terasim-world/assets/example/vehicle_pose/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic.tar b/packages/terasim-world/config/default_ftheta_intrinsic.tar similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic.tar rename to packages/terasim-world/config/default_ftheta_intrinsic.tar diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_left_120fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_left_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_left_120fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_left_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_right_120fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_right_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_right_120fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_cross_right_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_front_wide_120fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_front_wide_120fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_front_wide_120fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_front_wide_120fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_left_70fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_left_70fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_left_70fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_left_70fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_right_70fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_right_70fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_right_70fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_right_70fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_tele_30fov.npy b/packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_tele_30fov.npy similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_tele_30fov.npy rename to packages/terasim-world/config/default_ftheta_intrinsic/original_calib.ftheta_intrinsic.camera_rear_tele_30fov.npy diff --git a/packages/terasim-cosmos/terasim_cosmos/convert_terasim_to_rds_hq.py b/packages/terasim-world/convert_terasim_to_rds_hq.py similarity index 80% rename from packages/terasim-cosmos/terasim_cosmos/convert_terasim_to_rds_hq.py rename to packages/terasim-world/convert_terasim_to_rds_hq.py index 2588388..a0ac188 100644 --- a/packages/terasim-cosmos/terasim_cosmos/convert_terasim_to_rds_hq.py +++ b/packages/terasim-world/convert_terasim_to_rds_hq.py @@ -13,34 +13,38 @@ from waymo_open_dataset import dataset_pb2, label_pb2 from waymo_open_dataset.utils import frame_utils from google.protobuf import json_format -from .utils.wds_utils import write_to_tar, encode_dict_to_npz_bytes -from .utils.bbox_utils import interpolate_pose +from utils.wds_utils import write_to_tar, encode_dict_to_npz_bytes +from utils.bbox_utils import interpolate_pose import sumolib import xml.etree.ElementTree as ET -from .utils.wds_utils import get_sample - -from terasim_datazoo.processors.sumo2waymo import SUMO2Waymo +from utils.wds_utils import get_sample class TeraSim_Dataset: """ Dataset class for TeraSim data that provides iteration over the last N timesteps. Implements similar interface as Waymo dataset for compatibility. """ - def __init__(self, terasim_record_root: Union[str, Path], path_to_fcd: Union[str, Path], path_to_map: Union[str, Path], time_start: float, time_end: float, av_id: str = "CAV", agent_clip_distance: float = 100.0): + def __init__(self, + terasim_record_root: Union[str, Path], + path_to_fcd: Union[str, Path], + path_to_map: Union[str, Path], + timestep_start: int, + timestep_end: int, + av_id: str = "CAV"): """ Initialize the TeraSim dataset. Args: terasim_record_root: Path to the root directory containing TeraSim data - time_start: Start time - time_end: End time + timestep_start: Start timestep + timestep_end: End timestep av_id: ID of the AV vehicle (default: "CAV") """ self.clip_id = terasim_record_root.stem self.sumo_net_path = path_to_map if not self.sumo_net_path.exists(): - raise FileNotFoundError(f"Map file not found: {self.sumo_net_path}") + raise FileNotFoundError(f"Sumo net file not found: {self.sumo_net_path}") self.sumo_net = sumolib.net.readNet(self.sumo_net_path, withInternal=True, withPedestrianConnections=True) self.fcd_path = path_to_fcd if not self.fcd_path.exists(): @@ -52,10 +56,7 @@ def __init__(self, terasim_record_root: Union[str, Path], path_to_fcd: Union[str # Get all timesteps and keep only the last N all_timesteps = self.fcd_data.findall('timestep') - # Convert time to timestep indices (assuming 0.1s per timestep) - timestep_start = int(time_start * 10) if time_start >= 0 else 0 - timestep_end_idx = int(time_end * 10) if time_end >= 0 else len(all_timesteps) - stop = None if time_end == -1 else timestep_end_idx + 1 + stop = None if timestep_end == -1 else timestep_end + 1 self.timesteps = all_timesteps[timestep_start:stop] self.current_idx = 0 @@ -63,7 +64,6 @@ def __init__(self, terasim_record_root: Union[str, Path], path_to_fcd: Union[str self.start_time = float(self.timesteps[0].get('time')) self.end_time = float(self.timesteps[-1].get('time')) print(f"Dataset loaded: time range [{self.start_time}, {self.end_time}], {len(self.timesteps)} frames") - self.agent_clip_distance = agent_clip_distance def __iter__(self): """Reset iterator index and return self""" @@ -100,14 +100,7 @@ def _get_all_agent_bbox(self, timestep): agent_id = agent.get('id') if agent_id == self.av_id: continue - agent_bbox = self._get_agent_bbox(timestep, agent_id) - if agent_bbox is not None: - all_agent_bbox[agent_id] = agent_bbox - for agent in timestep.findall('person'): - agent_id = agent.get('id') - agent_bbox = self._get_agent_bbox(timestep, agent_id) - if agent_bbox is not None: - all_agent_bbox[agent_id] = agent_bbox + all_agent_bbox[agent_id] = self._get_agent_bbox(timestep, agent_id) return all_agent_bbox def _get_agent_bbox(self, timestep, agent_id): @@ -136,15 +129,6 @@ def _get_agent_bbox(self, timestep, agent_id): y = float(agent.get('y')) z = float(agent.get('z', 0.0)) - av_agent = timestep.find(f"vehicle[@id='{self.av_id}']") - av_x = float(av_agent.get('x')) - av_y = float(av_agent.get('y')) - av_z = float(av_agent.get('z', 0.0)) - - av_distance = np.sqrt((x - av_x)**2 + (y - av_y)**2) - if av_distance > self.agent_clip_distance: - return None - # Get object type from agent tag and type attribute agent_tag = agent.tag # 'vehicle' or 'person' agent_type = agent.get('type', '') # Get type attribute if exists @@ -370,7 +354,7 @@ def convert_terasim_intrinsics(output_root: Path, clip_id: str, dataset: tf.data write_to_tar(sample, output_root / 'pinhole_intrinsic' / f'{clip_id}.tar') return -def convert_terasim_hdmap(output_root: Path, clip_id: str, dataset: TeraSim_Dataset, map_clip_distance: float = 100.0): +def convert_terasim_hdmap(output_root: Path, clip_id: str, dataset: TeraSim_Dataset): """ Convert TeraSim map data to RDS-HQ format. @@ -382,17 +366,10 @@ def convert_terasim_hdmap(output_root: Path, clip_id: str, dataset: TeraSim_Data def hump_to_underline(hump_str): import re return re.sub(r'([a-z])([A-Z])', r'\1_\2', hump_str).lower() - + from scenparse.processors.sumo2waymo import SUMO2Waymo sumo2waymo = SUMO2Waymo(dataset.sumo_net_path) sumo2waymo.parse(have_road_edges=True, have_road_lines=True) scenario = sumo2waymo.convert_to_scenario(scenario_id=clip_id) - - # Get AV position from the first frame - dataset_iter = iter(dataset) - first_frame = next(dataset_iter) - av_position = first_frame['vehicle_pose'][:3, 3] # Extract translation [x, y, z] - - # print(f"AV position in first frame: [{av_position[0]:.2f}, {av_position[1]:.2f}, {av_position[2]:.2f}]") hdmap_names_polyline = ["lane", "road_line", "road_edge"] hdmap_names_polygon = ["crosswalk", "speed_bump", "driveway"] @@ -415,68 +392,50 @@ def hump_to_underline(hump_str): try: hdmap_data = hdmap_data['polyline'] polyline = [[point['x'], point['y'], point['z']] for point in hdmap_data] - - # Filter polyline based on distance to AV - filtered_polyline = [] - for point in polyline: - distance = np.sqrt((point[0] - av_position[0])**2 + (point[1] - av_position[1])**2) - if distance <= map_clip_distance: - filtered_polyline.append(point) - - # Only add polyline if it has points within distance threshold - if filtered_polyline: - hdmap_name_to_data[hdmap_name_lower].append(filtered_polyline) + hdmap_name_to_data[hdmap_name_lower].append(polyline) except: print(f"Unkown hdmap item name: {hdmap_name}, skip this item") elif hdmap_name_lower in hdmap_names_polygon: hdmap_data = hdmap_data['polygon'] polygon = [[point['x'], point['y'], point['z']] for point in hdmap_data] - - # Filter polygon based on distance to AV - filtered_polygon = [] - for point in polygon: - distance = np.sqrt((point[0] - av_position[0])**2 + (point[1] - av_position[1])**2) - if distance <= map_clip_distance: - filtered_polygon.append(point) - - # Only add polygon if it has points within distance threshold - if filtered_polygon: - hdmap_name_to_data[hdmap_name_lower].append(filtered_polygon) + hdmap_name_to_data[hdmap_name_lower].append(polygon) else: print(f"Unkown hdmap item name: {hdmap_name}, skip this item") - # # Plot all HDMap elements for visualization - # import matplotlib.pyplot as plt + # Plot all HDMap elements for visualization + import matplotlib.pyplot as plt - # plt.figure(figsize=(12, 8)) - # colors = ['r', 'g', 'b', 'c', 'm', 'y'] + plt.figure(figsize=(12, 8)) + colors = ['r', 'g', 'b', 'c', 'm', 'y'] - # for i, (hdmap_name, hdmap_data) in enumerate(hdmap_name_to_data.items()): - # if len(hdmap_data) == 0: - # continue + for i, (hdmap_name, hdmap_data) in enumerate(hdmap_name_to_data.items()): + if len(hdmap_data) == 0: + continue - # color = colors[i % len(colors)] - # for polyline in hdmap_data: - # polyline = np.array(polyline) - # if hdmap_name in hdmap_names_polyline: - # # Plot polylines for lane, road_line, road_edge - # plt.plot(polyline[:, 0], polyline[:, 1], color=color, alpha=0.5, label=hdmap_name) - # else: - # # Plot filled polygons for crosswalk, speed_bump, driveway - # plt.fill(polyline[:, 0], polyline[:, 1], color=color, alpha=0.3, label=hdmap_name) - # # Also plot the polygon outline - # plt.plot(polyline[:, 0], polyline[:, 1], color=color, alpha=0.5, linestyle='--') + color = colors[i % len(colors)] + for polyline in hdmap_data: + polyline = np.array(polyline) + if hdmap_name in hdmap_names_polyline: + # Plot polylines for lane, road_line, road_edge + plt.plot(polyline[:, 0], polyline[:, 1], color=color, alpha=0.5, label=hdmap_name) + else: + # Plot filled polygons for crosswalk, speed_bump, driveway + plt.fill(polyline[:, 0], polyline[:, 1], color=color, alpha=0.3, label=hdmap_name) + # Also plot the polygon outline + plt.plot(polyline[:, 0], polyline[:, 1], color=color, alpha=0.5, linestyle='--') - # plt.title(f'HDMap Elements Visualization - {clip_id}') - # plt.xlabel('X (meters)') - # plt.ylabel('Y (meters)') - # plt.axis('equal') - # plt.grid(True) - # plt.legend() + plt.title(f'HDMap Elements Visualization - {clip_id}') + plt.xlabel('X (meters)') + plt.ylabel('Y (meters)') + plt.axis('equal') + plt.grid(True) + plt.legend() + + # Save plot + plt.savefig("sumo_waymo_hdmap_visualize.png", dpi=300) + plt.close() + - # # Save plot - # plt.savefig("sumo_waymo_hdmap_visualize.png", dpi=300) - # plt.close() # convert to cosmos's name convention for easier processing hdmap_name_to_cosmos = { @@ -554,14 +513,14 @@ def convert_terasim_pose(output_root: Path, clip_id: str, dataset: TeraSim_Datas } elif camera_setting_name == "default": import json + import os camera_name_to_camera_to_vehicle = {} - package_root = Path(__file__).parent - settings = json.load(open(package_root / "config/dataset_rds_hq_mv_terasim.json", "r")) + settings = json.load(open("config/dataset_rds_hq_mv_terasim.json", "r")) CameraNames = settings["CAMERAS"] example_id = "2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000" time_step = 0 - path_to_pose = package_root / "assets/example/pose" / f"{example_id}.tar" - path_to_vehicle_pose = package_root / "assets/example/vehicle_pose" / f"{example_id}.tar" + path_to_pose = os.path.join("assets/example/pose", f"{example_id}.tar") + path_to_vehicle_pose = os.path.join("assets/example/vehicle_pose", f"{example_id}.tar") pose = get_sample(path_to_pose) vehicle_pose = get_sample(path_to_vehicle_pose) vehicle_to_world = vehicle_pose[f"{time_step:06d}.vehicle_pose.npy"] @@ -577,10 +536,6 @@ def convert_terasim_pose(output_root: Path, clip_id: str, dataset: TeraSim_Datas world_to_vehicle = np.linalg.inv(vehicle_to_world) camera_to_vehicle = world_to_vehicle @ camera_to_world camera_name_to_camera_to_vehicle[camera_name] = camera_to_vehicle - # print the yaw angle of the camera which is used for street view analysis - # rotation = camera_to_vehicle[:3, :3] - # yaw = np.arctan2(rotation[1, 0], rotation[0, 0]) - # print(f"Yaw angle of {camera_name}: {np.rad2deg(yaw)}") else: raise ValueError(f"Invalid camera setting name: {camera_setting_name}") @@ -686,10 +641,8 @@ def convert_terasim_to_wds( single_camera: bool = False, camera_setting_name: str = "default", av_id: str = "CAV", - time_start: float = -12.0, - time_end: float = -1, - agent_clip_distance: float = 100.0, - map_clip_distance: float = 100.0 + timestep_start: int = -120, + timestep_end: int = -1 ): terasim_record_path = Path(terasim_record_root) clip_id = terasim_record_path.stem @@ -698,25 +651,25 @@ def convert_terasim_to_wds( if not terasim_record_path.exists(): raise FileNotFoundError(f"Terasim record file not found: {terasim_record_path}") - dataset = TeraSim_Dataset(terasim_record_root, path_to_fcd, path_to_map, time_start, time_end, av_id=av_id, agent_clip_distance=agent_clip_distance) + dataset = TeraSim_Dataset(terasim_record_root, path_to_fcd, path_to_map, timestep_start, timestep_end, av_id=av_id) convert_terasim_pose(output_wds_path, clip_id, dataset, camera_setting_name) - convert_terasim_hdmap(output_wds_path, clip_id, dataset, map_clip_distance) + convert_terasim_hdmap(output_wds_path, clip_id, dataset) convert_terasim_bbox(output_wds_path, clip_id, dataset) convert_terasim_intrinsics(output_wds_path, clip_id, dataset) -# @click.command() -# @click.option("--terasim_record_root", "-i", type=str, help="Terasim record root", default="terasim_mcity_dataset") -# @click.option("--output_wds_path", "-o", type=str, help="Output wds path", default="/home/mtl/cosmos-av-sample-toolkits/terasim_demo_headon") -# @click.option("--num_workers", "-n", type=int, default=1, help="Number of workers") -# @click.option("--single_camera", "-s", type=bool, default=False, help="Convert only front camera") -# def main(terasim_record_root: str, output_wds_path: str, num_workers: int, single_camera: bool): -# all_filenames = list(Path(terasim_record_root).iterdir()) -# print(f"Found {len(all_filenames)} TeraSim records") -# for filename in all_filenames: -# if filename.stem.startswith("001001_headon"): -# convert_terasim_to_wds(filename, output_wds_path, single_camera, av_id="BV_3.20") - -# if __name__ == "__main__": -# main() +@click.command() +@click.option("--terasim_record_root", "-i", type=str, help="Terasim record root", required=True) +@click.option("--output_wds_path", "-o", type=str, help="Output wds path", required=True) +@click.option("--num_workers", "-n", type=int, default=1, help="Number of workers") +@click.option("--single_camera", "-s", type=bool, default=False, help="Convert only front camera") +def main(terasim_record_root: str, output_wds_path: str, num_workers: int, single_camera: bool): + all_filenames = list(Path(terasim_record_root).iterdir()) + print(f"Found {len(all_filenames)} TeraSim records") + for filename in all_filenames: + if filename.stem.startswith("001001_headon"): + convert_terasim_to_wds(filename, output_wds_path, single_camera, av_id="BV_3.20") + +if __name__ == "__main__": + main() diff --git a/packages/terasim-cosmos/terasim_cosmos/convert_waymo_to_rds_hq.py b/packages/terasim-world/convert_waymo_to_rds_hq.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/convert_waymo_to_rds_hq.py rename to packages/terasim-world/convert_waymo_to_rds_hq.py index 41335fa..e623d6b 100644 --- a/packages/terasim-cosmos/terasim_cosmos/convert_waymo_to_rds_hq.py +++ b/packages/terasim-world/convert_waymo_to_rds_hq.py @@ -13,8 +13,8 @@ from waymo_open_dataset import dataset_pb2, label_pb2 from waymo_open_dataset.utils import frame_utils from google.protobuf import json_format -from .utils.wds_utils import write_to_tar, encode_dict_to_npz_bytes -from .utils.bbox_utils import interpolate_pose +from utils.wds_utils import write_to_tar, encode_dict_to_npz_bytes +from utils.bbox_utils import interpolate_pose WaymoProto2SemanticLabel = { label_pb2.Label.Type.TYPE_UNKNOWN: "Unknown", diff --git a/packages/terasim-cosmos/terasim_cosmos/create_t5_embed.py b/packages/terasim-world/create_t5_embed.py similarity index 98% rename from packages/terasim-cosmos/terasim_cosmos/create_t5_embed.py rename to packages/terasim-world/create_t5_embed.py index 7d081dd..8db49f4 100644 --- a/packages/terasim-cosmos/terasim_cosmos/create_t5_embed.py +++ b/packages/terasim-world/create_t5_embed.py @@ -101,7 +101,7 @@ def _encode_for_batch( @click.option( "--caption_file", type=str, - default=str(Path(__file__).parent / 'assets/waymo_caption.csv'), + default='./assets/waymo_caption.csv', help="Path to the folder containing caption files.", ) @click.option("--data_root", type=str, default="waymo_mv", help="Path to data root directory") diff --git a/packages/terasim-cosmos/terasim_cosmos/create_t5_embed_mv.py b/packages/terasim-world/create_t5_embed_mv.py similarity index 97% rename from packages/terasim-cosmos/terasim_cosmos/create_t5_embed_mv.py rename to packages/terasim-world/create_t5_embed_mv.py index e81086e..c402b2a 100644 --- a/packages/terasim-cosmos/terasim_cosmos/create_t5_embed_mv.py +++ b/packages/terasim-world/create_t5_embed_mv.py @@ -114,7 +114,7 @@ def _get_clip_id(video_path: Path) -> str: return "_" + video_path.stem.split("_")[-1] @click.command() -@click.option("--text_file", type=str, default=str(Path(__file__).parent / "assets/waymo_multiview_texts.json"), help="Path to JSON file containing text descriptions") +@click.option("--text_file", type=str, default="assets/waymo_multiview_texts.json", help="Path to JSON file containing text descriptions") @click.option("--data_root", type=str, default="waymo_mv", help="Path to data root directory") def main(text_file: str, data_root: str): """Main function: Process text and generate T5 embeddings""" diff --git a/packages/terasim-world/docs/processing_waymo_for_predict1.md b/packages/terasim-world/docs/processing_waymo_for_predict1.md new file mode 100644 index 0000000..212b1e3 --- /dev/null +++ b/packages/terasim-world/docs/processing_waymo_for_predict1.md @@ -0,0 +1,101 @@ +# Processing Waymo dataset for Cosmos-Predict1-SampleAV + +## Installation +If you haven't set up the data processing environment yet, follow our installation instructions [here](https://github.com/nv-tlabs/cosmos-av-sample-toolkits?tab=readme-ov-file#installation) to setup the environment. + +## PostTraining + +We provide a conversion and rendering script for the Waymo Open Dataset as an example of how information from another AV source can interface with the model. Note that our model is not trained on the Waymo dataset, and this script is intended to help users better understand our data format. As a result, a drop in generative video quality is expected. Finetuning on the desired custom dataset would be beneficial to improve quality. + +### Waymo Open Dataset +Parsing tfrecords from Waymo Open Dataset requires extra dependencies; install it with +```bash +pip install waymo-open-dataset-tf-2-11-0==1.6.1 +``` + +#### Step 0: Check Our Provided Captions +We provide auto-generated captions for the Waymo dataset at [`assets/waymo_caption.csv`](./assets/waymo_caption.csv). You will need these captions to run [**Cosmos-Transfer1-7B-Sample-AV**](https://github.com/nvidia-cosmos/cosmos-transfer1/blob/main/examples/inference_cosmos_transfer1_7b_sample_av.md). + +#### Step 1: Download Waymo Open Dataset + +Download the all the training & validation clips from [waymo perception dataset v1.4.2](https://waymo.com/open/download/) to the ``. + +If you have `sudo`, you can use [gcloud](https://cloud.google.com/storage/docs/discover-object-storage-gcloud) to download them from terminal. +
+gcloud installation (need sudo) and downloading from terminal + +```bash +sudo apt-get update +sudo apt-get install apt-transport-https ca-certificates gnupg curl +curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg +echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list +sudo apt-get update && sudo apt-get install google-cloud-cli +``` + +Then you can login your google account and download the above tfrecords via +```bash +# or use `gcloud init --no-launch-browser` if you are in a remote terminal session +gcloud init +bash download_waymo.sh config/waymo_all.json +``` +
+ +After downloading tfrecord files, we expect a folder structure as follows: +```bash + +|-- segment-10247954040621004675_2180_000_2200_000_with_camera_labels.tfrecord +|-- segment-11379226583756500423_6230_810_6250_810_with_camera_labels.tfrecord +|-- ... +`-- segment-1172406780360799916_1660_000_1680_000_with_camera_labels.tfrecord +``` + +> [!NOTE] +> If you download the tfrecord files from the console, you will have prefixes like `individual_files_training_` or `individual_files_validation_`. Make sure these prefixes are removed before further processing. + + +#### Step 2: Convert Waymo Open Dataset to RDS-HQ format + +Next, convert the Waymo Open Dataset to RDS-HQ format. Suppose you have a folder with Waymo Open Dataset's tfrecords, you can convert it to RDS-HQ format by: +```bash +python convert_waymo_to_rds_hq.py -i -o /videos -n 16 +``` +Here `` can be set to any folder you want, and number of workers can be changed from `16`. + +#### Step 3: Create T5 Text Embeddings +Lastly, we need to create T5 text embeddings. +Make sure you have completed Cosmos-predict1 installation and use the cosmos-predict1 environment for this step: +```bash +conda activate cosmos-predict1 +``` +We offer two set of captions, a more complete set of single view captions in `assets/waymo_caption.csv`, and a set of 5k multiview captions in `assets/waymo_multiview_texts.json`. +To use the 5k multiview captions in `assets/waymo_multiview_texts.json`: +```bash +python create_t5_embed.py --text_file ./assets/waymo_multiview_texts.json --data_root +``` +Alternatively, to use the single view captions in `assets/waymo_caption.csv`: +```bash +python create_t5_embed.py --caption_file ./assets/waymo_caption.csv --data_root +``` + +The resulting folder structure should look like this: +``` +/waymo/ +├── cache/ +│ ├── prefix_t5_embeddings_pinhole_front.pickle +│ ├── prefix_t5_embeddings_pinhole_front_left.pickle +│ ├── prefix_t5_embeddings_pinhole_front_right.pickle +│ ├── prefix_t5_embeddings_pinhole_side_left.pickle +│ └── prefix_t5_embeddings_pinhole_side_right.pickle +├── videos/ +│ ├── pinhole_front +│ ├── *.mp4 +│ ├── pinhole_front_left +│ ├── pinhole_front_right +│ ├── pinhole_side_left +│ ├── pinhole_side_right +│ ... +└── t5_xxl/ + ├── pinhole_front + └── *.pkl +``` +You are now ready to train cosmos-predict1 models on Waymo! diff --git a/packages/terasim-world/docs/processing_waymo_for_transfer1.md b/packages/terasim-world/docs/processing_waymo_for_transfer1.md new file mode 100644 index 0000000..53c5eb4 --- /dev/null +++ b/packages/terasim-world/docs/processing_waymo_for_transfer1.md @@ -0,0 +1,142 @@ +# Processing Waymo dataset for Cosmos-Transfer1-SampleAV + +## Installation +If you haven't set up the data processing environment yet, follow our installation instructions [here](https://github.com/nv-tlabs/cosmos-av-sample-toolkits?tab=readme-ov-file#installation) to setup the environment. + +## Inference + +We provide pre-rendered examples [here](https://huggingface.co/datasets/nvidia/Cosmos-Transfer1-7B-Sample-AV-Data-Example/tree/main/examples) (rendered HDMAP / rendered LiDAR / text prompts). You can download and use these examples to test [**Cosmos-Transfer1-7B-Sample-AV**](https://github.com/nvidia-cosmos/cosmos-transfer1)! + +## Installation +```bash +git clone https://github.com/nv-tlabs/cosmos-av-sample-toolkits.git +cd cosmos-av-sample-toolkits +conda env create -f environment.yaml +conda activate cosmos-av-toolkits +``` + +## Download Examples +We provide 10 examples of input prompts with HD map and LiDAR, to help test the model. +1. Add your SSH public key to your [user settings](https://huggingface.co/settings/keys) on Hugging Face. +2. Download the examples from [Hugging Face](https://huggingface.co/datasets/nvidia/Cosmos-Transfer1-7B-Sample-AV-Data-Example) (about 8GB): +```bash +git lfs install +git clone git@hf.co:datasets/nvidia/Cosmos-Transfer1-7B-Sample-AV-Data-Example +``` + +## Visualize Dataset +You can use `visualize_rds_hq.py` to visualize the RDS-HQ dataset. +```bash +python visualize_rds_hq.py -i -c +``` +This python script will launch a [viser](https://github.com/nerfstudio-project/viser) server to visualize the 3D HD map world with dynamic bounding boxes. You can use +- `w a s d` to control camera's position +- `q e` to control camera's z-axis coordinate + +## PostTraining + +We provide a conversion and rendering script for the Waymo Open Dataset as an example of how information from another AV source can interface with the model. Note that our model is not trained on the Waymo dataset, and this script is intended to help users better understand our data format. As a result, a drop in generative video quality is expected. Finetuning on the desired custom dataset would be beneficial to improve quality. + +### Waymo Open Dataset +Parsing tfrecords from Waymo Open Dataset requires extra dependencies; install it with +```bash +pip install waymo-open-dataset-tf-2-11-0==1.6.1 +``` + +#### Step 0: Check Our Provided Captions +We provide auto-generated captions for the Waymo dataset at [`assets/waymo_caption.csv`](./assets/waymo_caption.csv). You will need these captions to run [**Cosmos-Transfer1-7B-Sample-AV**](https://github.com/nvidia-cosmos/cosmos-transfer1/blob/main/examples/inference_cosmos_transfer1_7b_sample_av.md). + +#### Step 1: Download Waymo Open Dataset + +Download the all the training & validation clips from [waymo perception dataset v1.4.2](https://waymo.com/open/download/) to the ``. + +If you have `sudo`, you can use [gcloud](https://cloud.google.com/storage/docs/discover-object-storage-gcloud) to download them from terminal. +
+gcloud installation (need sudo) and downloading from terminal + +```bash +sudo apt-get update +sudo apt-get install apt-transport-https ca-certificates gnupg curl +curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg +echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list +sudo apt-get update && sudo apt-get install google-cloud-cli +``` + +Then you can login your google account and download the above tfrecords via +```bash +# or use `gcloud init --no-launch-browser` if you are in a remote terminal session +gcloud init +bash download_waymo.sh config/waymo_all.json +``` +
+ +After downloading tfrecord files, we expect a folder structure as follows: +```bash + +|-- segment-10247954040621004675_2180_000_2200_000_with_camera_labels.tfrecord +|-- segment-11379226583756500423_6230_810_6250_810_with_camera_labels.tfrecord +|-- ... +`-- segment-1172406780360799916_1660_000_1680_000_with_camera_labels.tfrecord +``` + +> [!NOTE] +> If you download the tfrecord files from the console, you will have prefixes like `individual_files_training_` or `individual_files_validation_`. Make sure these prefixes are removed before further processing. + + +#### Step 2: Convert Waymo Open Dataset to RDS-HQ format + +Next, convert the Waymo Open Dataset to RDS-HQ format. Suppose you have a folder with Waymo Open Dataset's tfrecords, you can convert it to RDS-HQ format by: +```bash +python convert_waymo_to_rds_hq.py -i -o /videos -n 16 +``` +Here `` can be set to any folder you want, and number of workers can be changed from `16`. + +#### Step 3: Render HD map + bounding box / LiDAR condition video from RDS-HQ format +For single view post-training, run the following command: +```bash +python render_from_rds_hq.py -d waymo -i /videos -o -c pinhole -p True -n 8 -rl True +``` +Or, for multiview training, run: +```bash +python render_from_rds_hq.py -d waymo_mv_short -i /videos -o -c pinhole -p True -n 8 -rl True +``` + +#### Step 4: Create T5 Text Embeddings +Lastly, we need to create T5 text embeddings. +Make sure to have completed Cosmos-transfer1 installation and use the cosmos-transfer1 environment for this step: +```bash +conda activate cosmos-transfer1 + +python create_t5_embed.py --caption_file ./assets/waymo_caption.csv --data_root +``` +The resulting folder structure should look like this if you are doing multiview training, or with only the `pinhole_front/` sub-folders if doing only front view training: +``` +/waymo/ +├── cache/ +│ ├── prefix_pinhole_front.pkl +│ ├── prefix_pinhole_front_left.pkl +│ ├── prefix_pinhole_front_right.pkl +│ ├── prefix_pinhole_side_left.pkl +│ └── prefix_pinhole_side_right.pkl +├── videos/ +│ ├── pinhole_front/ +│ │ └── *.mp4 +│ ├── pinhole_left/ +│ │ └── *.mp4 +│ ├── pinhole_front_right/ +│ │ └── *.mp4 +│ * +├── hdmap/ +├── ├── pinhole_front/ +│ │ └── *.mp4 +│ * +├── lidar/ +├── ├── pinhole_front/ +│ │ └── *.mp4 +│ * +└── t5_xxl/ + ├── pinhole_front + │ └── *.pkl + * +``` +You are now ready to train cosmos-transfer models on Waymo! \ No newline at end of file diff --git a/packages/terasim-world/environment.yaml b/packages/terasim-world/environment.yaml new file mode 100644 index 0000000..e922fbc --- /dev/null +++ b/packages/terasim-world/environment.yaml @@ -0,0 +1,27 @@ +name: cosmos-av-toolkits +channels: + - conda-forge +dependencies: + - python=3.10 + - conda-forge::ffmpeg + - numpy + - scipy + - click + - tqdm + - termcolor + - imageio + - trimesh + - pip: + - torch==2.4.0 --index-url=https://download.pytorch.org/whl/cu121 + - opencv-python-headless + - pymap3d + - einops + - pyproj + - webdataset + - imageio[ffmpeg] + - decord + - viser + - python-pycg + - ray[default] + - shapely + - transformers \ No newline at end of file diff --git a/packages/terasim-cosmos/terasim_cosmos/render_from_rds_hq.py b/packages/terasim-world/render_from_rds_hq.py similarity index 90% rename from packages/terasim-cosmos/terasim_cosmos/render_from_rds_hq.py rename to packages/terasim-world/render_from_rds_hq.py index 305fd1c..6cce99e 100644 --- a/packages/terasim-cosmos/terasim_cosmos/render_from_rds_hq.py +++ b/packages/terasim-world/render_from_rds_hq.py @@ -20,13 +20,13 @@ from pathlib import Path from termcolor import cprint, colored from pathlib import Path -from .utils.wds_utils import get_sample -from .utils.bbox_utils import create_bbox_projection, interpolate_bbox, fix_static_objects -from .utils.minimap_utils import create_minimap_projection, simplify_minimap -from .utils.pcd_utils import batch_move_points_within_bboxes_sparse, forward_warp_multiframes_sparse_depth_only -from .utils.camera.pinhole import PinholeCamera -from .utils.camera.ftheta import FThetaCamera -from .utils.ray_utils import ray_remote, wait_for_futures +from utils.wds_utils import get_sample +from utils.bbox_utils import create_bbox_projection, interpolate_bbox, fix_static_objects +from utils.minimap_utils import create_minimap_projection, simplify_minimap +from utils.pcd_utils import batch_move_points_within_bboxes_sparse, forward_warp_multiframes_sparse_depth_only +from utils.camera.pinhole import PinholeCamera +from utils.camera.ftheta import FThetaCamera +from utils.ray_utils import ray_remote, wait_for_futures USE_RAY = False @@ -118,8 +118,7 @@ def prepare_input(input_root, clip_id, settings, camera_type, post_training, res cprint(f"Ftheta intrinsic file does not exist: {intrinsic_file}", 'red') cprint(f"===> So we will use default ftheta intrinsic for rendering", 'yellow', attrs=['bold']) # intrinsic_file = 'config/default_ftheta_intrinsic.tar' - package_root = Path(__file__).parent - intrinsic_file = package_root / "assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar" + intrinsic_file = "assets/example/ftheta_intrinsic/2d23a1f4-c269-46aa-8e7d-1bb595d1e421_2445376400000_2445396400000.tar" if 'CAMERAS_TO_RDS_HQ' in settings: camera_name_in_rds_hq = settings['CAMERAS_TO_RDS_HQ'][camera_name] else: @@ -206,7 +205,6 @@ def prepare_output( # save HD map condition video output_writer = imageio_v1.get_writer( output_root_p / render_name / camera_folder_name / f"{clip_id}_{cur_idx}.mp4", - format='mp4', fps=TARGET_RENDER_FPS, codec="libx264", macro_block_size=None, # This makes sure num_frames is correct (by default it is rounded to 16x). @@ -233,9 +231,13 @@ def render_sample_hdmap( resize_resolution: tuple[int, int] = (1280, 720), cosmos_resolution: tuple[int, int] = (1280, 704), resize_last: bool = False, + distance_threshold: float = 100.0, # Maximum distance to render in meters ): """ - Render HD map projections. + Render HD map projections with distance filtering. + Args: + ... (existing args) ... + distance_threshold: Maximum distance in meters to render. Objects beyond this distance will be filtered out. """ print(f"Processing {clip_id} {camera_type} from {input_root}...") minimap_types = settings['MINIMAP_TYPES'] @@ -249,22 +251,51 @@ def render_sample_hdmap( for camera_name, camera_model in camera_name_to_camera_model.items(): cprint(f"Processing minimap projection for {clip_id} {camera_name}...", 'green', attrs=['bold']) pose_all_frames = camera_name_to_camera_poses[camera_name] + # camera_pose_initial_position = pose_all_frames[0][:3, 3] + camera_pose_last_position = pose_all_frames[-1][:3, 3] + minimaps_projection_merged = np.zeros((len(render_frame_ids), camera_model.height, camera_model.width, 3), dtype=np.uint8) for minimap_wds_file in minimap_wds_files: minimap_data_wo_meta_info, minimap_name = simplify_minimap(minimap_wds_file) - # Create projection with all data + # Filter minimap data by distance + filtered_minimap_data = [] + for point in minimap_data_wo_meta_info: + # Calculate distance from camera to each point + distances = np.linalg.norm(point - camera_pose_last_position, axis=1) + # Keep only points within distance threshold + mask = distances <= distance_threshold + if np.any(mask): + filtered_minimap_data.append(point[mask]) + + # Create projection with filtered data minimap_projection = create_minimap_projection( minimap_name, - minimap_data_wo_meta_info, + filtered_minimap_data, pose_all_frames[render_frame_ids], camera_model ) minimaps_projection_merged = np.maximum(minimaps_projection_merged, minimap_projection) - # Add bounding box projection to the minimap + # Filter and add bounding box projection to the minimap + filtered_object_info = {} + for frame_id in render_frame_ids: + frame_key = f"{frame_id:06d}.all_object_info.json" + if frame_key in all_object_info: + frame_objects = all_object_info[frame_key] + filtered_objects = {} + for obj, obj_information in frame_objects.items(): + # Extract object center from transformation matrix (last column, first 3 elements) + obj_center = np.array(obj_information['object_to_world'])[:3, 3] + # Calculate distance from camera to object center + distance = np.linalg.norm(obj_center - camera_pose_last_position) + if distance <= distance_threshold: + filtered_objects[obj] = obj_information + if filtered_objects: + filtered_object_info[frame_key] = filtered_objects + bounding_box_projection = create_bbox_projection( - all_object_info, + filtered_object_info, pose_all_frames, render_frame_ids, camera_model, @@ -480,9 +511,7 @@ def main(input_root, output_root, dataset, camera_type, skip, post_training, res print(f" -> 2. {colored('Center Crop', 'magenta', attrs=['bold'])} to {colored(cosmos_resolution, 'magenta', attrs=['bold'])}.") # Load settings - package_root = Path(__file__).parent - config_path = package_root / f'config/dataset_{dataset}.json' - with open(config_path, 'r') as file: + with open(f'config/dataset_{dataset}.json', 'r') as file: settings = json.load(file) # if novel_pose_folder is provided, we also change the output folder diff --git a/packages/terasim-world/street_view_analysis.py b/packages/terasim-world/street_view_analysis.py new file mode 100644 index 0000000..a87152e --- /dev/null +++ b/packages/terasim-world/street_view_analysis.py @@ -0,0 +1,201 @@ +import sumolib +import dotenv +import os +import requests +from openai import OpenAI +from pathlib import Path +import base64 +import xml.etree.ElementTree as ET + +# Load environment variables +dotenv.load_dotenv() + +class StreetViewRetrievalAndAnalysis: + """ + Class for retrieving and analyzing street view images using Google Street View API and GPT-4 Vision + """ + + def __init__(self): + """ + Initialize StreetViewRetrievalAndAnalysis + + Args: + google_maps_api_key: Google Maps API key for street view retrieval + openai_api_key: OpenAI API key for image analysis + """ + # Load API keys from environment if not provided + self.google_maps_api_key = os.getenv('GOOGLE_MAPS_API_KEY') + self.openai_api_key = os.getenv('OPENAI_API_KEY') + + if not self.google_maps_api_key: + raise ValueError("Google Maps API key is required") + if not self.openai_api_key: + raise ValueError("OpenAI API key is required") + + # Initialize OpenAI client + self.client = OpenAI(api_key=self.openai_api_key) + + def get_street_view_image(self, latitude: float, longitude: float, heading: int = 0, pitch: int = 0, fov: int = 90) -> bytes: + """ + Get a street view image from Google Street View API + + Args: + latitude: Latitude coordinate + longitude: Longitude coordinate + heading: Heading angle in degrees (0-360) + pitch: Pitch angle in degrees (-90 to 90) + fov: Field of view in degrees (10-120) + + Returns: + Image data as bytes + """ + url = f"https://maps.googleapis.com/maps/api/streetview" + params = { + 'size': '600x400', # Image size + 'location': f'{latitude},{longitude}', + 'heading': heading, + 'pitch': pitch, + 'fov': fov, + 'key': self.google_maps_api_key + } + + response = requests.get(url, params=params) + if response.status_code == 200: + return response.content + else: + raise Exception(f"Failed to get street view image: {response.status_code}") + + def analyze_image_with_llm(self, image_data_list: list) -> str: + """ + Analyze the image using GPT-4 Vision and generate environment description + + Args: + image_data_list: List of image data as bytes + + Returns: + Environment description as string + """ + # Convert images to base64 + base64_image_list = [base64.b64encode(image_data).decode('utf-8') for image_data in image_data_list] + + # Construct message content with multiple images + content = [ + { + "type": "text", + "text": "Please describe the environment and setting of this street view image. Focus on static elements like buildings, roads, vegetation, weather conditions, and overall atmosphere. Ignore any moving objects or people. This description will be used as a prompt for video generation." + }, + ] + + # Add each image to the content + for base64_image in base64_image_list: + content.append({ + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{base64_image}" + } + }) + + response = self.client.chat.completions.create( + model="gpt-4o", + messages=[{ + "role": "user", + "content": content + }], + max_tokens=500 + ) + + return response.choices[0].message.content + + def get_vehicle_position_view(self, path_to_fcd: Path, + vehicle_id: str, + timestep_start: int, + timestep_end: int, + timestep_interval: int = 10) -> list: + """ + Get vehicle position and angle data from FCD file + + Args: + path_to_fcd: Path to FCD XML file + vehicle_id: Vehicle ID to track + timestep_start: Starting timestep + timestep_end: Ending timestep + timestep_interval: Interval between timesteps + + Returns: + List of tuples (x, y, angle) for vehicle positions + """ + tree = ET.parse(path_to_fcd) + root = tree.getroot() + all_timesteps = list(root.findall("timestep")) + all_timesteps.sort(key=lambda x: float(x.get("time"))) + target_timestep_list = all_timesteps[timestep_start:timestep_end:timestep_interval] + + vehicle_position_angle_list = [] + for target_timestep in target_timestep_list: + for vehicle in target_timestep.findall("vehicle"): + if vehicle.get("id") == vehicle_id: + vehicle_position_angle_list.append(( + float(vehicle.get("x")), + float(vehicle.get("y")), + float(vehicle.get("angle")) + )) + return vehicle_position_angle_list + + def get_streetview_image_and_description(self, path_to_output: Path, + path_to_fcd: Path, + path_to_map: Path, + vehicle_id: str = None, + timestep_start: int = -40, + timestep_end: int = -1, + fov: int = 120) -> str: + """ + Get street view images and generate environment description + + Args: + path_to_output: Output directory path + path_to_fcd: Path to FCD XML file + path_to_map: Path to SUMO network file + vehicle_id: Vehicle ID to track + timestep_start: Starting timestep + timestep_end: Ending timestep + fov: Field of view for street view images + + Returns: + Environment description as string + """ + # Load SUMO network + sumo_net = sumolib.net.readNet(path_to_map) + + # Get vehicle positions + vehicle_position_angle_list = self.get_vehicle_position_view( + path_to_fcd=path_to_fcd, + vehicle_id=vehicle_id, + timestep_start=timestep_start, + timestep_end=timestep_end, + timestep_interval=timestep_end - timestep_start + 1 + ) + + # Convert coordinates to lat/lon + vehicle_lon_lat_angle_list = [] + for x, y, angle in vehicle_position_angle_list: + lon, lat = sumo_net.convertXY2LonLat(x, y) + vehicle_lon_lat_angle_list.append((lon, lat, angle)) + + # Get street view images + image_data_list = [] + for i, (lon, lat, angle) in enumerate(vehicle_lon_lat_angle_list): + image_data = self.get_street_view_image(lat, lon, heading=angle, fov=fov) + image_data_list.append(image_data) + + # Save image to file + with open(path_to_output / f"streetview_image_{i}.jpg", 'wb') as f: + f.write(image_data) + print(f"Street view image saved as {path_to_output} / streetview_image_{i}.jpg") + + # Generate environment description + description = self.analyze_image_with_llm(image_data_list) + with open(path_to_output / f"streetview_description.txt", 'w') as f: + f.write(description) + print(f"Environment description saved as {path_to_output} / streetview_description.txt") + + return description diff --git a/packages/terasim-world/terasim_to_cosmos_input.py b/packages/terasim-world/terasim_to_cosmos_input.py new file mode 100644 index 0000000..f25e5d1 --- /dev/null +++ b/packages/terasim-world/terasim_to_cosmos_input.py @@ -0,0 +1,90 @@ +from pathlib import Path +import json + +from convert_terasim_to_rds_hq import convert_terasim_to_wds +from render_from_rds_hq import render_sample_hdmap +from street_view_analysis import StreetViewRetrievalAndAnalysis + + +def terasim_to_cosmos_input(path_to_output: Path, + path_to_fcd: Path, + path_to_map: Path, + camera_setting_name: str = "default", + vehicle_id: str = None, + timestep_start: int = 0, + timestep_end: int = 100, + streetview_retrieval: bool = False): + + print(f"Processing fcd: {path_to_fcd}") + print(f"Processing map: {path_to_map}") + + if vehicle_id is None: + print("No vehicle id provided, trying to load from monitor.json") + try: + path_to_collition_record = path_to_output / "monitor.json" + with open(path_to_collition_record, "r") as f: + collision_record = json.load(f) + vehicle_id = collision_record["veh_1_id"] + print(f"Using vehicle id: {vehicle_id}") + except Exception as e: + raise Exception(f"Error loading monitor.json: {e}") + + if streetview_retrieval: + # Use the new class for street view retrieval and analysis + streetview_analyzer = StreetViewRetrievalAndAnalysis() + streetview_analyzer.get_streetview_image_and_description( + path_to_output=path_to_output, + path_to_fcd=path_to_fcd, + path_to_map=path_to_map, + vehicle_id=vehicle_id, + timestep_start=timestep_start, + timestep_end=timestep_end + ) + + convert_terasim_to_wds( + terasim_record_root=path_to_output, + path_to_fcd=path_to_fcd, + path_to_map=path_to_map, + output_wds_path=path_to_output / "wds", + single_camera=False, + camera_setting_name=camera_setting_name, + av_id=vehicle_id, + timestep_start=timestep_start, + timestep_end=timestep_end + ) + + if camera_setting_name == "waymo": + settings = json.load(open("config/dataset_waymo_mv.json", "r")) + elif camera_setting_name == "default": + settings = json.load(open("config/dataset_rds_hq_mv_terasim.json", "r")) + else: + raise ValueError(f"Invalid camera setting name: {camera_setting_name}") + + render_sample_hdmap( + input_root=path_to_output / "wds", + output_root=path_to_output / "render" / vehicle_id, + clip_id=path_to_output.stem, + settings=settings, + camera_type="ftheta", + ) + return True + + +if __name__ == "__main__": + # Example usage + path_to_output = Path("/path/to/terasim/output") # Replace with your TeraSim output directory + path_to_fcd = path_to_output / "fcd_all.xml" + path_to_map = path_to_output / "map.net.xml" + camera_setting_name = "default" # "waymo" or "default" + vehicle_id = None # Will auto-detect from monitor.json + timestep_start = -40 + timestep_end = -1 + + terasim_to_cosmos_input(path_to_output=path_to_output, + path_to_fcd=path_to_fcd, + path_to_map=path_to_map, + camera_setting_name=camera_setting_name, + vehicle_id=vehicle_id, + timestep_start=timestep_start, + timestep_end=timestep_end, + streetview_retrieval=True) diff --git a/packages/terasim-world/terasim_vis.py b/packages/terasim-world/terasim_vis.py new file mode 100644 index 0000000..a9ef85a --- /dev/null +++ b/packages/terasim-world/terasim_vis.py @@ -0,0 +1,31 @@ +import matplotlib +import matplotlib.animation as animation +import matplotlib.pyplot as plt + +import terasim_vis +matplotlib.use('Agg') +# Load net file and trajectory file +net = terasim_vis.Net("path/to/road/directory/map.net.xml") +trajectories = terasim_vis.Trajectories("path/to/road/directory/fcd_all.xml") +# Set trajectory color for different vehicles +for trajectory in trajectories: + if trajectory.id == "CAV": + trajectory.assign_colors_constant("#ff0000") + else: + trajectory.assign_colors_constant("#00FF00") + +# Show the generated trajectory video +fig, ax = plt.subplots() +ax.set_aspect('equal', adjustable='box') # same scale +artist_collection = net.plot(ax=ax) +plot_time_interaval = trajectories.timestep_range()[-100:] # only plot 10s before the end of the trajectories, can be modified later +a = animation.FuncAnimation( + fig, + trajectories.plot_points, + frames=plot_time_interaval, + interval=1, + fargs=(ax, True, artist_collection.lanes), + blit=False, +) +# plt.show() +a.save("test.mp4", writer=animation.FFMpegWriter(fps=10), dpi=300) diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/animation_utils.py b/packages/terasim-world/utils/animation_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/animation_utils.py rename to packages/terasim-world/utils/animation_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/bbox_utils.py b/packages/terasim-world/utils/bbox_utils.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/utils/bbox_utils.py rename to packages/terasim-world/utils/bbox_utils.py index 1e71739..6b0e72b 100644 --- a/packages/terasim-cosmos/terasim_cosmos/utils/bbox_utils.py +++ b/packages/terasim-world/utils/bbox_utils.py @@ -9,7 +9,7 @@ import numpy as np from tqdm import tqdm -from .minimap_utils import cuboid3d_to_polyline +from utils.minimap_utils import cuboid3d_to_polyline from scipy.spatial.transform import Rotation as R from scipy.spatial.transform import Slerp from pycg import Isometry diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/camera/base.py b/packages/terasim-world/utils/camera/base.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/utils/camera/base.py rename to packages/terasim-world/utils/camera/base.py index ff2b019..bbd97ec 100644 --- a/packages/terasim-cosmos/terasim_cosmos/utils/camera/base.py +++ b/packages/terasim-world/utils/camera/base.py @@ -9,7 +9,7 @@ import torch import numpy as np import cv2 -from ..pcd_utils import interpolate_polyline_to_points +from utils.pcd_utils import interpolate_polyline_to_points from typing import List, Union from abc import abstractmethod from shapely.geometry import Polygon, LineString diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/camera/ftheta.py b/packages/terasim-world/utils/camera/ftheta.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/utils/camera/ftheta.py rename to packages/terasim-world/utils/camera/ftheta.py index 3579e2b..a03ca25 100644 --- a/packages/terasim-cosmos/terasim_cosmos/utils/camera/ftheta.py +++ b/packages/terasim-world/utils/camera/ftheta.py @@ -15,7 +15,7 @@ from numpy.polynomial.polynomial import Polynomial from scipy.optimize import curve_fit -from .base import CameraBase +from utils.camera.base import CameraBase CropParams = TypeVar("CropParams") ScaleParams = TypeVar("ScaleParams") @@ -541,7 +541,7 @@ def pixel2ray_torch(self, pixels: torch.Tensor) -> torch.Tensor: rays (torch.Tensor): ray direction vector. shape: (M, 3) valid (torch.Tensor): bool flag indicating the validity of each backprojected pixel. shape: (M,) """ - # ensure the input shape is (n_points, 2) + # 确保输入形状为 (n_points, 2) if pixels.dim() == 1: pixels = pixels.unsqueeze(0) @@ -565,7 +565,7 @@ def pixel2ray_torch(self, pixels: torch.Tensor) -> torch.Tensor: rays[valid, 1] = sin_alpha[valid] * xd[valid, 1] / xd_norm[valid] rays[valid, 2] = torch.cos(alpha[valid]) - # for the invalid point set to (0,0,1) + # For the invalid point set to (0,0,1) rays[~valid, 0] = 0 rays[~valid, 1] = 0 rays[~valid, 2] = 1 @@ -588,7 +588,7 @@ def ray2pixel_np(self, rays: np.ndarray) -> np.ndarray: # Fix the type rays = rays.astype(np.float32) - # TODO(restes) combine 2 and 3 column norm for rays? (optional) + # TODO(restes) combine 2 and 3 column norm for rays? xy_norm = np.linalg.norm(rays[:, :2], axis=1, keepdims=True) cos_alpha = rays[:, 2:] / np.linalg.norm(rays, axis=1, keepdims=True) diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/camera/pinhole.py b/packages/terasim-world/utils/camera/pinhole.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/utils/camera/pinhole.py rename to packages/terasim-world/utils/camera/pinhole.py index 218683e..4263e3b 100644 --- a/packages/terasim-cosmos/terasim_cosmos/utils/camera/pinhole.py +++ b/packages/terasim-world/utils/camera/pinhole.py @@ -9,7 +9,7 @@ import torch import numpy as np -from .base import CameraBase +from utils.camera.base import CameraBase class PinholeCamera(CameraBase): def __init__(self, fx, fy, cx, cy, w, h, dtype=torch.float32, device=None): diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/deepmap_utils.py b/packages/terasim-world/utils/deepmap_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/deepmap_utils.py rename to packages/terasim-world/utils/deepmap_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/minimap_utils.py b/packages/terasim-world/utils/minimap_utils.py similarity index 99% rename from packages/terasim-cosmos/terasim_cosmos/utils/minimap_utils.py rename to packages/terasim-world/utils/minimap_utils.py index e7c466d..8b42014 100644 --- a/packages/terasim-cosmos/terasim_cosmos/utils/minimap_utils.py +++ b/packages/terasim-world/utils/minimap_utils.py @@ -12,7 +12,7 @@ from pathlib import Path from scipy.spatial.transform import Rotation as R from termcolor import cprint -from .wds_utils import get_sample +from utils.wds_utils import get_sample MINIMAP_TO_RGB = json.load(open(Path(__file__).parent.parent / 'config' /'hdmap_color_config.json')) diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/pcd_utils.py b/packages/terasim-world/utils/pcd_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/pcd_utils.py rename to packages/terasim-world/utils/pcd_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/post_training_utils.py b/packages/terasim-world/utils/post_training_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/post_training_utils.py rename to packages/terasim-world/utils/post_training_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/ray_utils.py b/packages/terasim-world/utils/ray_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/ray_utils.py rename to packages/terasim-world/utils/ray_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/utils/wds_utils.py b/packages/terasim-world/utils/wds_utils.py similarity index 100% rename from packages/terasim-cosmos/terasim_cosmos/utils/wds_utils.py rename to packages/terasim-world/utils/wds_utils.py diff --git a/packages/terasim-cosmos/terasim_cosmos/visualize_rds_hq.py b/packages/terasim-world/visualize_rds_hq.py similarity index 89% rename from packages/terasim-cosmos/terasim_cosmos/visualize_rds_hq.py rename to packages/terasim-world/visualize_rds_hq.py index 19a8996..1ee4bde 100644 --- a/packages/terasim-cosmos/terasim_cosmos/visualize_rds_hq.py +++ b/packages/terasim-world/visualize_rds_hq.py @@ -16,9 +16,9 @@ import json from pycg import Isometry -from .utils.wds_utils import write_to_tar, get_sample -from .utils.minimap_utils import simplify_minimap -from .utils.animation_utils import FreePoseAnimator, InterpType +from utils.wds_utils import write_to_tar, get_sample +from utils.minimap_utils import simplify_minimap +from utils.animation_utils import FreePoseAnimator, InterpType from pathlib import Path MINIMAP_TO_TYPE = json.load(open(Path(__file__).parent / 'config' /'hdmap_type_config.json')) @@ -214,33 +214,32 @@ def draw_bev_projection(gui_image_handler, client_camera_pose, label_to_line_seg def add_camera_frustums(server, camera_poses, current_frame_idx, all_cameras): """ - Add camera frustums to the viser server for all cameras at the current frame. - Different cameras are represented with different colors. + 为所有相机添加视锥体 Args: - server: viser server - camera_poses: camera poses - current_frame_idx: current frame index - all_cameras: all camera names + server: viser服务器 + camera_poses: 相机姿态数据 + current_frame_idx: 当前帧索引 + all_cameras: 所有相机名称列表 """ - # create frustums for each camera + # 为每个相机创建视锥体 for i, camera_name in enumerate(all_cameras): camera_pose = camera_poses[f'{current_frame_idx:06d}.pose.{camera_name}.npy'] camera_wxyz = tf.SE3.from_matrix(camera_pose).wxyz_xyz[:4] camera_position = camera_pose[:3, 3] - # set different colors based on the camera position - if i == 0: # front camera - color = np.array([1.0, 0, 0]) # red + # 根据相机位置设置不同的颜色 + if i == 0: # 前相机 + color = np.array([1.0, 0, 0]) # 红色 fov = 60 / 180 * np.pi - # elif i == 1: # left camera - # color = np.array([0, 1.0, 0]) # green + # elif i == 1: # 左相机 + # color = np.array([0, 1.0, 0]) # 绿色 # fov = 30 / 180 * np.pi - elif i == len(all_cameras) - 1: # back camera - color = np.array([0, 0, 1.0]) # blue + elif i == len(all_cameras) - 1: # 后相机 + color = np.array([0, 0, 1.0]) # 蓝色 fov = 30 / 180 * np.pi - else: # other cameras - color = np.array([1.0, 1.0, 0]) # yellow + else: # 其他相机 + color = np.array([1.0, 1.0, 0]) # 黄色 fov = 30 / 180 * np.pi server.scene.add_camera_frustum( @@ -257,18 +256,16 @@ def add_camera_frustums(server, camera_poses, current_frame_idx, all_cameras): @click.command() @click.option('--input_root', '-i', type=str, required=True, - help='The root directory of the webdataset (wds) folder') + help='The root directory of the webdataset') @click.option('--novel_pose_folder', '-np', type=str, default='novel_pose', help='The folder name of the novel pose data. If provided, we will render the novel ego trajectory') -@click.option('--dataset', '-d', type=str, default='rds_hq_mv_terasim', +@click.option('--dataset', '-d', type=str, default='rds_hq', help='The dataset name, "rds_hq" or "waymo"') -@click.option('--clip_id', '-c', type=str, help='clip id to visualize', required=True) +@click.option('--clip_id', '-c', type=str, help='clip id to visualize') def main(input_root, novel_pose_folder, dataset, clip_id): server = viser.ViserServer() - package_root = Path(__file__).parent - config_path = package_root / f'config/dataset_{dataset}.json' - with open(config_path, 'r') as file: + with open(f'config/dataset_{dataset}.json', 'r') as file: settings = json.load(file) label_to_line_segments = {} @@ -276,14 +273,14 @@ def main(input_root, novel_pose_folder, dataset, clip_id): camera_poses = get_sample(os.path.join(input_root, f"pose/{clip_id}.tar")) frame_num = len([x for x in camera_poses.keys() if x.endswith(f'pose.{all_cameras[0]}.npy')]) - # get the first camera position and pose of the 0th frame + # 获取第0帧的第一个相机位置和姿态 initial_camera_pose = camera_poses[f'000000.pose.{all_cameras[0]}.npy'] initial_camera_position = initial_camera_pose[:3, 3] initial_camera_wxyz = tf.SE3.from_matrix(initial_camera_pose).wxyz_xyz[:4] - # set the offset: add the offset to the first camera position - # offset: x=0, y=-2(back), z=3(up) - so the user's view is behind the first camera - camera_offset = np.array([0, -4, 3]) # can be adjusted as needed + # 设置偏移量:在第一个相机位置基础上添加偏移 + # 偏移量:x=0, y=-2(后方), z=3(上方) - 这样用户视角在第一个相机后方上方 + camera_offset = np.array([0, -4, 3]) # 可以根据需要调整 initial_camera_position_with_offset = initial_camera_position + camera_offset all_camera_to_front_camera = [ @@ -324,7 +321,7 @@ def main(input_root, novel_pose_folder, dataset, clip_id): ) gui_reset_to_first_camera_button = server.gui.add_button( "Reset to First Camera View", - hint="Reset camera view to current frame's first camera position and orientation", + hint="Reset camera view to first camera's initial position and orientation", ) gui_image_handler = server.gui.add_image( image = np.ones((bev_map_h_pixel, bev_map_w_pixel, 3), dtype=np.uint8) * 255, @@ -439,25 +436,13 @@ def _(event: viser.GuiEvent): assert client is not None try: - # get the current frame index - current_frame_idx = gui_frame_slider.value - - # get the first camera pose of the current frame - current_camera_pose = camera_poses[f'{current_frame_idx:06d}.pose.{all_cameras[0]}.npy'] - current_camera_position = current_camera_pose[:3, 3] - current_camera_wxyz = tf.SE3.from_matrix(current_camera_pose).wxyz_xyz[:4] - - # set the offset: add the offset to the first camera position - camera_offset = np.array([0, -4, 3]) # behind the camera - current_camera_position_with_offset = current_camera_position + camera_offset - for client_id, client in server.get_clients().items(): - client.camera.position = current_camera_position_with_offset - client.camera.wxyz = current_camera_wxyz - + client.camera.position = initial_camera_position_with_offset + client.camera.wxyz = initial_camera_wxyz + client.add_notification( title="Camera View Reset", - body=f"Camera view reset to frame {current_frame_idx} first camera position: {current_camera_position_with_offset}", + body=f"Camera view reset to first camera's initial position: {initial_camera_position_with_offset}", loading=False, with_close_button=True, auto_close=3000, @@ -559,7 +544,7 @@ def _(event: viser.GuiEvent): while-true loop for visualization """ prev_frame_idx = 0 - first_frame = True # mark if it is the first frame + first_frame = True # 标记是否是第一帧 while True: current_frame_idx = gui_frame_slider.value current_frame_idx_divisible_by_3 = current_frame_idx // 3 * 3 @@ -567,7 +552,7 @@ def _(event: viser.GuiEvent): label_to_line_segments['current_dynamic_objects'] = frame_idx_to_dynamic_object_line_segments[current_frame_idx_divisible_by_3] label_to_line_segments['ego_car'] = frame_idx_to_ego_car_line_segments[current_frame_idx] - # create frustums for all cameras + # 为所有相机创建视锥体 add_camera_frustums(server, camera_poses, current_frame_idx, all_cameras) # create bev projection for current frame diff --git a/packages/terasim/terasim/simulator.py b/packages/terasim/terasim/simulator.py index 79b5efb..17ed352 100644 --- a/packages/terasim/terasim/simulator.py +++ b/packages/terasim/terasim/simulator.py @@ -32,6 +32,7 @@ def __init__( self, sumo_config_file_path: str or Path, sumo_net_file_path: str or Path, + sumo_additional_file_path: str or Path = None, num_tries: int = 10, gui_flag: bool = False, output_path: str or Path = None, @@ -59,6 +60,7 @@ def __init__( """ self.sumo_net_file_path = Path(sumo_net_file_path) self.sumo_config_file_path = Path(sumo_config_file_path) + self.sumo_additional_file_path = Path(sumo_additional_file_path) if sumo_additional_file_path is not None else None assert self.sumo_net_file_path.exists(), "sumo_net_file_path does not exist" assert self.sumo_config_file_path.exists(), "sumo_config_file_path does not exist" self.sumo_net = sumolib.net.readNet(str(self.sumo_net_file_path), withInternal=True, withPrograms=True) @@ -79,7 +81,8 @@ def __init__( self.additional_sumo_args = ( [additional_sumo_args] if isinstance(additional_sumo_args, str) - else additional_sumo_args + else additional_sumo_args if additional_sumo_args is not None + else [] ) if seed is not None: self.additional_sumo_args += ["--seed", str(seed)] @@ -143,6 +146,8 @@ def start(self): "-c", str(self.sumo_config_file_path), ] + if self.sumo_additional_file_path is not None: + sumo_cmd += ["--additional-files", str(self.sumo_additional_file_path)] if self.step_length is not None: sumo_cmd += ["--step-length", str(self.step_length)] diff --git a/pyproject.toml b/pyproject.toml index de6e4e4..6799c4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,9 +8,7 @@ authors = [ readme = "README.md" license = "Apache-2.0" requires-python = ">=3.10,<3.13" -dependencies = [ - "terasim-cosmos", -] +dependencies = [] [tool.uv.workspace] members = [ @@ -19,8 +17,7 @@ members = [ "packages/terasim-service", "packages/terasim-envgen", "packages/terasim-datazoo", - "packages/terasim-vis", - "packages/terasim-cosmos" + "packages/terasim-vis" ] [tool.uv.sources] @@ -31,7 +28,6 @@ terasim-service = { workspace = true } terasim-envgen = { workspace = true } terasim-datazoo = { workspace = true } terasim-vis = { workspace = true } -terasim-cosmos = { workspace = true } [dependency-groups] dev = [ @@ -91,4 +87,4 @@ exclude_lines = [ "raise NotImplementedError", "if 0:", "if __name__ == .__main__.:" -] +] \ No newline at end of file diff --git a/scripts/run_experiments.py b/run_experiments.py similarity index 97% rename from scripts/run_experiments.py rename to run_experiments.py index 9dfd9d6..508a826 100644 --- a/scripts/run_experiments.py +++ b/run_experiments.py @@ -103,10 +103,10 @@ def run_simulation(config_file="examples/scenarios/police_pullover_case.yaml", a # Example 2: Run simulation with visualization result = run_simulation( - config_file="texas_example/test_configs/cutin.yaml", + config_file="/home/sdai/harry/TeraSim/jupiter/eb/test_config.yaml", enable_viz=True, # Enable visualization viz_port=8050, # Visualization port viz_update_freq=2 # Update every 2 simulation steps (reduce load) ) - print(f"Final simulation result: {result}") + print(f"Final simulation result: {result}") \ No newline at end of file diff --git a/scripts/run_experiments_debug.py b/run_experiments_debug.py similarity index 63% rename from scripts/run_experiments_debug.py rename to run_experiments_debug.py index ddfef20..a7b7732 100644 --- a/scripts/run_experiments_debug.py +++ b/run_experiments_debug.py @@ -1,8 +1,10 @@ import argparse +import random import hydra from loguru import logger from omegaconf import DictConfig, OmegaConf from pathlib import Path +from tqdm import tqdm from terasim.logger.infoextractor import InfoExtractor from terasim.simulator import Simulator @@ -29,8 +31,8 @@ def main(config_path: str) -> None: base_dir = Path(config.output.dir) / config.output.name / "raw_data" / config.output.nth base_dir.mkdir(parents=True, exist_ok=True) - env = NADEWithAV( # NADEWithAV or NADE - av_cfg = config.environment.parameters.AV_cfg, + env = NADEWithAV( + av_cfg=config.environment.parameters.AV_cfg, vehicle_factory=NDEVehicleFactory(cfg=config.environment.parameters), vru_factory=NDEVulnerableRoadUserFactory(cfg=config.environment.parameters), info_extractor=InfoExtractor, @@ -46,16 +48,23 @@ def main(config_path: str) -> None: # Paths already resolved in config sumo_net_file = config.input.sumo_net_file sumo_config_file = config.input.sumo_config_file + # sumo_additional_file = config.input.sumo_additional_file + sumo_additional_file = "./vTypeDistributions.add.xml" sim = Simulator( sumo_net_file_path=sumo_net_file, sumo_config_file_path=sumo_config_file, + sumo_additional_file_path=sumo_additional_file, num_tries=10, gui_flag=config.simulator.parameters.gui_flag, realtime_flag=config.simulator.parameters.realtime_flag, output_path=base_dir, - sumo_output_file_types=config.simulator.parameters.sumo_output_file_types, - traffic_scale=config.simulator.parameters.traffic_scale if hasattr(config.simulator.parameters, "traffic_scale") else 1, + sumo_output_file_types=["collision"], + traffic_scale=( + config.simulator.parameters.traffic_scale + if hasattr(config.simulator.parameters, "traffic_scale") + else 1 + ), additional_sumo_args=[ "--device.bluelight.explicit", "true", @@ -70,25 +79,22 @@ def main(config_path: str) -> None: if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Run TeraSim debug experiments with YAML configuration") - parser.add_argument( - "--config", - type=str, - default="configs/simulation/test.yaml", - help="Path to YAML configuration file (default: configs/simulation/test.yaml)" - ) - - args = parser.parse_args() - - # Convert to Path object and validate - config_path = Path(args.config) - if not config_path.exists(): - logger.error(f"Configuration file not found: {config_path}") - exit(1) - - if not config_path.suffix.lower() in ['.yaml', '.yml']: - logger.error(f"Configuration file must be a YAML file: {config_path}") - exit(1) - - logger.info(f"Running experiment with config: {config_path}") - main(str(config_path)) + # Get all yaml files in examples/scenarios directory + config_dir = Path(__file__).parent / "examples" / "scenarios" + # yaml_files = sorted(config_dir.glob("*.yaml"), key=lambda x: int(''.join(filter(str.isdigit, x.stem)) or '0')) + # yaml_files = ["examples/scenarios/cutin.yaml"] + yaml_files = [Path("/home/sdai/harry/TeraSim/jupiter/eb/test_config.yaml")] + # Randomly shuffle yaml files + random.shuffle(yaml_files) + + # Run experiments for each yaml file + for yaml_file in tqdm(yaml_files): + print(yaml_file) + logger.info(f"Running experiment with config: {yaml_file}") + main(str(yaml_file)) + # try: + # main(str(yaml_file)) + # except Exception as e: + # logger.error(f"Error running {yaml_file}: {e}") + # # yaml_file.unlink() # Delete the yaml file + # continue diff --git a/scripts/run_service.py b/run_service.py similarity index 100% rename from scripts/run_service.py rename to run_service.py diff --git a/scripts/convert_terasim_to_cosmos.py b/scripts/convert_terasim_to_cosmos.py deleted file mode 100644 index 8e06c83..0000000 --- a/scripts/convert_terasim_to_cosmos.py +++ /dev/null @@ -1,61 +0,0 @@ -from pathlib import Path -import sys -import argparse - -from terasim_cosmos import TeraSimToCosmosConverter - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Convert TeraSim simulation data to Cosmos-Drive compatible format" - ) - - # Required parameters - parser.add_argument("--path_to_output", type=Path, required=True, - help="Output directory path") - parser.add_argument("--path_to_fcd", type=Path, required=True, - help="Path to FCD (Floating Car Data) XML file") - parser.add_argument("--path_to_map", type=Path, required=True, - help="Path to SUMO network map XML file") - parser.add_argument("--time_start", type=float, required=True, - help="Start time in seconds") - parser.add_argument("--time_end", type=float, required=True, - help="End time in seconds") - parser.add_argument("--vehicle_id", type=str, required=True, - help="ID of the ego vehicle") - - # Optional parameters - parser.add_argument("--camera_setting_name", type=str, choices=["default", "waymo"], - default="default", - help="Camera configuration setting (default: %(default)s)") - parser.add_argument("--agent_clip_distance", type=float, default=80.0, - help="Distance threshold to show agents (default: %(default)s) meters") - parser.add_argument("--map_clip_distance", type=float, default=100.0, - help="Distance threshold to show map features (default: %(default)s) meters") - - # Processing options - parser.add_argument("--streetview_retrieval", action="store_true", - help="Retrieve street view imagery and generate text descriptions") - parser.add_argument("--no_streetview_retrieval", dest="streetview_retrieval", action="store_false", - help="Disable street view retrieval") - parser.set_defaults(streetview_retrieval=True) - - args = parser.parse_args() - - # Create config dictionary from command line arguments - config_dict = { - "path_to_output": str(args.path_to_output), - "path_to_fcd": str(args.path_to_fcd), - "path_to_map": str(args.path_to_map), - "camera_setting_name": args.camera_setting_name, - "vehicle_id": args.vehicle_id, - "time_start": args.time_start, - "time_end": args.time_end, - "agent_clip_distance": args.agent_clip_distance, - "map_clip_distance": args.map_clip_distance, - "streetview_retrieval": args.streetview_retrieval, - } - - # Create converter and run conversion - converter = TeraSimToCosmosConverter.from_config_dict(config_dict) - converter.convert() \ No newline at end of file diff --git a/scripts/generate_experiments.py b/scripts/generate_experiments.py deleted file mode 100755 index c47beed..0000000 --- a/scripts/generate_experiments.py +++ /dev/null @@ -1,384 +0,0 @@ -#!/usr/bin/env python3 -""" -TeraSim Experiment Generator - -Generate complete simulation scenarios from latitude/longitude coordinates. -This tool combines map downloading, format conversion, and traffic flow generation -to create ready-to-use simulation environments for autonomous vehicle testing. - -Usage Examples: - # Single scenario generation - python generate_experiments.py --lat 42.2775 --lon -83.7347 --bbox 500 --name ann_arbor - - # Batch generation from file - python generate_experiments.py --batch coordinates.txt --bbox 300 - - # Custom traffic densities - python generate_experiments.py --lat 30.2309 --lon -97.7335 --traffic low medium - - # Specify output directory and formats - python generate_experiments.py --lat 37.7749 --lon -122.4194 --output experiments/sf --formats sumo opendrive -""" - -import argparse -import json -import logging -import sys -from pathlib import Path -from typing import List, Tuple, Optional, Dict -import time - -try: - from terasim_envgen import IntegratedScenarioGenerator -except ImportError as e: - print(f"Error importing terasim_envgen: {e}") - print("Please ensure terasim-envgen is installed: poetry install") - sys.exit(1) - -# Configure logging -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger(__name__) - - -def parse_arguments(): - """Parse command line arguments.""" - parser = argparse.ArgumentParser( - description="Generate TeraSim simulation scenarios from geographic coordinates", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=__doc__ - ) - - # Input options (mutually exclusive) - input_group = parser.add_mutually_exclusive_group(required=True) - input_group.add_argument( - "--lat", - type=float, - help="Latitude of the center point for single scenario" - ) - input_group.add_argument( - "--batch", - type=str, - help="Path to file containing lat,lon pairs (one per line)" - ) - input_group.add_argument( - "--coordinates", - nargs="+", - type=float, - help="List of coordinates as: lat1 lon1 lat2 lon2 ..." - ) - - # Longitude (required with --lat) - parser.add_argument( - "--lon", - type=float, - help="Longitude of the center point (required with --lat)" - ) - - # Common parameters - parser.add_argument( - "--bbox", - type=int, - default=500, - help="Size of bounding box in meters (default: 500)" - ) - - parser.add_argument( - "--output", - type=str, - default="generated_experiments", - help="Output directory for generated files (default: generated_experiments)" - ) - - parser.add_argument( - "--name", - type=str, - help="Name for the scenario (auto-generated if not provided)" - ) - - parser.add_argument( - "--traffic", - nargs="+", - choices=["low", "medium", "high"], - default=["low", "medium", "high"], - help="Traffic density levels to generate (default: all)" - ) - - parser.add_argument( - "--formats", - nargs="+", - choices=["sumo", "opendrive", "lanelet2"], - default=["sumo"], - help="Map formats to convert to (default: sumo)" - ) - - parser.add_argument( - "--config", - type=str, - help="Path to configuration file for advanced settings" - ) - - parser.add_argument( - "--route", - type=str, - help="Path to file containing AV route coordinates (lat,lon per line)" - ) - - parser.add_argument( - "--verbose", - action="store_true", - help="Enable verbose logging" - ) - - parser.add_argument( - "--dry-run", - action="store_true", - help="Show what would be generated without actually generating" - ) - - return parser.parse_args() - - -def load_coordinates_from_file(filepath: str) -> List[Tuple[float, float]]: - """ - Load coordinates from a text file. - - Expected format: lat,lon (one pair per line) - Lines starting with # are treated as comments. - - Args: - filepath: Path to the coordinates file - - Returns: - List of (lat, lon) tuples - """ - coordinates = [] - - try: - with open(filepath, 'r') as f: - for line_num, line in enumerate(f, 1): - line = line.strip() - - # Skip empty lines and comments - if not line or line.startswith('#'): - continue - - # Parse lat,lon - try: - parts = line.split(',') - if len(parts) != 2: - logger.warning(f"Line {line_num}: Invalid format (expected 'lat,lon'): {line}") - continue - - lat = float(parts[0].strip()) - lon = float(parts[1].strip()) - coordinates.append((lat, lon)) - - except ValueError as e: - logger.warning(f"Line {line_num}: Could not parse coordinates: {line} ({e})") - continue - - except FileNotFoundError: - logger.error(f"Coordinates file not found: {filepath}") - sys.exit(1) - except Exception as e: - logger.error(f"Error reading coordinates file: {e}") - sys.exit(1) - - return coordinates - - -def load_route_from_file(filepath: str) -> Optional[List[Tuple[float, float]]]: - """Load AV route coordinates from file.""" - if not filepath: - return None - - return load_coordinates_from_file(filepath) - - -def generate_single_scenario( - generator: IntegratedScenarioGenerator, - lat: float, - lon: float, - args: argparse.Namespace, - scenario_name: Optional[str] = None -) -> Dict: - """ - Generate a single scenario. - - Args: - generator: The integrated scenario generator instance - lat: Latitude of center point - lon: Longitude of center point - args: Command line arguments - scenario_name: Optional name for the scenario - - Returns: - Dictionary with generation results - """ - # Load AV route if provided - av_route = load_route_from_file(args.route) if hasattr(args, 'route') else None - - # Use provided name or generate one - if not scenario_name: - scenario_name = args.name if args.name else f"scenario_{lat:.6f}_{lon:.6f}" - - logger.info(f"Generating scenario: {scenario_name}") - logger.info(f" Location: ({lat}, {lon})") - logger.info(f" Bounding box: {args.bbox}m") - logger.info(f" Traffic densities: {args.traffic}") - logger.info(f" Map formats: {args.formats}") - - if args.dry_run: - logger.info(" [DRY RUN] Would generate files to: %s/%s", args.output, scenario_name) - return {"status": "dry_run", "scenario_name": scenario_name} - - # Generate the scenario - start_time = time.time() - - try: - result = generator.generate_from_latlon( - lat=lat, - lon=lon, - bbox_size=args.bbox, - output_dir=args.output, - scenario_name=scenario_name, - traffic_densities=args.traffic, - convert_formats=args.formats, - av_route=av_route - ) - - elapsed_time = time.time() - start_time - logger.info(f" Generation completed in {elapsed_time:.2f} seconds") - - # Log generated files - if result.get("status") == "success": - logger.info(" Generated files:") - for category, files in result.get("generated_files", {}).items(): - if isinstance(files, dict): - logger.info(f" {category}:") - for key, value in files.items(): - logger.info(f" {key}: {value}") - else: - logger.info(f" {category}: {files}") - else: - logger.error(f" Generation failed: {result.get('error', 'Unknown error')}") - - except Exception as e: - logger.error(f" Error generating scenario: {e}") - result = {"status": "error", "error": str(e)} - - return result - - -def main(): - """Main function.""" - args = parse_arguments() - - # Set logging level - if args.verbose: - logging.getLogger().setLevel(logging.DEBUG) - - # Validate arguments - if args.lat is not None and args.lon is None: - logger.error("Longitude (--lon) is required when using --lat") - sys.exit(1) - - # Initialize generator - logger.info("Initializing TeraSim scenario generator...") - try: - generator = IntegratedScenarioGenerator(config_path=args.config) - except Exception as e: - logger.error(f"Failed to initialize generator: {e}") - sys.exit(1) - - # Determine coordinates to process - coordinates = [] - - if args.lat is not None: - # Single coordinate - coordinates = [(args.lat, args.lon)] - - elif args.batch: - # Load from file - logger.info(f"Loading coordinates from: {args.batch}") - coordinates = load_coordinates_from_file(args.batch) - logger.info(f"Loaded {len(coordinates)} coordinate pairs") - - elif args.coordinates: - # Parse from command line - if len(args.coordinates) % 2 != 0: - logger.error("Coordinates must be provided in lat,lon pairs") - sys.exit(1) - - coordinates = [ - (args.coordinates[i], args.coordinates[i+1]) - for i in range(0, len(args.coordinates), 2) - ] - logger.info(f"Processing {len(coordinates)} coordinate pairs") - - if not coordinates: - logger.error("No valid coordinates to process") - sys.exit(1) - - # Generate scenarios - logger.info("="*60) - logger.info(f"Starting generation of {len(coordinates)} scenario(s)") - logger.info("="*60) - - results = [] - success_count = 0 - - for i, (lat, lon) in enumerate(coordinates, 1): - logger.info(f"\n[{i}/{len(coordinates)}] Processing coordinates: ({lat}, {lon})") - - # Generate scenario name for batch processing - scenario_name = None - if len(coordinates) > 1: - scenario_name = f"batch_{i:03d}_{lat:.6f}_{lon:.6f}" - - result = generate_single_scenario(generator, lat, lon, args, scenario_name) - results.append(result) - - if result.get("status") == "success": - success_count += 1 - - # Summary - logger.info("\n" + "="*60) - logger.info("GENERATION SUMMARY") - logger.info("="*60) - logger.info(f"Total scenarios: {len(coordinates)}") - logger.info(f"Successful: {success_count}") - logger.info(f"Failed: {len(coordinates) - success_count}") - - if not args.dry_run: - # Save summary to file - summary_file = Path(args.output) / "generation_summary.json" - summary_file.parent.mkdir(parents=True, exist_ok=True) - - summary_data = { - "total_scenarios": len(coordinates), - "successful": success_count, - "failed": len(coordinates) - success_count, - "parameters": { - "bbox_size": args.bbox, - "traffic_densities": args.traffic, - "map_formats": args.formats, - "output_directory": args.output - }, - "results": results - } - - with open(summary_file, 'w') as f: - json.dump(summary_data, f, indent=2) - - logger.info(f"\nSummary saved to: {summary_file}") - - # Exit with appropriate code - sys.exit(0 if success_count == len(coordinates) else 1) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/visualize_fcd.py b/scripts/visualize_fcd.py deleted file mode 100644 index 53c57b6..0000000 --- a/scripts/visualize_fcd.py +++ /dev/null @@ -1,381 +0,0 @@ -#!/usr/bin/env python3 -import matplotlib.pyplot as plt -import matplotlib.animation as animation -import numpy as np -from pathlib import Path -import sys -import yaml - -from terasim_vis import Net, Trajectories - - -def load_config(config_path): - """Load configuration from YAML file.""" - config_path = Path(config_path) - - if not config_path.exists(): - print(f"Error: Configuration file {config_path} not found.") - sys.exit(1) - - try: - with open(config_path, 'r') as f: - config = yaml.safe_load(f) - - # Convert paths to Path objects - if config.get('fcd'): - config['fcd'] = Path(config['fcd']) - if config.get('net'): - config['net'] = Path(config['net']) - if config.get('save'): - config['save'] = Path(config['save']) - - # Handle output directory configuration - if config.get('output'): - output_config = config['output'] - if output_config.get('dir'): - output_config['dir'] = Path(output_config['dir']) - - # Set defaults for missing values - config.setdefault('start_time', 0) - config.setdefault('end_time', None) - config.setdefault('speed_colors', False) - config.setdefault('lane_colors', False) - config.setdefault('animate', False) - config.setdefault('dpi', 150) - config.setdefault('figsize', '12,8') - - return config - - except Exception as e: - print(f"Error loading configuration file: {e}") - sys.exit(1) - - -class TrafficVisualizer: - """Class for visualizing SUMO traffic simulation data.""" - - def __init__(self, net, trajectories, config): - """Initialize the visualizer with network, trajectories, and configuration.""" - self.net = net - self.trajectories = trajectories - self.config = config - self.fig = None - self.ax = None - self.target_trajectory = None - - def setup_plot(self): - """Set up the matplotlib figure and plot the network.""" - figsize = tuple(map(float, self.config['figsize'].split(","))) - self.fig, self.ax = plt.subplots(figsize=figsize) - - # Get map styling configuration - map_style = self.config.get('map_style', {}) - colors = map_style.get('colors', {}) - - # Then change the colors of road elements - lane_color = colors.get('lane_color', 'white') - lane_marking_color = colors.get('lane_marking_color', 'black') - # Plot the network with custom road colors - # First plot with default settings to get the network structure - self.net.plot( - self.ax, - style=map_style.get('style', 'EUR'), - zoom_to_extents=map_style.get('zoom_to_extents', True), - plot_stop_lines=map_style.get('plot_stop_lines', False), - lane_kwargs=dict(color=lane_color), - junction_kwargs=dict(color=lane_color), - tl_phases=map_style.get('tl_phases', None) - # lane_marking_kwargs=dict(color=lane_marking_color) - ) - - - self.ax.set_aspect('equal') - - # Apply custom view settings if not zooming to extents - if not map_style.get('zoom_to_extents', True): - self._set_custom_view(map_style.get('view', {})) - - # Optional title and labels based on config - if map_style.get('show_title', False): - title = map_style.get('title', 'SUMO Traffic Simulation Visualization') - self.ax.set_title(title) - - if map_style.get('show_labels', False): - self.ax.set_xlabel("X coordinate (m)") - self.ax.set_ylabel("Y coordinate (m)") - - # Hide ticks if not showing labels - if not map_style.get('show_labels', False): - self.ax.set_xticks([]) - self.ax.set_yticks([]) - - # Remove margins and padding to fill the entire display area - self.ax.margins(0) # Remove default margins around the plot - self.ax.set_aspect('equal', adjustable='box') # Maintain aspect ratio - - # Adjust the subplot to remove whitespace - plt.subplots_adjust(left=0, right=1, top=1, bottom=0) - - # Alternative: use tight_layout for automatic adjustment - # plt.tight_layout(pad=0) - - return self.fig, self.ax - - def _set_custom_view(self, view_config): - """Set custom view boundaries based on configuration.""" - width = view_config.get('width', 200) - height = view_config.get('height', 200) - - if view_config.get('center_on_ego', True) and self.target_trajectory: - # Center on ego vehicle's first position - if hasattr(self.target_trajectory, 'x') and len(self.target_trajectory.x) > 0: - center_x = self.target_trajectory.x[0] - center_y = self.target_trajectory.y[0] - else: - # Fallback to fixed center if ego trajectory not available - center_x = view_config.get('center_x', 0) - center_y = view_config.get('center_y', 0) - else: - # Use fixed center coordinates - center_x = view_config.get('center_x', 0) - center_y = view_config.get('center_y', 0) - - # Set view limits - half_width = width / 2 - half_height = height / 2 - - self.ax.set_xlim(center_x - half_width, center_x + half_width) - self.ax.set_ylim(center_y - half_height, center_y + half_height) - - def configure_trajectory_colors(self, ego_vehicle_id=None, adv_vehicle_id=None): - """Configure colors and markers for all trajectories.""" - # Find the target vehicle for following - if ego_vehicle_id: - for trajectory in self.trajectories: - if trajectory.id == ego_vehicle_id: - self.target_trajectory = trajectory - print(f"Found target vehicle (ego): {ego_vehicle_id}") - break - if not self.target_trajectory: - print(f"Warning: Ego vehicle {ego_vehicle_id} not found in trajectories") - - # Set up color scheme and marker properties for different vehicle types - for trajectory in self.trajectories: - # Highlight the ego vehicle (green) - if ego_vehicle_id and trajectory.id == ego_vehicle_id: - trajectory.assign_colors_constant("blue") # Green for ego vehicle - trajectory.point_plot_kwargs["color"] = "blue" - trajectory.point_plot_kwargs["markeredgecolor"] = "black" - trajectory.point_plot_kwargs["zorder"] = 300 # Higher z-order to show on top - # Highlight the adversarial vehicle (red) - elif adv_vehicle_id and trajectory.id == adv_vehicle_id: - trajectory.assign_colors_constant("red") # Red for adversarial vehicle - trajectory.point_plot_kwargs["color"] = "red" - trajectory.point_plot_kwargs["markeredgecolor"] = "black" - trajectory.point_plot_kwargs["zorder"] = 290 # High z-order but below ego - else: - # All other vehicles use gray color - trajectory.assign_colors_constant("gray") - trajectory.point_plot_kwargs["color"] = "gray" - trajectory.point_plot_kwargs["markeredgecolor"] = "black" - trajectory.point_plot_kwargs["zorder"] = 200 - # Set size, color for different vehicle types - vehicle_type = getattr(trajectory, 'type', '') - if 'ped' in vehicle_type.lower(): - trajectory.length = 1 - trajectory.width = 1 - trajectory.point_plot_kwargs["ms"] = 1 - elif 'bike' in vehicle_type.lower() or 'bicycle' in vehicle_type.lower(): - trajectory.length = 2 # Bicycles - trajectory.width = 1 - trajectory.point_plot_kwargs["ms"] = 1 - else: - trajectory.length = 4.8 # Regular vehicles - trajectory.width = 2 - trajectory.point_plot_kwargs["ms"] = 2 - - def plot_static_trajectories(self, speed_colors=False, lane_colors=False, ego_vehicle_id=None, adv_vehicle_id=None): - """Plot all trajectories as static lines.""" - if not speed_colors and not lane_colors and (ego_vehicle_id or adv_vehicle_id): - # Use special vehicle coloring scheme - self.configure_trajectory_colors(ego_vehicle_id, adv_vehicle_id) - else: - # Use original coloring scheme for static plots - for trajectory in self.trajectories: - if speed_colors: - trajectory.assign_colors_speed(cmap="viridis") - elif lane_colors: - trajectory.assign_colors_lane(cmap="tab10") - else: - # Assign colors based on vehicle type - vehicle_type = getattr(trajectory, 'type', '') - if 'bike' in vehicle_type.lower() or 'bicycle' in vehicle_type.lower(): - trajectory.assign_colors_constant("yellow") # Bicycles - elif trajectory.id.startswith("VRU_"): - trajectory.assign_colors_constant("blue") # Pedestrians - else: - trajectory.assign_colors_constant("red") # Regular vehicles - - for trajectory in self.trajectories: - trajectory.plot(self.ax, linewidth=1.5, alpha=0.7) - - # Add colorbar if using speed colors - if speed_colors and self.trajectories.mappables: - # Use the first trajectory's mappable for the colorbar - first_mappable = next(iter(self.trajectories.mappables.values())) - cbar = plt.colorbar(first_mappable, ax=self.ax, shrink=0.6) - cbar.set_label("Speed (m/s)") - - def create_animation(self, ego_vehicle_id=None, adv_vehicle_id=None): - """Create animated visualization with optional camera following.""" - # Configure trajectory colors and find target vehicle - self.configure_trajectory_colors(ego_vehicle_id, adv_vehicle_id) - - # Set trajectories timestep - self.trajectories.timestep = 0.1 - print(f"Trajectories timestep: {self.trajectories.timestep}") - print(f"Trajectories start: {self.trajectories.start}, end: {self.trajectories.end}") - - # Get timestep range - timestep_range = self.trajectories.timestep_range() - - # Filter frames to desired time range - start_time = self.config.get('start_time') - end_time = self.config.get('end_time') - - if start_time is not None or end_time is not None: - if start_time is None: - start_time = self.trajectories.start - if end_time is None: - end_time = self.trajectories.end - timestep_range = timestep_range[(timestep_range >= start_time) & (timestep_range <= end_time)] - - # Limit to max frames if desired - max_frames = self.config.get('max_frames') - if max_frames is not None: - timestep_range = timestep_range[:max_frames] - - print(f"Creating animation with {len(timestep_range)} frames") - print(f"Time range: {timestep_range[0]:.1f} to {timestep_range[-1]:.1f}") - - # Create animation function with camera following - def animate_with_follow(frame): - # Call original plot_points function - self.trajectories.plot_points(frame, self.ax, True) - - # Follow target vehicle if specified - if self.target_trajectory and frame in self.target_trajectory.time: - # Get vehicle position at current frame - frame_idx = self.target_trajectory.time.index(frame) - vehicle_x = self.target_trajectory.x[frame_idx] - vehicle_y = self.target_trajectory.y[frame_idx] - - # Set view to follow the vehicle with configured view size - map_style = self.config.get('map_style', {}) - view_config = map_style.get('view', {}) - width = view_config.get('width', 200) - height = view_config.get('height', 200) - - half_width = width / 2 - half_height = height / 2 - - self.ax.set_xlim(vehicle_x - half_width, vehicle_x + half_width) - self.ax.set_ylim(vehicle_y - half_height, vehicle_y + half_height) - - return self.ax.get_children() # Return artists for blitting - - if self.target_trajectory: - # Use custom animation function for following - anim = animation.FuncAnimation( - self.fig, animate_with_follow, - frames=timestep_range, - repeat=False, - interval=int(1000 * self.trajectories.timestep) if self.trajectories.timestep else 100, - blit=False # Disable blitting when changing view limits - ) - else: - # Use original approach when not following - anim = animation.FuncAnimation( - self.fig, self.trajectories.plot_points, - frames=timestep_range, - repeat=False, - interval=int(1000 * self.trajectories.timestep) if self.trajectories.timestep else 100, - fargs=(self.ax, True), - blit=True - ) - - # Store time_range for later use in saving - anim.time_range = timestep_range - return anim - - -def main(path_to_config): - """Main function.""" - config = load_config(path_to_config) - - print(f"Loading network from: {config['net']}") - net = Net(str(config['net'])) - - print(f"Loading trajectories from: {config['fcd']}") - trajectories = Trajectories(str(config['fcd']), - start_time=config['start_time'], - end_time=config['end_time'], - vehicle_only=config['vehicle_only'] if 'vehicle_only' in config else False) - print(f"Loaded {len(trajectories.trajectories)} trajectories") - - # Create visualizer instance - visualizer = TrafficVisualizer(net, trajectories, config) - visualizer.setup_plot() - - output_dir = Path(config['output_dir']) - output_dir.mkdir(parents=True, exist_ok=True) - - if config['animate']: - print("Creating animation...") - ego_vehicle_id = config.get('ego_vehicle_id') - adv_vehicle_id = config.get('adv_vehicle_id') - if ego_vehicle_id: - print(f"Camera will follow ego vehicle: {ego_vehicle_id}") - if adv_vehicle_id: - print(f"Highlighting adversarial vehicle: {adv_vehicle_id}") - anim = visualizer.create_animation(ego_vehicle_id, adv_vehicle_id) - - video_name = config.get('video_name', 'animation') - max_frames = config.get('max_frames') - if max_frames is not None: - video_name = f"{video_name}_{max_frames}" - save_path = output_dir/f"{video_name}.mp4" - - print(f"Saving animation to: {save_path}") - Writer = animation.writers['ffmpeg'] - writer = Writer(fps=8, metadata=dict(artist='TeraSim-Vis'), bitrate=3600) - print(f"Saving {len(anim.time_range)} frames at 8 fps...") - anim.save(str(save_path), writer=writer, dpi=config['dpi']) - print(f"Animation saved successfully!") - - else: - print("Creating static visualization...") - ego_vehicle_id = config.get('ego_vehicle_id') - adv_vehicle_id = config.get('adv_vehicle_id') - visualizer.plot_static_trajectories( - config['speed_colors'], config['lane_colors'], ego_vehicle_id, adv_vehicle_id) - save_path = output_dir/f"visualization.png" - print(f"Saving plot to: {save_path}") - plt.savefig(str(save_path), dpi=config['dpi'], bbox_inches='tight', pad_inches=0) - - print("Visualization complete!") - - -if __name__ == "__main__": - # path_to_config = "vis_configs/France_Paris_PedestrianCrossing.yaml" - # path_to_config = "vis_configs/Germany_Rossfeld_AggressiveMerge.yaml" - # path_to_config = "vis_configs/US_Arizona_HighwayCutin.yaml" - # path_to_config = "vis_configs/US_AnnArbor_RoundaboutFailToYield.yaml" - path_to_config = "vis_configs/US_SanDiego_RunRedLight.yaml" - # path_to_config = "vis_configs/US_Chicago_UncoordinatedLeftTurn.yaml" - # path_to_config = "vis_configs/Mcity_CyclistCrossing.yaml" - # path_to_config = "vis_configs/Mcity_PedestrianCrossing.yaml" - # path_to_config = "vis_configs/Mcity_UnprotectedLeftTurn.yaml" - # path_to_config = "vis_configs/US_AnnArbor_RoundaboutFailToYield.yaml" - # path_to_config = "vis_configs/Demo_AnnArborRoundabout.yaml" - main(path_to_config) \ No newline at end of file diff --git a/scripts/visualize_xodr_region.py b/scripts/visualize_xodr_region.py new file mode 100755 index 0000000..77a5e80 --- /dev/null +++ b/scripts/visualize_xodr_region.py @@ -0,0 +1,913 @@ +#!/usr/bin/env python3 +""" +OpenDRIVE Map Region Visualizer (SUMO Coordinate Mode) + +This script takes SUMO x, y coordinates and visualizes the corresponding +region in the original OpenDRIVE (.xodr) map file. + +The script reads the coordinate transformation (netOffset) from the SUMO +network file to convert SUMO coordinates back to OpenDRIVE coordinates. + +Usage: + python visualize_xodr_region.py [options] + +Author: TeraSim Team +License: MIT +""" + +import xml.etree.ElementTree as ET +import argparse +import logging +import math +import sys +from typing import List, Tuple, Optional +import matplotlib.pyplot as plt +import matplotlib.patches as patches +from matplotlib.path import Path +import numpy as np + +# Setup logging +logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') +logger = logging.getLogger(__name__) + +# Try to import pyOpenDRIVE for enhanced geometry +try: + from pyOpenDRIVE.OpenDriveMap import PyOpenDriveMap + PYOPENDRIVE_AVAILABLE = True + logger.info("pyOpenDRIVE is available - enhanced geometry processing enabled") +except ImportError: + PYOPENDRIVE_AVAILABLE = False + logger.warning("pyOpenDRIVE not available. Using XML parsing for basic visualization.") + + +class GeometryCalculator: + """Calculate positions along OpenDRIVE geometries""" + + @staticmethod + def line(s: float, x: float, y: float, hdg: float, length: float) -> Tuple[float, float, float]: + """Calculate position and heading on a line geometry""" + dx = s * math.cos(hdg) + dy = s * math.sin(hdg) + return x + dx, y + dy, hdg + + @staticmethod + def arc(s: float, x: float, y: float, hdg: float, length: float, curvature: float) -> Tuple[float, float, float]: + """Calculate position and heading on an arc geometry""" + if abs(curvature) < 1e-10: + return GeometryCalculator.line(s, x, y, hdg, length) + + radius = 1.0 / curvature + # Arc center + cx = x - radius * math.sin(hdg) + cy = y + radius * math.cos(hdg) + + # Angle along arc + angle = hdg - math.pi / 2 + s * curvature + + # Point on arc + px = cx + radius * math.cos(angle) + py = cy + radius * math.sin(angle) + + # Heading at this point + phdg = hdg + s * curvature + + return px, py, phdg + + @staticmethod + def spiral(s: float, x: float, y: float, hdg: float, length: float, + curv_start: float, curv_end: float) -> Tuple[float, float, float]: + """Calculate position and heading on a spiral (clothoid) - simplified approximation""" + # Simplified clothoid approximation using small segments + num_segments = max(10, int(length)) + if num_segments == 0: + return x, y, hdg + + segment_length = s / num_segments + + px, py = x, y + current_hdg = hdg + + for i in range(num_segments): + # Linear interpolation of curvature + t = i / num_segments + curvature = curv_start + t * (curv_end - curv_start) + + # Move along current heading + px += segment_length * math.cos(current_hdg) + py += segment_length * math.sin(current_hdg) + + # Update heading based on curvature + current_hdg += curvature * segment_length + + return px, py, current_hdg + + @staticmethod + def get_lateral_offset(x: float, y: float, hdg: float, lateral_offset: float) -> Tuple[float, float]: + """ + Calculate position offset laterally from centerline + Positive offset = left side, Negative offset = right side + """ + # Perpendicular direction (90 degrees to the left of heading) + perp_hdg = hdg + math.pi / 2 + offset_x = x + lateral_offset * math.cos(perp_hdg) + offset_y = y + lateral_offset * math.sin(perp_hdg) + return offset_x, offset_y + + +class XODRVisualizer: + """Visualize a region of an OpenDRIVE map""" + + def __init__(self, xodr_file: str, sumo_net_file: Optional[str] = None): + """ + Initialize visualizer with OpenDRIVE file + + Args: + xodr_file: Path to OpenDRIVE map file + sumo_net_file: Optional SUMO network file for coordinate transformation + """ + self.xodr_file = xodr_file + self.sumo_net_file = sumo_net_file + self.roads = [] + self.junction_roads = [] # Roads that are part of junctions + self.junctions = [] + + # Lane-level data + self.lanes = [] # List of lane geometries + self.lane_connections = [] # List of junction lane connections + + # Coordinate transformation from SUMO to OpenDRIVE + self.net_offset = (0.0, 0.0) # Default: no offset + + # Read offset from SUMO network file if provided + if sumo_net_file: + self._read_sumo_offset() + + # Parse the map + if PYOPENDRIVE_AVAILABLE: + self._parse_with_pyopendrive() + else: + self._parse_with_xml() + + def _read_sumo_offset(self): + """Read netOffset from SUMO network file""" + try: + tree = ET.parse(self.sumo_net_file) + root = tree.getroot() + + # Find location element with netOffset + location = root.find('location') + if location is not None: + net_offset_str = location.get('netOffset') + if net_offset_str: + parts = net_offset_str.split(',') + self.net_offset = (float(parts[0]), float(parts[1])) + logger.info(f"Read netOffset from SUMO file: ({self.net_offset[0]:.2f}, {self.net_offset[1]:.2f})") + + # Also read boundaries for reference + orig_boundary = location.get('origBoundary') + conv_boundary = location.get('convBoundary') + if orig_boundary: + logger.info(f" Original OpenDRIVE boundary: {orig_boundary}") + if conv_boundary: + logger.info(f" Converted SUMO boundary: {conv_boundary}") + else: + logger.warning("No netOffset found in SUMO network file") + else: + logger.warning("No location element found in SUMO network file") + except Exception as e: + logger.error(f"Error reading SUMO network file: {e}") + logger.info("Using default offset (0, 0)") + + def sumo_to_xodr(self, sumo_x: float, sumo_y: float) -> Tuple[float, float]: + """ + Convert SUMO coordinates to OpenDRIVE coordinates + + The conversion formula is: + xodr_x = sumo_x - offset_x + xodr_y = sumo_y - offset_y + + Args: + sumo_x: X coordinate in SUMO system + sumo_y: Y coordinate in SUMO system + + Returns: + Tuple of (xodr_x, xodr_y) in OpenDRIVE coordinate system + """ + xodr_x = sumo_x - self.net_offset[0] + xodr_y = sumo_y - self.net_offset[1] + return xodr_x, xodr_y + + def _parse_with_pyopendrive(self): + """Parse OpenDRIVE using pyOpenDRIVE library""" + try: + logger.info(f"Parsing {self.xodr_file} with pyOpenDRIVE...") + odr_map = PyOpenDriveMap.load_from_file(self.xodr_file) + + # Extract road geometries + for road_id in range(odr_map.get_num_roads()): + road = odr_map.get_road(road_id) + road_data = { + 'id': road.get_id(), + 'points': self._sample_road_centerline_pyodr(road) + } + self.roads.append(road_data) + + logger.info(f"Loaded {len(self.roads)} roads using pyOpenDRIVE") + except Exception as e: + logger.error(f"Error parsing with pyOpenDRIVE: {e}") + logger.info("Falling back to XML parsing...") + self._parse_with_xml() + + def _sample_road_centerline_pyodr(self, road, num_samples: int = 50) -> List[Tuple[float, float]]: + """Sample points along road centerline using pyOpenDRIVE""" + points = [] + length = road.get_length() + + for i in range(num_samples + 1): + s = (i / num_samples) * length + try: + x, y = road.get_xy(s) + points.append((x, y)) + except: + pass + + return points + + def _parse_with_xml(self): + """Parse OpenDRIVE using XML parsing""" + try: + logger.info(f"Parsing {self.xodr_file} with XML parser...") + tree = ET.parse(self.xodr_file) + root = tree.getroot() + + # First, collect all junction connecting road IDs + junction_road_ids = set() + for junction_elem in root.findall('.//junction'): + for connection in junction_elem.findall('connection'): + connecting_road_id = connection.get('connectingRoad') + if connecting_road_id: + junction_road_ids.add(connecting_road_id) + + # Parse roads + for road_elem in root.findall('.//road'): + road_id = road_elem.get('id', 'unknown') + junction_id = road_elem.get('junction', '-1') + + # Parse plan view geometries + points = [] + plan_view = road_elem.find('planView') + if plan_view is not None: + for geom in plan_view.findall('geometry'): + geom_points = self._parse_geometry(geom) + points.extend(geom_points) + + if points: + road_data = { + 'id': road_id, + 'points': points, + 'junction_id': junction_id + } + + # Separate junction roads from regular roads + if junction_id != '-1' or road_id in junction_road_ids: + self.junction_roads.append(road_data) + else: + self.roads.append(road_data) + + logger.info(f"Loaded {len(self.roads)} regular roads and {len(self.junction_roads)} junction roads using XML parser") + + # Parse lane-level geometries + self._parse_lanes_from_xml(root) + + # Parse junction connections for lane links + self._parse_junction_connections(root) + + except Exception as e: + logger.error(f"Error parsing XML: {e}") + raise + + def _parse_lanes_from_xml(self, root): + """Parse individual lane geometries from OpenDRIVE XML""" + try: + for road_elem in root.findall('.//road'): + road_id = road_elem.get('id', 'unknown') + junction_id = road_elem.get('junction', '-1') + + # Get road plan view geometries + plan_view = road_elem.find('planView') + if plan_view is None: + continue + + geometries = [] + for geom in plan_view.findall('geometry'): + geometries.append({ + 's': float(geom.get('s', 0)), + 'x': float(geom.get('x', 0)), + 'y': float(geom.get('y', 0)), + 'hdg': float(geom.get('hdg', 0)), + 'length': float(geom.get('length', 0)), + 'type': self._get_geometry_type(geom), + 'elem': geom + }) + + if not geometries: + continue + + # Get road length + road_length = float(road_elem.get('length', 0)) + + # Parse lanes from lane sections + lanes_elem = road_elem.find('lanes') + if lanes_elem is None: + continue + + for lane_section in lanes_elem.findall('laneSection'): + s_start = float(lane_section.get('s', 0)) + + # Find s_end (start of next section or road end) + s_end = road_length + + # Parse right lanes (negative IDs) + right_elem = lane_section.find('right') + if right_elem is not None: + for lane_elem in right_elem.findall('lane'): + lane_id = int(lane_elem.get('id', 0)) + lane_type = lane_elem.get('type', 'none') + + if lane_type in ['driving', 'biking', 'sidewalk']: # Only visualize drivable lanes + lane_data = self._create_lane_geometry( + road_id, lane_id, lane_type, junction_id, + geometries, lane_elem, s_start, s_end + ) + if lane_data: + self.lanes.append(lane_data) + + # Parse left lanes (positive IDs) + left_elem = lane_section.find('left') + if left_elem is not None: + for lane_elem in left_elem.findall('lane'): + lane_id = int(lane_elem.get('id', 0)) + lane_type = lane_elem.get('type', 'none') + + if lane_type in ['driving', 'biking', 'sidewalk']: + lane_data = self._create_lane_geometry( + road_id, lane_id, lane_type, junction_id, + geometries, lane_elem, s_start, s_end + ) + if lane_data: + self.lanes.append(lane_data) + + logger.info(f"Parsed {len(self.lanes)} individual lanes") + except Exception as e: + logger.error(f"Error parsing lanes: {e}") + # Don't raise - fall back to road-level visualization + + def _get_geometry_type(self, geom_elem): + """Determine geometry type from element""" + if geom_elem.find('line') is not None: + return 'line' + elif geom_elem.find('arc') is not None: + return 'arc' + elif geom_elem.find('spiral') is not None: + return 'spiral' + return 'unknown' + + def _create_lane_geometry(self, road_id, lane_id, lane_type, junction_id, geometries, lane_elem, s_start, s_end): + """Create lane boundary geometry""" + # Calculate actual lane boundaries + left_boundary = [] + right_boundary = [] + + # Get lane width elements + width_elements = lane_elem.findall('width') + if not width_elements: + return None + + # Sample points along the lane + num_samples = 20 + total_length = s_end - s_start + + for i in range(num_samples + 1): + # Position along lane section + s_local = (i / num_samples) * total_length + s_global = s_start + s_local + + # Find which geometry this s belongs to + geom = self._find_geometry_at_s(geometries, s_global) + if not geom: + continue + + # Calculate position and heading on centerline + s_in_geom = s_global - geom['s'] + px, py, phdg = self._evaluate_geometry(geom, s_in_geom) + + # Calculate lane width at this position + width = self._calculate_lane_width(width_elements, s_local) + + # Calculate cumulative offset for this lane + # For right lanes (negative ID), offset is negative (to the right) + # For left lanes (positive ID), offset is positive (to the left) + offset = self._calculate_lane_offset(lane_elem, lane_id, s_local) + + # Calculate lane boundaries + # Inner boundary (closer to centerline) + inner_x, inner_y = GeometryCalculator.get_lateral_offset(px, py, phdg, offset) + # Outer boundary (farther from centerline) + outer_x, outer_y = GeometryCalculator.get_lateral_offset(px, py, phdg, offset + width * (-1 if lane_id < 0 else 1)) + + if lane_id < 0: # Right side lanes + right_boundary.append((inner_x, inner_y)) + left_boundary.append((outer_x, outer_y)) + else: # Left side lanes + left_boundary.append((inner_x, inner_y)) + right_boundary.append((outer_x, outer_y)) + + if not left_boundary or not right_boundary: + return None + + return { + 'road_id': road_id, + 'lane_id': lane_id, + 'type': lane_type, + 'junction_id': junction_id, + 's_start': s_start, + 's_end': s_end, + 'left_boundary': left_boundary, + 'right_boundary': right_boundary + } + + def _find_geometry_at_s(self, geometries, s): + """Find which geometry element contains position s""" + for geom in geometries: + if geom['s'] <= s < geom['s'] + geom['length']: + return geom + # Return last geometry if s is beyond end + return geometries[-1] if geometries else None + + def _evaluate_geometry(self, geom, s): + """Evaluate geometry at position s""" + geom_elem = geom['elem'] + x, y, hdg = geom['x'], geom['y'], geom['hdg'] + length = geom['length'] + + line = geom_elem.find('line') + arc = geom_elem.find('arc') + spiral = geom_elem.find('spiral') + + if line is not None: + return GeometryCalculator.line(s, x, y, hdg, length) + elif arc is not None: + curvature = float(arc.get('curvature', 0)) + return GeometryCalculator.arc(s, x, y, hdg, length, curvature) + elif spiral is not None: + curv_start = float(spiral.get('curvStart', 0)) + curv_end = float(spiral.get('curvEnd', 0)) + return GeometryCalculator.spiral(s, x, y, hdg, length, curv_start, curv_end) + else: + return x, y, hdg + + def _calculate_lane_width(self, width_elements, s): + """Calculate lane width at position s using polynomial""" + # Find applicable width element + applicable_width = None + for width_elem in width_elements: + s_offset = float(width_elem.get('sOffset', 0)) + if s >= s_offset: + applicable_width = width_elem + + if not applicable_width: + applicable_width = width_elements[0] + + # Get polynomial coefficients + a = float(applicable_width.get('a', 0)) + b = float(applicable_width.get('b', 0)) + c = float(applicable_width.get('c', 0)) + d = float(applicable_width.get('d', 0)) + s_offset = float(applicable_width.get('sOffset', 0)) + + # Calculate width: width(ds) = a + b*ds + c*ds^2 + d*ds^3 + ds = s - s_offset + width = a + b*ds + c*ds**2 + d*ds**3 + + return abs(width) # Ensure positive width + + def _calculate_lane_offset(self, lane_elem, lane_id, s): + """Calculate cumulative offset from centerline to inner edge of this lane""" + # This is simplified - assumes we know offsets + # In reality, would need to sum widths of inner lanes + + # For simplicity, use a basic offset based on lane ID + # Full implementation would traverse all inner lanes + base_offset = abs(lane_id) * 3.5 # Assume ~3.5m per lane + + if lane_id < 0: # Right side + return -base_offset + else: # Left side + return base_offset + + def _generate_junction_colors(self, num_junctions): + """Generate distinct colors for each junction using HSV color space""" + import colorsys + colors = [] + for i in range(num_junctions): + # Use golden ratio for better color distribution + hue = (i * 0.618033988749895) % 1.0 + # Keep saturation high and value/brightness high for visibility + saturation = 0.7 + (i % 3) * 0.1 # Vary between 0.7-1.0 + value = 0.8 + (i % 2) * 0.2 # Vary between 0.8-1.0 + rgb = colorsys.hsv_to_rgb(hue, saturation, value) + # Convert to hex color + hex_color = '#{:02x}{:02x}{:02x}'.format( + int(rgb[0] * 255), + int(rgb[1] * 255), + int(rgb[2] * 255) + ) + colors.append(hex_color) + return colors + + def _parse_junction_connections(self, root): + """Parse junction connections to understand lane links""" + try: + for junction_elem in root.findall('.//junction'): + junction_id = junction_elem.get('id', 'unknown') + + for connection in junction_elem.findall('connection'): + incoming_road = connection.get('incomingRoad') + connecting_road = connection.get('connectingRoad') + contact_point = connection.get('contactPoint', 'start') + + for lane_link in connection.findall('laneLink'): + from_lane = int(lane_link.get('from', 0)) + to_lane = int(lane_link.get('to', 0)) + + self.lane_connections.append({ + 'junction_id': junction_id, + 'from_road': incoming_road, + 'from_lane': from_lane, + 'to_road': connecting_road, + 'to_lane': to_lane, + 'contact_point': contact_point + }) + + logger.info(f"Parsed {len(self.lane_connections)} lane connections in junctions") + except Exception as e: + logger.error(f"Error parsing junction connections: {e}") + + def _parse_geometry(self, geom_elem, num_samples: int = 20) -> List[Tuple[float, float]]: + """Parse a geometry element and sample points""" + s = float(geom_elem.get('s', 0)) + x = float(geom_elem.get('x', 0)) + y = float(geom_elem.get('y', 0)) + hdg = float(geom_elem.get('hdg', 0)) + length = float(geom_elem.get('length', 0)) + + points = [] + + # Check geometry type + line = geom_elem.find('line') + arc = geom_elem.find('arc') + spiral = geom_elem.find('spiral') + + if line is not None: + # Sample line + for i in range(num_samples + 1): + t = (i / num_samples) * length + px, py, phdg = GeometryCalculator.line(t, x, y, hdg, length) + points.append((px, py)) + + elif arc is not None: + # Sample arc + curvature = float(arc.get('curvature', 0)) + for i in range(num_samples + 1): + t = (i / num_samples) * length + px, py, phdg = GeometryCalculator.arc(t, x, y, hdg, length, curvature) + points.append((px, py)) + + elif spiral is not None: + # Sample spiral + curv_start = float(spiral.get('curvStart', 0)) + curv_end = float(spiral.get('curvEnd', 0)) + for i in range(num_samples + 1): + t = (i / num_samples) * length + px, py, phdg = GeometryCalculator.spiral(t, x, y, hdg, length, curv_start, curv_end) + points.append((px, py)) + else: + # Unknown geometry type, just add start point + points.append((x, y)) + + return points + + def visualize_region(self, center_x: float, center_y: float, + output_file: str = 'map_region.png', + size_pixels: int = 1000, + meters_per_pixel: float = 1.0, + use_sumo_coords: bool = False, + show_lanes: bool = False): + """ + Visualize a region of the map centered on (center_x, center_y) + + Args: + center_x: X coordinate of center point (meters, in SUMO or OpenDRIVE coords) + center_y: Y coordinate of center point (meters, in SUMO or OpenDRIVE coords) + output_file: Output PNG file path + size_pixels: Size of output image (width and height) + meters_per_pixel: Scale factor (default: 1 meter per pixel) + use_sumo_coords: If True, input coordinates are SUMO coords (convert to OpenDRIVE) + show_lanes: If True, show individual lanes and connections (experimental) + """ + # Convert SUMO coordinates to OpenDRIVE if needed + if use_sumo_coords: + xodr_x, xodr_y = self.sumo_to_xodr(center_x, center_y) + logger.info(f"Converting SUMO coords ({center_x:.2f}, {center_y:.2f}) " + f"to OpenDRIVE coords ({xodr_x:.2f}, {xodr_y:.2f})") + center_x, center_y = xodr_x, xodr_y + # Calculate bounds + half_size_meters = (size_pixels / 2.0) * meters_per_pixel + x_min = center_x - half_size_meters + x_max = center_x + half_size_meters + y_min = center_y - half_size_meters + y_max = center_y + half_size_meters + + logger.info(f"Visualizing region: ({x_min:.1f}, {y_min:.1f}) to ({x_max:.1f}, {y_max:.1f})") + logger.info(f"Center: ({center_x:.1f}, {center_y:.1f})") + logger.info(f"Size: {size_pixels}x{size_pixels} pixels ({half_size_meters*2:.1f}m x {half_size_meters*2:.1f}m)") + + # Create figure + dpi = 100 + fig_size = size_pixels / dpi + fig, ax = plt.subplots(figsize=(fig_size, fig_size), dpi=dpi) + + # Set limits + ax.set_xlim(x_min, x_max) + ax.set_ylim(y_min, y_max) + ax.set_aspect('equal') + + if show_lanes and self.lanes: + # Lane-level visualization + lanes_in_view = 0 + junction_lanes_in_view = 0 + + # Generate unique colors for each junction + unique_junctions = set() + for lane in self.lanes: + if lane['junction_id'] != '-1': + unique_junctions.add(lane['junction_id']) + + junction_colors = self._generate_junction_colors(len(unique_junctions)) + junction_color_map = {jid: color for jid, color in zip(sorted(unique_junctions), junction_colors)} + + # Define colors for different lane types + lane_colors = { + 'driving': '#888888', # Gray + 'biking': '#90EE90', # Light green + 'sidewalk': '#D3D3D3', # Light gray + } + + # Track junctions in view for legend + junctions_in_view = set() + + for lane in self.lanes: + # Check if lane has boundaries + if 'left_boundary' not in lane or 'right_boundary' not in lane: + continue + + left_boundary = lane['left_boundary'] + right_boundary = lane['right_boundary'] + + if not left_boundary or not right_boundary: + continue + + # Check if any points are in view + in_view = any( + x_min <= x <= x_max and y_min <= y <= y_max + for x, y in left_boundary + right_boundary + ) + + if not in_view: + continue + + # Determine color based on lane type and junction status + is_junction = lane['junction_id'] != '-1' + lane_type = lane['type'] + junction_id = lane['junction_id'] + + if is_junction: + # Use unique color for this junction + color = junction_color_map.get(junction_id, '#6495ED') + junctions_in_view.add(junction_id) + else: + # Use regular lane type color + color = lane_colors.get(lane_type, '#888888') + + # Create polygon: left boundary + reversed right boundary + polygon_points = left_boundary + list(reversed(right_boundary)) + + # Draw filled polygon + xs, ys = zip(*polygon_points) + ax.fill(xs, ys, color=color, alpha=0.7, edgecolor='black', linewidth=0.5) + + lanes_in_view += 1 + if is_junction: + junction_lanes_in_view += 1 + + logger.info(f"Drew {lanes_in_view} lanes ({junction_lanes_in_view} in junctions)") + logger.info(f"Unique junctions in view: {len(junctions_in_view)}") + + # Store junction info for legend + junctions_for_legend = junctions_in_view + junction_color_map_for_legend = junction_color_map + else: + # Initialize empty sets if not showing lanes + junctions_for_legend = set() + junction_color_map_for_legend = {} + + # Skip road-level visualization if showing lanes + if show_lanes and self.lanes: + roads_in_view = 0 + junctions_in_view_roads = 0 + else: + # Plot regular roads + roads_in_view = 0 + for road in self.roads: + points = road['points'] + if not points: + continue + + # Check if any points are in the view + in_view = any( + x_min <= x <= x_max and y_min <= y <= y_max + for x, y in points + ) + + if in_view: + roads_in_view += 1 + xs, ys = zip(*points) + ax.plot(xs, ys, 'k-', linewidth=2, alpha=0.7, label='Regular roads' if roads_in_view == 1 else '') + + # Plot junction roads with different color + junctions_in_view = 0 + for road in self.junction_roads: + points = road['points'] + if not points: + continue + + # Check if any points are in the view + in_view = any( + x_min <= x <= x_max and y_min <= y <= y_max + for x, y in points + ) + + if in_view: + junctions_in_view += 1 + xs, ys = zip(*points) + ax.plot(xs, ys, 'b-', linewidth=2, alpha=0.6, label='Junction roads' if junctions_in_view == 1 else '') + + # Draw lane connections if enabled + if show_lanes and self.lane_connections: + connections_drawn = 0 + for conn in self.lane_connections: + # Draw a line showing lane connectivity + # This would require finding the actual lane endpoints + connections_drawn += 1 + + if connections_drawn > 0: + logger.info(f"Drew {connections_drawn} lane connection indicators") + + # Mark center point + ax.plot(center_x, center_y, 'r+', markersize=15, markeredgewidth=2, + label=f'Center ({center_x:.1f}, {center_y:.1f})') + + # Add grid + ax.grid(True, alpha=0.3, linestyle='--') + + # Labels and title + ax.set_xlabel('X (m)', fontsize=8) + ax.set_ylabel('Y (m)', fontsize=8) + + # Update title based on visualization mode + if show_lanes and self.lanes: + title = f'OpenDRIVE Lane-Level View\n{size_pixels}x{size_pixels}px @ {meters_per_pixel}m/px' + else: + title = f'OpenDRIVE Map Region\n{size_pixels}x{size_pixels}px @ {meters_per_pixel}m/px' + ax.set_title(title, fontsize=10) + + # Create legend + if show_lanes and self.lanes and junctions_for_legend: + # Add junction color patches to legend + from matplotlib.patches import Patch + legend_elements = [Patch(facecolor='#888888', edgecolor='black', label='Regular lanes', alpha=0.7)] + + # Add up to 5 junctions to legend to avoid clutter + for i, jid in enumerate(sorted(junctions_for_legend)): + if i >= 5: # Limit to 5 junctions in legend + legend_elements.append(Patch(facecolor='gray', edgecolor='black', + label=f'... +{len(junctions_for_legend)-5} more junctions', alpha=0.5)) + break + color = junction_color_map_for_legend.get(jid, '#6495ED') + legend_elements.append(Patch(facecolor=color, edgecolor='black', + label=f'Junction {jid}', alpha=0.7)) + + ax.legend(handles=legend_elements, fontsize=7, loc='upper right') + else: + ax.legend(fontsize=7, loc='upper right') + + # Add scale bar + scale_length = 50 # meters + scale_x = x_min + (x_max - x_min) * 0.1 + scale_y = y_min + (y_max - y_min) * 0.05 + ax.plot([scale_x, scale_x + scale_length], [scale_y, scale_y], 'k-', linewidth=3) + ax.text(scale_x + scale_length/2, scale_y + (y_max-y_min)*0.02, + f'{scale_length}m', ha='center', fontsize=7) + + # Tight layout + plt.tight_layout(pad=0.5) + + # Save + plt.savefig(output_file, dpi=dpi, bbox_inches='tight', pad_inches=0.1) + logger.info(f"✓ Saved visualization to {output_file}") + logger.info(f" Regular roads visible: {roads_in_view}") + logger.info(f" Junction roads visible: {junctions_in_view}") + + plt.close() + + +def main(): + """Main entry point""" + parser = argparse.ArgumentParser( + description='Visualize OpenDRIVE map region using SUMO coordinates', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Using SUMO coordinates (reads netOffset from SUMO network file) + python visualize_xodr_region.py map.xodr map.net.xml 100 200 + + # Direct OpenDRIVE coordinates (no SUMO network file) + python visualize_xodr_region.py map.xodr - 384.6 0 + + # Custom output file and size + python visualize_xodr_region.py map.xodr map.net.xml 100 200 --output region.png --size 400 + + # Different scale (0.5 meters per pixel = zoomed in, more detail) + python visualize_xodr_region.py map.xodr map.net.xml 100 200 --scale 0.5 + """ + ) + + parser.add_argument('xodr_file', help='OpenDRIVE map file (.xodr)') + parser.add_argument('sumo_net_file', help='SUMO network file (.net.xml) for coordinate conversion, or "-" for direct OpenDRIVE coords') + parser.add_argument('x', type=float, help='X coordinate of center point (SUMO coords if net file provided, else OpenDRIVE coords)') + parser.add_argument('y', type=float, help='Y coordinate of center point (SUMO coords if net file provided, else OpenDRIVE coords)') + parser.add_argument('--output', '-o', default='map_region.png', + help='Output PNG file (default: map_region.png)') + parser.add_argument('--size', '-s', type=int, default=1000, + help='Image size in pixels (width=height, default: 1000)') + parser.add_argument('--scale', type=float, default=1.0, + help='Meters per pixel (default: 1.0)') + parser.add_argument('--lanes', action='store_true', + help='Show individual lanes and junction connections (experimental)') + parser.add_argument('--verbose', '-v', action='store_true', + help='Enable verbose logging') + + args = parser.parse_args() + + # Set logging level + if args.verbose: + logging.getLogger().setLevel(logging.DEBUG) + + # Validate inputs + if args.size <= 0: + logger.error("Size must be positive") + sys.exit(1) + + if args.scale <= 0: + logger.error("Scale must be positive") + sys.exit(1) + + # Determine if using SUMO coordinates + use_sumo_coords = args.sumo_net_file != '-' + sumo_net_file = args.sumo_net_file if use_sumo_coords else None + + # Create visualizer + try: + visualizer = XODRVisualizer(args.xodr_file, sumo_net_file) + visualizer.visualize_region( + center_x=args.x, + center_y=args.y, + output_file=args.output, + size_pixels=args.size, + meters_per_pixel=args.scale, + use_sumo_coords=use_sumo_coords, + show_lanes=args.lanes + ) + except FileNotFoundError as e: + logger.error(f"File not found: {e}") + sys.exit(1) + except Exception as e: + logger.error(f"Error: {e}") + if args.verbose: + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/scripts/xodr_to_sumo_converter.py b/scripts/xodr_to_sumo_converter.py index d1bd3b4..b877b5b 100644 --- a/scripts/xodr_to_sumo_converter.py +++ b/scripts/xodr_to_sumo_converter.py @@ -383,48 +383,61 @@ def _get_lane_width(self, lane_elem: ET.Element) -> float: def _is_highway_merge(self, junction_id: str, internal_road_ids: List[str]) -> bool: """ Check if a junction represents a highway merge scenario - + Highway merge criteria: 1. Exactly 2 incoming roads (main line + ramp) 2. Exactly 1 outgoing road (merged highway) - 3. Connecting road length > 150m (sufficient merge distance) - + 3. Different lane counts on incoming roads (asymmetric merge) + Returns: True if this is a highway merge, False otherwise """ incoming_roads = set() outgoing_roads = set() max_connecting_length = 0 - + incoming_lane_counts = {} + for road_id in internal_road_ids: if road_id not in self.road_map: continue - + road = self.road_map[road_id] - + # Track maximum connecting road length max_connecting_length = max(max_connecting_length, road.length) - + # Collect incoming roads (predecessors of connecting roads) if road.predecessor and road.predecessor['elementType'] == 'road': - incoming_roads.add(road.predecessor['elementId']) - + inc_road_id = road.predecessor['elementId'] + incoming_roads.add(inc_road_id) + # Track lane count of this connecting road (proxy for incoming road lanes) + lane_count = len(road.lanes_right) + len(road.lanes_left) + incoming_lane_counts[inc_road_id] = lane_count + # Collect outgoing roads (successors of connecting roads) if road.successor and road.successor['elementType'] == 'road': outgoing_roads.add(road.successor['elementId']) - + # Check highway merge criteria + # A merge is when 2 roads join into 1, regardless of length + # Additional check: asymmetric lane counts (e.g., 1-lane ramp merging with 3-lane highway) + is_asymmetric = False + if len(incoming_lane_counts) == 2: + lane_counts = list(incoming_lane_counts.values()) + is_asymmetric = lane_counts[0] != lane_counts[1] + is_merge = ( - len(incoming_roads) == 2 and - len(outgoing_roads) == 1 and - max_connecting_length > 150 + len(incoming_roads) == 2 and + len(outgoing_roads) == 1 and + (max_connecting_length > 50 or is_asymmetric) # Relaxed threshold: >50m OR asymmetric lanes ) - + if is_merge: logger.info(f"Junction {junction_id} identified as highway merge: " - f"incoming={incoming_roads}, outgoing={outgoing_roads}, " - f"max_length={max_connecting_length:.1f}m") - + f"incoming={incoming_roads} (lanes={incoming_lane_counts}), " + f"outgoing={outgoing_roads}, max_length={max_connecting_length:.1f}m, " + f"asymmetric={is_asymmetric}") + return is_merge def _determine_junction_type(self, junction_id: str, internal_road_ids: List[str]) -> str: @@ -479,12 +492,12 @@ def _create_nodes(self): # Collect all junction IDs referenced by roads referenced_junctions = set() junction_road_endpoints = {} # junction_id -> list of (x, y, road_id, position) - + # First pass: Identify junction connections and collect connection points for road_id, road in self.road_map.items(): if road.junction != '-1': continue # Skip junction internal roads - + # Check predecessor if road.predecessor and road.predecessor['elementType'] == 'junction': junction_id = road.predecessor['elementId'] @@ -494,11 +507,28 @@ def _create_nodes(self): if junction_id not in junction_road_endpoints: junction_road_endpoints[junction_id] = [] junction_road_endpoints[junction_id].append((start_pos[0], start_pos[1], road_id, 'start')) + elif road.predecessor and road.predecessor['elementType'] == 'road': + # Road-to-road connection - establish node mapping + pred_road_id = road.predecessor['elementId'] + contact_point = road.predecessor.get('contactPoint', 'start') + pred_node_key = f"{pred_road_id}_{contact_point}" + current_node_key = f"{road_id}_start" + + # Create node if it doesn't exist yet + if pred_node_key not in self.node_map: + pred_road = self.road_map.get(pred_road_id) + if pred_road: + node = self._create_road_endpoint_node(pred_road, contact_point) + self.node_map[pred_node_key] = node + self.node_map[current_node_key] = node + else: + # Node already exists, just link current road to it + self.node_map[current_node_key] = self.node_map[pred_node_key] else: # Create regular start node start_node = self._create_road_endpoint_node(road, 'start') self.node_map[f"{road_id}_start"] = start_node - + # Check successor if road.successor and road.successor['elementType'] == 'junction': junction_id = road.successor['elementId'] @@ -508,6 +538,21 @@ def _create_nodes(self): if junction_id not in junction_road_endpoints: junction_road_endpoints[junction_id] = [] junction_road_endpoints[junction_id].append((end_pos[0], end_pos[1], road_id, 'end')) + elif road.successor and road.successor['elementType'] == 'road': + # Road-to-road connection - establish node mapping + succ_road_id = road.successor['elementId'] + contact_point = road.successor.get('contactPoint', 'start') + succ_node_key = f"{succ_road_id}_{contact_point}" + current_node_key = f"{road_id}_end" + + # Create node if it doesn't exist yet + if current_node_key not in self.node_map: + node = self._create_road_endpoint_node(road, 'end') + self.node_map[current_node_key] = node + self.node_map[succ_node_key] = node + # If current_node_key already exists, link successor to it + elif succ_node_key not in self.node_map: + self.node_map[succ_node_key] = self.node_map[current_node_key] else: # Create regular end node end_node = self._create_road_endpoint_node(road, 'end') @@ -701,58 +746,54 @@ def _calculate_junction_center_from_internal_roads(self, internal_road_ids: List def _handle_highway_merge(self, junction_id: str, internal_road_ids: List[str]): """ - Handle highway merge by creating edges instead of junction - Creates: Junction A (merge start) -> Merge Edge (4 lanes) -> Junction B (merge end) + Handle highway merge by creating separate entry nodes and internal edges + Creates: Main Entry -> Internal Edge (main) -> Merge End + Ramp Entry -> Internal Edge (ramp) -> Merge End """ logger.info(f"Handling highway merge for junction {junction_id}") - + # Analyze the merge configuration merge_info = self._analyze_merge_roads(junction_id, internal_road_ids) if not merge_info: logger.error(f"Failed to analyze merge roads for junction {junction_id}") return - - # Create Junction A (merge start) - junction_a = self._create_merge_start_junction(junction_id, merge_info) - if junction_a: - self.nodes.append(junction_a) - self.node_map[f"merge_start_{junction_id}"] = junction_a.id - - # Create Junction B (merge end) - junction_b = self._create_merge_end_junction(junction_id, merge_info) - if junction_b: - self.nodes.append(junction_b) - self.node_map[f"merge_end_{junction_id}"] = junction_b.id - - # Mark junction as handled - but we need to be smarter about the mapping - # Incoming roads (main and ramp) should map to merge start - # Outgoing road should map to merge end - - # For roads ending at this junction (incoming), use merge start - for road_id, road in self.road_map.items(): - if road.successor and road.successor.get('elementId') == junction_id: - # This road ends at the junction - it's an incoming road - # It should connect to the merge start node - pass # Will be handled by the updated _get_road_to_node logic - if road.predecessor and road.predecessor.get('elementId') == junction_id: - # This road starts from the junction - it's an outgoing road - # It should connect to the merge end node - pass # Will be handled by the updated _get_road_from_node logic - - # Store a special marker for this junction + + # Create separate entry nodes for main road and ramp + main_entry = self._create_main_entry_node(junction_id, merge_info) + if main_entry: + self.nodes.append(main_entry) + self.node_map[f"main_entry_{junction_id}"] = main_entry.id + logger.info(f"Created main entry node: {main_entry.id}") + + ramp_entry = self._create_ramp_entry_node(junction_id, merge_info) + if ramp_entry: + self.nodes.append(ramp_entry) + self.node_map[f"ramp_entry_{junction_id}"] = ramp_entry.id + logger.info(f"Created ramp entry node: {ramp_entry.id}") + + # Create merge end junction (where both internal edges converge) + merge_end = self._create_merge_end_junction(junction_id, merge_info) + if merge_end: + self.nodes.append(merge_end) + self.node_map[f"merge_end_{junction_id}"] = merge_end.id + logger.info(f"Created merge end node: {merge_end.id}") + + # Store junction information self.node_map[junction_id] = f"merge_zone_{junction_id}" - - # Also store specific mappings for incoming and outgoing + + # Store detailed merge information self.highway_merges = getattr(self, 'highway_merges', {}) self.highway_merges[junction_id] = { - 'start_node': junction_a.id if junction_a else None, - 'end_node': junction_b.id if junction_b else None, + 'main_entry_node': main_entry.id if main_entry else None, + 'ramp_entry_node': ramp_entry.id if ramp_entry else None, + 'merge_end_node': merge_end.id if merge_end else None, 'merge_info': merge_info } - - logger.info(f"Created merge zone for junction {junction_id}: " - f"{junction_a.id if junction_a else 'None'} -> merge_zone_{junction_id} -> " - f"{junction_b.id if junction_b else 'None'}") + + logger.info(f"Created merge structure for junction {junction_id}: " + f"Main({main_entry.id if main_entry else 'None'}) + " + f"Ramp({ramp_entry.id if ramp_entry else 'None'}) -> " + f"End({merge_end.id if merge_end else 'None'})") def _analyze_merge_roads(self, junction_id: str, internal_road_ids: List[str]) -> Optional[dict]: """ @@ -820,8 +861,10 @@ def _analyze_merge_roads(self, junction_id: str, internal_road_ids: List[str]) - def _create_merge_start_junction(self, junction_id: str, merge_info: dict) -> Optional[PlainNode]: """Create the junction node at the merge start (where main road and ramp meet)""" + # This method is deprecated - we now create separate entry nodes for main and ramp + # Keeping for backward compatibility, but it won't be used main_road = merge_info['main_road'] - + # Use main road's end position as junction location if main_road.successor and main_road.successor['elementType'] == 'junction': end_pos = self._calculate_road_end(main_road) @@ -832,9 +875,45 @@ def _create_merge_start_junction(self, junction_id: str, merge_info: dict) -> Op y=end_pos[1], type="priority" ) - + logger.warning(f"Could not determine merge start position for junction {junction_id}") return None + + def _create_main_entry_node(self, junction_id: str, merge_info: dict) -> Optional[PlainNode]: + """Create the entry node for the main road""" + main_road = merge_info['main_road'] + + # Use main road's end position + if main_road.successor and main_road.successor['elementType'] == 'junction': + end_pos = self._calculate_road_end(main_road) + if end_pos: + return PlainNode( + id=f"j_main_entry_{junction_id}", + x=end_pos[0], + y=end_pos[1], + type="priority" + ) + + logger.warning(f"Could not determine main entry position for junction {junction_id}") + return None + + def _create_ramp_entry_node(self, junction_id: str, merge_info: dict) -> Optional[PlainNode]: + """Create the entry node for the ramp""" + ramp_road = merge_info['ramp_road'] + + # Use ramp road's end position + if ramp_road.successor and ramp_road.successor['elementType'] == 'junction': + end_pos = self._calculate_road_end(ramp_road) + if end_pos: + return PlainNode( + id=f"j_ramp_entry_{junction_id}", + x=end_pos[0], + y=end_pos[1], + type="priority" + ) + + logger.warning(f"Could not determine ramp entry position for junction {junction_id}") + return None def _create_merge_end_junction(self, junction_id: str, merge_info: dict) -> Optional[PlainNode]: """Create the junction node at the merge end (where merge zone meets outgoing road)""" @@ -1118,12 +1197,12 @@ def _get_road_from_node(self, road: OpenDriveRoad) -> Optional[str]: if road.predecessor['elementType'] == 'junction': # Road starts from a junction - elementId is the junction ID directly junction_id = road.predecessor['elementId'] - + # Check if this is a highway merge junction if hasattr(self, 'highway_merges') and junction_id in self.highway_merges: # This road is outgoing from a merge - use the merge end node - return self.highway_merges[junction_id]['end_node'] - + return self.highway_merges[junction_id]['merge_end_node'] + # Check if this junction has been converted to merge nodes if junction_id in self.node_map: mapped_node = self.node_map[junction_id] @@ -1138,21 +1217,33 @@ def _get_road_from_node(self, road: OpenDriveRoad) -> Optional[str]: # Road connects to another road - find the shared connection point pred_road_id = road.predecessor['elementId'] contact_point = road.predecessor.get('contactPoint', 'start') - if contact_point == 'end': - shared_node_key = f"{pred_road_id}_end" + + # Determine the canonical node key - use the predecessor road's contact point as primary + pred_node_key = f"{pred_road_id}_{contact_point}" + current_node_key = f"{road.id}_start" + + # Check if either node already exists + if pred_node_key in self.node_map: + # Predecessor's node already exists - use it and link current to it + shared_node = self.node_map[pred_node_key] + if current_node_key not in self.node_map: + self.node_map[current_node_key] = shared_node + return shared_node + elif current_node_key in self.node_map: + # Current road's start node already exists - use it and link predecessor to it + shared_node = self.node_map[current_node_key] + self.node_map[pred_node_key] = shared_node + return shared_node else: - shared_node_key = f"{pred_road_id}_start" - - # Use the shared node from the predecessor road - shared_node = self.node_map.get(shared_node_key) - if not shared_node: - # If the shared node doesn't exist, create it based on the predecessor road + # Neither exists - create node at predecessor road's contact point pred_road = self.road_map.get(pred_road_id) if pred_road: - position = 'end' if contact_point == 'end' else 'start' + position = contact_point shared_node = self._create_road_endpoint_node(pred_road, position) - self.node_map[shared_node_key] = shared_node - return shared_node + self.node_map[pred_node_key] = shared_node + self.node_map[current_node_key] = shared_node + return shared_node + return None # Road has no predecessor - use stored endpoint node (ensure it exists and is unique) node_key = f"{road.id}_start" if node_key not in self.node_map: @@ -1163,16 +1254,35 @@ def _get_road_from_node(self, road: OpenDriveRoad) -> Optional[str]: def _get_road_to_node(self, road: OpenDriveRoad) -> Optional[str]: """Get the to node for a road""" + # First check if this road's end node was already created by another road's predecessor link + # This handles cases where road A claims to end at a junction, but road B claims road A is its predecessor + current_node_key = f"{road.id}_end" + if current_node_key in self.node_map: + # Already mapped - use existing node (likely from another road's predecessor) + return self.node_map[current_node_key] + if road.successor: if road.successor['elementType'] == 'junction': # Road ends at a junction - elementId is the junction ID directly junction_id = road.successor['elementId'] - + # Check if this is a highway merge junction if hasattr(self, 'highway_merges') and junction_id in self.highway_merges: - # This road is incoming to a merge - use the merge start node - return self.highway_merges[junction_id]['start_node'] - + # This road is incoming to a merge - determine which entry node to use + merge_data = self.highway_merges[junction_id] + merge_info = merge_data['merge_info'] + main_road = merge_info.get('main_road') + ramp_road = merge_info.get('ramp_road') + + # Check if this road is the main road or ramp + if main_road and road.id == main_road.id: + return merge_data['main_entry_node'] + elif ramp_road and road.id == ramp_road.id: + return merge_data['ramp_entry_node'] + else: + logger.warning(f"Road {road.id} ends at merge junction {junction_id} but is neither main nor ramp") + return merge_data.get('main_entry_node', f"junction_{junction_id}") + # Check if this junction has been converted to merge nodes if junction_id in self.node_map: mapped_node = self.node_map[junction_id] @@ -1187,21 +1297,29 @@ def _get_road_to_node(self, road: OpenDriveRoad) -> Optional[str]: # Road connects to another road - find the shared connection point succ_road_id = road.successor['elementId'] contact_point = road.successor.get('contactPoint', 'start') - if contact_point == 'end': - shared_node_key = f"{succ_road_id}_end" + + # Determine the canonical node key - use the current road's end as primary + current_node_key = f"{road.id}_end" + succ_node_key = f"{succ_road_id}_{contact_point}" + + # Check if either node already exists + if current_node_key in self.node_map: + # Current road's end node already exists - use it and link successor to it + shared_node = self.node_map[current_node_key] + if succ_node_key not in self.node_map: + self.node_map[succ_node_key] = shared_node + return shared_node + elif succ_node_key in self.node_map: + # Successor's node already exists - use it and link current to it + shared_node = self.node_map[succ_node_key] + self.node_map[current_node_key] = shared_node + return shared_node else: - shared_node_key = f"{succ_road_id}_start" - - # Use the shared node from the successor road - shared_node = self.node_map.get(shared_node_key) - if not shared_node: - # If the shared node doesn't exist, create it based on the successor road - succ_road = self.road_map.get(succ_road_id) - if succ_road: - position = 'end' if contact_point == 'end' else 'start' - shared_node = self._create_road_endpoint_node(succ_road, position) - self.node_map[shared_node_key] = shared_node - return shared_node + # Neither exists - create node at current road's end + shared_node = self._create_road_endpoint_node(road, 'end') + self.node_map[current_node_key] = shared_node + self.node_map[succ_node_key] = shared_node + return shared_node # Road has no successor - use stored endpoint node (ensure it exists and is unique) node_key = f"{road.id}_end" if node_key not in self.node_map: @@ -1395,47 +1513,33 @@ def _create_edges(self): self._create_merge_edges() def _create_merge_edges(self): - """Create edges for highway merge zones""" + """Create edges for highway merge zones - now creates individual edges for each internal connecting road""" for junction_id, internal_road_ids in self.junction_roads.items(): # Only process highway merges if not self._is_highway_merge(junction_id, internal_road_ids): continue - - logger.info(f"Creating merge edge for highway merge junction {junction_id}") - + + logger.info(f"Creating internal lane edges for highway merge junction {junction_id}") + # Get merge configuration merge_info = self._analyze_merge_roads(junction_id, internal_road_ids) if not merge_info: - logger.error(f"Failed to create merge edge for junction {junction_id}") + logger.error(f"Failed to create merge edges for junction {junction_id}") continue - - # Find the main connecting road (the one from main road, not ramp) - # We should use the connecting road that comes from the main road (higher lane count) - main_connecting = None - main_road = merge_info.get('main_road') - - # Try to find the connecting road that follows the main road - for road_id, road in merge_info['connecting_roads'].items(): - # Check if this connecting road comes from the main road - if road.predecessor and main_road: - pred_id = road.predecessor.get('elementId') - if pred_id == main_road.id: - main_connecting = road - logger.debug(f"Selected connecting road {road_id} from main road {main_road.id}") - break - - if not main_connecting: - logger.error(f"No connecting road found for merge zone {junction_id}") - continue - - # Create 4-lane merge edge - merge_edge = self._build_merge_edge(junction_id, main_connecting, merge_info) - if merge_edge: - self.edges.append(merge_edge) - logger.info(f"Created merge edge {merge_edge.id} with {merge_edge.num_lanes} lanes") - - # # Create lane mappings for junction internal roads to merge zone - # self._create_merge_zone_lane_mappings(junction_id, merge_info) + + # Create individual edges for each internal connecting road (lane) + connecting_roads = merge_info.get('connecting_roads', {}) + edges_created = 0 + + for road_id, connecting_road in connecting_roads.items(): + # Create an edge for this internal connecting road + internal_edge = self._build_internal_lane_edge(junction_id, connecting_road, merge_info) + if internal_edge: + self.edges.append(internal_edge) + edges_created += 1 + logger.info(f"Created internal edge {internal_edge.id} with {internal_edge.num_lanes} lane(s)") + + logger.info(f"Created {edges_created} internal lane edges for junction {junction_id}") def _build_merge_edge(self, junction_id: str, main_connecting: OpenDriveRoad, merge_info: dict) -> Optional[PlainEdge]: """Build a 4-lane merge edge from connecting road geometry""" @@ -1559,7 +1663,98 @@ def trim_shape(points, trim_dist): shape=shape_points if len(shape_points) >= 2 else None, lane_data=lane_data ) - + + def _build_internal_lane_edge(self, junction_id: str, connecting_road: OpenDriveRoad, merge_info: dict) -> Optional[PlainEdge]: + """Build an edge for an internal connecting road (lane) within a junction""" + + # Determine which incoming road this connecting road comes from + predecessor_id = connecting_road.predecessor.get('elementId') if connecting_road.predecessor else None + successor_id = connecting_road.successor.get('elementId') if connecting_road.successor else None + + main_road = merge_info.get('main_road') + ramp_road = merge_info.get('ramp_road') + outgoing_road = merge_info.get('outgoing_road') + + # Determine the from node based on which road this connecting road comes from + from_node = None + if predecessor_id: + if main_road and predecessor_id == main_road.id: + # This connecting road comes from the main road + from_node = f"j_main_entry_{junction_id}" + logger.debug(f"Connecting road {connecting_road.id} starts from main entry") + elif ramp_road and predecessor_id == ramp_road.id: + # This connecting road comes from the ramp + from_node = f"j_ramp_entry_{junction_id}" + logger.debug(f"Connecting road {connecting_road.id} starts from ramp entry") + else: + logger.warning(f"Connecting road {connecting_road.id} has unexpected predecessor {predecessor_id}") + + # Determine the to node - all internal edges end at the merge end + to_node = None + if successor_id: + if outgoing_road and successor_id == outgoing_road.id: + to_node = f"j_merge_end_{junction_id}" + logger.debug(f"Connecting road {connecting_road.id} ends at merge end") + else: + logger.warning(f"Connecting road {connecting_road.id} has unexpected successor {successor_id}") + to_node = f"j_merge_end_{junction_id}" + + # Fallback if nodes not determined + if not from_node: + logger.warning(f"Could not determine from_node for connecting road {connecting_road.id}, using main entry") + from_node = f"j_main_entry_{junction_id}" + if not to_node: + logger.warning(f"Could not determine to_node for connecting road {connecting_road.id}, using merge end") + to_node = f"j_merge_end_{junction_id}" + + # Check if nodes exist + if from_node not in [n.id for n in self.nodes] or to_node not in [n.id for n in self.nodes]: + logger.error(f"Nodes not found for connecting road {connecting_road.id} in junction {junction_id}: from={from_node}, to={to_node}") + return None + + # Get geometry from connecting road + if self.use_pyopendrive and connecting_road.id in self.py_roads: + shape_points = self._get_road_centerline_pyopendrive(connecting_road.id, eps=0.5) + else: + shape_points = self._generate_road_shape(connecting_road) + + # Get lane information from the connecting road + num_lanes = len(connecting_road.lanes_right) if connecting_road.lanes_right else 1 + + # Prepare lane data + lane_data = [] + for i, lane in enumerate(connecting_road.lanes_right): + lane_dict = { + 'width': lane.get('width', 3.66), + } + lane_type = self._decode_if_bytes(lane.get('type', 'driving')) + if lane_type == 'shoulder': + lane_dict['type'] = 'shoulder' + lane_dict['disallow'] = 'all' + lane_data.append(lane_dict) + + # Create lane mapping + opendrive_lane_id = lane['id'] + edge_id = f"internal_{junction_id}_{connecting_road.id}" + mapping_key = (connecting_road.id, opendrive_lane_id, 'forward') + self.lane_mapping[mapping_key] = (edge_id, i) + + # Get speed from the connecting road or use default + speed = connecting_road.speed_limit if hasattr(connecting_road, 'speed_limit') else 13.89 + + # Create the internal edge + return PlainEdge( + id=f"internal_{junction_id}_{connecting_road.id}", + from_node=from_node, + to_node=to_node, + num_lanes=num_lanes, + speed=speed, + name=f"Internal lane {connecting_road.id} in junction {junction_id}", + type="highway_merge_internal", + shape=shape_points if shape_points and len(shape_points) >= 2 else None, + lane_data=lane_data if lane_data else None + ) + def _create_connections(self): """Create Plain XML connections using connecting road geometry as via points""" total_connections = 0 @@ -1811,125 +2006,144 @@ def _trace_lane_successor(self, road: OpenDriveRoad, lane_id: int) -> Optional[i return lane_id def _create_merge_connections(self, junction_id: str): - """Create connections for highway merge zones using OpenDRIVE definitions""" + """Create connections for highway merge zones using individual internal edges""" logger.info(f"Creating merge connections for junction {junction_id}") - + # Get merge configuration if junction_id not in self.junction_roads: logger.error(f"No junction roads found for merge {junction_id}") return - + merge_info = self._analyze_merge_roads(junction_id, self.junction_roads[junction_id]) if not merge_info: logger.error(f"Failed to analyze merge for connections {junction_id}") return - + main_road = merge_info['main_road'] ramp_road = merge_info['ramp_road'] outgoing_road = merge_info['outgoing_road'] - + # Build connection chains from OpenDRIVE data connection_chains = self._build_junction_connection_chains(junction_id) - - # Create merge zone edge reference - merge_edge = f"merge_zone_{junction_id}" - - # Process connections using established lane mappings + + # Create connections: incoming roads -> internal edges -> outgoing road for incoming_road_id, chains in connection_chains.items(): # Get the incoming edge incoming_edge_id = f"{incoming_road_id}.0" incoming_edge_obj = next((e for e in self.edges if e.id == incoming_edge_id), None) - + if not incoming_edge_obj: logger.warning(f"Incoming edge {incoming_edge_id} not found for merge connections") continue - + for chain in chains: from_lane_id = chain['from_lane'] connecting_road_id = chain['connecting_road'] connecting_lane_id = chain['connecting_lane'] - - # Get lane mappings using the established system - # 1. From incoming road to connecting road (via normal mapping) + outgoing_road_id = chain['outgoing_road'] + outgoing_lane_id = chain['final_lane'] + + # Get the internal edge for this connecting road + internal_edge_id = f"internal_{junction_id}_{connecting_road_id}" + internal_edge_obj = next((e for e in self.edges if e.id == internal_edge_id), None) + + if not internal_edge_obj: + logger.warning(f"Internal edge {internal_edge_id} not found for connecting road {connecting_road_id}") + continue + + # Get lane mappings + # 1. From incoming road lane to SUMO lane from_mapping = self._get_sumo_lane_index(incoming_road_id, from_lane_id, 'forward') - - # 2. From connecting road to merge zone (via our new mapping) - to_mapping = self._get_sumo_lane_index(connecting_road_id, connecting_lane_id, 'forward') - + + # 2. From connecting road lane to internal edge lane + internal_mapping = self._get_sumo_lane_index(connecting_road_id, connecting_lane_id, 'forward') + + # 3. From outgoing road lane to SUMO lane + to_mapping = self._get_sumo_lane_index(outgoing_road_id, outgoing_lane_id, 'forward') + if not from_mapping: logger.error(f"No lane mapping found for incoming road {incoming_road_id} lane {from_lane_id}") continue - - if not to_mapping: + + if not internal_mapping: logger.error(f"No lane mapping found for connecting road {connecting_road_id} lane {connecting_lane_id}") continue - + + if not to_mapping: + logger.error(f"No lane mapping found for outgoing road {outgoing_road_id} lane {outgoing_lane_id}") + continue + from_edge, from_lane_idx = from_mapping + internal_edge, internal_lane_idx = internal_mapping to_edge, to_lane_idx = to_mapping - - # Verify the to_edge is our merge zone - if to_edge != merge_edge: - logger.error(f"Expected merge zone edge {merge_edge}, but got {to_edge}") - continue - - # Determine connection direction + + # Determine connection direction and state incoming_road = self.road_map.get(incoming_road_id) - main_road = merge_info['main_road'] - - - # Create the connection + is_from_main = incoming_road and incoming_road.id == main_road.id + + # Connection 1: incoming road -> internal edge self.connections.append(PlainConnection( from_edge=from_edge, - to_edge=to_edge, + to_edge=internal_edge, from_lane=from_lane_idx, + to_lane=internal_lane_idx, + )) + logger.debug(f"Connected incoming to internal: {from_edge}:{from_lane_idx} -> {internal_edge}:{internal_lane_idx}") + + # Connection 2: internal edge -> outgoing road + if is_from_main: + direction = 's' # straight + state = 'M' # major + else: + # Ramp lane connections + direction = 'r' # right merge + state = 'm' # minor + + # Only override for the rightmost ramp lane (lane 0 of internal edge) + # Multi-lane ramps: lane 0 → rightmost outgoing, lane 1 → lane 1, etc. + if internal_lane_idx == 0: + # This is the rightmost ramp lane - ensure it connects to rightmost outgoing lane + outgoing_edge_obj = next((e for e in self.edges if e.id == to_edge), None) + if outgoing_edge_obj: + # Check if there are any shoulder lanes we should skip + rightmost_driving_lane = 0 + if hasattr(outgoing_edge_obj, 'lane_data') and outgoing_edge_obj.lane_data: + # Find the rightmost driving lane (skip shoulders) + driving_lanes = [i for i, lane in enumerate(outgoing_edge_obj.lane_data) + if lane.get('type', 'driving') != 'shoulder'] + if driving_lanes: + rightmost_driving_lane = min(driving_lanes) + + if to_lane_idx != rightmost_driving_lane: + logger.info(f"Ramp override: junction {junction_id}, internal {internal_edge} lane {internal_lane_idx} -> {to_edge} lane {to_lane_idx} changed to lane {rightmost_driving_lane} (rightmost)") + to_lane_idx = rightmost_driving_lane + else: + # For other ramp lanes, ensure proper lane offset from rightmost + # internal_lane_idx 1 should go to rightmost + 1, etc. + outgoing_edge_obj = next((e for e in self.edges if e.id == to_edge), None) + if outgoing_edge_obj: + rightmost_driving_lane = 0 + if hasattr(outgoing_edge_obj, 'lane_data') and outgoing_edge_obj.lane_data: + driving_lanes = [i for i, lane in enumerate(outgoing_edge_obj.lane_data) + if lane.get('type', 'driving') != 'shoulder'] + if driving_lanes: + rightmost_driving_lane = min(driving_lanes) + + expected_lane = rightmost_driving_lane + internal_lane_idx + if to_lane_idx != expected_lane: + logger.info(f"Ramp lane offset correction: junction {junction_id}, internal {internal_edge} lane {internal_lane_idx} -> {to_edge} lane {to_lane_idx} changed to lane {expected_lane}") + to_lane_idx = expected_lane + + self.connections.append(PlainConnection( + from_edge=internal_edge, + to_edge=to_edge, + from_lane=internal_lane_idx, to_lane=to_lane_idx, - # dir=direction, - # state=state + dir=direction, + state=state )) - logger.debug(f"Connected via mapping: {from_edge}:{from_lane_idx} -> {to_edge}:{to_lane_idx} " - f"(Road {incoming_road_id} lane {from_lane_id} -> Road {connecting_road_id} lane {connecting_lane_id})") - - # Create connections for Junction B (merge end) - # Merge zone to outgoing road (4 lanes to 3 lanes) - if outgoing_road: - outgoing_edge = f"{outgoing_road.id}.0" - outgoing_edge_obj = next((e for e in self.edges if e.id == outgoing_edge), None) - - if outgoing_edge_obj: - for chain in chains: - - connecting_road_id = chain['connecting_road'] - connecting_lane_id = chain['connecting_lane'] - outgoing_road_id = chain['outgoing_road'] - outgoing_lane_id = chain['final_lane'] - from_mapping = self._get_sumo_lane_index(connecting_road_id, connecting_lane_id, 'forward') - to_mapping = self._get_sumo_lane_index(outgoing_road_id, outgoing_lane_id, 'forward') - - if incoming_road and incoming_road.id == main_road.id: - # Main road - straight - direction = 's' - state = 'M' - else: - # Ramp - right merge - direction = 'r' - state = 'm' - - if from_mapping is None or to_mapping is None: - logger.error(f"Missing lane mapping for merge end: from {connecting_road_id} lane {connecting_lane_id} or to {outgoing_road_id} lane {outgoing_lane_id}") - continue - - from_edge, from_lane_idx = from_mapping - to_edge, to_lane_idx = to_mapping - self.connections.append(PlainConnection( - from_edge=from_edge, - to_edge=to_edge, - from_lane=from_lane_idx, # From lanes 1,2,3 - to_lane=to_lane_idx, # To lanes 0,1,2 - dir=direction, - state=state - )) - logger.debug(f"Connected merge to outgoing: {from_edge}:{from_lane_idx} -> {to_edge}:{to_lane_idx}") - + logger.debug(f"Connected internal to outgoing: {internal_edge}:{internal_lane_idx} -> {to_edge}:{to_lane_idx} (dir={direction})") + logger.info(f"Created merge connections for junction {junction_id}") def _get_outgoing_road_from_connecting(self, connecting_road: OpenDriveRoad, contact_point: str) -> Optional[str]: diff --git a/setup_environment.sh b/setup_environment.sh index bd4174c..c913042 100755 --- a/setup_environment.sh +++ b/setup_environment.sh @@ -1,3 +1,16 @@ +check_gcc_gpp() { + log_info "Checking for gcc and g++ compilers..." + if ! check_command gcc; then + log_error "gcc compiler not found. Please install gcc before proceeding." + exit 1 + fi + if ! check_command g++; then + log_error "g++ compiler not found. Please install g++ before proceeding." + exit 1 + fi + log_info "gcc version: $(gcc --version | head -n1)" + log_info "g++ version: $(g++ --version | head -n1)" +} #!/bin/bash # TeraSim Monorepo Environment Setup Script (improved from original version) @@ -32,11 +45,11 @@ check_python() { if check_command python3; then PYTHON_VERSION=$(python3 --version | cut -d' ' -f2) log_info "Python version: $PYTHON_VERSION" - + # Check if Python version meets requirements PYTHON_MAJOR=$(echo $PYTHON_VERSION | cut -d. -f1) PYTHON_MINOR=$(echo $PYTHON_VERSION | cut -d. -f2) - + if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 10 ]); then log_error "Python 3.10+ required, found $PYTHON_VERSION" exit 1 @@ -47,20 +60,6 @@ check_python() { fi } -check_gcc_gpp() { - log_info "Checking for gcc and g++ compilers..." - if ! check_command gcc; then - log_error "gcc compiler not found. Please install gcc before proceeding." - exit 1 - fi - if ! check_command g++; then - log_error "g++ compiler not found. Please install g++ before proceeding." - exit 1 - fi - log_info "gcc version: $(gcc --version | head -n1)" - log_info "g++ version: $(g++ --version | head -n1)" -} - check_redis() { log_info "Checking Redis service..." @@ -125,7 +124,6 @@ setup_monorepo() { pip install -e packages/terasim-envgen pip install -e packages/terasim-datazoo pip install -e packages/terasim-vis - pip install -e packages/terasim-cosmos # Install development dependencies pip install "pytest>=7.4.0" "pytest-cov>=4.1.0" "black>=23.7.0" "ruff>=0.1.0" "mypy>=1.5.1" "isort>=5.12.0" @@ -162,12 +160,6 @@ try: except ImportError: print('⚠️ TeraSim Visualization not available (optional)') -try: - import terasim_cosmos - print('✅ TeraSim Cosmos imported successfully') -except ImportError: - print('⚠️ TeraSim Cosmos not available (optional)') - print(f'TeraSim version: 0.2.0') " } @@ -199,9 +191,6 @@ setup_sumo_tools() { log_info "✅ SUMO tools updated" fi - # Export SUMO_HOME for current session - export SUMO_HOME="${SUMO_HOME}" - # Save SUMO_HOME path for reference echo "SUMO_HOME=${SUMO_HOME}" > "${DEPS_DIR}/.sumo_home" @@ -215,89 +204,6 @@ create_output_directories() { log_info "Output directories created" } -setup_environment_variables() { - log_info "Setting up environment variables..." - - # Get SUMO_HOME from the saved file - DEPS_DIR="${HOME}/.terasim/deps" - if [ -f "${DEPS_DIR}/.sumo_home" ]; then - source "${DEPS_DIR}/.sumo_home" - log_info "📍 Found SUMO_HOME: ${SUMO_HOME}" - else - log_warning "SUMO_HOME not found. Please run SUMO setup first." - return 1 - fi - - # Ask user if they want to add environment variables to shell config - echo - log_info "Environment variable setup options:" - echo "1. Add to ~/.bashrc (recommended for bash users)" - echo "2. Add to ~/.profile (recommended for all shells)" - echo "3. Add to ~/.zshrc (for zsh users)" - echo "4. Skip (environment variables will only be available in current session)" - echo - read -p "Choose an option (1-4): " -n 1 -r - echo - - case $REPLY in - 1) - SHELL_CONFIG="${HOME}/.bashrc" - ;; - 2) - SHELL_CONFIG="${HOME}/.profile" - ;; - 3) - SHELL_CONFIG="${HOME}/.zshrc" - ;; - 4) - log_info "Skipping persistent environment variable setup" - log_info "To use SUMO in other sessions, run: source ${DEPS_DIR}/.sumo_home" - return 0 - ;; - *) - log_warning "Invalid option. Skipping persistent environment variable setup" - return 0 - ;; - esac - - # Check if SUMO_HOME is already in the config file - if grep -q "SUMO_HOME=" "${SHELL_CONFIG}" 2>/dev/null; then - log_warning "SUMO_HOME already exists in ${SHELL_CONFIG}" - read -p "Update existing SUMO_HOME? (y/n) " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - # Remove existing SUMO_HOME lines - sed -i '/SUMO_HOME=/d' "${SHELL_CONFIG}" - else - log_info "Keeping existing SUMO_HOME configuration" - return 0 - fi - fi - - # Add environment variables to shell config - echo "" >> "${SHELL_CONFIG}" - echo "# TeraSim environment variables" >> "${SHELL_CONFIG}" - echo "export SUMO_HOME=\"${SUMO_HOME}\"" >> "${SHELL_CONFIG}" - echo "export PATH=\"\$SUMO_HOME/bin:\$PATH\"" >> "${SHELL_CONFIG}" - - log_info "✅ Environment variables added to ${SHELL_CONFIG}" - log_info "📍 SUMO_HOME: ${SUMO_HOME}" - log_info "📍 PATH updated to include SUMO tools" - - # Verify the setup - log_info "Verifying environment variable setup..." - if [ -f "${SUMO_HOME}/bin/sumo" ] || [ -f "${SUMO_HOME}/tools/sumo" ]; then - log_info "✅ SUMO tools found in ${SUMO_HOME}" - else - log_warning "⚠️ SUMO tools not found in expected location" - fi - - echo - log_info "To apply changes in current session, run:" - log_info " source ${SHELL_CONFIG}" - log_info "Or restart your terminal" -} - main() { log_info "Starting TeraSim monorepo setup..." @@ -306,7 +212,6 @@ main() { check_gcc_gpp check_redis setup_sumo_tools - setup_environment_variables setup_monorepo create_output_directories @@ -325,8 +230,7 @@ packages = [ ('terasim_vis', 'Visualization tools'), ('terasim_envgen', 'Environment generation tools'), ('terasim_datazoo', 'Data processing tools'), - ('terasim_service', 'Service API'), - ('terasim_cosmos', 'Cosmos-Drive integration') + ('terasim_service', 'Service API') ] for pkg_name, description in packages: @@ -337,19 +241,12 @@ for pkg_name, description in packages: print(f' ❌ {pkg_name:<18} - {description} (failed)') " - echo - echo "Environment variables:" - echo " SUMO_HOME is set to: ${SUMO_HOME:-'Not set'}" - echo " To verify: echo \$SUMO_HOME" echo echo "Development commands:" echo " pytest # Run tests" echo " black . # Format code" echo " python # Start Python shell" echo - echo "If SUMO_HOME is not set in new terminal sessions:" - echo " source ~/.terasim/deps/.sumo_home # Load environment variables" - echo } # Run main function only if script is executed directly diff --git a/test_config.yaml b/test_config.yaml new file mode 100644 index 0000000..b811945 --- /dev/null +++ b/test_config.yaml @@ -0,0 +1,19 @@ +map_search: + bbox_size: 1000 + default_city: Ann Arbor, Michigan, USA + max_results: 5 +output: + base_dir: test_output +visualization: + preview: + dpi: 300 + figure_height: 6 + figure_width: 8 + interactive_map: false + randomize: + enabled: true + map_style: true + node_selection: true + seed: 33 + visualization: true + satellite_view: true diff --git a/vTypeDistributions.add.xml b/vTypeDistributions.add.xml new file mode 100644 index 0000000..e96a704 --- /dev/null +++ b/vTypeDistributions.add.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +