isar 1.25.9__tar.gz → 1.26.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.25.9 → isar-1.26.0}/.github/workflows/pythonpackage.yml +6 -1
- {isar-1.25.9 → isar-1.26.0}/.github/workflows/stale.yml +0 -4
- {isar-1.25.9 → isar-1.26.0}/PKG-INFO +2 -3
- {isar-1.25.9 → isar-1.26.0}/README.md +0 -2
- isar-1.26.0/docs/state_machine_diagram.png +0 -0
- {isar-1.25.9 → isar-1.26.0}/pyproject.toml +1 -0
- {isar-1.25.9 → isar-1.26.0}/requirements.txt +19 -19
- isar-1.26.0/src/isar/apis/models/start_mission_definition.py +176 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/robot_control/robot_controller.py +5 -4
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/schedule/scheduling_controller.py +4 -32
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/security/authentication.py +2 -2
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/settings.env +1 -3
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/settings.py +5 -5
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/message.py +0 -4
- isar-1.26.0/src/isar/models/communication/queues/queue_utils.py +27 -0
- isar-1.26.0/src/isar/models/communication/queues/queues.py +37 -0
- isar-1.26.0/src/isar/robot/robot.py +91 -0
- isar-1.26.0/src/isar/robot/robot_start_mission.py +73 -0
- isar-1.26.0/src/isar/robot/robot_status.py +46 -0
- isar-1.26.0/src/isar/robot/robot_task_status.py +92 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/script.py +7 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/scheduling_utilities.py +15 -26
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/state_machine.py +94 -183
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/blocked_protective_stop.py +7 -19
- isar-1.26.0/src/isar/state_machine/states/idle.py +61 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/monitor.py +43 -90
- isar-1.26.0/src/isar/state_machine/states/offline.py +38 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/paused.py +1 -1
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states_enum.py +0 -2
- isar-1.26.0/src/isar/state_machine/transitions/fail_mission.py +13 -0
- isar-1.26.0/src/isar/state_machine/transitions/finish_mission.py +39 -0
- isar-1.26.0/src/isar/state_machine/transitions/pause.py +24 -0
- isar-1.26.0/src/isar/state_machine/transitions/resume.py +27 -0
- isar-1.26.0/src/isar/state_machine/transitions/start_mission.py +73 -0
- isar-1.26.0/src/isar/state_machine/transitions/stop.py +33 -0
- isar-1.26.0/src/isar/state_machine/transitions/utils.py +10 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/slimm_storage.py +2 -2
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/PKG-INFO +2 -3
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/SOURCES.txt +12 -2
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/requires.txt +1 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/mqtt_client.py +0 -1
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/payloads.py +3 -3
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/json_service.py +1 -1
- {isar-1.25.9 → isar-1.26.0}/tests/conftest.py +1 -7
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -2
- isar-1.26.0/tests/isar/apis/security/test_authentication.py +32 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/models/communication/test_queues.py +10 -10
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/test_scheduling_utilities.py +2 -2
- {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/test_state_machine.py +92 -59
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/robot_interface.py +25 -11
- isar-1.25.9/docs/state_machine_diagram.png +0 -0
- isar-1.25.9/src/isar/apis/models/start_mission_definition.py +0 -229
- isar-1.25.9/src/isar/models/communication/queues/queues.py +0 -19
- isar-1.25.9/src/isar/state_machine/states/idle.py +0 -103
- isar-1.25.9/src/isar/state_machine/states/initialize.py +0 -70
- isar-1.25.9/src/isar/state_machine/states/initiate.py +0 -111
- isar-1.25.9/src/isar/state_machine/states/offline.py +0 -63
- isar-1.25.9/tests/isar/apis/security/test_authentication.py +0 -53
- {isar-1.25.9 → isar-1.26.0}/.dockerignore +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/release.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/workflows/project_automations.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/.gitignore +0 -0
- {isar-1.25.9 → isar-1.26.0}/.pre-commit-config.yaml +0 -0
- {isar-1.25.9 → isar-1.26.0}/Dockerfile +0 -0
- {isar-1.25.9 → isar-1.26.0}/LICENSE +0 -0
- {isar-1.25.9 → isar-1.26.0}/SECURITY.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/docker-compose-turtlebot.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/docker-compose.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/Makefile +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/make.bat +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/rst_processing.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/source/conf.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/source/index.rst +0 -0
- {isar-1.25.9 → isar-1.26.0}/docs/source/readme_link.md +0 -0
- {isar-1.25.9 → isar-1.26.0}/main.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/radixconfig.yml +0 -0
- {isar-1.25.9 → isar-1.26.0}/setup.cfg +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/api.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/models/models.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/configuration_error.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/log.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/logging.conf +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/modules.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/stop.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/local_storage.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/uploader.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar/storage/utilities.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/inspection/inspection.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/task.py +1 -1
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/test_successful_mission.py +1 -1
- {isar-1.25.9 → isar-1.26.0}/tests/isar/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/mission/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/models/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/__init__.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/blob_storage.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/mission_definition.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/pose.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/request.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/status.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/task.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/mocks/token.py +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.25.9 → isar-1.26.0}/tests/test_modules.py +0 -0
|
@@ -7,6 +7,7 @@ on:
|
|
|
7
7
|
pull_request:
|
|
8
8
|
branches:
|
|
9
9
|
- main
|
|
10
|
+
- update-dependencies
|
|
10
11
|
|
|
11
12
|
jobs:
|
|
12
13
|
build:
|
|
@@ -48,9 +49,13 @@ jobs:
|
|
|
48
49
|
run: |
|
|
49
50
|
black --check .
|
|
50
51
|
|
|
52
|
+
- name: Run isort
|
|
53
|
+
run: |
|
|
54
|
+
isort --check .
|
|
55
|
+
|
|
51
56
|
- name: Run mypy
|
|
52
57
|
run: |
|
|
53
|
-
mypy --disable-error-code=import-untyped .
|
|
58
|
+
mypy --disable-error-code=import-untyped --check-untyped-defs .
|
|
54
59
|
|
|
55
60
|
- name: Run ruff
|
|
56
61
|
run: |
|
|
@@ -22,11 +22,7 @@ jobs:
|
|
|
22
22
|
uses: actions/stale@v9
|
|
23
23
|
with:
|
|
24
24
|
repo-token: ${{ secrets.STALE_ISSUE_TOKEN }}
|
|
25
|
-
stale-issue-message: "This issue has automatically been marked as stale as there has been no activity for 60 days."
|
|
26
|
-
stale-pr-message: "This pull request has automatically been marked as stale as there has been no activity for 30 days."
|
|
27
25
|
stale-issue-label: "stale"
|
|
28
26
|
stale-pr-label: "stale"
|
|
29
|
-
close-issue-message: "This issue has been closed automatically due to a lack of activity."
|
|
30
|
-
close-pr-message: "This pull request has been closed automatically due to a lack of activity."
|
|
31
27
|
days-before-pr-stale: 30
|
|
32
28
|
days-before-close: -1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: isar
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.26.0
|
|
4
4
|
Summary: Integration and Supervisory control of Autonomous Robots
|
|
5
5
|
Author-email: Equinor ASA <fg_robots_dev@equinor.com>
|
|
6
6
|
License: Eclipse Public License version 2.0
|
|
@@ -127,6 +127,7 @@ Requires-Dist: transitions
|
|
|
127
127
|
Requires-Dist: uvicorn
|
|
128
128
|
Provides-Extra: dev
|
|
129
129
|
Requires-Dist: black; extra == "dev"
|
|
130
|
+
Requires-Dist: isort; extra == "dev"
|
|
130
131
|
Requires-Dist: mypy; extra == "dev"
|
|
131
132
|
Requires-Dist: pip-tools; extra == "dev"
|
|
132
133
|
Requires-Dist: pre-commit; extra == "dev"
|
|
@@ -350,8 +351,6 @@ In general the states
|
|
|
350
351
|
|
|
351
352
|
```
|
|
352
353
|
States.Off,
|
|
353
|
-
States.Initialize,
|
|
354
|
-
States.Initiate,
|
|
355
354
|
States.Stop,
|
|
356
355
|
States.Monitor,
|
|
357
356
|
States.Paused,
|
|
Binary file
|
|
@@ -18,19 +18,19 @@ azure-core==1.32.0
|
|
|
18
18
|
# azure-keyvault-secrets
|
|
19
19
|
# azure-storage-blob
|
|
20
20
|
# opencensus-ext-azure
|
|
21
|
-
azure-identity==1.
|
|
21
|
+
azure-identity==1.20.0
|
|
22
22
|
# via
|
|
23
23
|
# isar (pyproject.toml)
|
|
24
24
|
# opencensus-ext-azure
|
|
25
25
|
azure-keyvault-secrets==4.9.0
|
|
26
26
|
# via isar (pyproject.toml)
|
|
27
|
-
azure-storage-blob==12.24.
|
|
27
|
+
azure-storage-blob==12.24.1
|
|
28
28
|
# via isar (pyproject.toml)
|
|
29
29
|
backoff==2.2.1
|
|
30
30
|
# via isar (pyproject.toml)
|
|
31
|
-
cachetools==5.5.
|
|
31
|
+
cachetools==5.5.2
|
|
32
32
|
# via google-auth
|
|
33
|
-
certifi==
|
|
33
|
+
certifi==2025.1.31
|
|
34
34
|
# via
|
|
35
35
|
# httpcore
|
|
36
36
|
# httpx
|
|
@@ -43,28 +43,28 @@ click==8.1.8
|
|
|
43
43
|
# via
|
|
44
44
|
# isar (pyproject.toml)
|
|
45
45
|
# uvicorn
|
|
46
|
-
cryptography==44.0.
|
|
46
|
+
cryptography==44.0.1
|
|
47
47
|
# via
|
|
48
48
|
# azure-identity
|
|
49
49
|
# azure-storage-blob
|
|
50
50
|
# fastapi-azure-auth
|
|
51
51
|
# msal
|
|
52
52
|
# pyjwt
|
|
53
|
-
dacite==1.
|
|
53
|
+
dacite==1.9.2
|
|
54
54
|
# via
|
|
55
55
|
# alitra
|
|
56
56
|
# isar (pyproject.toml)
|
|
57
|
-
fastapi==0.115.
|
|
57
|
+
fastapi==0.115.8
|
|
58
58
|
# via
|
|
59
59
|
# fastapi-azure-auth
|
|
60
60
|
# isar (pyproject.toml)
|
|
61
|
-
fastapi-azure-auth==5.0
|
|
61
|
+
fastapi-azure-auth==5.1.0
|
|
62
62
|
# via isar (pyproject.toml)
|
|
63
|
-
google-api-core==2.24.
|
|
63
|
+
google-api-core==2.24.1
|
|
64
64
|
# via opencensus
|
|
65
|
-
google-auth==2.
|
|
65
|
+
google-auth==2.38.0
|
|
66
66
|
# via google-api-core
|
|
67
|
-
googleapis-common-protos==1.
|
|
67
|
+
googleapis-common-protos==1.68.0
|
|
68
68
|
# via google-api-core
|
|
69
69
|
h11==0.14.0
|
|
70
70
|
# 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.2.
|
|
94
|
+
numpy==2.2.3
|
|
95
95
|
# via
|
|
96
96
|
# alitra
|
|
97
97
|
# isar (pyproject.toml)
|
|
@@ -113,14 +113,14 @@ paho-mqtt==2.1.0
|
|
|
113
113
|
# via isar (pyproject.toml)
|
|
114
114
|
portalocker==2.10.1
|
|
115
115
|
# via msal-extensions
|
|
116
|
-
proto-plus==1.
|
|
116
|
+
proto-plus==1.26.0
|
|
117
117
|
# via google-api-core
|
|
118
118
|
protobuf==5.29.3
|
|
119
119
|
# via
|
|
120
120
|
# google-api-core
|
|
121
121
|
# googleapis-common-protos
|
|
122
122
|
# proto-plus
|
|
123
|
-
psutil==
|
|
123
|
+
psutil==7.0.0
|
|
124
124
|
# via opencensus-ext-azure
|
|
125
125
|
pyasn1==0.6.1
|
|
126
126
|
# via
|
|
@@ -130,14 +130,14 @@ 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.6
|
|
134
134
|
# via
|
|
135
135
|
# fastapi
|
|
136
136
|
# isar (pyproject.toml)
|
|
137
137
|
# pydantic-settings
|
|
138
138
|
pydantic-core==2.27.2
|
|
139
139
|
# via pydantic
|
|
140
|
-
pydantic-settings==2.
|
|
140
|
+
pydantic-settings==2.8.0
|
|
141
141
|
# via isar (pyproject.toml)
|
|
142
142
|
pyjwt[crypto]==2.10.1
|
|
143
143
|
# via
|
|
@@ -163,7 +163,7 @@ requests-toolbelt==1.0.0
|
|
|
163
163
|
# via isar (pyproject.toml)
|
|
164
164
|
rsa==4.9
|
|
165
165
|
# via google-auth
|
|
166
|
-
scipy==1.15.
|
|
166
|
+
scipy==1.15.2
|
|
167
167
|
# via alitra
|
|
168
168
|
six==1.17.0
|
|
169
169
|
# via
|
|
@@ -172,7 +172,7 @@ six==1.17.0
|
|
|
172
172
|
# transitions
|
|
173
173
|
sniffio==1.3.1
|
|
174
174
|
# via anyio
|
|
175
|
-
starlette==0.
|
|
175
|
+
starlette==0.45.3
|
|
176
176
|
# via fastapi
|
|
177
177
|
transitions==0.9.2
|
|
178
178
|
# via isar (pyproject.toml)
|
|
@@ -190,5 +190,5 @@ urllib3==2.3.0
|
|
|
190
190
|
# via requests
|
|
191
191
|
uvicorn==0.34.0
|
|
192
192
|
# via isar (pyproject.toml)
|
|
193
|
-
wrapt==1.17.
|
|
193
|
+
wrapt==1.17.2
|
|
194
194
|
# via opencensus-ext-requests
|
|
@@ -0,0 +1,176 @@
|
|
|
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
|
+
RecordAudio,
|
|
14
|
+
ReturnToHome,
|
|
15
|
+
TakeGasMeasurement,
|
|
16
|
+
TakeImage,
|
|
17
|
+
TakeThermalImage,
|
|
18
|
+
TakeThermalVideo,
|
|
19
|
+
TakeVideo,
|
|
20
|
+
ZoomDescription,
|
|
21
|
+
)
|
|
22
|
+
from robot_interface.utilities.uuid_string_factory import uuid4_string
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class InspectionTypes(str, Enum):
|
|
26
|
+
image = "Image"
|
|
27
|
+
thermal_image = "ThermalImage"
|
|
28
|
+
video = "Video"
|
|
29
|
+
thermal_video = "ThermalVideo"
|
|
30
|
+
audio = "Audio"
|
|
31
|
+
gas_measurement = "GasMeasurement"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TaskType(str, Enum):
|
|
35
|
+
Inspection = "inspection"
|
|
36
|
+
ReturnToHome = "return_to_home"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class StartMissionInspectionDefinition(BaseModel):
|
|
40
|
+
type: InspectionTypes = Field(default=InspectionTypes.image)
|
|
41
|
+
inspection_target: InputPosition
|
|
42
|
+
analysis_type: Optional[str] = None
|
|
43
|
+
duration: Optional[float] = None
|
|
44
|
+
metadata: Optional[dict] = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class StartMissionTaskDefinition(BaseModel):
|
|
48
|
+
id: Optional[str] = None
|
|
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
|
+
|
|
61
|
+
|
|
62
|
+
def to_isar_mission(
|
|
63
|
+
start_mission_definition: StartMissionDefinition,
|
|
64
|
+
return_pose: Optional[InputPose] = None,
|
|
65
|
+
) -> Mission:
|
|
66
|
+
isar_tasks: List[TASKS] = []
|
|
67
|
+
|
|
68
|
+
for task_definition in start_mission_definition.tasks:
|
|
69
|
+
task: TASKS = to_isar_task(task_definition)
|
|
70
|
+
isar_tasks.append(task)
|
|
71
|
+
|
|
72
|
+
if return_pose:
|
|
73
|
+
isar_tasks.append(ReturnToHome(pose=return_pose.to_alitra_pose()))
|
|
74
|
+
|
|
75
|
+
if not isar_tasks:
|
|
76
|
+
raise MissionPlannerError("Mission does not contain any valid tasks")
|
|
77
|
+
|
|
78
|
+
isar_mission_name: str = (
|
|
79
|
+
start_mission_definition.name
|
|
80
|
+
if start_mission_definition.name
|
|
81
|
+
else _build_mission_name()
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
start_pose = None
|
|
85
|
+
if start_mission_definition.start_pose:
|
|
86
|
+
start_pose = start_mission_definition.start_pose.to_alitra_pose()
|
|
87
|
+
|
|
88
|
+
return Mission(
|
|
89
|
+
tasks=isar_tasks,
|
|
90
|
+
name=isar_mission_name,
|
|
91
|
+
start_pose=start_pose,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def to_isar_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
96
|
+
if task_definition.type == TaskType.Inspection:
|
|
97
|
+
return to_inspection_task(task_definition)
|
|
98
|
+
elif task_definition.type == TaskType.ReturnToHome:
|
|
99
|
+
return create_return_to_home_task(task_definition)
|
|
100
|
+
else:
|
|
101
|
+
raise MissionPlannerError(
|
|
102
|
+
f"Failed to create task: '{task_definition.type}' is not a valid"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
107
|
+
inspection_definition = task_definition.inspection
|
|
108
|
+
|
|
109
|
+
if inspection_definition.type == InspectionTypes.image:
|
|
110
|
+
return TakeImage(
|
|
111
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
112
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
113
|
+
tag_id=task_definition.tag,
|
|
114
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
115
|
+
metadata=task_definition.inspection.metadata,
|
|
116
|
+
zoom=task_definition.zoom,
|
|
117
|
+
)
|
|
118
|
+
elif inspection_definition.type == InspectionTypes.video:
|
|
119
|
+
return TakeVideo(
|
|
120
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
121
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
122
|
+
tag_id=task_definition.tag,
|
|
123
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
124
|
+
duration=inspection_definition.duration,
|
|
125
|
+
metadata=task_definition.inspection.metadata,
|
|
126
|
+
zoom=task_definition.zoom,
|
|
127
|
+
)
|
|
128
|
+
elif inspection_definition.type == InspectionTypes.thermal_image:
|
|
129
|
+
return TakeThermalImage(
|
|
130
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
131
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
132
|
+
tag_id=task_definition.tag,
|
|
133
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
134
|
+
metadata=task_definition.inspection.metadata,
|
|
135
|
+
zoom=task_definition.zoom,
|
|
136
|
+
)
|
|
137
|
+
elif inspection_definition.type == InspectionTypes.thermal_video:
|
|
138
|
+
return TakeThermalVideo(
|
|
139
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
140
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
141
|
+
tag_id=task_definition.tag,
|
|
142
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
143
|
+
duration=inspection_definition.duration,
|
|
144
|
+
metadata=task_definition.inspection.metadata,
|
|
145
|
+
zoom=task_definition.zoom,
|
|
146
|
+
)
|
|
147
|
+
elif inspection_definition.type == InspectionTypes.audio:
|
|
148
|
+
return RecordAudio(
|
|
149
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
150
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
151
|
+
tag_id=task_definition.tag,
|
|
152
|
+
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
153
|
+
duration=inspection_definition.duration,
|
|
154
|
+
metadata=task_definition.inspection.metadata,
|
|
155
|
+
)
|
|
156
|
+
elif inspection_definition.type == InspectionTypes.gas_measurement:
|
|
157
|
+
return TakeGasMeasurement(
|
|
158
|
+
id=task_definition.id if task_definition.id else uuid4_string(),
|
|
159
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
160
|
+
tag_id=task_definition.tag,
|
|
161
|
+
metadata=task_definition.inspection.metadata,
|
|
162
|
+
)
|
|
163
|
+
else:
|
|
164
|
+
raise ValueError(
|
|
165
|
+
f"Inspection type '{inspection_definition.type}' not supported"
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def create_return_to_home_task(
|
|
170
|
+
task_definition: StartMissionTaskDefinition,
|
|
171
|
+
) -> ReturnToHome:
|
|
172
|
+
return ReturnToHome(pose=task_definition.pose.to_alitra_pose())
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _build_mission_name() -> str:
|
|
176
|
+
return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
+
from fastapi import HTTPException
|
|
3
4
|
from injector import inject
|
|
4
5
|
|
|
5
6
|
from isar.apis.models.models import RobotInfoResponse
|
|
6
7
|
from isar.config.settings import robot_settings, settings
|
|
7
8
|
from isar.services.utilities.robot_utilities import RobotUtilities
|
|
8
|
-
from
|
|
9
|
+
from robot_interface.models.robots.media import MediaConfig
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class RobotController:
|
|
@@ -17,8 +18,8 @@ class RobotController:
|
|
|
17
18
|
self.robot_utilities: RobotUtilities = robot_utilities
|
|
18
19
|
self.logger = logging.getLogger("api")
|
|
19
20
|
|
|
20
|
-
def generate_media_config(self):
|
|
21
|
-
media_config = self.robot_utilities.generate_media_config()
|
|
21
|
+
def generate_media_config(self) -> MediaConfig:
|
|
22
|
+
media_config: MediaConfig = self.robot_utilities.generate_media_config()
|
|
22
23
|
if media_config is None:
|
|
23
24
|
raise HTTPException(
|
|
24
25
|
status_code=204,
|
|
@@ -26,7 +27,7 @@ class RobotController:
|
|
|
26
27
|
)
|
|
27
28
|
return media_config
|
|
28
29
|
|
|
29
|
-
def get_info(self):
|
|
30
|
+
def get_info(self) -> RobotInfoResponse:
|
|
30
31
|
return RobotInfoResponse(
|
|
31
32
|
robot_package=settings.ROBOT_PACKAGE,
|
|
32
33
|
isar_id=settings.ISAR_ID,
|
|
@@ -8,9 +8,9 @@ from injector import inject
|
|
|
8
8
|
|
|
9
9
|
from isar.apis.models.models import (
|
|
10
10
|
ControlMissionResponse,
|
|
11
|
-
TaskResponse,
|
|
12
11
|
InputPose,
|
|
13
12
|
StartMissionResponse,
|
|
13
|
+
TaskResponse,
|
|
14
14
|
)
|
|
15
15
|
from isar.apis.models.start_mission_definition import (
|
|
16
16
|
StartMissionDefinition,
|
|
@@ -45,12 +45,6 @@ class SchedulingController:
|
|
|
45
45
|
title="Mission ID",
|
|
46
46
|
description="ID-number for predefined mission",
|
|
47
47
|
),
|
|
48
|
-
initial_pose: Optional[InputPose] = Body(
|
|
49
|
-
default=None,
|
|
50
|
-
description="The starting point of the mission. Used for initial "
|
|
51
|
-
"localization of robot",
|
|
52
|
-
embed=True,
|
|
53
|
-
),
|
|
54
48
|
return_pose: Optional[InputPose] = Body(
|
|
55
49
|
default=None,
|
|
56
50
|
description="End pose of the mission. The robot return to the specified "
|
|
@@ -72,15 +66,9 @@ class SchedulingController:
|
|
|
72
66
|
mission=mission, robot_capabilities=robot_settings.CAPABILITIES
|
|
73
67
|
)
|
|
74
68
|
|
|
75
|
-
initial_pose_alitra: Optional[Pose] = (
|
|
76
|
-
initial_pose.to_alitra_pose() if initial_pose else None
|
|
77
|
-
)
|
|
78
|
-
|
|
79
69
|
self.logger.info(f"Starting mission with ISAR Mission ID: '{mission.id}'")
|
|
80
70
|
|
|
81
|
-
self.scheduling_utilities.start_mission(
|
|
82
|
-
mission=mission, initial_pose=initial_pose_alitra
|
|
83
|
-
)
|
|
71
|
+
self.scheduling_utilities.start_mission(mission=mission)
|
|
84
72
|
|
|
85
73
|
return self._api_response(mission)
|
|
86
74
|
|
|
@@ -92,12 +80,6 @@ class SchedulingController:
|
|
|
92
80
|
title="Mission Definition",
|
|
93
81
|
description="Description of the mission in json format",
|
|
94
82
|
),
|
|
95
|
-
initial_pose: Optional[InputPose] = Body(
|
|
96
|
-
default=None,
|
|
97
|
-
description="The starting point of the mission. Used for initial "
|
|
98
|
-
"localization of robot",
|
|
99
|
-
embed=True,
|
|
100
|
-
),
|
|
101
83
|
return_pose: Optional[InputPose] = Body(
|
|
102
84
|
default=None,
|
|
103
85
|
description="End pose of the mission. The robot return to the specified "
|
|
@@ -135,14 +117,8 @@ class SchedulingController:
|
|
|
135
117
|
mission=mission, robot_capabilities=robot_settings.CAPABILITIES
|
|
136
118
|
)
|
|
137
119
|
|
|
138
|
-
initial_pose_alitra: Optional[Pose] = (
|
|
139
|
-
initial_pose.to_alitra_pose() if initial_pose else None
|
|
140
|
-
)
|
|
141
|
-
|
|
142
120
|
self.logger.info(f"Starting mission: {mission.id}")
|
|
143
|
-
self.scheduling_utilities.start_mission(
|
|
144
|
-
mission=mission, initial_pose=initial_pose_alitra
|
|
145
|
-
)
|
|
121
|
+
self.scheduling_utilities.start_mission(mission=mission)
|
|
146
122
|
return self._api_response(mission)
|
|
147
123
|
|
|
148
124
|
def pause_mission(self) -> ControlMissionResponse:
|
|
@@ -152,7 +128,6 @@ class SchedulingController:
|
|
|
152
128
|
|
|
153
129
|
if state not in [
|
|
154
130
|
States.Monitor,
|
|
155
|
-
States.Initiate,
|
|
156
131
|
]:
|
|
157
132
|
error_message = (
|
|
158
133
|
f"Conflict - Pause command received in invalid state - State: {state}"
|
|
@@ -245,10 +220,7 @@ class SchedulingController:
|
|
|
245
220
|
self.logger.info(
|
|
246
221
|
f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
|
|
247
222
|
)
|
|
248
|
-
self.scheduling_utilities.start_mission(
|
|
249
|
-
mission=mission,
|
|
250
|
-
initial_pose=None,
|
|
251
|
-
)
|
|
223
|
+
self.scheduling_utilities.start_mission(mission=mission)
|
|
252
224
|
return self._api_response(mission)
|
|
253
225
|
|
|
254
226
|
def _api_response(self, mission: Mission) -> StartMissionResponse:
|
|
@@ -50,7 +50,7 @@ class Authenticator:
|
|
|
50
50
|
enabled_string = "enabled" if self.authentication_enabled else "disabled"
|
|
51
51
|
self.logger.info(f"API authentication is {enabled_string}")
|
|
52
52
|
|
|
53
|
-
def should_authenticate(self):
|
|
53
|
+
def should_authenticate(self) -> bool:
|
|
54
54
|
return self.authentication_enabled
|
|
55
55
|
|
|
56
56
|
def get_scheme(self):
|
|
@@ -58,7 +58,7 @@ class Authenticator:
|
|
|
58
58
|
return validate_has_role
|
|
59
59
|
return NoSecurity
|
|
60
60
|
|
|
61
|
-
async def load_config(self):
|
|
61
|
+
async def load_config(self) -> None:
|
|
62
62
|
"""
|
|
63
63
|
Load OpenID config on startup.
|
|
64
64
|
"""
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
ISAR_ROBOT_PACKAGE = isar_robot
|
|
2
2
|
|
|
3
|
-
ISAR_RUN_MISSION_BY_TASK = true
|
|
4
|
-
|
|
5
3
|
ISAR_STORAGE_LOCAL_ENABLED = true
|
|
6
4
|
ISAR_STORAGE_BLOB_ENABLED = false
|
|
7
5
|
ISAR_STORAGE_SLIMM_ENABLED = false
|
|
@@ -12,7 +10,7 @@ ISAR_LOG_HANDLER_APPLICATION_INSIGHTS_ENABLED = false
|
|
|
12
10
|
ISAR_MQTT_ENABLED = true
|
|
13
11
|
ISAR_MQTT_SSL_ENABLED = true
|
|
14
12
|
|
|
15
|
-
ISAR_AUTHENTICATION_ENABLED =
|
|
13
|
+
ISAR_AUTHENTICATION_ENABLED = true
|
|
16
14
|
|
|
17
15
|
ISAR_PLANT_SHORT_NAME = HUA
|
|
18
16
|
|
|
@@ -62,7 +62,7 @@ class Settings(BaseSettings):
|
|
|
62
62
|
REQUEST_STATUS_COMMUNICATION_RECONNECT_DELAY: float = Field(default=10)
|
|
63
63
|
|
|
64
64
|
# Number of attempts to stop the robot before giving up
|
|
65
|
-
STOP_ROBOT_ATTEMPTS_LIMIT: int = Field(default=
|
|
65
|
+
STOP_ROBOT_ATTEMPTS_LIMIT: int = Field(default=3)
|
|
66
66
|
|
|
67
67
|
# Number of attempts to stop the robot before giving up
|
|
68
68
|
UPLOAD_FAILURE_ATTEMPTS_LIMIT: int = Field(default=10)
|
|
@@ -111,7 +111,7 @@ class Settings(BaseSettings):
|
|
|
111
111
|
# Enabling this requires certain resources available for OAuth2 authentication
|
|
112
112
|
# Currently supported authentication is Azure AD
|
|
113
113
|
# (https://github.com/Intility/fastapi-azure-auth)
|
|
114
|
-
AUTHENTICATION_ENABLED: bool = Field(default=
|
|
114
|
+
AUTHENTICATION_ENABLED: bool = Field(default=True)
|
|
115
115
|
|
|
116
116
|
# Tenant ID for the Azure tenant with your Azure Active Directory application
|
|
117
117
|
AZURE_TENANT_ID: str = Field(default="3aa4a235-b6e2-48d5-9195-7fcf05b459b0")
|
|
@@ -169,13 +169,13 @@ class Settings(BaseSettings):
|
|
|
169
169
|
# submitted with the results once they have been uploaded.
|
|
170
170
|
|
|
171
171
|
# Four digit code indicating facility
|
|
172
|
-
PLANT_CODE: str = Field(default="
|
|
172
|
+
PLANT_CODE: str = Field(default="1210")
|
|
173
173
|
|
|
174
174
|
# Name of the facility the robot is operating in
|
|
175
|
-
PLANT_NAME: str = Field(default="
|
|
175
|
+
PLANT_NAME: str = Field(default="Huldra")
|
|
176
176
|
|
|
177
177
|
# Shortname of the facility the robot is operating in
|
|
178
|
-
PLANT_SHORT_NAME: str = Field(default="
|
|
178
|
+
PLANT_SHORT_NAME: str = Field(default="HUA")
|
|
179
179
|
|
|
180
180
|
# Country the robot is operating in
|
|
181
181
|
COUNTRY: str = Field(default="Norway")
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
from alitra import Pose
|
|
5
2
|
|
|
6
3
|
from robot_interface.models.mission.mission import Mission
|
|
7
4
|
|
|
@@ -9,4 +6,3 @@ from robot_interface.models.mission.mission import Mission
|
|
|
9
6
|
@dataclass
|
|
10
7
|
class StartMissionMessage:
|
|
11
8
|
mission: Mission
|
|
12
|
-
initial_pose: Optional[Pose]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import queue
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from isar.models.communication.queues.queue_io import QueueIO
|
|
5
|
+
from isar.models.communication.queues.status_queue import StatusQueue
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def trigger_event(queueio: QueueIO, data: Any = None) -> None:
|
|
9
|
+
queueio.input.put(data if data is not None else True)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def check_shared_state(queueio: StatusQueue) -> Any:
|
|
13
|
+
try:
|
|
14
|
+
return queueio.check()
|
|
15
|
+
except queue.Empty:
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def update_shared_state(queueio: StatusQueue, data: Any = None) -> None:
|
|
20
|
+
queueio.update(data if data is not None else True)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def check_for_event(queueio: QueueIO) -> Any:
|
|
24
|
+
try:
|
|
25
|
+
return queueio.input.get(block=False)
|
|
26
|
+
except queue.Empty:
|
|
27
|
+
return None
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from queue import Queue
|
|
2
|
+
|
|
3
|
+
from isar.config.settings import settings
|
|
4
|
+
from isar.models.communication.queues.queue_io import QueueIO
|
|
5
|
+
from isar.models.communication.queues.status_queue import StatusQueue
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Queues:
|
|
9
|
+
def __init__(self) -> None:
|
|
10
|
+
self.api_start_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
11
|
+
self.api_stop_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
12
|
+
self.api_pause_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
13
|
+
self.api_resume_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
14
|
+
|
|
15
|
+
self.state_machine_start_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
16
|
+
self.state_machine_stop_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
17
|
+
self.state_machine_pause_mission: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
18
|
+
self.state_machine_task_status_request: QueueIO = QueueIO(
|
|
19
|
+
input_size=1, output_size=1
|
|
20
|
+
)
|
|
21
|
+
self.state_machine_robot_status_request: QueueIO = QueueIO(
|
|
22
|
+
input_size=1, output_size=1
|
|
23
|
+
)
|
|
24
|
+
self.state_machine_current_task: StatusQueue = StatusQueue()
|
|
25
|
+
|
|
26
|
+
self.robot_task_status: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
27
|
+
self.robot_task_status_failed: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
28
|
+
self.robot_mission_started: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
29
|
+
self.robot_mission_failed: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
30
|
+
self.robot_status_changed: QueueIO = QueueIO(input_size=1, output_size=1)
|
|
31
|
+
|
|
32
|
+
self.upload_queue: Queue = Queue(maxsize=10)
|
|
33
|
+
self.state: StatusQueue = StatusQueue()
|
|
34
|
+
self.robot_status: StatusQueue = StatusQueue()
|
|
35
|
+
|
|
36
|
+
if settings.MQTT_ENABLED:
|
|
37
|
+
self.mqtt_queue: Queue = Queue()
|