isar 1.14.4__tar.gz → 1.15.0__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.14.4 → isar-1.15.0}/PKG-INFO +2 -2
- {isar-1.14.4 → isar-1.15.0}/README.md +1 -1
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/models/start_mission_definition.py +17 -2
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/schedule/scheduling_controller.py +9 -11
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_mission_definition/default_mission.json +4 -11
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +7 -19
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/message.py +0 -2
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +1 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/utilities/scheduling_utilities.py +0 -3
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/state_machine.py +1 -6
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/idle.py +0 -1
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/monitor.py +4 -7
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/blob_storage.py +8 -8
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/local_storage.py +6 -6
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/slimm_storage.py +39 -36
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/storage_interface.py +4 -4
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/uploader.py +6 -6
- isar-1.15.0/src/isar/storage/utilities.py +78 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar.egg-info/PKG-INFO +2 -2
- {isar-1.14.4 → isar-1.15.0}/src/isar.egg-info/SOURCES.txt +0 -1
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/inspection/inspection.py +1 -1
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/mission/mission.py +1 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/mission/step.py +1 -1
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/telemetry/mqtt_client.py +2 -4
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/telemetry/payloads.py +1 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/mission/test_mission.py +1 -1
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/readers/test_mission_reader.py +0 -4
- {isar-1.14.4 → isar-1.15.0}/tests/isar/state_machine/test_state_machine.py +12 -29
- {isar-1.14.4 → isar-1.15.0}/tests/isar/storage/test_uploader.py +8 -12
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/blob_storage.py +2 -2
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/mission_definition.py +3 -3
- isar-1.14.4/src/isar/models/mission_metadata/mission_metadata.py +0 -26
- isar-1.14.4/src/isar/storage/utilities.py +0 -74
- {isar-1.14.4 → isar-1.15.0}/.dockerignore +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/release.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/project_automations.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/repository_dispatch_on_merge.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.github/workflows/stale.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/.gitignore +0 -0
- {isar-1.14.4 → isar-1.15.0}/.pre-commit-config.yaml +0 -0
- {isar-1.14.4 → isar-1.15.0}/Dockerfile +0 -0
- {isar-1.14.4 → isar-1.15.0}/LICENSE +0 -0
- {isar-1.14.4 → isar-1.15.0}/docker-compose-turtlebot.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/docker-compose.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/Makefile +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/make.bat +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/rst_processing.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/source/conf.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/source/index.rst +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/source/readme_link.md +0 -0
- {isar-1.14.4 → isar-1.15.0}/docs/state_machine_diagram.png +0 -0
- {isar-1.14.4 → isar-1.15.0}/main.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/pyproject.toml +0 -0
- {isar-1.14.4 → isar-1.15.0}/radixconfig.yml +0 -0
- {isar-1.14.4 → isar-1.15.0}/setup.cfg +0 -0
- {isar-1.14.4 → isar-1.15.0}/setup.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/api.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/models/models.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/configuration_error.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/log.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/logging.conf +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_poses/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/settings.env +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/config/settings.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/modules.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/readers/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/readers/base_reader.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/mqtt/robot_status_publisher.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/stid/stid_service.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/initialize.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/initiate.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states/stop.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar/storage/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/mission/task.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/conftest.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/apis/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/mission/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/models/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/models/test_start_mission_definition.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/readers/test_base_reader.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/service_connections/stid/test_stid_service.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/__init__.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/pose.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/request.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/robot_interface.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/status.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/step.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/task.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/mocks/token.py +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_json_file.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.14.4 → isar-1.15.0}/tests/test_modules.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: isar
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.15.0
|
|
4
4
|
Summary: Integration and Supervisory control of Autonomous Robots
|
|
5
5
|
Home-page: https://github.com/equinor/isar
|
|
6
6
|
Author: Equinor ASA
|
|
@@ -41,7 +41,7 @@ Steps:
|
|
|
41
41
|
For local development, please fork the repository. Then, clone and install in the repository root folder:
|
|
42
42
|
|
|
43
43
|
```
|
|
44
|
-
git clone https://github.com
|
|
44
|
+
git clone https://github.com/<path_to_parent>/isar
|
|
45
45
|
cd isar
|
|
46
46
|
pip install -e .[dev]
|
|
47
47
|
```
|
|
@@ -22,7 +22,7 @@ Steps:
|
|
|
22
22
|
For local development, please fork the repository. Then, clone and install in the repository root folder:
|
|
23
23
|
|
|
24
24
|
```
|
|
25
|
-
git clone https://github.com
|
|
25
|
+
git clone https://github.com/<path_to_parent>/isar
|
|
26
26
|
cd isar
|
|
27
27
|
pip install -e .[dev]
|
|
28
28
|
```
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import time
|
|
1
2
|
from enum import Enum
|
|
2
3
|
from typing import Any, Dict, List, Optional, Union
|
|
3
4
|
|
|
@@ -5,6 +6,7 @@ from alitra import Position
|
|
|
5
6
|
from pydantic import BaseModel, Field
|
|
6
7
|
|
|
7
8
|
from isar.apis.models.models import InputPose, InputPosition
|
|
9
|
+
from isar.config.settings import settings
|
|
8
10
|
from isar.mission_planner.mission_planner_interface import MissionPlannerError
|
|
9
11
|
from robot_interface.models.mission.mission import Mission
|
|
10
12
|
from robot_interface.models.mission.step import (
|
|
@@ -30,7 +32,7 @@ class InspectionTypes(str, Enum):
|
|
|
30
32
|
class StartMissionInspectionDefinition(BaseModel):
|
|
31
33
|
type: InspectionTypes = Field(default=InspectionTypes.image)
|
|
32
34
|
inspection_target: InputPosition
|
|
33
|
-
analysis_types: Optional[
|
|
35
|
+
analysis_types: Optional[str]
|
|
34
36
|
duration: Optional[float]
|
|
35
37
|
metadata: Optional[dict]
|
|
36
38
|
id: Optional[str]
|
|
@@ -46,6 +48,7 @@ class StartMissionTaskDefinition(BaseModel):
|
|
|
46
48
|
class StartMissionDefinition(BaseModel):
|
|
47
49
|
tasks: List[StartMissionTaskDefinition]
|
|
48
50
|
id: Optional[str]
|
|
51
|
+
name: Optional[str]
|
|
49
52
|
|
|
50
53
|
|
|
51
54
|
def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
|
|
@@ -101,6 +104,14 @@ def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
|
|
|
101
104
|
|
|
102
105
|
isar_mission: Mission = Mission(tasks=isar_tasks)
|
|
103
106
|
|
|
107
|
+
if mission_definition.name:
|
|
108
|
+
isar_mission.name = mission_definition.name
|
|
109
|
+
else:
|
|
110
|
+
isar_mission.name = _build_mission_name()
|
|
111
|
+
|
|
112
|
+
if mission_definition.id:
|
|
113
|
+
isar_mission.id = mission_definition.id
|
|
114
|
+
|
|
104
115
|
return isar_mission
|
|
105
116
|
|
|
106
117
|
|
|
@@ -108,7 +119,7 @@ def create_inspection_step(
|
|
|
108
119
|
inspection_type: InspectionTypes,
|
|
109
120
|
duration: float,
|
|
110
121
|
target: Position,
|
|
111
|
-
analysis: Optional[
|
|
122
|
+
analysis: Optional[str],
|
|
112
123
|
tag_id: Optional[str],
|
|
113
124
|
metadata: Optional[dict],
|
|
114
125
|
id: Optional[str],
|
|
@@ -151,3 +162,7 @@ def get_duplicate_ids(items: Union[List[Task], List[STEPS]]) -> List[str]:
|
|
|
151
162
|
duplicate_ids.append(id)
|
|
152
163
|
|
|
153
164
|
return duplicate_ids
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _build_mission_name() -> str:
|
|
168
|
+
return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
|
|
@@ -18,7 +18,6 @@ from isar.apis.models.start_mission_definition import (
|
|
|
18
18
|
)
|
|
19
19
|
from isar.config.settings import robot_settings, settings
|
|
20
20
|
from isar.mission_planner.mission_planner_interface import MissionPlannerError
|
|
21
|
-
from isar.models.mission_metadata.mission_metadata import MissionMetadata
|
|
22
21
|
from isar.services.utilities.scheduling_utilities import SchedulingUtilities
|
|
23
22
|
from isar.state_machine.states_enum import States
|
|
24
23
|
from robot_interface.models.mission.mission import Mission
|
|
@@ -76,10 +75,11 @@ class SchedulingController:
|
|
|
76
75
|
)
|
|
77
76
|
|
|
78
77
|
self.logger.info(f"Starting mission with ISAR Mission ID: '{mission.id}'")
|
|
79
|
-
|
|
78
|
+
|
|
80
79
|
self.scheduling_utilities.start_mission(
|
|
81
|
-
mission=mission, initial_pose=initial_pose_alitra
|
|
80
|
+
mission=mission, initial_pose=initial_pose_alitra
|
|
82
81
|
)
|
|
82
|
+
|
|
83
83
|
return self._api_response(mission)
|
|
84
84
|
|
|
85
85
|
def start_mission(
|
|
@@ -139,10 +139,9 @@ class SchedulingController:
|
|
|
139
139
|
initial_pose.to_alitra_pose() if initial_pose else None
|
|
140
140
|
)
|
|
141
141
|
|
|
142
|
-
metadata: MissionMetadata = MissionMetadata(mission.id)
|
|
143
142
|
self.logger.info(f"Starting mission: {mission.id}")
|
|
144
143
|
self.scheduling_utilities.start_mission(
|
|
145
|
-
mission=mission,
|
|
144
|
+
mission=mission, initial_pose=initial_pose_alitra
|
|
146
145
|
)
|
|
147
146
|
return self._api_response(mission)
|
|
148
147
|
|
|
@@ -220,13 +219,11 @@ class SchedulingController:
|
|
|
220
219
|
pose: Pose = target_pose.to_alitra_pose()
|
|
221
220
|
step: DriveToPose = DriveToPose(pose=pose)
|
|
222
221
|
mission: Mission = Mission(tasks=[Task(steps=[step])])
|
|
223
|
-
|
|
222
|
+
|
|
224
223
|
self.logger.info(
|
|
225
224
|
f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
|
|
226
225
|
)
|
|
227
|
-
self.scheduling_utilities.start_mission(
|
|
228
|
-
mission=mission, initial_pose=None, mission_metadata=metadata
|
|
229
|
-
)
|
|
226
|
+
self.scheduling_utilities.start_mission(mission=mission, initial_pose=None)
|
|
230
227
|
return self._api_response(mission)
|
|
231
228
|
|
|
232
229
|
def start_localization_mission(
|
|
@@ -247,12 +244,13 @@ class SchedulingController:
|
|
|
247
244
|
pose: Pose = localization_pose.to_alitra_pose()
|
|
248
245
|
step: Localize = Localize(localization_pose=pose)
|
|
249
246
|
mission: Mission = Mission(tasks=[Task(steps=[step])])
|
|
250
|
-
|
|
247
|
+
|
|
251
248
|
self.logger.info(
|
|
252
249
|
f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
|
|
253
250
|
)
|
|
254
251
|
self.scheduling_utilities.start_mission(
|
|
255
|
-
mission=mission,
|
|
252
|
+
mission=mission,
|
|
253
|
+
initial_pose=None,
|
|
256
254
|
)
|
|
257
255
|
return self._api_response(mission)
|
|
258
256
|
|
{isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_mission_definition/default_mission.json
RENAMED
|
@@ -28,10 +28,7 @@
|
|
|
28
28
|
"z": 0,
|
|
29
29
|
"frame_name": "robot"
|
|
30
30
|
},
|
|
31
|
-
"analysis_types":
|
|
32
|
-
"CarSeal",
|
|
33
|
-
"Rust"
|
|
34
|
-
],
|
|
31
|
+
"analysis_types": "CarSeal, Rust",
|
|
35
32
|
"metadata": {
|
|
36
33
|
"zoom": "2x"
|
|
37
34
|
}
|
|
@@ -44,9 +41,8 @@
|
|
|
44
41
|
"z": 0,
|
|
45
42
|
"frame_name": "robot"
|
|
46
43
|
},
|
|
47
|
-
"analysis_types":
|
|
48
|
-
|
|
49
|
-
],
|
|
44
|
+
"analysis_types": "GasDetection"
|
|
45
|
+
,
|
|
50
46
|
"duration": 10
|
|
51
47
|
}
|
|
52
48
|
]
|
|
@@ -77,10 +73,7 @@
|
|
|
77
73
|
"z": 0,
|
|
78
74
|
"frame_name": "robot"
|
|
79
75
|
},
|
|
80
|
-
"analysis_types":
|
|
81
|
-
"ColdSpot",
|
|
82
|
-
"HotSpot"
|
|
83
|
-
]
|
|
76
|
+
"analysis_types": "ColdSpot,HotSpot"
|
|
84
77
|
},
|
|
85
78
|
{
|
|
86
79
|
"type": "Video",
|
{isar-1.14.4 → isar-1.15.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json
RENAMED
|
@@ -28,10 +28,8 @@
|
|
|
28
28
|
"z": 0,
|
|
29
29
|
"frame": "robot"
|
|
30
30
|
},
|
|
31
|
-
"analysis_types":
|
|
32
|
-
|
|
33
|
-
"Rust"
|
|
34
|
-
],
|
|
31
|
+
"analysis_types": "CarSeal, Rust"
|
|
32
|
+
,
|
|
35
33
|
"metadata": {
|
|
36
34
|
"zoom": "2x"
|
|
37
35
|
}
|
|
@@ -44,9 +42,7 @@
|
|
|
44
42
|
"z": 0,
|
|
45
43
|
"frame": "robot"
|
|
46
44
|
},
|
|
47
|
-
"analysis_types":
|
|
48
|
-
"GasDetection"
|
|
49
|
-
]
|
|
45
|
+
"analysis_types": "GasDetection"
|
|
50
46
|
}
|
|
51
47
|
]
|
|
52
48
|
},
|
|
@@ -77,10 +73,8 @@
|
|
|
77
73
|
"z": 0,
|
|
78
74
|
"frame": "robot"
|
|
79
75
|
},
|
|
80
|
-
"analysis_types":
|
|
81
|
-
|
|
82
|
-
"HotSpot"
|
|
83
|
-
]
|
|
76
|
+
"analysis_types": "ColdSpot, HotSpot"
|
|
77
|
+
|
|
84
78
|
}
|
|
85
79
|
]
|
|
86
80
|
},
|
|
@@ -111,10 +105,7 @@
|
|
|
111
105
|
"z": 0,
|
|
112
106
|
"frame": "robot"
|
|
113
107
|
},
|
|
114
|
-
"analysis_types":
|
|
115
|
-
"ColdSpot",
|
|
116
|
-
"HotSpot"
|
|
117
|
-
]
|
|
108
|
+
"analysis_types": "ColdSpot, HotSpot"
|
|
118
109
|
},
|
|
119
110
|
{
|
|
120
111
|
"type": "ThermalImage",
|
|
@@ -124,10 +115,7 @@
|
|
|
124
115
|
"z": 0,
|
|
125
116
|
"frame": "robot"
|
|
126
117
|
},
|
|
127
|
-
"analysis_types":
|
|
128
|
-
"ColdSpot",
|
|
129
|
-
"HotSpot"
|
|
130
|
-
]
|
|
118
|
+
"analysis_types": "ColdSpot, HotSpot"
|
|
131
119
|
}
|
|
132
120
|
]
|
|
133
121
|
}
|
|
@@ -3,12 +3,10 @@ from typing import Optional
|
|
|
3
3
|
|
|
4
4
|
from alitra import Pose
|
|
5
5
|
|
|
6
|
-
from isar.models.mission_metadata.mission_metadata import MissionMetadata
|
|
7
6
|
from robot_interface.models.mission.mission import Mission
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
@dataclass
|
|
11
10
|
class StartMissionMessage:
|
|
12
11
|
mission: Mission
|
|
13
|
-
mission_metadata: MissionMetadata
|
|
14
12
|
initial_pose: Optional[Pose]
|
{isar-1.14.4 → isar-1.15.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py
RENAMED
|
@@ -20,6 +20,7 @@ class RobotInfoPublisher:
|
|
|
20
20
|
robot_name=settings.ROBOT_NAME,
|
|
21
21
|
robot_model=robot_settings.ROBOT_MODEL, # type: ignore
|
|
22
22
|
robot_serial_number=settings.SERIAL_NUMBER,
|
|
23
|
+
robot_asset=settings.PLANT_SHORT_NAME,
|
|
23
24
|
video_streams=settings.VIDEO_STREAMS,
|
|
24
25
|
host=settings.API_HOST_VIEWED_EXTERNALLY,
|
|
25
26
|
port=settings.API_PORT,
|
|
@@ -18,7 +18,6 @@ from isar.mission_planner.mission_planner_interface import (
|
|
|
18
18
|
)
|
|
19
19
|
from isar.models.communication.message import StartMissionMessage
|
|
20
20
|
from isar.models.communication.queues import QueueIO, Queues, QueueTimeoutError
|
|
21
|
-
from isar.models.mission_metadata.mission_metadata import MissionMetadata
|
|
22
21
|
from isar.services.utilities.queue_utilities import QueueUtilities
|
|
23
22
|
from isar.state_machine.states_enum import States
|
|
24
23
|
from robot_interface.models.mission.mission import Mission
|
|
@@ -139,7 +138,6 @@ class SchedulingUtilities:
|
|
|
139
138
|
def start_mission(
|
|
140
139
|
self,
|
|
141
140
|
mission: Mission,
|
|
142
|
-
mission_metadata: MissionMetadata,
|
|
143
141
|
initial_pose: Optional[Pose],
|
|
144
142
|
) -> None:
|
|
145
143
|
"""Start mission
|
|
@@ -153,7 +151,6 @@ class SchedulingUtilities:
|
|
|
153
151
|
self._send_command(
|
|
154
152
|
StartMissionMessage(
|
|
155
153
|
mission=deepcopy(mission),
|
|
156
|
-
mission_metadata=deepcopy(mission_metadata),
|
|
157
154
|
initial_pose=initial_pose,
|
|
158
155
|
),
|
|
159
156
|
self.queues.start_mission,
|
|
@@ -19,7 +19,6 @@ from isar.mission_planner.task_selector_interface import (
|
|
|
19
19
|
)
|
|
20
20
|
from isar.models.communication.message import StartMissionMessage
|
|
21
21
|
from isar.models.communication.queues.queues import Queues
|
|
22
|
-
from isar.models.mission_metadata.mission_metadata import MissionMetadata
|
|
23
22
|
from isar.state_machine.states import (
|
|
24
23
|
Idle,
|
|
25
24
|
Initialize,
|
|
@@ -203,7 +202,6 @@ class StateMachine(object):
|
|
|
203
202
|
|
|
204
203
|
self.stopped: bool = False
|
|
205
204
|
self.current_mission: Optional[Mission] = None
|
|
206
|
-
self.current_mission_metadata: Optional[MissionMetadata] = None
|
|
207
205
|
self.current_task: Optional[Task] = None
|
|
208
206
|
self.current_step: Optional[Step] = None
|
|
209
207
|
self.initial_pose: Optional[Pose] = None
|
|
@@ -436,12 +434,9 @@ class StateMachine(object):
|
|
|
436
434
|
self.current_mission = None
|
|
437
435
|
self.initial_pose = None
|
|
438
436
|
|
|
439
|
-
def start_mission(
|
|
440
|
-
self, mission: Mission, mission_metadata: MissionMetadata, initial_pose: Pose
|
|
441
|
-
):
|
|
437
|
+
def start_mission(self, mission: Mission, initial_pose: Pose):
|
|
442
438
|
"""Starts a scheduled mission."""
|
|
443
439
|
self.current_mission = mission
|
|
444
|
-
self.current_mission_metadata = mission_metadata
|
|
445
440
|
self.initial_pose = initial_pose
|
|
446
441
|
|
|
447
442
|
self.task_selector.initialize(tasks=self.current_mission.tasks)
|
|
@@ -31,7 +31,6 @@ class Idle(State):
|
|
|
31
31
|
if start_mission:
|
|
32
32
|
self.state_machine.start_mission(
|
|
33
33
|
mission=start_mission.mission,
|
|
34
|
-
mission_metadata=start_mission.mission_metadata,
|
|
35
34
|
initial_pose=start_mission.initial_pose,
|
|
36
35
|
)
|
|
37
36
|
transition = self.state_machine.mission_started # type: ignore
|
|
@@ -6,7 +6,6 @@ from typing import Callable, Optional, Sequence, TYPE_CHECKING, Tuple, Union
|
|
|
6
6
|
from injector import inject
|
|
7
7
|
from transitions import State
|
|
8
8
|
|
|
9
|
-
from isar.models.mission_metadata.mission_metadata import MissionMetadata
|
|
10
9
|
from isar.services.utilities.threaded_request import (
|
|
11
10
|
ThreadedRequest,
|
|
12
11
|
ThreadedRequestNotFinishedError,
|
|
@@ -129,18 +128,16 @@ class Monitor(State):
|
|
|
129
128
|
f"No inspection data retrieved for step {str(current_step.id)[:8]}"
|
|
130
129
|
)
|
|
131
130
|
|
|
132
|
-
# A deepcopy is made to freeze the
|
|
131
|
+
# A deepcopy is made to freeze the mission before passing it to another thread
|
|
133
132
|
# through the queue
|
|
134
|
-
|
|
135
|
-
self.state_machine.current_mission_metadata
|
|
136
|
-
)
|
|
133
|
+
mission: Mission = deepcopy(self.state_machine.current_mission)
|
|
137
134
|
|
|
138
135
|
for inspection in inspections:
|
|
139
136
|
inspection.metadata.tag_id = current_step.tag_id
|
|
140
137
|
|
|
141
|
-
message: Tuple[Inspection,
|
|
138
|
+
message: Tuple[Inspection, Mission] = (
|
|
142
139
|
inspection,
|
|
143
|
-
|
|
140
|
+
mission,
|
|
144
141
|
)
|
|
145
142
|
self.state_machine.queues.upload_queue.put(message)
|
|
146
143
|
self.logger.info(f"Inspection: {str(inspection.id)[:8]} queued for upload")
|
|
@@ -7,9 +7,9 @@ from injector import inject
|
|
|
7
7
|
|
|
8
8
|
from isar.config.keyvault.keyvault_service import Keyvault
|
|
9
9
|
from isar.config.settings import settings
|
|
10
|
-
from
|
|
10
|
+
from robot_interface.models.mission.mission import Mission
|
|
11
11
|
from isar.storage.storage_interface import StorageException, StorageInterface
|
|
12
|
-
from isar.storage.utilities import
|
|
12
|
+
from isar.storage.utilities import construct_metadata_file, construct_paths
|
|
13
13
|
from robot_interface.models.inspection.inspection import Inspection
|
|
14
14
|
|
|
15
15
|
|
|
@@ -31,17 +31,17 @@ class BlobStorage(StorageInterface):
|
|
|
31
31
|
|
|
32
32
|
self.logger = logging.getLogger("uploader")
|
|
33
33
|
|
|
34
|
-
def store(self, inspection: Inspection,
|
|
35
|
-
|
|
36
|
-
inspection=inspection,
|
|
34
|
+
def store(self, inspection: Inspection, mission: Mission) -> str:
|
|
35
|
+
data_path, metadata_path = construct_paths(
|
|
36
|
+
inspection=inspection, mission=mission
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
metadata_bytes: bytes = construct_metadata_file(
|
|
40
|
-
inspection=inspection,
|
|
40
|
+
inspection=inspection, mission=mission, filename=data_path.name
|
|
41
41
|
)
|
|
42
42
|
|
|
43
|
-
self._upload_file(path=
|
|
44
|
-
return self._upload_file(path=
|
|
43
|
+
self._upload_file(path=metadata_path, data=metadata_bytes)
|
|
44
|
+
return self._upload_file(path=data_path, data=inspection.data)
|
|
45
45
|
|
|
46
46
|
def _upload_file(self, path: Path, data: bytes) -> str:
|
|
47
47
|
blob_client = self._get_blob_client(path)
|
|
@@ -2,9 +2,9 @@ import logging
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
4
|
from isar.config.settings import settings
|
|
5
|
-
from
|
|
5
|
+
from robot_interface.models.mission.mission import Mission
|
|
6
6
|
from isar.storage.storage_interface import StorageException, StorageInterface
|
|
7
|
-
from isar.storage.utilities import
|
|
7
|
+
from isar.storage.utilities import construct_metadata_file, construct_paths
|
|
8
8
|
from robot_interface.models.inspection.inspection import Inspection
|
|
9
9
|
|
|
10
10
|
|
|
@@ -13,9 +13,9 @@ class LocalStorage(StorageInterface):
|
|
|
13
13
|
self.root_folder: Path = Path(settings.LOCAL_STORAGE_PATH)
|
|
14
14
|
self.logger = logging.getLogger("uploader")
|
|
15
15
|
|
|
16
|
-
def store(self, inspection: Inspection,
|
|
17
|
-
local_path, local_metadata_path =
|
|
18
|
-
inspection=inspection,
|
|
16
|
+
def store(self, inspection: Inspection, mission: Mission) -> str:
|
|
17
|
+
local_path, local_metadata_path = construct_paths(
|
|
18
|
+
inspection=inspection, mission=mission
|
|
19
19
|
)
|
|
20
20
|
|
|
21
21
|
absolute_path: Path = self.root_folder.joinpath(local_path)
|
|
@@ -24,7 +24,7 @@ class LocalStorage(StorageInterface):
|
|
|
24
24
|
absolute_path.parent.mkdir(parents=True, exist_ok=True)
|
|
25
25
|
|
|
26
26
|
metadata_bytes: bytes = construct_metadata_file(
|
|
27
|
-
inspection=inspection,
|
|
27
|
+
inspection=inspection, mission=mission, filename=local_path.name
|
|
28
28
|
)
|
|
29
29
|
try:
|
|
30
30
|
with open(absolute_path, "wb") as file, open(
|
|
@@ -7,7 +7,7 @@ from requests import HTTPError, RequestException
|
|
|
7
7
|
from requests_toolbelt import MultipartEncoder
|
|
8
8
|
|
|
9
9
|
from isar.config.settings import settings
|
|
10
|
-
from
|
|
10
|
+
from robot_interface.models.mission.mission import Mission
|
|
11
11
|
from isar.services.auth.azure_credentials import AzureCredentials
|
|
12
12
|
from isar.services.service_connections.request_handler import RequestHandler
|
|
13
13
|
from isar.storage.storage_interface import StorageException, StorageInterface
|
|
@@ -31,24 +31,22 @@ class SlimmStorage(StorageInterface):
|
|
|
31
31
|
|
|
32
32
|
self.url: str = settings.SLIMM_API_URL
|
|
33
33
|
|
|
34
|
-
def store(self, inspection: Inspection,
|
|
34
|
+
def store(self, inspection: Inspection, mission: Mission) -> str:
|
|
35
35
|
filename: str = get_filename(
|
|
36
|
-
|
|
37
|
-
inspection_type=type(inspection).__name__,
|
|
38
|
-
inspection_id=inspection.id,
|
|
36
|
+
inspection=inspection,
|
|
39
37
|
)
|
|
40
38
|
filename = f"{filename}.{inspection.metadata.file_type}"
|
|
41
39
|
if type(inspection) in [Video, ThermalVideo]:
|
|
42
|
-
inspection_path = self._store_video(filename, inspection,
|
|
40
|
+
inspection_path = self._store_video(filename, inspection, mission)
|
|
43
41
|
else:
|
|
44
|
-
inspection_path = self._store_image(filename, inspection,
|
|
42
|
+
inspection_path = self._store_image(filename, inspection, mission)
|
|
45
43
|
return inspection_path
|
|
46
44
|
|
|
47
45
|
def _store_image(
|
|
48
|
-
self, filename: str, inspection: Inspection,
|
|
46
|
+
self, filename: str, inspection: Inspection, mission: Mission
|
|
49
47
|
) -> str:
|
|
50
48
|
multiform_body: MultipartEncoder = self._construct_multiform_request_image(
|
|
51
|
-
filename=filename, inspection=inspection,
|
|
49
|
+
filename=filename, inspection=inspection, mission=mission
|
|
52
50
|
)
|
|
53
51
|
request_url: str = f"{self.url}/UploadSingleImage"
|
|
54
52
|
inspection_path = self._ingest(
|
|
@@ -59,10 +57,10 @@ class SlimmStorage(StorageInterface):
|
|
|
59
57
|
return inspection_path
|
|
60
58
|
|
|
61
59
|
def _store_video(
|
|
62
|
-
self, filename: str, inspection: Inspection,
|
|
60
|
+
self, filename: str, inspection: Inspection, mission: Mission
|
|
63
61
|
) -> str:
|
|
64
62
|
multiform_body: MultipartEncoder = self._construct_multiform_request_video(
|
|
65
|
-
filename=filename, inspection=inspection,
|
|
63
|
+
filename=filename, inspection=inspection, mission=mission
|
|
66
64
|
)
|
|
67
65
|
request_url = f"{self.url}/UploadSingleVideo"
|
|
68
66
|
inspection_path = self._ingest(
|
|
@@ -98,23 +96,23 @@ class SlimmStorage(StorageInterface):
|
|
|
98
96
|
|
|
99
97
|
@staticmethod
|
|
100
98
|
def _construct_multiform_request_image(
|
|
101
|
-
filename: str, inspection: Inspection,
|
|
99
|
+
filename: str, inspection: Inspection, mission: Mission
|
|
102
100
|
):
|
|
103
101
|
array_of_orientation = (
|
|
104
102
|
inspection.metadata.pose.orientation.to_quat_array().tolist()
|
|
105
103
|
)
|
|
106
104
|
multiform_body: MultipartEncoder = MultipartEncoder(
|
|
107
105
|
fields={
|
|
108
|
-
"PlantFacilitySAPCode":
|
|
109
|
-
"InstCode":
|
|
110
|
-
"InternalClassification":
|
|
106
|
+
"PlantFacilitySAPCode": settings.PLANT_CODE,
|
|
107
|
+
"InstCode": settings.PLANT_SHORT_NAME,
|
|
108
|
+
"InternalClassification": settings.DATA_CLASSIFICATION,
|
|
111
109
|
"IsoCountryCode": "NO",
|
|
112
|
-
"Geodetic.CoordinateReferenceSystemCode":
|
|
113
|
-
"Geodetic.VerticalCoordinateReferenceSystemCode":
|
|
114
|
-
"Geodetic.OrientationReferenceSystem":
|
|
115
|
-
"SensorCarrier.SensorCarrierId":
|
|
116
|
-
"SensorCarrier.ModelName":
|
|
117
|
-
"Mission.MissionId":
|
|
110
|
+
"Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
|
|
111
|
+
"Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
|
|
112
|
+
"Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
|
|
113
|
+
"SensorCarrier.SensorCarrierId": settings.ISAR_ID,
|
|
114
|
+
"SensorCarrier.ModelName": settings.ROBOT_TYPE,
|
|
115
|
+
"Mission.MissionId": mission.id,
|
|
118
116
|
"Mission.Client": "Equinor",
|
|
119
117
|
"ImageMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
|
|
120
118
|
"ImageMetadata.X": str(inspection.metadata.pose.position.x),
|
|
@@ -124,11 +122,13 @@ class SlimmStorage(StorageInterface):
|
|
|
124
122
|
"ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
|
|
125
123
|
"ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
|
|
126
124
|
"ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
|
|
127
|
-
"ImageMetadata.AnalysisMethods":
|
|
125
|
+
"ImageMetadata.AnalysisMethods": inspection.metadata.analysis
|
|
126
|
+
if inspection.metadata.analysis
|
|
127
|
+
else "N/A",
|
|
128
128
|
"ImageMetadata.Description": str(inspection.metadata.additional),
|
|
129
129
|
"ImageMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
|
|
130
130
|
if inspection.metadata.tag_id
|
|
131
|
-
else "
|
|
131
|
+
else "N/A",
|
|
132
132
|
"Filename": filename,
|
|
133
133
|
"AttachedFile": (filename, inspection.data),
|
|
134
134
|
}
|
|
@@ -139,26 +139,27 @@ class SlimmStorage(StorageInterface):
|
|
|
139
139
|
def _construct_multiform_request_video(
|
|
140
140
|
filename: str,
|
|
141
141
|
inspection: Inspection,
|
|
142
|
-
|
|
142
|
+
mission: Mission,
|
|
143
143
|
):
|
|
144
144
|
array_of_orientation = (
|
|
145
145
|
inspection.metadata.pose.orientation.to_quat_array().tolist()
|
|
146
146
|
)
|
|
147
147
|
multiform_body: MultipartEncoder = MultipartEncoder(
|
|
148
148
|
fields={
|
|
149
|
-
"PlantFacilitySAPCode":
|
|
150
|
-
"InstCode":
|
|
151
|
-
"InternalClassification":
|
|
149
|
+
"PlantFacilitySAPCode": settings.PLANT_CODE,
|
|
150
|
+
"InstCode": settings.PLANT_SHORT_NAME,
|
|
151
|
+
"InternalClassification": settings.DATA_CLASSIFICATION,
|
|
152
152
|
"IsoCountryCode": "NO",
|
|
153
|
-
"Geodetic.CoordinateReferenceSystemCode":
|
|
154
|
-
"Geodetic.VerticalCoordinateReferenceSystemCode":
|
|
155
|
-
"Geodetic.OrientationReferenceSystem":
|
|
156
|
-
"SensorCarrier.SensorCarrierId":
|
|
157
|
-
"SensorCarrier.ModelName":
|
|
158
|
-
"Mission.MissionId":
|
|
153
|
+
"Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
|
|
154
|
+
"Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
|
|
155
|
+
"Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
|
|
156
|
+
"SensorCarrier.SensorCarrierId": settings.ISAR_ID,
|
|
157
|
+
"SensorCarrier.ModelName": settings.ROBOT_TYPE,
|
|
158
|
+
"Mission.MissionId": mission.id,
|
|
159
159
|
"Mission.Client": "Equinor",
|
|
160
160
|
"VideoMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
|
|
161
|
-
|
|
161
|
+
# Converting to int because SLIMM expects an int, while we use floats in operations.
|
|
162
|
+
"VideoMetadata.Duration": str(int(inspection.metadata.duration)), # type: ignore
|
|
162
163
|
"VideoMetadata.X": str(inspection.metadata.pose.position.x),
|
|
163
164
|
"VideoMetadata.Y": str(inspection.metadata.pose.position.y),
|
|
164
165
|
"VideoMetadata.Z": str(inspection.metadata.pose.position.z),
|
|
@@ -166,11 +167,13 @@ class SlimmStorage(StorageInterface):
|
|
|
166
167
|
"VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
|
|
167
168
|
"VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
|
|
168
169
|
"VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
|
|
169
|
-
"VideoMetadata.AnalysisMethods":
|
|
170
|
+
"VideoMetadata.AnalysisMethods": inspection.metadata.analysis
|
|
171
|
+
if inspection.metadata.analysis
|
|
172
|
+
else "N/A",
|
|
170
173
|
"VideoMetadata.Description": str(inspection.metadata.additional),
|
|
171
174
|
"VideoMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
|
|
172
175
|
if inspection.metadata.tag_id
|
|
173
|
-
else "
|
|
176
|
+
else "N/A",
|
|
174
177
|
"Filename": filename,
|
|
175
178
|
"AttachedFile": (filename, inspection.data),
|
|
176
179
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from robot_interface.models.mission.mission import Mission
|
|
4
4
|
from robot_interface.models.inspection.inspection import Inspection
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class StorageInterface(metaclass=ABCMeta):
|
|
8
8
|
@abstractmethod
|
|
9
|
-
def store(self, inspection: Inspection,
|
|
9
|
+
def store(self, inspection: Inspection, mission: Mission) -> str:
|
|
10
10
|
"""
|
|
11
11
|
Parameters
|
|
12
12
|
----------
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
mission : Mission
|
|
14
|
+
Mission the inspection is a part of.
|
|
15
15
|
inspection : Inspection
|
|
16
16
|
The inspection object to be stored.
|
|
17
17
|
|