diff --git a/CHANGELOG.md b/CHANGELOG.md index 914df2a36e..cb41540e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ * Added API function `world.set_annotations_traverse_translucency` and implemented functionality to configure, whether depth and semantic + instance segmentation traverse translucent materials or not. * Fixed `frame`, `timestamp` and `transform` of `SensorData` not matching to the actually sent image for camera sensors. * Added "geolocation_to_transform" function to the Map object in the PythonAPI + * Add support for NVIDIA NuRec 25.07 (CARLA-NuRec 0.2) ## CARLA 0.9.15 diff --git a/PythonAPI/examples/nvidia/grpc_proto/__init__.py b/PythonAPI/examples/nvidia/grpc_proto/__init__.py deleted file mode 100644 index 74cd0aefbe..0000000000 --- a/PythonAPI/examples/nvidia/grpc_proto/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -import os -import sys - -# add this dir to path -sys.path.append(os.path.dirname(os.path.abspath(__file__))) - -from . import common_pb2 -from . import sensorsim_pb2 -from . import sensorsim_pb2_grpc - -__all__ = ["common_pb2", "sensorsim_pb2", "sensorsim_pb2_grpc"] \ No newline at end of file diff --git a/PythonAPI/examples/nvidia/README.md b/PythonAPI/examples/nvidia/nurec/README.md similarity index 100% rename from PythonAPI/examples/nvidia/README.md rename to PythonAPI/examples/nvidia/nurec/README.md diff --git a/PythonAPI/examples/nvidia/blueprint_library.py b/PythonAPI/examples/nvidia/nurec/blueprint_library.py similarity index 100% rename from PythonAPI/examples/nvidia/blueprint_library.py rename to PythonAPI/examples/nvidia/nurec/blueprint_library.py diff --git a/PythonAPI/examples/nvidia/blueprint_sizes_vehicle.json b/PythonAPI/examples/nvidia/nurec/blueprint_sizes_vehicle.json similarity index 100% rename from PythonAPI/examples/nvidia/blueprint_sizes_vehicle.json rename to PythonAPI/examples/nvidia/nurec/blueprint_sizes_vehicle.json diff --git a/PythonAPI/examples/nvidia/blueprint_sizes_walker.json b/PythonAPI/examples/nvidia/nurec/blueprint_sizes_walker.json similarity index 100% rename from PythonAPI/examples/nvidia/blueprint_sizes_walker.json rename to PythonAPI/examples/nvidia/nurec/blueprint_sizes_walker.json diff --git a/PythonAPI/examples/nvidia/constants.py b/PythonAPI/examples/nvidia/nurec/constants.py similarity index 100% rename from PythonAPI/examples/nvidia/constants.py rename to PythonAPI/examples/nvidia/nurec/constants.py diff --git a/PythonAPI/examples/nvidia/example_custom_camera.py b/PythonAPI/examples/nvidia/nurec/example_custom_camera.py similarity index 100% rename from PythonAPI/examples/nvidia/example_custom_camera.py rename to PythonAPI/examples/nvidia/nurec/example_custom_camera.py diff --git a/PythonAPI/examples/nvidia/example_replay_recording.py b/PythonAPI/examples/nvidia/nurec/example_replay_recording.py similarity index 100% rename from PythonAPI/examples/nvidia/example_replay_recording.py rename to PythonAPI/examples/nvidia/nurec/example_replay_recording.py diff --git a/PythonAPI/examples/nvidia/example_save_images.py b/PythonAPI/examples/nvidia/nurec/example_save_images.py similarity index 100% rename from PythonAPI/examples/nvidia/example_save_images.py rename to PythonAPI/examples/nvidia/nurec/example_save_images.py diff --git a/PythonAPI/examples/nvidia/install_nurec.sh b/PythonAPI/examples/nvidia/nurec/install_nurec.sh similarity index 64% rename from PythonAPI/examples/nvidia/install_nurec.sh rename to PythonAPI/examples/nvidia/nurec/install_nurec.sh index 1642d32b8b..186bd72864 100755 --- a/PythonAPI/examples/nvidia/install_nurec.sh +++ b/PythonAPI/examples/nvidia/nurec/install_nurec.sh @@ -7,7 +7,7 @@ command_exists() { -# Function to check if Hugging Face dataset exists +# Function to check if HuggingFace dataset exists check_hf_dataset() { local dataset_path="PhysicalAI-Autonomous-Vehicles-NuRec" if [ -d "$dataset_path" ]; then @@ -25,25 +25,58 @@ check_NuRec_container() { return 1 } -# Function to validate Hugging Face PAT format (basic check) +# Function to validate HuggingFace PAT format (basic check) validate_hf_pat() { if [[ ! $1 =~ ^hf_[a-zA-Z0-9]{32,}$ ]]; then - echo "Error: Invalid Hugging Face PAT format" >&2 + echo "Error: Invalid HuggingFace PAT format" >&2 return 1 fi return 0 } -# Function to get and validate Hugging Face PAT +# Function to get and validate HuggingFace PAT get_hf_pat() { - # Get Hugging Face PAT - read -s -p "Please enter your Hugging Face Personal Access Token. If you don't have one, visit: https://huggingface.co/settings/tokens. Enter your token: " hf_pat - echo + # Color codes + local RED='\033[0;31m' + local GREEN='\033[0;32m' + local YELLOW='\033[1;33m' + local BLUE='\033[0;34m' + local PURPLE='\033[0;35m' + local CYAN='\033[0;36m' + local WHITE='\033[1;37m' + local NC='\033[0m' # No Color + + echo "" >&2 + echo -e "${CYAN}============================================================${NC}" >&2 + echo -e "${WHITE} 🔑 ${YELLOW}HUGGINGFACE AUTHENTICATION REQUIRED${WHITE} 🔑${NC}" >&2 + echo -e "${CYAN}============================================================${NC}" >&2 + echo "" >&2 + echo -e "${WHITE}To download the dataset, you need a ${YELLOW}HuggingFace Personal Access Token${WHITE}.${NC}" >&2 + echo "" >&2 + echo -e "${BLUE}📍 If you don't have a token yet:${NC}" >&2 + echo -e "${WHITE} 1. Visit: ${CYAN}https://huggingface.co/settings/tokens${NC}" >&2 + echo -e "${WHITE} 2. Click ${YELLOW}'New token'${NC}" >&2 + echo -e "${WHITE} 3. Choose ${GREEN}'Read'${WHITE} permissions${NC}" >&2 + echo -e "${WHITE} 4. Copy the generated token${NC}" >&2 + echo "" >&2 + echo -e "${YELLOW}⚠️ Your input will be hidden for security${NC}" >&2 + echo "" >&2 + + # Get HuggingFace PAT + echo -ne "${PURPLE}🔐 Enter your HuggingFace Personal Access Token: ${NC}" >&2 + read -s hf_pat + echo >&2 + echo "" >&2 - # Validate Hugging Face PAT + # Validate HuggingFace PAT if ! validate_hf_pat "$hf_pat"; then + echo -e "${RED}❌ Invalid token format. Please try again.${NC}" >&2 + echo "" >&2 return 1 fi + + echo -e "${GREEN}✅ Token validated successfully!${NC}" >&2 + echo "" >&2 echo "$hf_pat" return 0 } @@ -135,23 +168,29 @@ done # Download NuRec GRPC Container echo "Checking NuRec GRPC container..." -if check_NuRec_container "docker.io/carlasimulator/nvidia-nurec-grpc:0.1.0"; then +if check_NuRec_container "docker.io/carlasimulator/nvidia-nurec-grpc:0.2.0"; then echo "NuRec GRPC container already exists, skipping download." else echo "Initiating NuRec GRPC Container Downloads..." - docker pull docker.io/carlasimulator/nvidia-nurec-grpc:0.1.0 + docker pull docker.io/carlasimulator/nvidia-nurec-grpc:0.2.0 if [ $? -ne 0 ]; then echo "Error: Failed to download NuRec GRPC Container" exit 1 fi fi -# Download the dataset from Hugging Face -echo "Checking Hugging Face dataset..." +# Download the dataset from HuggingFace +echo "Checking HuggingFace dataset..." if check_hf_dataset; then - echo "Hugging Face dataset already exists, skipping download." + echo "HuggingFace dataset already exists, skipping download." else - # Get and validate Hugging Face PAT + echo "Installing HuggingFace CLI..." + pip3 install --upgrade huggingface_hub || { + echo "Error: Failed to install HuggingFace CLI" + exit 1 + } + + # Get and validate HuggingFace PAT hf_pat=$(get_hf_pat) if [ $? -ne 0 ]; then exit 1 @@ -160,30 +199,24 @@ else # Strip any newlines or whitespace from the token hf_pat=$(echo "$hf_pat" | tr -d '\n\r' | xargs) - # Create the Hugging Face URL with embedded token - hf_url="https://user:${hf_pat}@huggingface.co/datasets/nvidia/PhysicalAI-Autonomous-Vehicles-NuRec/" - - echo "Downloading the dataset from Hugging Face..." - git lfs install - - # Set git configuration to avoid prompts - export GIT_TERMINAL_PROMPT=0 # Disable git prompts - - # Clone the repository using the URL with embedded token - echo "Cloning dataset with authentication..." - git clone "$hf_url" + echo "Downloading the dataset from HuggingFace using CLI..." - clone_result=$? - unset GIT_TERMINAL_PROMPT + # Login to HuggingFace using the token + echo "$hf_pat" | hf auth login --token "$hf_pat" || { + echo "Error: Failed to authenticate with HuggingFace" + exit 1 + } - if [ $clone_result -ne 0 ]; then - echo "Error: Failed to download the NuRec dataset from Hugging Face" + # Download the dataset using HuggingFace CLI + echo "Downloading dataset with HuggingFace CLI..." + hf download nvidia/PhysicalAI-Autonomous-Vehicles-NuRec --repo-type dataset --local-dir PhysicalAI-Autonomous-Vehicles-NuRec || { + echo "Error: Failed to download the NuRec dataset from HuggingFace" exit 1 - fi + } fi # Set the NuRec image path -NUREC_IMAGE="docker.io/carlasimulator/nvidia-nurec-grpc:0.1.0" +NUREC_IMAGE="docker.io/carlasimulator/nvidia-nurec-grpc:0.2.0" export NUREC_IMAGE echo "NUREC_IMAGE: $NUREC_IMAGE" @@ -228,7 +261,7 @@ pip3 install pygame numpy nvidia-nvjpeg-cu12 imageio|| { # Install Carla Wheel echo "Installing Carla Wheel..." -WHEEL=$(ls ../../carla/dist/carla-0.9.16-cp310-cp310-*.whl | head -n 1) +WHEEL=$(ls ../../../carla/dist/carla-0.9.16-cp310-cp310-*.whl | head -n 1) python -m pip install ${WHEEL} || { echo "Error: Failed to install Carla Wheel" exit 1 @@ -243,12 +276,12 @@ pip3 install -r requirements.txt || { # Install and setup GRPC Protos echo "Setting up GRPC Protos..." -pip3 install -r grpc_proto/requirements.txt || { +pip3 install -r nre/grpc/requirements.txt || { echo "Error: Failed to install GRPC requirements" exit 1 } -python3 grpc_proto/update_generated.py || { +python3 nre/grpc/update_generated.py || { echo "Error: Failed to update generated GRPC files" exit 1 } @@ -257,3 +290,21 @@ python3 grpc_proto/update_generated.py || { chmod +x "$0" echo "Setup completed successfully!" +echo "" +echo "🔔 IMPORTANT: Environment Variable Notice" +echo "==============================================" +echo "The NUREC_IMAGE environment variable has been added to your ~/.bashrc file" +echo "and will be available in new terminal sessions." +echo "" +echo "To use it in your CURRENT terminal session, run one of these commands:" +echo "" +echo " Option 1 (Reload bashrc):" +echo " source ~/.bashrc" +echo "" +echo " Option 2 (Export manually for this session):" +echo " export NUREC_IMAGE=\"$NUREC_IMAGE\"" +echo "" +echo " Option 3 (Start a new terminal session)" +echo "" +echo "You can verify the variable is set by running:" +echo " echo \$NUREC_IMAGE" diff --git a/PythonAPI/examples/nvidia/grpc_proto/README.md b/PythonAPI/examples/nvidia/nurec/nre/grpc/README.md similarity index 91% rename from PythonAPI/examples/nvidia/grpc_proto/README.md rename to PythonAPI/examples/nvidia/nurec/nre/grpc/README.md index 10a7777192..44de3fd255 100644 --- a/PythonAPI/examples/nvidia/grpc_proto/README.md +++ b/PythonAPI/examples/nvidia/nurec/nre/grpc/README.md @@ -38,9 +38,9 @@ After generating the Python files, you can import and use them in your Python co ```python # Import the generated modules -import grpc_proto.common_pb2 as common_pb2 -import grpc_proto.sensorsim_pb2 as sensorsim_pb2 -import grpc_proto.sensorsim_pb2_grpc as sensorsim_pb2_grpc +import nre.grpc.protos.common_pb2 as common_pb2 +import nre.grpc.protos.sensorsim_pb2 as sensorsim_pb2 +import nre.grpc.protos.sensorsim_pb2_grpc as sensorsim_pb2_grpc # Create a gRPC channel and stub import grpc @@ -73,7 +73,7 @@ The NuRec gRPC API provides the following main services: When modifying the .proto files, always regenerate the Python code: ```bash -python PythonAPI/examples/nvidia/grpc/update_generated.py +python PythonAPI/examples/nvidia/nre/grpc/update_generated.py ``` ## Support diff --git a/PythonAPI/examples/nvidia/grpc_proto/protos/__init__.py b/PythonAPI/examples/nvidia/nurec/nre/grpc/protos/__init__.py similarity index 100% rename from PythonAPI/examples/nvidia/grpc_proto/protos/__init__.py rename to PythonAPI/examples/nvidia/nurec/nre/grpc/protos/__init__.py diff --git a/PythonAPI/examples/nvidia/grpc_proto/protos/common.proto b/PythonAPI/examples/nvidia/nurec/nre/grpc/protos/common.proto similarity index 90% rename from PythonAPI/examples/nvidia/grpc_proto/protos/common.proto rename to PythonAPI/examples/nvidia/nurec/nre/grpc/protos/common.proto index 5d27b035d5..598057ebf1 100644 --- a/PythonAPI/examples/nvidia/grpc_proto/protos/common.proto +++ b/PythonAPI/examples/nvidia/nurec/nre/grpc/protos/common.proto @@ -1,10 +1,7 @@ -// SPDX-FileCopyrightText: © 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -// -// SPDX-License-Identifier: MIT - +// Copyright (c) 2025 NVIDIA CORPORATION. All rights reserved. syntax = "proto3"; -package common; +package nre.grpc.protos.common; //////////////////////////////////////////////////////////////////////////////// // Common types @@ -78,4 +75,3 @@ message SessionRequestStatus {} // empty; reserved name in case we want to exten message AvailableScenesReturn { repeated string scene_ids = 1; } - diff --git a/PythonAPI/examples/nvidia/grpc_proto/protos/sensorsim.proto b/PythonAPI/examples/nvidia/nurec/nre/grpc/protos/sensorsim.proto similarity index 85% rename from PythonAPI/examples/nvidia/grpc_proto/protos/sensorsim.proto rename to PythonAPI/examples/nvidia/nurec/nre/grpc/protos/sensorsim.proto index 63b2776f6c..0e8504c24d 100644 --- a/PythonAPI/examples/nvidia/grpc_proto/protos/sensorsim.proto +++ b/PythonAPI/examples/nvidia/nurec/nre/grpc/protos/sensorsim.proto @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: © 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -// -// SPDX-License-Identifier: MIT - +// Copyright (c) 2025 NVIDIA CORPORATION. All rights reserved. syntax = "proto3"; -package sensorsim; +package nre.grpc.protos.sensorsim; -import "common.proto"; +import "nre/grpc/protos/common.proto"; //////////////////////////////////////////////////////////////////////////////// // Sensor simulator <-> Runtime @@ -15,12 +12,12 @@ import "common.proto"; service SensorsimService { rpc render_rgb (RGBRenderRequest) returns (RGBRenderReturn); rpc render_lidar (LidarRenderRequest) returns (LidarRenderReturn); - rpc get_version (common.Empty) returns (common.VersionId); - rpc get_available_scenes (common.Empty) returns (common.AvailableScenesReturn); + rpc get_version (nre.grpc.protos.common.Empty) returns (nre.grpc.protos.common.VersionId); + rpc get_available_scenes (nre.grpc.protos.common.Empty) returns (nre.grpc.protos.common.AvailableScenesReturn); rpc get_available_cameras (AvailableCamerasRequest) returns (AvailableCamerasReturn); - rpc shut_down (common.Empty) returns (common.Empty); + rpc shut_down (nre.grpc.protos.common.Empty) returns (nre.grpc.protos.common.Empty); rpc get_available_trajectories (AvailableTrajectoriesRequest) returns (AvailableTrajectoriesReturn); - rpc get_available_ego_masks (common.Empty) returns (AvailableEgoMasksReturn); + rpc get_available_ego_masks (nre.grpc.protos.common.Empty) returns (AvailableEgoMasksReturn); } message EgoMaskId { @@ -46,6 +43,11 @@ enum ShutterType { GLOBAL = 5; //Instantaneous global shutter (no rolling shutter) } +message LinearCde { + double linear_c = 1; + double linear_d = 2; + double linear_e = 3; +} message FthetaCameraParam { enum PolynomialType { @@ -64,6 +66,8 @@ message FthetaCameraParam { repeated double angle_to_pixeldist_poly = 5; double max_angle = 6; + + LinearCde linear_cde = 7; } //TODO: implentation of OpenCV pinhole camera model parameters @@ -130,8 +134,8 @@ message CameraSpec { message PosePair { // represents poses at start and end of the frame // TODO: replace with common.Trajectory (more general) - common.Pose start_pose = 1; - common.Pose end_pose = 2; + nre.grpc.protos.common.Pose start_pose = 1; + nre.grpc.protos.common.Pose end_pose = 2; } message DynamicObject { @@ -183,7 +187,7 @@ message AvailableCamerasRequest { message AvailableCamerasReturn { message AvailableCamera { CameraSpec intrinsics = 1; - common.Pose rig_to_camera = 2; // should be camera_to_rig -> silently breaks things, deprecate and create duplicate? or just fix and let people know + nre.grpc.protos.common.Pose rig_to_camera = 2; // should be camera_to_rig -> silently breaks things, deprecate and create duplicate? or just fix and let people know string logical_id = 3; uint32 trajectory_idx = 4; @@ -199,7 +203,7 @@ message AvailableTrajectoriesRequest { message AvailableTrajectoriesReturn { message AvailableTrajectory { uint32 trajectory_idx = 1; - common.Trajectory trajectory = 2; + nre.grpc.protos.common.Trajectory trajectory = 2; } repeated AvailableTrajectory available_trajectories = 1; @@ -241,4 +245,4 @@ message LidarRenderRequest { PosePair sensor_pose = 5; repeated DynamicObject dynamic_objects = 6; -} +} \ No newline at end of file diff --git a/PythonAPI/examples/nvidia/grpc_proto/requirements.txt b/PythonAPI/examples/nvidia/nurec/nre/grpc/requirements.txt similarity index 100% rename from PythonAPI/examples/nvidia/grpc_proto/requirements.txt rename to PythonAPI/examples/nvidia/nurec/nre/grpc/requirements.txt diff --git a/PythonAPI/examples/nvidia/grpc_proto/update_generated.py b/PythonAPI/examples/nvidia/nurec/nre/grpc/update_generated.py similarity index 85% rename from PythonAPI/examples/nvidia/grpc_proto/update_generated.py rename to PythonAPI/examples/nvidia/nurec/nre/grpc/update_generated.py index 012e5efbfa..a25993c9da 100644 --- a/PythonAPI/examples/nvidia/grpc_proto/update_generated.py +++ b/PythonAPI/examples/nvidia/nurec/nre/grpc/update_generated.py @@ -1,15 +1,15 @@ -# SPDX-FileCopyrightText: © 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: MIT +# Copyright (c) 2025 NVIDIA CORPORATION. All rights reserved. -import os -import sys import glob -import subprocess import logging +import os import re +import subprocess +import sys + from pathlib import Path + logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -17,19 +17,19 @@ def compile_proto(proto_path, project_base): """Compile a proto files to Python code.""" # Use the protoc command installed by grpcio-tools through Python - # Use the directory of the proto file as the proto_path so imports work + # Use `project_base` as the root directory for the proto files such that protoc generates absolute imports + # starting from the project root. cmd = [ sys.executable, "-m", "grpc_tools.protoc", - f"--proto_path={os.path.dirname(proto_path)}", + f"--proto_path={project_base}", f"--python_out={project_base}", f"--pyi_out={project_base}", f"--grpc_python_out={project_base}", proto_path, ] - print(" ".join(cmd)) result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: @@ -41,12 +41,13 @@ def compile_proto(proto_path, project_base): def main(): """Main function.""" # Get the path to the proto files + if "BUILD_WORKSPACE_DIRECTORY" in os.environ: project_base = os.environ["BUILD_WORKSPACE_DIRECTORY"] else: - project_base = Path(__file__).parent + project_base = Path(__file__).parent.parent.parent - project_proto_dir = os.path.join(project_base, "protos") + project_proto_dir = os.path.join(project_base, "nre", "grpc", "protos") # Create __init__.py in the output directory to make it importable init_file = os.path.join(project_proto_dir, "__init__.py") @@ -81,4 +82,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/PythonAPI/examples/nvidia/nurec_integration.py b/PythonAPI/examples/nvidia/nurec/nurec_integration.py similarity index 99% rename from PythonAPI/examples/nvidia/nurec_integration.py rename to PythonAPI/examples/nvidia/nurec/nurec_integration.py index d8c995f637..580d121e1b 100644 --- a/PythonAPI/examples/nvidia/nurec_integration.py +++ b/PythonAPI/examples/nvidia/nurec/nurec_integration.py @@ -41,9 +41,9 @@ from blueprint_library import BlueprintLibrary import grpc -from grpc_proto.common_pb2 import Empty as EmptyRequest -from grpc_proto.sensorsim_pb2_grpc import SensorsimServiceStub -from grpc_proto.sensorsim_pb2 import ( +from nre.grpc.protos.common_pb2 import Empty as EmptyRequest +from nre.grpc.protos.sensorsim_pb2_grpc import SensorsimServiceStub +from nre.grpc.protos.sensorsim_pb2 import ( RGBRenderReturn, RGBRenderRequest, AvailableCamerasRequest, diff --git a/PythonAPI/examples/nvidia/nurec_render_service.py b/PythonAPI/examples/nvidia/nurec/nurec_render_service.py similarity index 95% rename from PythonAPI/examples/nvidia/nurec_render_service.py rename to PythonAPI/examples/nvidia/nurec/nurec_render_service.py index 299a4627d9..8cf6655ecd 100644 --- a/PythonAPI/examples/nvidia/nurec_render_service.py +++ b/PythonAPI/examples/nvidia/nurec/nurec_render_service.py @@ -68,6 +68,27 @@ def get_container_name(uuid_val: str) -> str: container_name = f"NuRec_{uuid_val}_run_{random_suffix}" return container_name +def check_if_scene_loaded(logs: str) -> bool: + """ + Check if the scene is loaded by looking for the string "successfully loaded scene" or "done testing gathered scenes" in the logs. + """ + return "successfully loaded scene" in logs.lower() or "done testing gathered scenes" in logs.lower() + + +def _normalize_image_name(image: str) -> str: + """ + Normalize Docker image names for comparison. + Docker often omits the leading "docker.io/" in image names when listing containers. + This strips that prefix for consistent equality checks. + """ + if not image: + return image + prefix = "docker.io/" + if image.startswith(prefix): + return image[len(prefix):] + return image + + class ServerMonitor: def __init__(self, expected_host, expected_port): self.expected_host = expected_host @@ -99,7 +120,7 @@ def process_line(self, line: str) -> None: # Check for scene loaded message if not self.scene_loaded.is_set(): - if "successfully loaded scene" in line.lower(): + if check_if_scene_loaded(line): logger.debug(f"Scene loaded: {line}") self.scene_loaded.set() @@ -220,7 +241,7 @@ def _find_existing_container(self, uuid_val): logger.warning(f"Skipping container {line} because it has the wrong format") continue name, image = parts - if pattern in name and image == self.image: + if pattern in name and _normalize_image_name(image) == _normalize_image_name(self.image): matching_container = name break @@ -247,7 +268,7 @@ def _verify_container_logs(self, container_name, expected_scene, expected_port): server_started = "serving on" in logs.lower() # Check for correct scene - scene_loaded = "successfully loaded scene" in logs.lower() + scene_loaded = check_if_scene_loaded(logs) correct_scene = expected_scene in logs # Check for correct port @@ -289,7 +310,7 @@ def _kill_old_nurec_containers(self): # Check if it's a NuRec container with the same image if (container_name.startswith("NuRec_") and - container_image == self.image): + _normalize_image_name(container_image) == _normalize_image_name(self.image)): containers_to_kill.append(container_name) if containers_to_kill: @@ -426,7 +447,6 @@ def start(self) -> Dict[str, Any]: self.image, "--artifact-glob", f"{os.path.realpath(self.usdz_path)}", - "--no-enable-nrend", f"--port={self.final_port}", "--host=localhost", "--test-scenes-are-valid", diff --git a/PythonAPI/examples/nvidia/nurec/poetry.lock b/PythonAPI/examples/nvidia/nurec/poetry.lock new file mode 100644 index 0000000000..3185c1ca04 --- /dev/null +++ b/PythonAPI/examples/nvidia/nurec/poetry.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. + +[[package]] +name = "grpcio" +version = "1.74.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "grpcio-1.74.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:85bd5cdf4ed7b2d6438871adf6afff9af7096486fcf51818a81b77ef4dd30907"}, + {file = "grpcio-1.74.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:68c8ebcca945efff9d86d8d6d7bfb0841cf0071024417e2d7f45c5e46b5b08eb"}, + {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e154d230dc1bbbd78ad2fdc3039fa50ad7ffcf438e4eb2fa30bce223a70c7486"}, + {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8978003816c7b9eabe217f88c78bc26adc8f9304bf6a594b02e5a49b2ef9c11"}, + {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3d7bd6e3929fd2ea7fbc3f562e4987229ead70c9ae5f01501a46701e08f1ad9"}, + {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:136b53c91ac1d02c8c24201bfdeb56f8b3ac3278668cbb8e0ba49c88069e1bdc"}, + {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe0f540750a13fd8e5da4b3eaba91a785eea8dca5ccd2bc2ffe978caa403090e"}, + {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4e4181bfc24413d1e3a37a0b7889bea68d973d4b45dd2bc68bb766c140718f82"}, + {file = "grpcio-1.74.0-cp310-cp310-win32.whl", hash = "sha256:1733969040989f7acc3d94c22f55b4a9501a30f6aaacdbccfaba0a3ffb255ab7"}, + {file = "grpcio-1.74.0-cp310-cp310-win_amd64.whl", hash = "sha256:9e912d3c993a29df6c627459af58975b2e5c897d93287939b9d5065f000249b5"}, + {file = "grpcio-1.74.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:69e1a8180868a2576f02356565f16635b99088da7df3d45aaa7e24e73a054e31"}, + {file = "grpcio-1.74.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8efe72fde5500f47aca1ef59495cb59c885afe04ac89dd11d810f2de87d935d4"}, + {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a8f0302f9ac4e9923f98d8e243939a6fb627cd048f5cd38595c97e38020dffce"}, + {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f609a39f62a6f6f05c7512746798282546358a37ea93c1fcbadf8b2fed162e3"}, + {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98e0b7434a7fa4e3e63f250456eaef52499fba5ae661c58cc5b5477d11e7182"}, + {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:662456c4513e298db6d7bd9c3b8df6f75f8752f0ba01fb653e252ed4a59b5a5d"}, + {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3d14e3c4d65e19d8430a4e28ceb71ace4728776fd6c3ce34016947474479683f"}, + {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bf949792cee20d2078323a9b02bacbbae002b9e3b9e2433f2741c15bdeba1c4"}, + {file = "grpcio-1.74.0-cp311-cp311-win32.whl", hash = "sha256:55b453812fa7c7ce2f5c88be3018fb4a490519b6ce80788d5913f3f9d7da8c7b"}, + {file = "grpcio-1.74.0-cp311-cp311-win_amd64.whl", hash = "sha256:86ad489db097141a907c559988c29718719aa3e13370d40e20506f11b4de0d11"}, + {file = "grpcio-1.74.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:8533e6e9c5bd630ca98062e3a1326249e6ada07d05acf191a77bc33f8948f3d8"}, + {file = "grpcio-1.74.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:2918948864fec2a11721d91568effffbe0a02b23ecd57f281391d986847982f6"}, + {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:60d2d48b0580e70d2e1954d0d19fa3c2e60dd7cbed826aca104fff518310d1c5"}, + {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3601274bc0523f6dc07666c0e01682c94472402ac2fd1226fd96e079863bfa49"}, + {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:176d60a5168d7948539def20b2a3adcce67d72454d9ae05969a2e73f3a0feee7"}, + {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e759f9e8bc908aaae0412642afe5416c9f983a80499448fcc7fab8692ae044c3"}, + {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e7c4389771855a92934b2846bd807fc25a3dfa820fd912fe6bd8136026b2707"}, + {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cce634b10aeab37010449124814b05a62fb5f18928ca878f1bf4750d1f0c815b"}, + {file = "grpcio-1.74.0-cp312-cp312-win32.whl", hash = "sha256:885912559974df35d92219e2dc98f51a16a48395f37b92865ad45186f294096c"}, + {file = "grpcio-1.74.0-cp312-cp312-win_amd64.whl", hash = "sha256:42f8fee287427b94be63d916c90399ed310ed10aadbf9e2e5538b3e497d269bc"}, + {file = "grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89"}, + {file = "grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01"}, + {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e"}, + {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91"}, + {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249"}, + {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362"}, + {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f"}, + {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20"}, + {file = "grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa"}, + {file = "grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24"}, + {file = "grpcio-1.74.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4bc5fca10aaf74779081e16c2bcc3d5ec643ffd528d9e7b1c9039000ead73bae"}, + {file = "grpcio-1.74.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:6bab67d15ad617aff094c382c882e0177637da73cbc5532d52c07b4ee887a87b"}, + {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:655726919b75ab3c34cdad39da5c530ac6fa32696fb23119e36b64adcfca174a"}, + {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a2b06afe2e50ebfd46247ac3ba60cac523f54ec7792ae9ba6073c12daf26f0a"}, + {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f251c355167b2360537cf17bea2cf0197995e551ab9da6a0a59b3da5e8704f9"}, + {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f7b5882fb50632ab1e48cb3122d6df55b9afabc265582808036b6e51b9fd6b7"}, + {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:834988b6c34515545b3edd13e902c1acdd9f2465d386ea5143fb558f153a7176"}, + {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22b834cef33429ca6cc28303c9c327ba9a3fafecbf62fae17e9a7b7163cc43ac"}, + {file = "grpcio-1.74.0-cp39-cp39-win32.whl", hash = "sha256:7d95d71ff35291bab3f1c52f52f474c632db26ea12700c2ff0ea0532cb0b5854"}, + {file = "grpcio-1.74.0-cp39-cp39-win_amd64.whl", hash = "sha256:ecde9ab49f58433abe02f9ed076c7b5be839cf0153883a6d23995937a82392fa"}, + {file = "grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.74.0)"] + +[[package]] +name = "numpy" +version = "2.2.5" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "numpy-2.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1"}, + {file = "numpy-2.2.5-cp310-cp310-win32.whl", hash = "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88"}, + {file = "numpy-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906"}, + {file = "numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"}, + {file = "numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae"}, + {file = "numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb"}, + {file = "numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73"}, + {file = "numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b"}, + {file = "numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066"}, + {file = "numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e"}, + {file = "numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169"}, + {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"}, +] + +[[package]] +name = "nvidia-nvimgcodec-cu12" +version = "0.5.0.13" +description = "NVIDIA nvimgcodec for CUDA 12. Git SHA:" +optional = false +python-versions = "<3.14,>=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "nvidia_nvimgcodec_cu12-0.5.0.13-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d76fadc2ed0f9075871627e45f2592c7807a0e944a0505afc21f87ccceb75caa"}, + {file = "nvidia_nvimgcodec_cu12-0.5.0.13-py3-none-manylinux2014_x86_64.whl", hash = "sha256:24cf0a759b1b02a6c3c0aedf8bf6602643f74c4c6df68c4b1c3c4ec1d48d71b0"}, + {file = "nvidia_nvimgcodec_cu12-0.5.0.13-py3-none-win_amd64.whl", hash = "sha256:331fc77cc844b982ab0d5c0e9d660b2e777e82c61471657c18f40ca3d15640c2"}, +] + +[package.extras] +all = ["nvidia-nvcomp-cu12", "nvidia-nvjpeg-cu12", "nvidia-nvjpeg2k-cu12", "nvidia-nvtiff-cu12"] +nvjpeg = ["nvidia-nvjpeg-cu12"] +nvjpeg2k = ["nvidia-nvjpeg2k-cu12"] +nvtiff = ["nvidia-nvcomp-cu12", "nvidia-nvtiff-cu12"] + +[[package]] +name = "protobuf" +version = "4.23.3" +description = "" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "protobuf-4.23.3-cp310-abi3-win32.whl", hash = "sha256:514b6bbd54a41ca50c86dd5ad6488afe9505901b3557c5e0f7823a0cf67106fb"}, + {file = "protobuf-4.23.3-cp310-abi3-win_amd64.whl", hash = "sha256:cc14358a8742c4e06b1bfe4be1afbdf5c9f6bd094dff3e14edb78a1513893ff5"}, + {file = "protobuf-4.23.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2991f5e7690dab569f8f81702e6700e7364cc3b5e572725098215d3da5ccc6ac"}, + {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:08fe19d267608d438aa37019236db02b306e33f6b9902c3163838b8e75970223"}, + {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3b01a5274ac920feb75d0b372d901524f7e3ad39c63b1a2d55043f3887afe0c1"}, + {file = "protobuf-4.23.3-cp37-cp37m-win32.whl", hash = "sha256:aca6e86a08c5c5962f55eac9b5bd6fce6ed98645d77e8bfc2b952ecd4a8e4f6a"}, + {file = "protobuf-4.23.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0149053336a466e3e0b040e54d0b615fc71de86da66791c592cc3c8d18150bf8"}, + {file = "protobuf-4.23.3-cp38-cp38-win32.whl", hash = "sha256:84ea0bd90c2fdd70ddd9f3d3fc0197cc24ecec1345856c2b5ba70e4d99815359"}, + {file = "protobuf-4.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:3bcbeb2bf4bb61fe960dd6e005801a23a43578200ea8ceb726d1f6bd0e562ba1"}, + {file = "protobuf-4.23.3-cp39-cp39-win32.whl", hash = "sha256:5cb9e41188737f321f4fce9a4337bf40a5414b8d03227e1d9fbc59bc3a216e35"}, + {file = "protobuf-4.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:29660574cd769f2324a57fb78127cda59327eb6664381ecfe1c69731b83e8288"}, + {file = "protobuf-4.23.3-py3-none-any.whl", hash = "sha256:447b9786ac8e50ae72cae7a2eec5c5df6a9dbf9aa6f908f1b8bda6032644ea62"}, + {file = "protobuf-4.23.3.tar.gz", hash = "sha256:7a92beb30600332a52cdadbedb40d33fd7c8a0d7f549c440347bc606fb3fe34b"}, +] + +[[package]] +name = "pygame" +version = "2.6.1" +description = "Python Game Development" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "pygame-2.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9beeb647e555afb5657111fa83acb74b99ad88761108eaea66472e8b8547b55b"}, + {file = "pygame-2.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10e3d2a55f001f6c0a6eb44aa79ea7607091c9352b946692acedb2ac1482f1c9"}, + {file = "pygame-2.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:816e85000c5d8b02a42b9834f761a5925ef3377d2924e3a7c4c143d2990ce5b8"}, + {file = "pygame-2.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a78fd030d98faab4a8e27878536fdff7518d3e062a72761c552f624ebba5a5f"}, + {file = "pygame-2.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da3ad64d685f84a34ebe5daacb39fff14f1251acb34c098d760d63fee768f50c"}, + {file = "pygame-2.6.1-cp310-cp310-win32.whl", hash = "sha256:9dd5c054d4bd875a8caf978b82672f02bec332f52a833a76899220c460bb4b58"}, + {file = "pygame-2.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:00827aba089355925902d533f9c41e79a799641f03746c50a374dc5c3362e43d"}, + {file = "pygame-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20349195326a5e82a16e351ed93465a7845a7e2a9af55b7bc1b2110ea3e344e1"}, + {file = "pygame-2.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3935459109da4bb0b3901da9904f0a3e52028a3332a355d298b1673a334cf21"}, + {file = "pygame-2.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31dbdb5d0217f32764797d21c2752e258e5fb7e895326538d82b5f75a0cd856"}, + {file = "pygame-2.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:173badf82fa198e6888017bea40f511cb28e69ecdd5a72b214e81e4dcd66c3b1"}, + {file = "pygame-2.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce8cc108b92de9b149b344ad2e25eedbe773af0dc41dfb24d1f07f679b558c60"}, + {file = "pygame-2.6.1-cp311-cp311-win32.whl", hash = "sha256:811e7b925146d8149d79193652cbb83e0eca0aae66476b1cb310f0f4226b8b5c"}, + {file = "pygame-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:91476902426facd4bb0dad4dc3b2573bc82c95c71b135e0daaea072ed528d299"}, + {file = "pygame-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ee7f2771f588c966fa2fa8b829be26698c9b4836f82ede5e4edc1a68594942e"}, + {file = "pygame-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8040ea2ab18c6b255af706ec01355c8a6b08dc48d77fd4ee783f8fc46a843bf"}, + {file = "pygame-2.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47a6938de93fa610accd4969e638c2aebcb29b2fca518a84c3a39d91ab47116"}, + {file = "pygame-2.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33006f784e1c7d7e466fcb61d5489da59cc5f7eb098712f792a225df1d4e229d"}, + {file = "pygame-2.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1206125f14cae22c44565c9d333607f1d9f59487b1f1432945dfc809aeaa3e88"}, + {file = "pygame-2.6.1-cp312-cp312-win32.whl", hash = "sha256:84fc4054e25262140d09d39e094f6880d730199710829902f0d8ceae0213379e"}, + {file = "pygame-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9e7396be0d9633831c3f8d5d82dd63ba373ad65599628294b7a4f8a5a01a65"}, + {file = "pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2"}, + {file = "pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171"}, + {file = "pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b"}, + {file = "pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b"}, + {file = "pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c"}, + {file = "pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e"}, + {file = "pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a"}, + {file = "pygame-2.6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:56ffca6059b165bbf64f4b4be23b8068f6a0e220780e4f96ec0bb5ac3c63ec39"}, + {file = "pygame-2.6.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bede70ec708057e305815d6546012669226d1d80566785feca9b044216062e7"}, + {file = "pygame-2.6.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f84f15d146d6aa93254008a626c56ef96fed276006202881a47b29757f0cd65a"}, + {file = "pygame-2.6.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14f9dda45469b254c0f15edaaeaa85d2cc072ff6a83584a265f5d684c7f7efd8"}, + {file = "pygame-2.6.1-cp36-cp36m-win32.whl", hash = "sha256:28b43190436037e428a5be28fc80cf6615304fd528009f2c688cc828f4ff104b"}, + {file = "pygame-2.6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:a4b8f04fceddd9a3ac30778d11f0254f59efcd1c382d5801271113cea8b4f2f3"}, + {file = "pygame-2.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a620883d589926f157b8f1d1f543183ac52e5c30507dea445e3927ae0bee1c54"}, + {file = "pygame-2.6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b46e68cd168f44d0224c670bb72186688fc692d7079715f79d04096757d703d0"}, + {file = "pygame-2.6.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0b11356ac96261162d54a2c2b41a41978f00525631b01ec9c4fe26b01c66595"}, + {file = "pygame-2.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:325a84d072d52e3c2921eff02f87c6a74b7e77d71db3bdf53801c6c975f1b6c4"}, + {file = "pygame-2.6.1-cp37-cp37m-win32.whl", hash = "sha256:2a615d78b2364e86f541458ff41c2a46181b9a1e9eabd97b389282fdf04efbb3"}, + {file = "pygame-2.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:94afd1177680d92f9214c54966ad3517d18210c4fbc5d84a0192d218e93647e0"}, + {file = "pygame-2.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97ac4e13847b6b293ecaffa5ffce9886c98d09c03309406931cc592f0cea6366"}, + {file = "pygame-2.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d1a7f2b66ac2e4c9583b6d4c6d6f346fb10a3392c04163f537061f86a448ed5c"}, + {file = "pygame-2.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac3f033d2be4a9e23660a96afe2986df3a6916227538a6a0061bc218c5088507"}, + {file = "pygame-2.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1bf7ab5311bbced70320f1a56701650b4c18231343ae5af42111eea91e0949a"}, + {file = "pygame-2.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21160d9093533eb831f1b708e630706e5ac16b30750571ec27bc3b8364814f38"}, + {file = "pygame-2.6.1-cp38-cp38-win32.whl", hash = "sha256:7bffdd3eaf394d9645331d1c3a5df9d782ebcc3c5a78f3b657c7879a828dd111"}, + {file = "pygame-2.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:818b4eaec9c4acb6ac64805d4ca8edd4062bebca77bd815c18739fe2842c97e9"}, + {file = "pygame-2.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15efaa11a80a65dd589a95bebe812fa5bfc7e14946b638a424c5bd9ac6cca1a4"}, + {file = "pygame-2.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:481cfe1bdbb7fe00acc5950c494c26f00240888619bdc396fc8c39a734797432"}, + {file = "pygame-2.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d09fd950725d187aa5207c0cb8eb9ab0d2f8ce9ab8d189c30eeb470e71b617e"}, + {file = "pygame-2.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:163e66de169bd5670c86e27d0b74aad0d2d745e3b63cf4e7eb5b2bff1231ca8d"}, + {file = "pygame-2.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6e8d0547f30ddc845f4fd1e33070ef548233ad0dbf21f7ecea768883d1bbdc"}, + {file = "pygame-2.6.1-cp39-cp39-win32.whl", hash = "sha256:d29eb9a93f12aa3d997b6e3c447ac85b2a4b142ab2548441523a8fcf5e216042"}, + {file = "pygame-2.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:6582aa71a681e02e55d43150a9ab41394e6bf4d783d2962a10aea58f424be060"}, + {file = "pygame-2.6.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:4a8ea113b1bf627322a025a1a5a87e3818a7f55ab3a4077ff1ae5c8c60576614"}, + {file = "pygame-2.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7f9f8e6f76de36f4725175d686601214af362a4f30614b4dae2240198e72e6f"}, + {file = "pygame-2.6.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bbb7167c92103a2091366e9af26d4914ba3776666e8677d3c93551353fffa626"}, + {file = "pygame-2.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17498a2b043bc0e795faedef1b081199c688890200aef34991c1941caa2d2c89"}, + {file = "pygame-2.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7103c60939bbc1e05cfc7ba3f1d2ad3bbf103b7828b82a7166a9ab6f51950146"}, + {file = "pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f"}, +] + +[[package]] +name = "scipy" +version = "1.15.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92"}, + {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82"}, + {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40"}, + {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e"}, + {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c"}, + {file = "scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1"}, + {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889"}, + {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982"}, + {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9"}, + {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594"}, + {file = "scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c"}, + {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45"}, + {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49"}, + {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e"}, + {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539"}, + {file = "scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730"}, + {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825"}, + {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7"}, + {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11"}, + {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126"}, + {file = "scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb"}, + {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723"}, + {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb"}, + {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4"}, + {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5"}, + {file = "scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca"}, + {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.5" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[metadata] +lock-version = "2.1" +python-versions = "*" +content-hash = "b0587520411cd55eeb9df56512d00f4b77bde4cfaaa44569805a73107dcc3bde" diff --git a/PythonAPI/examples/nvidia/projection_functions.py b/PythonAPI/examples/nvidia/nurec/projection_functions.py similarity index 100% rename from PythonAPI/examples/nvidia/projection_functions.py rename to PythonAPI/examples/nvidia/nurec/projection_functions.py diff --git a/PythonAPI/examples/nvidia/pygame_display.py b/PythonAPI/examples/nvidia/nurec/pygame_display.py similarity index 100% rename from PythonAPI/examples/nvidia/pygame_display.py rename to PythonAPI/examples/nvidia/nurec/pygame_display.py diff --git a/PythonAPI/examples/nvidia/nurec/pyproject.toml b/PythonAPI/examples/nvidia/nurec/pyproject.toml new file mode 100644 index 0000000000..68c344e86d --- /dev/null +++ b/PythonAPI/examples/nvidia/nurec/pyproject.toml @@ -0,0 +1,13 @@ +[tool.poetry] +name = "carla" +version = "0.2" +description = "" +authors = ["Your Name "] + +[tool.poetry.dependencies] +pygame = {version = "2.6.1", python = ">=3.10, <3.11"} +numpy = {version = "2.2.5", python = ">=3.10, <3.11"} +scipy = {version = "1.15.3", python = ">=3.10, <3.11"} +grpcio = {version = "1.74.0", python = ">=3.10, <3.11"} +protobuf = {version = "4.23.3", python = ">=3.10, <3.11"} +nvidia-nvimgcodec-cu12 = {version = "^0.5.0.13", python = ">=3.10, <3.11"} diff --git a/PythonAPI/examples/nvidia/requirements.txt b/PythonAPI/examples/nvidia/nurec/requirements.txt similarity index 86% rename from PythonAPI/examples/nvidia/requirements.txt rename to PythonAPI/examples/nvidia/nurec/requirements.txt index 0d3be9e369..5b63876931 100644 --- a/PythonAPI/examples/nvidia/requirements.txt +++ b/PythonAPI/examples/nvidia/nurec/requirements.txt @@ -1,7 +1,7 @@ pygame==2.6.1 numpy==2.2.5 scipy==1.15.3 -grpcio==1.64.0 +grpcio==1.74.0 protobuf==4.23.3 carla>=0.9.16 nvidia-nvimgcodec-cu12 diff --git a/PythonAPI/examples/nvidia/scenario.py b/PythonAPI/examples/nvidia/nurec/scenario.py similarity index 100% rename from PythonAPI/examples/nvidia/scenario.py rename to PythonAPI/examples/nvidia/nurec/scenario.py diff --git a/PythonAPI/examples/nvidia/simple_trajectory_follower.py b/PythonAPI/examples/nvidia/nurec/simple_trajectory_follower.py similarity index 100% rename from PythonAPI/examples/nvidia/simple_trajectory_follower.py rename to PythonAPI/examples/nvidia/nurec/simple_trajectory_follower.py diff --git a/PythonAPI/examples/nvidia/tools.md b/PythonAPI/examples/nvidia/nurec/tools.md similarity index 100% rename from PythonAPI/examples/nvidia/tools.md rename to PythonAPI/examples/nvidia/nurec/tools.md diff --git a/PythonAPI/examples/nvidia/tools/extract_blueprint_sizes.py b/PythonAPI/examples/nvidia/nurec/tools/extract_blueprint_sizes.py similarity index 100% rename from PythonAPI/examples/nvidia/tools/extract_blueprint_sizes.py rename to PythonAPI/examples/nvidia/nurec/tools/extract_blueprint_sizes.py diff --git a/PythonAPI/examples/nvidia/track.py b/PythonAPI/examples/nvidia/nurec/track.py similarity index 100% rename from PythonAPI/examples/nvidia/track.py rename to PythonAPI/examples/nvidia/nurec/track.py diff --git a/PythonAPI/examples/nvidia/utils.py b/PythonAPI/examples/nvidia/nurec/utils.py similarity index 98% rename from PythonAPI/examples/nvidia/utils.py rename to PythonAPI/examples/nvidia/nurec/utils.py index 41be430658..9e5979f281 100644 --- a/PythonAPI/examples/nvidia/utils.py +++ b/PythonAPI/examples/nvidia/nurec/utils.py @@ -24,7 +24,7 @@ """ import numpy as np -from grpc_proto import common_pb2 as grpc_types +from nre.grpc.protos import common_pb2 as grpc_types import carla from scipy.spatial.transform import Rotation as R import logging @@ -107,7 +107,8 @@ def undo_carla_coordinate_transform(transform: np.ndarray) -> np.ndarray: # yaw, pitch, roll = roll, -yaw, pitch # yaw, pitch, roll = -pitch, roll, yaw yaw = -yaw - roll = -roll + roll = roll + pitch = -pitch rotation = R.from_euler("zyx", [yaw, pitch, roll], degrees=False) # carla.Rotation(pitch=euler_angles[2] * 180 / np.pi, yaw=-euler_angles[0] * 180 / np.pi, roll=euler_angles[1] * 180 / np.pi) result[:3, :3] = rotation.as_matrix()