isar 1.27.2__tar.gz → 1.28.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- {isar-1.27.2 → isar-1.28.1}/PKG-INFO +1 -1
- {isar-1.27.2 → isar-1.28.1}/requirements.txt +12 -12
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/models/start_mission_definition.py +7 -8
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/schedule/scheduling_controller.py +56 -24
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -2
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/default_mission.json +1 -5
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +4 -11
- {isar-1.27.2 → isar-1.28.1}/src/isar/robot/robot.py +16 -11
- {isar-1.27.2 → isar-1.28.1}/src/isar/robot/robot_start_mission.py +7 -1
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/slimm_storage.py +6 -10
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/uploader.py +4 -2
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/utilities.py +9 -10
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/inspection/inspection.py +1 -2
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/mission/task.py +1 -1
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/telemetry/payloads.py +3 -1
- {isar-1.27.2 → isar-1.28.1}/.dockerignore +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/release.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/workflows/project_automations.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.github/workflows/stale.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/.gitignore +0 -0
- {isar-1.27.2 → isar-1.28.1}/.pre-commit-config.yaml +0 -0
- {isar-1.27.2 → isar-1.28.1}/LICENSE +0 -0
- {isar-1.27.2 → isar-1.28.1}/README.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/SECURITY.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/Makefile +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/full_state_machine_diagram.png +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/make.bat +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/mission_state_machine_diagram.png +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/robot_status_state_machine_diagram.png +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/rst_processing.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/source/conf.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/source/index.rst +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/source/readme_link.md +0 -0
- {isar-1.27.2 → isar-1.28.1}/docs/update_state_diagram.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/main.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/pyproject.toml +0 -0
- {isar-1.27.2 → isar-1.28.1}/radixconfig.yml +0 -0
- {isar-1.27.2 → isar-1.28.1}/setup.cfg +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/api.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/models/models.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/robot_control/robot_controller.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/configuration_error.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/log.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/logging.conf +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/settings.env +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/config/settings.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/message.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/events.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/queue_utils.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/modules.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/robot/robot_status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/robot/robot_stop_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/robot/robot_task_status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/script.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/utilities/scheduling_utilities.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/state_machine.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/await_next_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/home.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/monitor.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/returning_home.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/robot_standing_still.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/stopping.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states/unknown_status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/pause.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/resume.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/stop.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/functions/utils.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/return_home.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/state_machine/transitions/robot_status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/local_storage.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/SOURCES.txt +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/conftest.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/models/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/mission/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/models/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/state_machine/test_state_machine.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/__init__.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/blob_storage.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/mission_definition.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/pose.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/request.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/robot_interface.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/status.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/task.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/mocks/token.py +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.27.2 → isar-1.28.1}/tests/test_data/test_thermal_image_mission.json +0 -0
|
@@ -12,13 +12,13 @@ anyio==4.9.0
|
|
|
12
12
|
# via
|
|
13
13
|
# httpx
|
|
14
14
|
# starlette
|
|
15
|
-
azure-core==1.
|
|
15
|
+
azure-core==1.34.0
|
|
16
16
|
# via
|
|
17
17
|
# azure-identity
|
|
18
18
|
# azure-keyvault-secrets
|
|
19
19
|
# azure-storage-blob
|
|
20
20
|
# opencensus-ext-azure
|
|
21
|
-
azure-identity==1.
|
|
21
|
+
azure-identity==1.23.0
|
|
22
22
|
# via
|
|
23
23
|
# isar (pyproject.toml)
|
|
24
24
|
# opencensus-ext-azure
|
|
@@ -30,20 +30,20 @@ backoff==2.2.1
|
|
|
30
30
|
# via isar (pyproject.toml)
|
|
31
31
|
cachetools==5.5.2
|
|
32
32
|
# via google-auth
|
|
33
|
-
certifi==2025.
|
|
33
|
+
certifi==2025.4.26
|
|
34
34
|
# via
|
|
35
35
|
# httpcore
|
|
36
36
|
# httpx
|
|
37
37
|
# requests
|
|
38
38
|
cffi==1.17.1
|
|
39
39
|
# via cryptography
|
|
40
|
-
charset-normalizer==3.4.
|
|
40
|
+
charset-normalizer==3.4.2
|
|
41
41
|
# via requests
|
|
42
|
-
click==8.
|
|
42
|
+
click==8.2.0
|
|
43
43
|
# via
|
|
44
44
|
# isar (pyproject.toml)
|
|
45
45
|
# uvicorn
|
|
46
|
-
cryptography==44.0.
|
|
46
|
+
cryptography==44.0.3
|
|
47
47
|
# via
|
|
48
48
|
# azure-identity
|
|
49
49
|
# azure-storage-blob
|
|
@@ -64,7 +64,7 @@ fastapi-azure-auth==5.1.1
|
|
|
64
64
|
# via isar (pyproject.toml)
|
|
65
65
|
google-api-core==2.24.2
|
|
66
66
|
# via opencensus
|
|
67
|
-
google-auth==2.
|
|
67
|
+
google-auth==2.40.1
|
|
68
68
|
# via google-api-core
|
|
69
69
|
googleapis-common-protos==1.70.0
|
|
70
70
|
# via google-api-core
|
|
@@ -85,7 +85,7 @@ isodate==0.7.2
|
|
|
85
85
|
# via
|
|
86
86
|
# azure-keyvault-secrets
|
|
87
87
|
# azure-storage-blob
|
|
88
|
-
msal==1.32.
|
|
88
|
+
msal==1.32.3
|
|
89
89
|
# via
|
|
90
90
|
# azure-identity
|
|
91
91
|
# msal-extensions
|
|
@@ -113,7 +113,7 @@ paho-mqtt==2.1.0
|
|
|
113
113
|
# via isar (pyproject.toml)
|
|
114
114
|
proto-plus==1.26.1
|
|
115
115
|
# via google-api-core
|
|
116
|
-
protobuf==6.
|
|
116
|
+
protobuf==6.31.0
|
|
117
117
|
# via
|
|
118
118
|
# google-api-core
|
|
119
119
|
# googleapis-common-protos
|
|
@@ -128,12 +128,12 @@ pyasn1-modules==0.4.2
|
|
|
128
128
|
# via google-auth
|
|
129
129
|
pycparser==2.22
|
|
130
130
|
# via cffi
|
|
131
|
-
pydantic==2.11.
|
|
131
|
+
pydantic==2.11.4
|
|
132
132
|
# via
|
|
133
133
|
# fastapi
|
|
134
134
|
# isar (pyproject.toml)
|
|
135
135
|
# pydantic-settings
|
|
136
|
-
pydantic-core==2.33.
|
|
136
|
+
pydantic-core==2.33.2
|
|
137
137
|
# via pydantic
|
|
138
138
|
pydantic-settings==2.9.1
|
|
139
139
|
# via isar (pyproject.toml)
|
|
@@ -161,7 +161,7 @@ requests-toolbelt==1.0.0
|
|
|
161
161
|
# via isar (pyproject.toml)
|
|
162
162
|
rsa==4.9.1
|
|
163
163
|
# via google-auth
|
|
164
|
-
scipy==1.15.
|
|
164
|
+
scipy==1.15.3
|
|
165
165
|
# via alitra
|
|
166
166
|
six==1.17.0
|
|
167
167
|
# via
|
|
@@ -39,9 +39,8 @@ class TaskType(str, Enum):
|
|
|
39
39
|
class StartMissionInspectionDefinition(BaseModel):
|
|
40
40
|
type: InspectionTypes = Field(default=InspectionTypes.image)
|
|
41
41
|
inspection_target: InputPosition
|
|
42
|
-
|
|
42
|
+
inspection_description: Optional[str] = None
|
|
43
43
|
duration: Optional[float] = None
|
|
44
|
-
metadata: Optional[dict] = None
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
class StartMissionTaskDefinition(BaseModel):
|
|
@@ -107,8 +106,8 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
107
106
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
108
107
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
109
108
|
tag_id=task_definition.tag,
|
|
109
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
110
110
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
111
|
-
metadata=task_definition.inspection.metadata,
|
|
112
111
|
zoom=task_definition.zoom,
|
|
113
112
|
)
|
|
114
113
|
elif inspection_definition.type == InspectionTypes.video:
|
|
@@ -116,9 +115,9 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
116
115
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
117
116
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
118
117
|
tag_id=task_definition.tag,
|
|
118
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
119
119
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
120
120
|
duration=inspection_definition.duration,
|
|
121
|
-
metadata=task_definition.inspection.metadata,
|
|
122
121
|
zoom=task_definition.zoom,
|
|
123
122
|
)
|
|
124
123
|
elif inspection_definition.type == InspectionTypes.thermal_image:
|
|
@@ -126,8 +125,8 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
126
125
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
127
126
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
128
127
|
tag_id=task_definition.tag,
|
|
128
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
129
129
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
130
|
-
metadata=task_definition.inspection.metadata,
|
|
131
130
|
zoom=task_definition.zoom,
|
|
132
131
|
)
|
|
133
132
|
elif inspection_definition.type == InspectionTypes.thermal_video:
|
|
@@ -135,9 +134,9 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
135
134
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
136
135
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
137
136
|
tag_id=task_definition.tag,
|
|
137
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
138
138
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
139
139
|
duration=inspection_definition.duration,
|
|
140
|
-
metadata=task_definition.inspection.metadata,
|
|
141
140
|
zoom=task_definition.zoom,
|
|
142
141
|
)
|
|
143
142
|
elif inspection_definition.type == InspectionTypes.audio:
|
|
@@ -145,16 +144,16 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
145
144
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
146
145
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
147
146
|
tag_id=task_definition.tag,
|
|
147
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
148
148
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
149
149
|
duration=inspection_definition.duration,
|
|
150
|
-
metadata=task_definition.inspection.metadata,
|
|
151
150
|
)
|
|
152
151
|
elif inspection_definition.type == InspectionTypes.gas_measurement:
|
|
153
152
|
return TakeGasMeasurement(
|
|
154
153
|
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
155
154
|
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
156
155
|
tag_id=task_definition.tag,
|
|
157
|
-
|
|
156
|
+
inspection_description=task_definition.inspection.inspection_description,
|
|
158
157
|
)
|
|
159
158
|
else:
|
|
160
159
|
raise ValueError(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from http import HTTPStatus
|
|
3
|
+
from threading import Lock
|
|
3
4
|
|
|
4
5
|
from dependency_injector.wiring import inject
|
|
5
6
|
from fastapi import Body, HTTPException, Path
|
|
@@ -29,6 +30,7 @@ class SchedulingController:
|
|
|
29
30
|
):
|
|
30
31
|
self.scheduling_utilities: SchedulingUtilities = scheduling_utilities
|
|
31
32
|
self.logger = logging.getLogger("api")
|
|
33
|
+
self.start_mission_lock: Lock = Lock()
|
|
32
34
|
|
|
33
35
|
def start_mission_by_id(
|
|
34
36
|
self,
|
|
@@ -67,46 +69,76 @@ class SchedulingController:
|
|
|
67
69
|
self.logger.info("Received request to start new mission")
|
|
68
70
|
|
|
69
71
|
if not mission_definition:
|
|
70
|
-
|
|
72
|
+
error_message_no_mission_definition: str = (
|
|
71
73
|
"Unprocessable entity - 'mission_definition' empty or invalid"
|
|
72
74
|
)
|
|
73
|
-
self.logger.error(
|
|
75
|
+
self.logger.error(error_message_no_mission_definition)
|
|
74
76
|
raise HTTPException(
|
|
75
|
-
status_code=HTTPStatus.UNPROCESSABLE_ENTITY,
|
|
77
|
+
status_code=HTTPStatus.UNPROCESSABLE_ENTITY,
|
|
78
|
+
detail=error_message_no_mission_definition,
|
|
76
79
|
)
|
|
77
80
|
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
if not self.start_mission_lock.acquire(blocking=False):
|
|
82
|
+
error_message_another_mission_starting: str = (
|
|
83
|
+
"Conflict - Another mission is currently being started"
|
|
84
|
+
)
|
|
85
|
+
self.logger.warning(error_message_another_mission_starting)
|
|
86
|
+
raise HTTPException(
|
|
87
|
+
status_code=HTTPStatus.CONFLICT,
|
|
88
|
+
detail=error_message_another_mission_starting,
|
|
89
|
+
)
|
|
80
90
|
|
|
81
91
|
try:
|
|
82
|
-
|
|
83
|
-
|
|
92
|
+
state: States = self.scheduling_utilities.get_state()
|
|
93
|
+
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(
|
|
94
|
+
state
|
|
84
95
|
)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
mission: Mission = to_isar_mission(
|
|
99
|
+
start_mission_definition=mission_definition
|
|
100
|
+
)
|
|
101
|
+
except MissionPlannerError as e:
|
|
102
|
+
error_message = f"Bad Request - Cannot create ISAR mission: {e}"
|
|
103
|
+
self.logger.warning(error_message)
|
|
104
|
+
raise HTTPException(
|
|
105
|
+
status_code=HTTPStatus.BAD_REQUEST,
|
|
106
|
+
detail=error_message,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
self.scheduling_utilities.verify_robot_capable_of_mission(
|
|
110
|
+
mission=mission, robot_capabilities=robot_settings.CAPABILITIES
|
|
91
111
|
)
|
|
92
112
|
|
|
93
|
-
|
|
94
|
-
mission=mission
|
|
95
|
-
|
|
113
|
+
self.logger.info("Starting mission: %s", mission.id)
|
|
114
|
+
self.scheduling_utilities.start_mission(mission=mission)
|
|
115
|
+
return self._api_response(mission)
|
|
96
116
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return self._api_response(mission)
|
|
117
|
+
finally:
|
|
118
|
+
self.start_mission_lock.release()
|
|
100
119
|
|
|
101
120
|
def return_home(self) -> None:
|
|
102
121
|
self.logger.info("Received request to return home")
|
|
103
122
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
123
|
+
if not self.start_mission_lock.acquire(blocking=False):
|
|
124
|
+
error_message_another_mission_starting: str = (
|
|
125
|
+
"Conflict - Another mission is currently being started"
|
|
126
|
+
)
|
|
127
|
+
self.logger.warning(error_message_another_mission_starting)
|
|
128
|
+
raise HTTPException(
|
|
129
|
+
status_code=HTTPStatus.CONFLICT,
|
|
130
|
+
detail=error_message_another_mission_starting,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
state: States = self.scheduling_utilities.get_state()
|
|
135
|
+
self.scheduling_utilities.verify_state_machine_ready_to_receive_return_home_mission(
|
|
136
|
+
state
|
|
137
|
+
)
|
|
108
138
|
|
|
109
|
-
|
|
139
|
+
self.scheduling_utilities.return_home()
|
|
140
|
+
finally:
|
|
141
|
+
self.start_mission_lock.release()
|
|
110
142
|
|
|
111
143
|
def pause_mission(self) -> ControlMissionResponse:
|
|
112
144
|
self.logger.info("Received request to pause current mission")
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
"z": 0.6145,
|
|
29
29
|
"frame_name": "robot"
|
|
30
30
|
},
|
|
31
|
-
"analysis_types": "CarSeal, Rust",
|
|
32
31
|
"metadata": {
|
|
33
32
|
"zoom": "2x"
|
|
34
33
|
}
|
|
@@ -41,7 +40,6 @@
|
|
|
41
40
|
"z": 0.6145,
|
|
42
41
|
"frame_name": "robot"
|
|
43
42
|
},
|
|
44
|
-
"analysis_types": "GasDetection",
|
|
45
43
|
"duration": 10
|
|
46
44
|
}
|
|
47
45
|
]
|
{isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/default_mission.json
RENAMED
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
"z": 0,
|
|
29
29
|
"frame_name": "robot"
|
|
30
30
|
},
|
|
31
|
-
"analysis_types": "CarSeal, Rust",
|
|
32
31
|
"metadata": {
|
|
33
32
|
"zoom": "2x"
|
|
34
33
|
}
|
|
@@ -41,8 +40,6 @@
|
|
|
41
40
|
"z": 0,
|
|
42
41
|
"frame_name": "robot"
|
|
43
42
|
},
|
|
44
|
-
"analysis_types": "GasDetection"
|
|
45
|
-
,
|
|
46
43
|
"duration": 10
|
|
47
44
|
}
|
|
48
45
|
]
|
|
@@ -72,8 +69,7 @@
|
|
|
72
69
|
"y": 0,
|
|
73
70
|
"z": 0,
|
|
74
71
|
"frame_name": "robot"
|
|
75
|
-
}
|
|
76
|
-
"analysis_types": "ColdSpot,HotSpot"
|
|
72
|
+
}
|
|
77
73
|
},
|
|
78
74
|
{
|
|
79
75
|
"type": "Video",
|
{isar-1.27.2 → isar-1.28.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json
RENAMED
|
@@ -28,8 +28,6 @@
|
|
|
28
28
|
"z": 0,
|
|
29
29
|
"frame": "robot"
|
|
30
30
|
},
|
|
31
|
-
"analysis_types": "CarSeal, Rust"
|
|
32
|
-
,
|
|
33
31
|
"metadata": {
|
|
34
32
|
"zoom": "2x"
|
|
35
33
|
}
|
|
@@ -41,8 +39,7 @@
|
|
|
41
39
|
"y": 4.9,
|
|
42
40
|
"z": 0,
|
|
43
41
|
"frame": "robot"
|
|
44
|
-
}
|
|
45
|
-
"analysis_types": "GasDetection"
|
|
42
|
+
}
|
|
46
43
|
}
|
|
47
44
|
]
|
|
48
45
|
},
|
|
@@ -72,9 +69,7 @@
|
|
|
72
69
|
"y": 5.2,
|
|
73
70
|
"z": 0,
|
|
74
71
|
"frame": "robot"
|
|
75
|
-
}
|
|
76
|
-
"analysis_types": "ColdSpot, HotSpot"
|
|
77
|
-
|
|
72
|
+
}
|
|
78
73
|
}
|
|
79
74
|
]
|
|
80
75
|
},
|
|
@@ -104,8 +99,7 @@
|
|
|
104
99
|
"y": 5.2,
|
|
105
100
|
"z": 0,
|
|
106
101
|
"frame": "robot"
|
|
107
|
-
}
|
|
108
|
-
"analysis_types": "ColdSpot, HotSpot"
|
|
102
|
+
}
|
|
109
103
|
},
|
|
110
104
|
{
|
|
111
105
|
"type": "ThermalImage",
|
|
@@ -114,8 +108,7 @@
|
|
|
114
108
|
"y": 1.9,
|
|
115
109
|
"z": 0,
|
|
116
110
|
"frame": "robot"
|
|
117
|
-
}
|
|
118
|
-
"analysis_types": "ColdSpot, HotSpot"
|
|
111
|
+
}
|
|
119
112
|
}
|
|
120
113
|
]
|
|
121
114
|
}
|
|
@@ -33,7 +33,7 @@ class Robot(object):
|
|
|
33
33
|
self.start_mission_thread: Optional[RobotStartMissionThread] = None
|
|
34
34
|
self.robot_status_thread: Optional[RobotStatusThread] = None
|
|
35
35
|
self.robot_task_status_thread: Optional[RobotTaskStatusThread] = None
|
|
36
|
-
self.
|
|
36
|
+
self.stop_mission_thread: Optional[RobotStopMissionThread] = None
|
|
37
37
|
self.signal_thread_quitting: Event = Event()
|
|
38
38
|
|
|
39
39
|
def stop(self) -> None:
|
|
@@ -42,19 +42,16 @@ class Robot(object):
|
|
|
42
42
|
self.robot_status_thread.join()
|
|
43
43
|
if (
|
|
44
44
|
self.robot_task_status_thread is not None
|
|
45
|
-
and self.
|
|
45
|
+
and self.robot_task_status_thread.is_alive()
|
|
46
46
|
):
|
|
47
47
|
self.robot_task_status_thread.join()
|
|
48
48
|
if (
|
|
49
49
|
self.start_mission_thread is not None
|
|
50
|
-
and self.
|
|
50
|
+
and self.start_mission_thread.is_alive()
|
|
51
51
|
):
|
|
52
52
|
self.start_mission_thread.join()
|
|
53
|
-
if (
|
|
54
|
-
self.
|
|
55
|
-
and self.stop_mission_thread_thread.is_alive()
|
|
56
|
-
):
|
|
57
|
-
self.stop_mission_thread_thread.join()
|
|
53
|
+
if self.stop_mission_thread is not None and self.stop_mission_thread.is_alive():
|
|
54
|
+
self.stop_mission_thread.join()
|
|
58
55
|
self.robot_status_thread = None
|
|
59
56
|
self.robot_task_status_thread = None
|
|
60
57
|
self.start_mission_thread = None
|
|
@@ -92,7 +89,15 @@ class Robot(object):
|
|
|
92
89
|
def _check_and_handle_stop_mission(self, event: Queue) -> None:
|
|
93
90
|
if check_for_event(event):
|
|
94
91
|
if (
|
|
95
|
-
self.
|
|
92
|
+
self.stop_mission_thread is not None
|
|
93
|
+
and self.stop_mission_thread.is_alive()
|
|
94
|
+
):
|
|
95
|
+
self.logger.warning(
|
|
96
|
+
"Received stop mission event while trying to stop a mission. Aborting stop attempt."
|
|
97
|
+
)
|
|
98
|
+
return
|
|
99
|
+
if (
|
|
100
|
+
self.start_mission_thread is not None
|
|
96
101
|
and self.start_mission_thread.is_alive()
|
|
97
102
|
):
|
|
98
103
|
error_description = "Received stop mission event while trying to start a mission. Aborting stop attempt."
|
|
@@ -104,10 +109,10 @@ class Robot(object):
|
|
|
104
109
|
self.robot_service_events.mission_failed_to_stop, error_message
|
|
105
110
|
)
|
|
106
111
|
return
|
|
107
|
-
self.
|
|
112
|
+
self.stop_mission_thread = RobotStopMissionThread(
|
|
108
113
|
self.robot_service_events, self.robot, self.signal_thread_quitting
|
|
109
114
|
)
|
|
110
|
-
self.
|
|
115
|
+
self.stop_mission_thread.start()
|
|
111
116
|
|
|
112
117
|
def run(self) -> None:
|
|
113
118
|
self.robot_status_thread = RobotStatusThread(
|
|
@@ -61,6 +61,10 @@ class RobotStartMissionThread(Thread):
|
|
|
61
61
|
error_description=error_description,
|
|
62
62
|
),
|
|
63
63
|
)
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
continue
|
|
67
|
+
|
|
64
68
|
started_mission = True
|
|
65
69
|
except RobotInfeasibleMissionException as e:
|
|
66
70
|
trigger_event(
|
|
@@ -69,4 +73,6 @@ class RobotStartMissionThread(Thread):
|
|
|
69
73
|
error_reason=e.error_reason, error_description=e.error_description
|
|
70
74
|
),
|
|
71
75
|
)
|
|
72
|
-
|
|
76
|
+
|
|
77
|
+
if started_mission:
|
|
78
|
+
trigger_event_without_data(self.robot_service_events.mission_started)
|
|
@@ -125,13 +125,11 @@ class SlimmStorage(StorageInterface):
|
|
|
125
125
|
"ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
|
|
126
126
|
"ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
|
|
127
127
|
"ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
|
|
128
|
-
"ImageMetadata.
|
|
129
|
-
inspection.metadata.
|
|
130
|
-
if inspection.metadata.
|
|
131
|
-
and inspection.metadata.additional["analysis_type"]
|
|
128
|
+
"ImageMetadata.Description": (
|
|
129
|
+
inspection.metadata.inspection_description
|
|
130
|
+
if inspection.metadata.inspection_description
|
|
132
131
|
else "N/A"
|
|
133
132
|
),
|
|
134
|
-
"ImageMetadata.Description": str(inspection.metadata.additional),
|
|
135
133
|
"ImageMetadata.FunctionalLocation": (
|
|
136
134
|
inspection.metadata.tag_id # noqa: E501
|
|
137
135
|
if inspection.metadata.tag_id
|
|
@@ -175,13 +173,11 @@ class SlimmStorage(StorageInterface):
|
|
|
175
173
|
"VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
|
|
176
174
|
"VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
|
|
177
175
|
"VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
|
|
178
|
-
"VideoMetadata.
|
|
179
|
-
inspection.metadata.
|
|
180
|
-
if inspection.metadata.
|
|
181
|
-
and inspection.metadata.additional["analysis_type"]
|
|
176
|
+
"VideoMetadata.Description": (
|
|
177
|
+
inspection.metadata.inspection_description
|
|
178
|
+
if inspection.metadata.inspection_description
|
|
182
179
|
else "N/A"
|
|
183
180
|
),
|
|
184
|
-
"VideoMetadata.Description": str(inspection.metadata.additional),
|
|
185
181
|
"VideoMetadata.FunctionalLocation": (
|
|
186
182
|
inspection.metadata.tag_id # noqa: E501
|
|
187
183
|
if inspection.metadata.tag_id
|
|
@@ -163,8 +163,10 @@ class Uploader:
|
|
|
163
163
|
inspection_id=inspection.id,
|
|
164
164
|
inspection_path=inspection_path,
|
|
165
165
|
installation_code=settings.PLANT_SHORT_NAME,
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
tag_id=inspection.metadata.tag_id,
|
|
167
|
+
inspection_type=type(inspection).__name__,
|
|
168
|
+
inspection_description=inspection.metadata.inspection_description,
|
|
169
|
+
timestamp=inspection.metadata.start_time,
|
|
168
170
|
)
|
|
169
171
|
self.mqtt_publisher.publish(
|
|
170
172
|
topic=settings.TOPIC_ISAR_INSPECTION_RESULT,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import time
|
|
3
2
|
from datetime import datetime, timezone
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import Tuple
|
|
@@ -41,11 +40,7 @@ def construct_metadata_file(
|
|
|
41
40
|
"plant_name": settings.PLANT_NAME,
|
|
42
41
|
"isar_id": settings.ISAR_ID,
|
|
43
42
|
"robot_name": settings.ROBOT_NAME,
|
|
44
|
-
"
|
|
45
|
-
inspection.metadata.additional["analysis_type"]
|
|
46
|
-
if inspection.metadata.additional
|
|
47
|
-
else "N/A"
|
|
48
|
-
),
|
|
43
|
+
"inspection_description": inspection.metadata.inspection_description,
|
|
49
44
|
},
|
|
50
45
|
"data": [
|
|
51
46
|
{
|
|
@@ -71,12 +66,16 @@ def construct_metadata_file(
|
|
|
71
66
|
|
|
72
67
|
|
|
73
68
|
def get_filename(inspection: Inspection) -> str:
|
|
74
|
-
|
|
69
|
+
utc_time: str = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
|
|
75
70
|
tag: str = inspection.metadata.tag_id if inspection.metadata.tag_id else "no-tag"
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
inspection_type: str = type(inspection).__name__
|
|
72
|
+
inspection_description: str = inspection.metadata.inspection_description.replace(
|
|
73
|
+
" ", "-"
|
|
74
|
+
)
|
|
75
|
+
return f"{tag}__{inspection_type}__{inspection_description}__{utc_time}"
|
|
78
76
|
|
|
79
77
|
|
|
80
78
|
def get_foldername(mission: Mission) -> str:
|
|
79
|
+
utc_date: str = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
81
80
|
mission_name: str = mission.name.replace(" ", "-")
|
|
82
|
-
return f"{
|
|
81
|
+
return f"{utc_date}__{settings.PLANT_SHORT_NAME}__{mission_name}__{mission.id}"
|
|
@@ -12,9 +12,8 @@ class InspectionMetadata(ABC):
|
|
|
12
12
|
start_time: datetime
|
|
13
13
|
pose: Pose
|
|
14
14
|
file_type: str
|
|
15
|
-
analysis_type: Optional[str] = field(default=None, init=False)
|
|
16
15
|
tag_id: Optional[str] = field(default=None, init=False)
|
|
17
|
-
|
|
16
|
+
inspection_description: Optional[str] = field(default=None, init=False)
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
@dataclass
|
|
@@ -61,7 +61,7 @@ class InspectionTask(Task):
|
|
|
61
61
|
|
|
62
62
|
inspection_id: str = Field(default_factory=uuid4_string, frozen=True)
|
|
63
63
|
robot_pose: Pose = Field(default=None, init=True)
|
|
64
|
-
|
|
64
|
+
inspection_description: Optional[str] = Field(default=None)
|
|
65
65
|
zoom: Optional[ZoomDescription] = Field(default=None)
|
|
66
66
|
|
|
67
67
|
@staticmethod
|
|
@@ -111,5 +111,7 @@ class InspectionResultPayload:
|
|
|
111
111
|
inspection_id: str
|
|
112
112
|
inspection_path: Union[str, dict]
|
|
113
113
|
installation_code: str
|
|
114
|
-
|
|
114
|
+
tag_id: Optional[str]
|
|
115
|
+
inspection_type: Optional[str]
|
|
116
|
+
inspection_description: Optional[str]
|
|
115
117
|
timestamp: datetime
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|