isar 1.24.6__tar.gz → 1.25.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.24.6 → isar-1.25.0}/PKG-INFO +1 -1
- {isar-1.24.6 → isar-1.25.0}/requirements.txt +12 -13
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/models/models.py +1 -0
- isar-1.25.0/src/isar/apis/models/start_mission_definition.py +181 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/schedule/scheduling_controller.py +27 -9
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/default.json +12 -11
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/default_turtlebot.json +17 -16
- {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/local_planner.py +6 -20
- {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/mission_planner_interface.py +1 -1
- {isar-1.24.6 → isar-1.25.0}/src/isar/script.py +1 -1
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/state_machine.py +2 -2
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/monitor.py +11 -3
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/slimm_storage.py +4 -1
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/utilities.py +3 -4
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/SOURCES.txt +3 -5
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/inspection/inspection.py +4 -11
- isar-1.25.0/src/robot_interface/models/mission/mission.py +20 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/mission/task.py +28 -40
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/robot_interface.py +7 -5
- {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/test_successful_mission.py +3 -2
- isar-1.25.0/tests/isar/apis/models/test_start_mission_definition.py +81 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -60
- {isar-1.24.6 → isar-1.25.0}/tests/isar/mission/test_mission.py +5 -7
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/readers/test_mission_reader.py +20 -20
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/test_queue_utilities.py +4 -4
- {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/states/test_monitor.py +1 -2
- {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/test_state_machine.py +7 -7
- {isar-1.24.6 → isar-1.25.0}/tests/isar/storage/test_uploader.py +11 -4
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/mission_definition.py +2 -37
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/robot_interface.py +7 -7
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/task.py +6 -2
- {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_working.json +15 -14
- {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_working_no_tasks.json +1 -0
- {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_thermal_image_mission.json +5 -4
- isar-1.24.6/src/isar/apis/models/start_mission_definition.py +0 -231
- isar-1.24.6/src/isar/services/readers/base_reader.py +0 -37
- isar-1.24.6/src/robot_interface/models/mission/mission.py +0 -28
- isar-1.24.6/tests/isar/models/test_start_mission_definition.py +0 -63
- isar-1.24.6/tests/isar/services/readers/test_base_reader.py +0 -23
- {isar-1.24.6 → isar-1.25.0}/.dockerignore +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/release.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/project_automations.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.github/workflows/stale.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/.gitignore +0 -0
- {isar-1.24.6 → isar-1.25.0}/.pre-commit-config.yaml +0 -0
- {isar-1.24.6 → isar-1.25.0}/Dockerfile +0 -0
- {isar-1.24.6 → isar-1.25.0}/LICENSE +0 -0
- {isar-1.24.6 → isar-1.25.0}/README.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/SECURITY.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/docker-compose-turtlebot.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/docker-compose.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/Makefile +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/make.bat +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/rst_processing.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/source/conf.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/source/index.rst +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/source/readme_link.md +0 -0
- {isar-1.24.6 → isar-1.25.0}/docs/state_machine_diagram.png +0 -0
- {isar-1.24.6 → isar-1.25.0}/main.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/pyproject.toml +0 -0
- {isar-1.24.6 → isar-1.25.0}/radixconfig.yml +0 -0
- {isar-1.24.6 → isar-1.25.0}/setup.cfg +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/api.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/robot_control/robot_controller.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/configuration_error.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/log.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/logging.conf +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/settings.env +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/config/settings.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/message.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/modules.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.24.6/src/isar/services/readers → isar-1.25.0/src/isar/services/service_connections}/__init__.py +0 -0
- {isar-1.24.6/src/isar/services/service_connections → isar-1.25.0/src/isar/services/service_connections/mqtt}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.24.6/src/isar/services/service_connections/mqtt → isar-1.25.0/src/isar/services/service_connections/stid}/__init__.py +0 -0
- {isar-1.24.6/src/isar/services/service_connections/stid → isar-1.25.0/src/isar/services/utilities}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/scheduling_utilities.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.24.6/src/isar/services/utilities → isar-1.25.0/src/isar/state_machine}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/idle.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/initialize.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/initiate.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/stop.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.24.6/src/isar/state_machine → isar-1.25.0/src/isar/storage}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/local_storage.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar/storage/uploader.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.24.6/src/isar/storage → isar-1.25.0/src/robot_interface}/__init__.py +0 -0
- {isar-1.24.6/src/robot_interface → isar-1.25.0/src/robot_interface/models}/__init__.py +0 -0
- {isar-1.24.6/src/robot_interface/models → isar-1.25.0/src/robot_interface/models/exceptions}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.24.6/src/robot_interface/models/exceptions → isar-1.25.0/src/robot_interface/models/mission}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.24.6/src/robot_interface/models/mission → isar-1.25.0/src/robot_interface/models/robots}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.24.6/src/robot_interface/models/robots → isar-1.25.0/src/robot_interface/telemetry}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/telemetry/payloads.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.24.6/src/robot_interface/telemetry → isar-1.25.0/src/robot_interface/utilities}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.24.6/src/robot_interface/utilities → isar-1.25.0/tests}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/conftest.py +0 -0
- {isar-1.24.6/tests → isar-1.25.0/tests/integration}/__init__.py +0 -0
- {isar-1.24.6/tests/integration → isar-1.25.0/tests/integration/turtlebot}/__init__.py +0 -0
- {isar-1.24.6/tests/integration/turtlebot → isar-1.25.0/tests/integration/turtlebot/config}/__init__.py +0 -0
- {isar-1.24.6/tests/integration/turtlebot/config → isar-1.25.0/tests/integration/turtlebot/config/maps}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.24.6/tests/integration/turtlebot/config/maps → isar-1.25.0/tests/integration/turtlebot/config/missions}/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.24.6/tests/integration/turtlebot/config/missions → isar-1.25.0/tests/isar}/__init__.py +0 -0
- {isar-1.24.6/tests/isar → isar-1.25.0/tests/isar/apis}/__init__.py +0 -0
- {isar-1.24.6/tests/isar/apis → isar-1.25.0/tests/isar/apis/models}/__init__.py +0 -0
- {isar-1.24.6/tests/isar → isar-1.25.0/tests/isar/apis}/models/example_mission_definition.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/mission/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/models/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/__init__.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/blob_storage.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/pose.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/request.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/status.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/mocks/token.py +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.24.6 → isar-1.25.0}/tests/test_modules.py +0 -0
|
@@ -8,7 +8,7 @@ alitra==1.1.3
|
|
|
8
8
|
# via isar (pyproject.toml)
|
|
9
9
|
annotated-types==0.7.0
|
|
10
10
|
# via pydantic
|
|
11
|
-
anyio==4.
|
|
11
|
+
anyio==4.7.0
|
|
12
12
|
# via
|
|
13
13
|
# httpx
|
|
14
14
|
# starlette
|
|
@@ -43,7 +43,7 @@ click==8.1.7
|
|
|
43
43
|
# via
|
|
44
44
|
# isar (pyproject.toml)
|
|
45
45
|
# uvicorn
|
|
46
|
-
cryptography==
|
|
46
|
+
cryptography==44.0.0
|
|
47
47
|
# via
|
|
48
48
|
# azure-identity
|
|
49
49
|
# azure-storage-blob
|
|
@@ -54,13 +54,13 @@ dacite==1.8.1
|
|
|
54
54
|
# via
|
|
55
55
|
# alitra
|
|
56
56
|
# isar (pyproject.toml)
|
|
57
|
-
fastapi==0.115.
|
|
57
|
+
fastapi==0.115.6
|
|
58
58
|
# via
|
|
59
59
|
# fastapi-azure-auth
|
|
60
60
|
# isar (pyproject.toml)
|
|
61
61
|
fastapi-azure-auth==5.0.1
|
|
62
62
|
# via isar (pyproject.toml)
|
|
63
|
-
google-api-core==2.
|
|
63
|
+
google-api-core==2.24.0
|
|
64
64
|
# via opencensus
|
|
65
65
|
google-auth==2.36.0
|
|
66
66
|
# via google-api-core
|
|
@@ -72,7 +72,7 @@ h11==0.14.0
|
|
|
72
72
|
# uvicorn
|
|
73
73
|
httpcore==1.0.7
|
|
74
74
|
# via httpx
|
|
75
|
-
httpx==0.
|
|
75
|
+
httpx==0.28.1
|
|
76
76
|
# via fastapi-azure-auth
|
|
77
77
|
idna==3.10
|
|
78
78
|
# via
|
|
@@ -91,7 +91,7 @@ msal==1.31.1
|
|
|
91
91
|
# msal-extensions
|
|
92
92
|
msal-extensions==1.2.0
|
|
93
93
|
# via azure-identity
|
|
94
|
-
numpy==2.
|
|
94
|
+
numpy==2.2.0
|
|
95
95
|
# via
|
|
96
96
|
# alitra
|
|
97
97
|
# isar (pyproject.toml)
|
|
@@ -115,7 +115,7 @@ portalocker==2.10.1
|
|
|
115
115
|
# via msal-extensions
|
|
116
116
|
proto-plus==1.25.0
|
|
117
117
|
# via google-api-core
|
|
118
|
-
protobuf==5.
|
|
118
|
+
protobuf==5.29.1
|
|
119
119
|
# via
|
|
120
120
|
# google-api-core
|
|
121
121
|
# googleapis-common-protos
|
|
@@ -130,7 +130,7 @@ pyasn1-modules==0.4.1
|
|
|
130
130
|
# via google-auth
|
|
131
131
|
pycparser==2.22
|
|
132
132
|
# via cffi
|
|
133
|
-
pydantic==2.10.
|
|
133
|
+
pydantic==2.10.3
|
|
134
134
|
# via
|
|
135
135
|
# fastapi
|
|
136
136
|
# isar (pyproject.toml)
|
|
@@ -139,7 +139,7 @@ pydantic-core==2.27.1
|
|
|
139
139
|
# via pydantic
|
|
140
140
|
pydantic-settings==2.6.1
|
|
141
141
|
# via isar (pyproject.toml)
|
|
142
|
-
pyjwt[crypto]==2.10.
|
|
142
|
+
pyjwt[crypto]==2.10.1
|
|
143
143
|
# via
|
|
144
144
|
# fastapi-azure-auth
|
|
145
145
|
# isar (pyproject.toml)
|
|
@@ -165,21 +165,20 @@ rsa==4.9
|
|
|
165
165
|
# via google-auth
|
|
166
166
|
scipy==1.14.1
|
|
167
167
|
# via alitra
|
|
168
|
-
six==1.
|
|
168
|
+
six==1.17.0
|
|
169
169
|
# via
|
|
170
170
|
# azure-core
|
|
171
171
|
# opencensus
|
|
172
172
|
# transitions
|
|
173
173
|
sniffio==1.3.1
|
|
174
|
-
# via
|
|
175
|
-
# anyio
|
|
176
|
-
# httpx
|
|
174
|
+
# via anyio
|
|
177
175
|
starlette==0.41.3
|
|
178
176
|
# via fastapi
|
|
179
177
|
transitions==0.9.2
|
|
180
178
|
# via isar (pyproject.toml)
|
|
181
179
|
typing-extensions==4.12.2
|
|
182
180
|
# via
|
|
181
|
+
# anyio
|
|
183
182
|
# azure-core
|
|
184
183
|
# azure-identity
|
|
185
184
|
# azure-keyvault-secrets
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from isar.apis.models.models import InputPose, InputPosition
|
|
8
|
+
from isar.config.settings import settings
|
|
9
|
+
from isar.mission_planner.mission_planner_interface import MissionPlannerError
|
|
10
|
+
from robot_interface.models.mission.mission import Mission
|
|
11
|
+
from robot_interface.models.mission.task import (
|
|
12
|
+
TASKS,
|
|
13
|
+
DockingProcedure,
|
|
14
|
+
Localize,
|
|
15
|
+
RecordAudio,
|
|
16
|
+
ReturnToHome,
|
|
17
|
+
TakeImage,
|
|
18
|
+
TakeThermalImage,
|
|
19
|
+
TakeThermalVideo,
|
|
20
|
+
TakeVideo,
|
|
21
|
+
ZoomDescription,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class InspectionTypes(str, Enum):
|
|
26
|
+
image: str = "Image"
|
|
27
|
+
thermal_image: str = "ThermalImage"
|
|
28
|
+
video: str = "Video"
|
|
29
|
+
thermal_video: str = "ThermalVideo"
|
|
30
|
+
audio: str = "Audio"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TaskType(str, Enum):
|
|
34
|
+
Inspection: str = "inspection"
|
|
35
|
+
Localization: str = "localization"
|
|
36
|
+
ReturnToHome: str = "return_to_home"
|
|
37
|
+
Dock: str = "dock"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class StartMissionInspectionDefinition(BaseModel):
|
|
41
|
+
type: InspectionTypes = Field(default=InspectionTypes.image)
|
|
42
|
+
inspection_target: InputPosition
|
|
43
|
+
analysis_type: Optional[str] = None
|
|
44
|
+
duration: Optional[float] = None
|
|
45
|
+
metadata: Optional[dict] = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class StartMissionTaskDefinition(BaseModel):
|
|
49
|
+
type: TaskType = Field(default=TaskType.Inspection)
|
|
50
|
+
pose: InputPose
|
|
51
|
+
inspection: Optional[StartMissionInspectionDefinition] = None
|
|
52
|
+
tag: Optional[str] = None
|
|
53
|
+
zoom: Optional[ZoomDescription] = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class StartMissionDefinition(BaseModel):
|
|
57
|
+
tasks: List[StartMissionTaskDefinition]
|
|
58
|
+
name: Optional[str] = None
|
|
59
|
+
start_pose: Optional[InputPose] = None
|
|
60
|
+
dock: Optional[bool] = Field(default=False)
|
|
61
|
+
undock: Optional[bool] = Field(default=False)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def to_isar_mission(
|
|
65
|
+
start_mission_definition: StartMissionDefinition,
|
|
66
|
+
return_pose: Optional[InputPose] = None,
|
|
67
|
+
) -> Mission:
|
|
68
|
+
isar_tasks: List[TASKS] = []
|
|
69
|
+
|
|
70
|
+
for task_definition in start_mission_definition.tasks:
|
|
71
|
+
task: TASKS = to_isar_task(task_definition)
|
|
72
|
+
isar_tasks.append(task)
|
|
73
|
+
|
|
74
|
+
if return_pose:
|
|
75
|
+
isar_tasks.append(ReturnToHome(pose=return_pose.to_alitra_pose()))
|
|
76
|
+
|
|
77
|
+
if not isar_tasks:
|
|
78
|
+
raise MissionPlannerError("Mission does not contain any valid tasks")
|
|
79
|
+
|
|
80
|
+
isar_mission_name: str
|
|
81
|
+
if start_mission_definition.name:
|
|
82
|
+
isar_mission_name = start_mission_definition.name
|
|
83
|
+
else:
|
|
84
|
+
isar_mission_name = _build_mission_name()
|
|
85
|
+
|
|
86
|
+
start_pose = None
|
|
87
|
+
if start_mission_definition.start_pose:
|
|
88
|
+
start_pose = start_mission_definition.start_pose.to_alitra_pose()
|
|
89
|
+
|
|
90
|
+
return Mission(
|
|
91
|
+
tasks=isar_tasks,
|
|
92
|
+
name=isar_mission_name,
|
|
93
|
+
start_pose=start_pose,
|
|
94
|
+
dock=start_mission_definition.dock,
|
|
95
|
+
undock=start_mission_definition.undock,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def to_isar_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
100
|
+
if task_definition.type == TaskType.Inspection:
|
|
101
|
+
return to_inspection_task(task_definition)
|
|
102
|
+
elif task_definition.type == TaskType.Localization:
|
|
103
|
+
return to_localization_task(task_definition)
|
|
104
|
+
elif task_definition.type == TaskType.ReturnToHome:
|
|
105
|
+
return create_return_to_home_task(task_definition)
|
|
106
|
+
elif task_definition.type == TaskType.Dock:
|
|
107
|
+
return create_dock_task()
|
|
108
|
+
else:
|
|
109
|
+
raise MissionPlannerError(
|
|
110
|
+
f"Failed to create task: '{task_definition.type}' is not a valid"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
115
|
+
inspection_definition = task_definition.inspection
|
|
116
|
+
|
|
117
|
+
if inspection_definition.type == InspectionTypes.image:
|
|
118
|
+
return TakeImage(
|
|
119
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
120
|
+
tag_id=task_definition.tag,
|
|
121
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
122
|
+
metadata=task_definition.inspection.metadata,
|
|
123
|
+
zoom=task_definition.zoom,
|
|
124
|
+
)
|
|
125
|
+
elif inspection_definition.type == InspectionTypes.video:
|
|
126
|
+
return TakeVideo(
|
|
127
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
128
|
+
tag_id=task_definition.tag,
|
|
129
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
130
|
+
duration=inspection_definition.duration,
|
|
131
|
+
metadata=task_definition.inspection.metadata,
|
|
132
|
+
zoom=task_definition.zoom,
|
|
133
|
+
)
|
|
134
|
+
elif inspection_definition.type == InspectionTypes.thermal_image:
|
|
135
|
+
return TakeThermalImage(
|
|
136
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
137
|
+
tag_id=task_definition.tag,
|
|
138
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
139
|
+
metadata=task_definition.inspection.metadata,
|
|
140
|
+
zoom=task_definition.zoom,
|
|
141
|
+
)
|
|
142
|
+
elif inspection_definition.type == InspectionTypes.thermal_video:
|
|
143
|
+
return TakeThermalVideo(
|
|
144
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
145
|
+
tag_id=task_definition.tag,
|
|
146
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
147
|
+
duration=inspection_definition.duration,
|
|
148
|
+
metadata=task_definition.inspection.metadata,
|
|
149
|
+
zoom=task_definition.zoom,
|
|
150
|
+
)
|
|
151
|
+
elif inspection_definition.type == InspectionTypes.audio:
|
|
152
|
+
return RecordAudio(
|
|
153
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
154
|
+
tag_id=task_definition.tag,
|
|
155
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
156
|
+
duration=inspection_definition.duration,
|
|
157
|
+
metadata=task_definition.inspection.metadata,
|
|
158
|
+
zoom=task_definition.zoom,
|
|
159
|
+
)
|
|
160
|
+
else:
|
|
161
|
+
raise ValueError(
|
|
162
|
+
f"Inspection type '{inspection_definition.type}' not supported"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def to_localization_task(task_definition: StartMissionTaskDefinition) -> Localize:
|
|
167
|
+
return Localize(localization_pose=task_definition.pose.to_alitra_pose())
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def create_return_to_home_task(
|
|
171
|
+
task_definition: StartMissionTaskDefinition,
|
|
172
|
+
) -> ReturnToHome:
|
|
173
|
+
return ReturnToHome(pose=task_definition.pose.to_alitra_pose())
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def create_dock_task() -> DockingProcedure:
|
|
177
|
+
return DockingProcedure(behavior="dock")
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _build_mission_name() -> str:
|
|
181
|
+
return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
|
|
@@ -21,7 +21,13 @@ from isar.mission_planner.mission_planner_interface import MissionPlannerError
|
|
|
21
21
|
from isar.services.utilities.scheduling_utilities import SchedulingUtilities
|
|
22
22
|
from isar.state_machine.states_enum import States
|
|
23
23
|
from robot_interface.models.mission.mission import Mission
|
|
24
|
-
from robot_interface.models.mission.task import
|
|
24
|
+
from robot_interface.models.mission.task import (
|
|
25
|
+
TASKS,
|
|
26
|
+
InspectionTask,
|
|
27
|
+
Localize,
|
|
28
|
+
MoveArm,
|
|
29
|
+
ReturnToHome,
|
|
30
|
+
)
|
|
25
31
|
|
|
26
32
|
|
|
27
33
|
class SchedulingController:
|
|
@@ -115,7 +121,9 @@ class SchedulingController:
|
|
|
115
121
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
116
122
|
|
|
117
123
|
try:
|
|
118
|
-
mission: Mission = to_isar_mission(
|
|
124
|
+
mission: Mission = to_isar_mission(
|
|
125
|
+
start_mission_definition=mission_definition, return_pose=return_pose
|
|
126
|
+
)
|
|
119
127
|
except MissionPlannerError as e:
|
|
120
128
|
error_message = f"Bad Request - Cannot create ISAR mission: {e}"
|
|
121
129
|
self.logger.warning(error_message)
|
|
@@ -127,9 +135,6 @@ class SchedulingController:
|
|
|
127
135
|
self.scheduling_utilities.verify_robot_capable_of_mission(
|
|
128
136
|
mission=mission, robot_capabilities=robot_settings.CAPABILITIES
|
|
129
137
|
)
|
|
130
|
-
if return_pose:
|
|
131
|
-
pose: Pose = return_pose.to_alitra_pose()
|
|
132
|
-
mission.tasks.append(ReturnToHome(pose=pose))
|
|
133
138
|
|
|
134
139
|
initial_pose_alitra: Optional[Pose] = (
|
|
135
140
|
initial_pose.to_alitra_pose() if initial_pose else None
|
|
@@ -213,7 +218,9 @@ class SchedulingController:
|
|
|
213
218
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
214
219
|
|
|
215
220
|
pose: Pose = target_pose.to_alitra_pose()
|
|
216
|
-
mission: Mission = Mission(
|
|
221
|
+
mission: Mission = Mission(
|
|
222
|
+
name="Drive to pose", tasks=[ReturnToHome(pose=pose)]
|
|
223
|
+
)
|
|
217
224
|
|
|
218
225
|
self.logger.info(
|
|
219
226
|
f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -237,7 +244,9 @@ class SchedulingController:
|
|
|
237
244
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
238
245
|
|
|
239
246
|
pose: Pose = localization_pose.to_alitra_pose()
|
|
240
|
-
mission: Mission = Mission(
|
|
247
|
+
mission: Mission = Mission(
|
|
248
|
+
name="Localization mission", tasks=[Localize(localization_pose=pose)]
|
|
249
|
+
)
|
|
241
250
|
|
|
242
251
|
self.logger.info(
|
|
243
252
|
f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -284,7 +293,9 @@ class SchedulingController:
|
|
|
284
293
|
|
|
285
294
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
286
295
|
|
|
287
|
-
mission: Mission = Mission(
|
|
296
|
+
mission: Mission = Mission(
|
|
297
|
+
name="Move arm mission", tasks=[MoveArm(arm_pose=arm_pose_literal)]
|
|
298
|
+
)
|
|
288
299
|
|
|
289
300
|
self.logger.info(
|
|
290
301
|
f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -302,4 +313,11 @@ class SchedulingController:
|
|
|
302
313
|
)
|
|
303
314
|
|
|
304
315
|
def _task_api_response(self, task: TASKS) -> TaskResponse:
|
|
305
|
-
|
|
316
|
+
if isinstance(task, InspectionTask):
|
|
317
|
+
inspection_id = task.inspection_id
|
|
318
|
+
else:
|
|
319
|
+
inspection_id = None
|
|
320
|
+
|
|
321
|
+
return TaskResponse(
|
|
322
|
+
id=task.id, tag_id=task.tag_id, inspection_id=inspection_id, type=task.type
|
|
323
|
+
)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "1",
|
|
3
|
+
"name": "Default mission",
|
|
3
4
|
"tasks": [
|
|
4
5
|
{
|
|
5
6
|
"type": "take_image",
|
|
@@ -8,22 +9,22 @@
|
|
|
8
9
|
"x": -2,
|
|
9
10
|
"y": -2,
|
|
10
11
|
"z": 0,
|
|
11
|
-
"frame": "asset"
|
|
12
|
+
"frame": {"name": "asset"}
|
|
12
13
|
},
|
|
13
14
|
"orientation": {
|
|
14
15
|
"x": 0,
|
|
15
16
|
"y": 0,
|
|
16
17
|
"z": 0.4794255,
|
|
17
18
|
"w": 0.8775826,
|
|
18
|
-
"frame": "asset"
|
|
19
|
+
"frame": {"name": "asset"}
|
|
19
20
|
},
|
|
20
|
-
"frame": "asset"
|
|
21
|
+
"frame": {"name": "asset"}
|
|
21
22
|
},
|
|
22
23
|
"target": {
|
|
23
24
|
"x": 2,
|
|
24
25
|
"y": 2,
|
|
25
26
|
"z": 0,
|
|
26
|
-
"frame": "
|
|
27
|
+
"frame": {"name": "asset"}
|
|
27
28
|
}
|
|
28
29
|
},
|
|
29
30
|
{
|
|
@@ -33,22 +34,22 @@
|
|
|
33
34
|
"x": -2,
|
|
34
35
|
"y": 2,
|
|
35
36
|
"z": 0,
|
|
36
|
-
"frame": "asset"
|
|
37
|
+
"frame": {"name": "asset"}
|
|
37
38
|
},
|
|
38
39
|
"orientation": {
|
|
39
40
|
"x": 0,
|
|
40
41
|
"y": 0,
|
|
41
42
|
"z": 0.4794255,
|
|
42
43
|
"w": 0.8775826,
|
|
43
|
-
"frame": "asset"
|
|
44
|
+
"frame": {"name": "asset"}
|
|
44
45
|
},
|
|
45
|
-
"frame": "asset"
|
|
46
|
+
"frame": {"name": "asset"}
|
|
46
47
|
},
|
|
47
48
|
"target": {
|
|
48
49
|
"x": 2,
|
|
49
50
|
"y": 2,
|
|
50
51
|
"z": 0,
|
|
51
|
-
"frame": "
|
|
52
|
+
"frame": {"name": "asset"}
|
|
52
53
|
}
|
|
53
54
|
},
|
|
54
55
|
{
|
|
@@ -58,16 +59,16 @@
|
|
|
58
59
|
"x": 2,
|
|
59
60
|
"y": 2,
|
|
60
61
|
"z": 0,
|
|
61
|
-
"frame": "asset"
|
|
62
|
+
"frame": {"name": "asset"}
|
|
62
63
|
},
|
|
63
64
|
"orientation": {
|
|
64
65
|
"x": 0,
|
|
65
66
|
"y": 0,
|
|
66
67
|
"z": 0.4794255,
|
|
67
68
|
"w": 0.8775826,
|
|
68
|
-
"frame": "asset"
|
|
69
|
+
"frame": {"name": "asset"}
|
|
69
70
|
},
|
|
70
|
-
"frame": "asset"
|
|
71
|
+
"frame": {"name": "asset"}
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "2",
|
|
3
|
+
"name": "Default mission Turtlebot",
|
|
3
4
|
"tasks": [
|
|
4
5
|
{
|
|
5
6
|
"type": "take_image",
|
|
@@ -8,22 +9,22 @@
|
|
|
8
9
|
"x": -3.6,
|
|
9
10
|
"y": 4,
|
|
10
11
|
"z": 0,
|
|
11
|
-
"frame": "asset"
|
|
12
|
+
"frame": {"name": "asset"}
|
|
12
13
|
},
|
|
13
14
|
"orientation": {
|
|
14
15
|
"x": 0,
|
|
15
16
|
"y": 0,
|
|
16
17
|
"z": -0.7286672256879113,
|
|
17
18
|
"w": -0.6848660759820616,
|
|
18
|
-
"frame": "asset"
|
|
19
|
+
"frame": {"name": "asset"}
|
|
19
20
|
},
|
|
20
|
-
"frame": "asset"
|
|
21
|
+
"frame": {"name": "asset"}
|
|
21
22
|
},
|
|
22
23
|
"target": {
|
|
23
24
|
"x": -4.7,
|
|
24
25
|
"y": 4.9,
|
|
25
26
|
"z": 0,
|
|
26
|
-
"frame": "
|
|
27
|
+
"frame": {"name": "asset"}
|
|
27
28
|
}
|
|
28
29
|
},
|
|
29
30
|
|
|
@@ -34,22 +35,22 @@
|
|
|
34
35
|
"x": 4.7,
|
|
35
36
|
"y": 3,
|
|
36
37
|
"z": 0,
|
|
37
|
-
"frame": "asset"
|
|
38
|
+
"frame": {"name": "asset"}
|
|
38
39
|
},
|
|
39
40
|
"orientation": {
|
|
40
41
|
"x": 0,
|
|
41
42
|
"y": 0,
|
|
42
43
|
"z": 0.5769585,
|
|
43
44
|
"w": 0.8167734,
|
|
44
|
-
"frame": "asset"
|
|
45
|
+
"frame": {"name": "asset"}
|
|
45
46
|
},
|
|
46
|
-
"frame": "asset"
|
|
47
|
+
"frame": {"name": "asset"}
|
|
47
48
|
},
|
|
48
49
|
"target": {
|
|
49
50
|
"x": 5.6,
|
|
50
51
|
"y": 5.2,
|
|
51
52
|
"z": 0,
|
|
52
|
-
"frame": "
|
|
53
|
+
"frame": {"name": "asset"}
|
|
53
54
|
}
|
|
54
55
|
},
|
|
55
56
|
{
|
|
@@ -59,22 +60,22 @@
|
|
|
59
60
|
"x": 4.7,
|
|
60
61
|
"y": 3,
|
|
61
62
|
"z": 0,
|
|
62
|
-
"frame": "asset"
|
|
63
|
+
"frame": {"name": "asset"}
|
|
63
64
|
},
|
|
64
65
|
"orientation": {
|
|
65
66
|
"x": 0,
|
|
66
67
|
"y": 0,
|
|
67
68
|
"z": 0.5769585,
|
|
68
69
|
"w": 0.8167734,
|
|
69
|
-
"frame": "asset"
|
|
70
|
+
"frame": {"name": "asset"}
|
|
70
71
|
},
|
|
71
|
-
"frame": "asset"
|
|
72
|
+
"frame": {"name": "asset"}
|
|
72
73
|
},
|
|
73
74
|
"target": {
|
|
74
75
|
"x": 3.1,
|
|
75
76
|
"y": 5.2,
|
|
76
77
|
"z": 0,
|
|
77
|
-
"frame": "
|
|
78
|
+
"frame": {"name": "asset"}
|
|
78
79
|
}
|
|
79
80
|
},
|
|
80
81
|
{
|
|
@@ -84,22 +85,22 @@
|
|
|
84
85
|
"x": 0.95,
|
|
85
86
|
"y": 2.6,
|
|
86
87
|
"z": 0,
|
|
87
|
-
"frame": "asset"
|
|
88
|
+
"frame": {"name": "asset"}
|
|
88
89
|
},
|
|
89
90
|
"orientation": {
|
|
90
91
|
"x": 0,
|
|
91
92
|
"y": 0,
|
|
92
93
|
"z": -0.6992469,
|
|
93
94
|
"w": 0.7148802,
|
|
94
|
-
"frame": "asset"
|
|
95
|
+
"frame": {"name": "asset"}
|
|
95
96
|
},
|
|
96
|
-
"frame": "asset"
|
|
97
|
+
"frame": {"name": "asset"}
|
|
97
98
|
},
|
|
98
99
|
"target": {
|
|
99
100
|
"x": 1.9,
|
|
100
101
|
"y": 1.9,
|
|
101
102
|
"z": 0,
|
|
102
|
-
"frame": "
|
|
103
|
+
"frame": {"name": "asset"}
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
106
|
]
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import json
|
|
1
2
|
import logging
|
|
2
3
|
from pathlib import Path
|
|
3
|
-
from typing import List, Optional
|
|
4
4
|
|
|
5
|
-
from alitra import Frame
|
|
6
5
|
from injector import inject
|
|
7
6
|
|
|
8
7
|
from isar.config.settings import settings
|
|
@@ -11,10 +10,8 @@ from isar.mission_planner.mission_planner_interface import (
|
|
|
11
10
|
MissionPlannerError,
|
|
12
11
|
MissionPlannerInterface,
|
|
13
12
|
)
|
|
14
|
-
from isar.services.readers.base_reader import BaseReader, BaseReaderError
|
|
15
13
|
from robot_interface.models.mission.mission import Mission
|
|
16
14
|
|
|
17
|
-
|
|
18
15
|
logger = logging.getLogger("api")
|
|
19
16
|
|
|
20
17
|
|
|
@@ -39,16 +36,10 @@ class LocalPlanner(MissionPlannerInterface):
|
|
|
39
36
|
|
|
40
37
|
@staticmethod
|
|
41
38
|
def read_mission_from_file(mission_path: Path) -> Mission:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
mission: Mission = BaseReader.dict_to_dataclass(
|
|
45
|
-
dataclass_dict=mission_dict,
|
|
46
|
-
target_dataclass=Mission,
|
|
47
|
-
cast_config=[Frame],
|
|
48
|
-
strict_config=True,
|
|
49
|
-
)
|
|
39
|
+
with open(mission_path) as json_file:
|
|
40
|
+
mission_dict = json.load(json_file)
|
|
50
41
|
|
|
51
|
-
return
|
|
42
|
+
return Mission(**mission_dict)
|
|
52
43
|
|
|
53
44
|
def get_predefined_missions(self) -> dict:
|
|
54
45
|
missions: dict = {}
|
|
@@ -57,13 +48,8 @@ class LocalPlanner(MissionPlannerInterface):
|
|
|
57
48
|
for file in json_files:
|
|
58
49
|
mission_name = file.stem
|
|
59
50
|
path_to_file = self.predefined_mission_folder.joinpath(file.name)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
except BaseReaderError as e:
|
|
63
|
-
logger.warning(
|
|
64
|
-
f"Failed to read predefined mission {path_to_file} \n {e}"
|
|
65
|
-
)
|
|
66
|
-
continue
|
|
51
|
+
|
|
52
|
+
mission: Mission = self.read_mission_from_file(path_to_file)
|
|
67
53
|
if mission.id in invalid_mission_ids:
|
|
68
54
|
logger.warning(
|
|
69
55
|
f"Duplicate mission id {mission.id} : {path_to_file.as_posix()}"
|
|
@@ -412,7 +412,7 @@ class StateMachine(object):
|
|
|
412
412
|
Transitions into idle state.
|
|
413
413
|
|
|
414
414
|
"""
|
|
415
|
-
self.to_idle()
|
|
415
|
+
self.to_idle() # type: ignore
|
|
416
416
|
|
|
417
417
|
def iterate_current_task(self):
|
|
418
418
|
if self.current_task.is_finished():
|
|
@@ -426,7 +426,7 @@ class StateMachine(object):
|
|
|
426
426
|
|
|
427
427
|
def update_state(self):
|
|
428
428
|
"""Updates the current state of the state machine."""
|
|
429
|
-
self.current_state = States(self.state)
|
|
429
|
+
self.current_state = States(self.state) # type: ignore
|
|
430
430
|
self.send_state_status()
|
|
431
431
|
self._log_state_transition(self.current_state)
|
|
432
432
|
self.logger.info(f"State: {self.current_state}")
|