isar 1.25.5__tar.gz → 1.25.7__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.5 → isar-1.25.7}/PKG-INFO +1 -1
- isar-1.25.7/docs/state_machine_diagram.png +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/api.py +8 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/models/start_mission_definition.py +16 -2
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/robot_control/robot_controller.py +8 -1
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/settings.py +0 -7
- {isar-1.25.5 → isar-1.25.7}/src/isar/script.py +0 -1
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/state_machine.py +8 -89
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/initiate.py +5 -36
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/monitor.py +17 -26
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/paused.py +2 -5
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/stop.py +3 -7
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/inspection/inspection.py +13 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/mission/task.py +17 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/robot_interface.py +1 -17
- {isar-1.25.5 → isar-1.25.7}/tests/isar/state_machine/test_state_machine.py +2 -40
- isar-1.25.5/docs/state_machine_diagram.png +0 -0
- {isar-1.25.5 → isar-1.25.7}/.dockerignore +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/release.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/project_automations.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.github/workflows/stale.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/.gitignore +0 -0
- {isar-1.25.5 → isar-1.25.7}/.pre-commit-config.yaml +0 -0
- {isar-1.25.5 → isar-1.25.7}/Dockerfile +0 -0
- {isar-1.25.5 → isar-1.25.7}/LICENSE +0 -0
- {isar-1.25.5 → isar-1.25.7}/README.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/SECURITY.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/docker-compose-turtlebot.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/docker-compose.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/Makefile +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/make.bat +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/rst_processing.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/source/conf.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/source/index.rst +0 -0
- {isar-1.25.5 → isar-1.25.7}/docs/source/readme_link.md +0 -0
- {isar-1.25.5 → isar-1.25.7}/main.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/pyproject.toml +0 -0
- {isar-1.25.5 → isar-1.25.7}/radixconfig.yml +0 -0
- {isar-1.25.5 → isar-1.25.7}/requirements.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/setup.cfg +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/models/models.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/schedule/scheduling_controller.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/configuration_error.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/log.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/logging.conf +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/config/settings.env +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/message.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/modules.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/utilities/scheduling_utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/idle.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/initialize.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/local_storage.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/slimm_storage.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/uploader.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar/storage/utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/SOURCES.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/telemetry/payloads.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/conftest.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/models/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/mission/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/models/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/__init__.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/blob_storage.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/mission_definition.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/pose.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/request.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/robot_interface.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/status.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/task.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/mocks/token.py +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.25.5 → isar-1.25.7}/tests/test_modules.py +0 -0
|
Binary file
|
|
@@ -301,6 +301,14 @@ class API:
|
|
|
301
301
|
methods=["GET"],
|
|
302
302
|
dependencies=[authentication_dependency],
|
|
303
303
|
summary="Generates a media stream connection config",
|
|
304
|
+
responses={
|
|
305
|
+
HTTPStatus.OK.value: {
|
|
306
|
+
"description": "Media stream was successfully generated",
|
|
307
|
+
},
|
|
308
|
+
HTTPStatus.NO_CONTENT.value: {
|
|
309
|
+
"description": "Robot has no media config",
|
|
310
|
+
},
|
|
311
|
+
},
|
|
304
312
|
)
|
|
305
313
|
|
|
306
314
|
return router
|
|
@@ -18,6 +18,7 @@ from robot_interface.models.mission.task import (
|
|
|
18
18
|
TakeThermalImage,
|
|
19
19
|
TakeThermalVideo,
|
|
20
20
|
TakeVideo,
|
|
21
|
+
TakeGasMeasurement,
|
|
21
22
|
ZoomDescription,
|
|
22
23
|
)
|
|
23
24
|
|
|
@@ -28,6 +29,7 @@ class InspectionTypes(str, Enum):
|
|
|
28
29
|
video = "Video"
|
|
29
30
|
thermal_video = "ThermalVideo"
|
|
30
31
|
audio = "Audio"
|
|
32
|
+
gas_measurement = "GasMeasurement"
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
class TaskType(str, Enum):
|
|
@@ -200,7 +202,6 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
200
202
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
201
203
|
duration=inspection_definition.duration,
|
|
202
204
|
metadata=task_definition.inspection.metadata,
|
|
203
|
-
zoom=task_definition.zoom,
|
|
204
205
|
)
|
|
205
206
|
else:
|
|
206
207
|
return RecordAudio(
|
|
@@ -209,7 +210,20 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
|
|
|
209
210
|
target=task_definition.inspection.inspection_target.to_alitra_position(),
|
|
210
211
|
duration=inspection_definition.duration,
|
|
211
212
|
metadata=task_definition.inspection.metadata,
|
|
212
|
-
|
|
213
|
+
)
|
|
214
|
+
elif inspection_definition.type == InspectionTypes.gas_measurement:
|
|
215
|
+
if task_definition.id:
|
|
216
|
+
return TakeGasMeasurement(
|
|
217
|
+
id=task_definition.id,
|
|
218
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
219
|
+
tag_id=task_definition.tag,
|
|
220
|
+
metadata=task_definition.inspection.metadata,
|
|
221
|
+
)
|
|
222
|
+
else:
|
|
223
|
+
return TakeGasMeasurement(
|
|
224
|
+
robot_pose=task_definition.pose.to_alitra_pose(),
|
|
225
|
+
tag_id=task_definition.tag,
|
|
226
|
+
metadata=task_definition.inspection.metadata,
|
|
213
227
|
)
|
|
214
228
|
else:
|
|
215
229
|
raise ValueError(
|
|
@@ -5,6 +5,7 @@ from injector import inject
|
|
|
5
5
|
from isar.apis.models.models import RobotInfoResponse
|
|
6
6
|
from isar.config.settings import robot_settings, settings
|
|
7
7
|
from isar.services.utilities.robot_utilities import RobotUtilities
|
|
8
|
+
from fastapi import HTTPException
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class RobotController:
|
|
@@ -17,7 +18,13 @@ class RobotController:
|
|
|
17
18
|
self.logger = logging.getLogger("api")
|
|
18
19
|
|
|
19
20
|
def generate_media_config(self):
|
|
20
|
-
|
|
21
|
+
media_config = self.robot_utilities.generate_media_config()
|
|
22
|
+
if media_config is None:
|
|
23
|
+
raise HTTPException(
|
|
24
|
+
status_code=204,
|
|
25
|
+
detail="Robot has no media config",
|
|
26
|
+
)
|
|
27
|
+
return media_config
|
|
21
28
|
|
|
22
29
|
def get_info(self):
|
|
23
30
|
return RobotInfoResponse(
|
|
@@ -25,9 +25,6 @@ class Settings(BaseSettings):
|
|
|
25
25
|
# Name must match with an installed python package in the local environment
|
|
26
26
|
ROBOT_PACKAGE: str = Field(default="isar_robot")
|
|
27
27
|
|
|
28
|
-
# The run mode of the robot (stepwise or full mission)
|
|
29
|
-
RUN_MISSION_BY_TASK: bool = Field(default=True)
|
|
30
|
-
|
|
31
28
|
# Determines the local path in which results from missions are stored
|
|
32
29
|
LOCAL_STORAGE_PATH: str = Field(default="./results")
|
|
33
30
|
|
|
@@ -331,7 +328,3 @@ class RobotSettings(BaseSettings):
|
|
|
331
328
|
|
|
332
329
|
|
|
333
330
|
robot_settings = RobotSettings()
|
|
334
|
-
|
|
335
|
-
if not settings.RUN_MISSION_BY_TASK: # If mission-wise, do not run localize missions
|
|
336
|
-
if "localize" in robot_settings.CAPABILITIES:
|
|
337
|
-
robot_settings.CAPABILITIES.remove("localize")
|
|
@@ -66,7 +66,6 @@ def print_startup_info():
|
|
|
66
66
|
print_setting(fillchar="-")
|
|
67
67
|
print_setting("Robot package", settings.ROBOT_PACKAGE)
|
|
68
68
|
print_setting("Robot name", settings.ROBOT_NAME)
|
|
69
|
-
print_setting("Run mission taskwise", settings.RUN_MISSION_BY_TASK)
|
|
70
69
|
print_setting("Running on port", settings.API_PORT)
|
|
71
70
|
print_setting("Mission planner", settings.MISSION_PLANNER)
|
|
72
71
|
print_setting("Using local storage", settings.STORAGE_LOCAL_ENABLED)
|
|
@@ -54,7 +54,6 @@ class StateMachine(object):
|
|
|
54
54
|
mqtt_publisher: MqttClientInterface,
|
|
55
55
|
task_selector: TaskSelectorInterface,
|
|
56
56
|
sleep_time: float = settings.FSM_SLEEP_TIME,
|
|
57
|
-
run_mission_by_task: bool = settings.RUN_MISSION_BY_TASK,
|
|
58
57
|
stop_robot_attempts_limit: int = settings.STOP_ROBOT_ATTEMPTS_LIMIT,
|
|
59
58
|
transitions_log_length: int = settings.STATE_TRANSITIONS_LOG_LENGTH,
|
|
60
59
|
):
|
|
@@ -82,7 +81,6 @@ class StateMachine(object):
|
|
|
82
81
|
self.robot: RobotInterface = robot
|
|
83
82
|
self.mqtt_publisher: Optional[MqttClientInterface] = mqtt_publisher
|
|
84
83
|
self.task_selector: TaskSelectorInterface = task_selector
|
|
85
|
-
self.run_mission_by_task: bool = run_mission_by_task
|
|
86
84
|
|
|
87
85
|
# List of states
|
|
88
86
|
self.stop_state: State = Stop(self)
|
|
@@ -114,7 +112,6 @@ class StateMachine(object):
|
|
|
114
112
|
"trigger": "start_machine",
|
|
115
113
|
"source": self.off_state,
|
|
116
114
|
"dest": self.idle_state,
|
|
117
|
-
"before": self._off,
|
|
118
115
|
},
|
|
119
116
|
{
|
|
120
117
|
"trigger": "initiated",
|
|
@@ -123,32 +120,24 @@ class StateMachine(object):
|
|
|
123
120
|
"before": self._initiated,
|
|
124
121
|
},
|
|
125
122
|
{
|
|
126
|
-
"trigger": "
|
|
127
|
-
"source":
|
|
123
|
+
"trigger": "pause",
|
|
124
|
+
"source": self.monitor_state,
|
|
128
125
|
"dest": self.paused_state,
|
|
129
126
|
"before": self._mission_paused,
|
|
130
127
|
},
|
|
131
|
-
{
|
|
132
|
-
"trigger": "pause",
|
|
133
|
-
"source": [self.initiate_state, self.monitor_state],
|
|
134
|
-
"dest": self.stop_state,
|
|
135
|
-
"before": self._pause,
|
|
136
|
-
},
|
|
137
128
|
{
|
|
138
129
|
"trigger": "stop",
|
|
139
130
|
"source": [
|
|
131
|
+
self.idle_state,
|
|
140
132
|
self.initiate_state,
|
|
141
133
|
self.monitor_state,
|
|
142
|
-
self.
|
|
134
|
+
self.paused_state,
|
|
143
135
|
],
|
|
144
136
|
"dest": self.stop_state,
|
|
145
|
-
"before": self._stop,
|
|
146
137
|
},
|
|
147
138
|
{
|
|
148
139
|
"trigger": "mission_finished",
|
|
149
|
-
"source":
|
|
150
|
-
self.initiate_state,
|
|
151
|
-
],
|
|
140
|
+
"source": self.monitor_state,
|
|
152
141
|
"dest": self.idle_state,
|
|
153
142
|
"before": self._mission_finished,
|
|
154
143
|
},
|
|
@@ -173,39 +162,9 @@ class StateMachine(object):
|
|
|
173
162
|
{
|
|
174
163
|
"trigger": "resume",
|
|
175
164
|
"source": self.paused_state,
|
|
176
|
-
"dest": self.initiate_state,
|
|
177
|
-
"before": self._resume,
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"trigger": "resume_full_mission",
|
|
181
|
-
"source": self.paused_state,
|
|
182
165
|
"dest": self.monitor_state,
|
|
183
166
|
"before": self._resume,
|
|
184
167
|
},
|
|
185
|
-
{
|
|
186
|
-
"trigger": "task_finished",
|
|
187
|
-
"source": self.monitor_state,
|
|
188
|
-
"dest": self.initiate_state,
|
|
189
|
-
"before": self._task_finished,
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
"trigger": "full_mission_finished",
|
|
193
|
-
"source": self.monitor_state,
|
|
194
|
-
"dest": self.initiate_state,
|
|
195
|
-
"before": self._full_mission_finished,
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
"trigger": "mission_paused",
|
|
199
|
-
"source": self.stop_state,
|
|
200
|
-
"dest": self.paused_state,
|
|
201
|
-
"before": self._mission_paused,
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
"trigger": "initiate_infeasible",
|
|
205
|
-
"source": self.initiate_state,
|
|
206
|
-
"dest": self.initiate_state,
|
|
207
|
-
"before": self._initiate_infeasible,
|
|
208
|
-
},
|
|
209
168
|
{
|
|
210
169
|
"trigger": "initiate_failed",
|
|
211
170
|
"source": self.initiate_state,
|
|
@@ -214,33 +173,29 @@ class StateMachine(object):
|
|
|
214
173
|
},
|
|
215
174
|
{
|
|
216
175
|
"trigger": "mission_stopped",
|
|
217
|
-
"source":
|
|
176
|
+
"source": self.stop_state,
|
|
218
177
|
"dest": self.idle_state,
|
|
219
178
|
"before": self._mission_stopped,
|
|
220
179
|
},
|
|
221
180
|
{
|
|
222
181
|
"trigger": "robot_turned_offline",
|
|
223
|
-
"source":
|
|
182
|
+
"source": self.idle_state,
|
|
224
183
|
"dest": self.offline_state,
|
|
225
|
-
"before": self._offline,
|
|
226
184
|
},
|
|
227
185
|
{
|
|
228
186
|
"trigger": "robot_turned_online",
|
|
229
187
|
"source": self.offline_state,
|
|
230
188
|
"dest": self.idle_state,
|
|
231
|
-
"before": self._online,
|
|
232
189
|
},
|
|
233
190
|
{
|
|
234
191
|
"trigger": "robot_protective_stop_engaged",
|
|
235
|
-
"source":
|
|
192
|
+
"source": self.idle_state,
|
|
236
193
|
"dest": self.blocked_protective_stop,
|
|
237
|
-
"before": self._protective_stop_engaged,
|
|
238
194
|
},
|
|
239
195
|
{
|
|
240
196
|
"trigger": "robot_protective_stop_disengaged",
|
|
241
197
|
"source": self.blocked_protective_stop,
|
|
242
198
|
"dest": self.idle_state,
|
|
243
|
-
"before": self._protective_stop_disengaged,
|
|
244
199
|
},
|
|
245
200
|
]
|
|
246
201
|
)
|
|
@@ -248,7 +203,6 @@ class StateMachine(object):
|
|
|
248
203
|
self.stop_robot_attempts_limit: int = stop_robot_attempts_limit
|
|
249
204
|
self.sleep_time: float = sleep_time
|
|
250
205
|
|
|
251
|
-
self.stopped: bool = False
|
|
252
206
|
self.current_mission: Optional[Mission] = None
|
|
253
207
|
self.current_task: Optional[TASKS] = None
|
|
254
208
|
self.initial_pose: Optional[Pose] = None
|
|
@@ -268,8 +222,6 @@ class StateMachine(object):
|
|
|
268
222
|
self._finalize()
|
|
269
223
|
|
|
270
224
|
def _initiated(self) -> None:
|
|
271
|
-
if self.run_mission_by_task:
|
|
272
|
-
self.current_task.status = TaskStatus.InProgress
|
|
273
225
|
self.current_mission.status = MissionStatus.InProgress
|
|
274
226
|
self.publish_task_status(task=self.current_task)
|
|
275
227
|
self.logger.info(
|
|
@@ -278,24 +230,6 @@ class StateMachine(object):
|
|
|
278
230
|
f"task: {str(self.current_task.id)[:8]}"
|
|
279
231
|
)
|
|
280
232
|
|
|
281
|
-
def _pause(self) -> None:
|
|
282
|
-
return
|
|
283
|
-
|
|
284
|
-
def _off(self) -> None:
|
|
285
|
-
return
|
|
286
|
-
|
|
287
|
-
def _offline(self) -> None:
|
|
288
|
-
return
|
|
289
|
-
|
|
290
|
-
def _online(self) -> None:
|
|
291
|
-
return
|
|
292
|
-
|
|
293
|
-
def _protective_stop_engaged(self) -> None:
|
|
294
|
-
return
|
|
295
|
-
|
|
296
|
-
def _protective_stop_disengaged(self) -> None:
|
|
297
|
-
return
|
|
298
|
-
|
|
299
233
|
def _resume(self) -> None:
|
|
300
234
|
self.logger.info(f"Resuming mission: {self.current_mission.id}")
|
|
301
235
|
self.current_mission.status = MissionStatus.InProgress
|
|
@@ -354,11 +288,6 @@ class StateMachine(object):
|
|
|
354
288
|
self.current_task.status = TaskStatus.InProgress
|
|
355
289
|
self.publish_task_status(task=self.current_task)
|
|
356
290
|
|
|
357
|
-
def _task_finished(self) -> None:
|
|
358
|
-
self.publish_task_status(task=self.current_task)
|
|
359
|
-
self.current_task.update_task_status()
|
|
360
|
-
self.iterate_current_task()
|
|
361
|
-
|
|
362
291
|
def _full_mission_finished(self) -> None:
|
|
363
292
|
self.current_task = None
|
|
364
293
|
|
|
@@ -377,21 +306,12 @@ class StateMachine(object):
|
|
|
377
306
|
|
|
378
307
|
self.robot.pause()
|
|
379
308
|
|
|
380
|
-
def _stop(self) -> None:
|
|
381
|
-
self.stopped = True
|
|
382
|
-
|
|
383
309
|
def _initiate_failed(self) -> None:
|
|
384
310
|
self.current_task.status = TaskStatus.Failed
|
|
385
311
|
self.current_mission.status = MissionStatus.Failed
|
|
386
312
|
self.publish_task_status(task=self.current_task)
|
|
387
313
|
self._finalize()
|
|
388
314
|
|
|
389
|
-
def _initiate_infeasible(self) -> None:
|
|
390
|
-
if self.run_mission_by_task:
|
|
391
|
-
self.current_task.status = TaskStatus.Failed
|
|
392
|
-
self.publish_task_status(task=self.current_task)
|
|
393
|
-
self.iterate_current_task()
|
|
394
|
-
|
|
395
315
|
def _mission_stopped(self) -> None:
|
|
396
316
|
if self.current_mission is None:
|
|
397
317
|
self._queue_empty_response()
|
|
@@ -458,7 +378,6 @@ class StateMachine(object):
|
|
|
458
378
|
|
|
459
379
|
def reset_state_machine(self) -> None:
|
|
460
380
|
self.logger.info("Resetting state machine")
|
|
461
|
-
self.stopped = False
|
|
462
381
|
self.current_task = None
|
|
463
382
|
self.current_mission = None
|
|
464
383
|
self.initial_pose = None
|
|
@@ -13,7 +13,6 @@ from robot_interface.models.exceptions.robot_exceptions import (
|
|
|
13
13
|
ErrorMessage,
|
|
14
14
|
RobotException,
|
|
15
15
|
RobotInfeasibleMissionException,
|
|
16
|
-
RobotInfeasibleTaskException,
|
|
17
16
|
)
|
|
18
17
|
|
|
19
18
|
if TYPE_CHECKING:
|
|
@@ -49,30 +48,12 @@ class Initiate(State):
|
|
|
49
48
|
transition = self.state_machine.stop # type: ignore
|
|
50
49
|
break
|
|
51
50
|
|
|
52
|
-
if self.state_machine.should_pause_mission():
|
|
53
|
-
transition = self.state_machine.pause # type: ignore
|
|
54
|
-
break
|
|
55
|
-
|
|
56
|
-
if not self.state_machine.current_task:
|
|
57
|
-
self.logger.info(
|
|
58
|
-
f"Completed mission: {self.state_machine.current_mission.id}"
|
|
59
|
-
)
|
|
60
|
-
transition = self.state_machine.mission_finished # type: ignore
|
|
61
|
-
break
|
|
62
|
-
|
|
63
51
|
if not self.initiate_thread:
|
|
64
|
-
|
|
65
|
-
self.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
)
|
|
70
|
-
else:
|
|
71
|
-
self._run_initiate_thread(
|
|
72
|
-
initiate_function=self.state_machine.robot.initiate_mission,
|
|
73
|
-
function_argument=self.state_machine.current_mission,
|
|
74
|
-
thread_name="State Machine Initiate Mission",
|
|
75
|
-
)
|
|
52
|
+
self._run_initiate_thread(
|
|
53
|
+
initiate_function=self.state_machine.robot.initiate_mission,
|
|
54
|
+
function_argument=self.state_machine.current_mission,
|
|
55
|
+
thread_name="State Machine Initiate Mission",
|
|
56
|
+
)
|
|
76
57
|
|
|
77
58
|
try:
|
|
78
59
|
self.initiate_thread.get_output()
|
|
@@ -81,18 +62,6 @@ class Initiate(State):
|
|
|
81
62
|
except ThreadedRequestNotFinishedError:
|
|
82
63
|
time.sleep(self.state_machine.sleep_time)
|
|
83
64
|
continue
|
|
84
|
-
except RobotInfeasibleTaskException as e:
|
|
85
|
-
self.state_machine.current_task.error_message = ErrorMessage(
|
|
86
|
-
error_reason=e.error_reason, error_description=e.error_description
|
|
87
|
-
)
|
|
88
|
-
self.logger.warning(
|
|
89
|
-
f"Failed to initiate task "
|
|
90
|
-
f"{str(self.state_machine.current_task.id)[:8]} after retrying "
|
|
91
|
-
f"{self.initiate_failure_counter} times because: "
|
|
92
|
-
f"{e.error_description}"
|
|
93
|
-
)
|
|
94
|
-
transition = self.state_machine.initiate_infeasible # type: ignore
|
|
95
|
-
break
|
|
96
65
|
|
|
97
66
|
except RobotInfeasibleMissionException as e:
|
|
98
67
|
self.state_machine.current_mission.error_message = ErrorMessage(
|
|
@@ -58,10 +58,7 @@ class Monitor(State):
|
|
|
58
58
|
break
|
|
59
59
|
|
|
60
60
|
if self.state_machine.should_pause_mission():
|
|
61
|
-
|
|
62
|
-
transition = self.state_machine.pause # type: ignore
|
|
63
|
-
else:
|
|
64
|
-
transition = self.state_machine.pause_full_mission # type: ignore
|
|
61
|
+
transition = self.state_machine.pause # type: ignore
|
|
65
62
|
break
|
|
66
63
|
|
|
67
64
|
if not self.task_status_thread:
|
|
@@ -72,6 +69,7 @@ class Monitor(State):
|
|
|
72
69
|
)
|
|
73
70
|
try:
|
|
74
71
|
status: TaskStatus = self.task_status_thread.get_output()
|
|
72
|
+
self.request_status_failure_counter = 0
|
|
75
73
|
except ThreadedRequestNotFinishedError:
|
|
76
74
|
time.sleep(self.state_machine.sleep_time)
|
|
77
75
|
continue
|
|
@@ -133,28 +131,22 @@ class Monitor(State):
|
|
|
133
131
|
name="State Machine Get Inspections",
|
|
134
132
|
)
|
|
135
133
|
|
|
136
|
-
if self.state_machine.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
else:
|
|
142
|
-
if self.state_machine.current_task.is_finished():
|
|
143
|
-
self._report_task_status(self.state_machine.current_task)
|
|
144
|
-
self.state_machine.publish_task_status(
|
|
145
|
-
task=self.state_machine.current_task
|
|
146
|
-
)
|
|
134
|
+
if self.state_machine.current_task.is_finished():
|
|
135
|
+
self._report_task_status(self.state_machine.current_task)
|
|
136
|
+
self.state_machine.publish_task_status(
|
|
137
|
+
task=self.state_machine.current_task
|
|
138
|
+
)
|
|
147
139
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
140
|
+
self.state_machine.iterate_current_task()
|
|
141
|
+
if self.state_machine.current_task is None:
|
|
142
|
+
transition = self.state_machine.mission_finished # type: ignore
|
|
143
|
+
break
|
|
152
144
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
145
|
+
# Report and update next task
|
|
146
|
+
self.state_machine.current_task.update_task_status()
|
|
147
|
+
self.state_machine.publish_task_status(
|
|
148
|
+
task=self.state_machine.current_task
|
|
149
|
+
)
|
|
158
150
|
|
|
159
151
|
self.task_status_thread = None
|
|
160
152
|
time.sleep(self.state_machine.sleep_time)
|
|
@@ -174,7 +166,7 @@ class Monitor(State):
|
|
|
174
166
|
inspection: Inspection = self.state_machine.robot.get_inspection(
|
|
175
167
|
task=current_task
|
|
176
168
|
)
|
|
177
|
-
if current_task.inspection_id
|
|
169
|
+
if current_task.inspection_id != inspection.id:
|
|
178
170
|
self.logger.warning(
|
|
179
171
|
f"The inspection_id of task ({current_task.inspection_id}) "
|
|
180
172
|
f"and result ({inspection.id}) is not matching. "
|
|
@@ -205,7 +197,6 @@ class Monitor(State):
|
|
|
205
197
|
)
|
|
206
198
|
|
|
207
199
|
def _report_task_status(self, task: Task) -> None:
|
|
208
|
-
self.request_status_failure_counter = 0
|
|
209
200
|
if task.status == TaskStatus.Failed:
|
|
210
201
|
self.logger.warning(
|
|
211
202
|
f"Task: {str(task.id)[:8]} was reported as failed by the robot"
|
|
@@ -22,14 +22,11 @@ class Paused(State):
|
|
|
22
22
|
transition: Callable
|
|
23
23
|
while True:
|
|
24
24
|
if self.state_machine.should_stop_mission():
|
|
25
|
-
transition = self.state_machine.
|
|
25
|
+
transition = self.state_machine.stop # type: ignore
|
|
26
26
|
break
|
|
27
27
|
|
|
28
28
|
if self.state_machine.should_resume_mission():
|
|
29
|
-
|
|
30
|
-
transition = self.state_machine.resume # type: ignore
|
|
31
|
-
else:
|
|
32
|
-
transition = self.state_machine.resume_full_mission # type: ignore
|
|
29
|
+
transition = self.state_machine.resume # type: ignore
|
|
33
30
|
break
|
|
34
31
|
|
|
35
32
|
time.sleep(self.state_machine.sleep_time)
|
|
@@ -43,9 +43,6 @@ class Stop(State):
|
|
|
43
43
|
self.stop_thread = ThreadedRequest(self.state_machine.robot.stop)
|
|
44
44
|
self.stop_thread.start_thread(name="State Machine Stop Robot")
|
|
45
45
|
|
|
46
|
-
if self.state_machine.should_stop_mission():
|
|
47
|
-
self.state_machine.stopped = True
|
|
48
|
-
|
|
49
46
|
try:
|
|
50
47
|
self.stop_thread.get_output()
|
|
51
48
|
except ThreadedRequestNotFinishedError:
|
|
@@ -70,10 +67,9 @@ class Stop(State):
|
|
|
70
67
|
|
|
71
68
|
self.stop_thread = None
|
|
72
69
|
continue
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
transition = self.state_machine.mission_paused # type: ignore
|
|
70
|
+
|
|
71
|
+
transition = self.state_machine.mission_stopped # type: ignore
|
|
72
|
+
|
|
77
73
|
break
|
|
78
74
|
|
|
79
75
|
transition()
|
|
@@ -42,6 +42,11 @@ class AudioMetadata(InspectionMetadata):
|
|
|
42
42
|
duration: Optional[float] = field(default=None)
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
@dataclass
|
|
46
|
+
class GasMeasurementMetadata(InspectionMetadata):
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
45
50
|
class Inspection(BaseModel):
|
|
46
51
|
metadata: InspectionMetadata
|
|
47
52
|
id: str = Field(frozen=True)
|
|
@@ -90,3 +95,11 @@ class Audio(Inspection):
|
|
|
90
95
|
@staticmethod
|
|
91
96
|
def get_metadata_type() -> Type[InspectionMetadata]:
|
|
92
97
|
return AudioMetadata
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class GasMeasurement(Inspection):
|
|
101
|
+
metadata: GasMeasurementMetadata
|
|
102
|
+
|
|
103
|
+
@staticmethod
|
|
104
|
+
def get_metadata_type() -> Type[InspectionMetadata]:
|
|
105
|
+
return GasMeasurementMetadata
|
|
@@ -11,6 +11,7 @@ from robot_interface.models.inspection.inspection import (
|
|
|
11
11
|
Inspection,
|
|
12
12
|
ThermalImage,
|
|
13
13
|
ThermalVideo,
|
|
14
|
+
GasMeasurement,
|
|
14
15
|
Video,
|
|
15
16
|
)
|
|
16
17
|
from robot_interface.models.mission.status import TaskStatus
|
|
@@ -25,6 +26,7 @@ class TaskTypes(str, Enum):
|
|
|
25
26
|
TakeThermalImage = "take_thermal_image"
|
|
26
27
|
TakeVideo = "take_video"
|
|
27
28
|
TakeThermalVideo = "take_thermal_video"
|
|
29
|
+
TakeGasMeasurement = "take_gas_measurement"
|
|
28
30
|
RecordAudio = "record_audio"
|
|
29
31
|
DockingProcedure = "docking_procedure"
|
|
30
32
|
|
|
@@ -179,6 +181,20 @@ class RecordAudio(InspectionTask):
|
|
|
179
181
|
return Audio
|
|
180
182
|
|
|
181
183
|
|
|
184
|
+
class TakeGasMeasurement(InspectionTask):
|
|
185
|
+
"""
|
|
186
|
+
Task which causes the robot to take a CO2 measurement at its position.
|
|
187
|
+
|
|
188
|
+
Duration of audio is given in seconds.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
type: Literal[TaskTypes.TakeGasMeasurement] = TaskTypes.TakeGasMeasurement
|
|
192
|
+
|
|
193
|
+
@staticmethod
|
|
194
|
+
def get_inspection_type() -> Type[Inspection]:
|
|
195
|
+
return GasMeasurement
|
|
196
|
+
|
|
197
|
+
|
|
182
198
|
TASKS = Union[
|
|
183
199
|
ReturnToHome,
|
|
184
200
|
Localize,
|
|
@@ -187,6 +203,7 @@ TASKS = Union[
|
|
|
187
203
|
TakeThermalImage,
|
|
188
204
|
TakeVideo,
|
|
189
205
|
TakeThermalVideo,
|
|
206
|
+
TakeGasMeasurement,
|
|
190
207
|
RecordAudio,
|
|
191
208
|
DockingProcedure,
|
|
192
209
|
]
|
|
@@ -18,10 +18,6 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
18
18
|
def initiate_mission(self, mission: Mission) -> None:
|
|
19
19
|
"""Send a mission to the robot and initiate execution of the mission
|
|
20
20
|
|
|
21
|
-
This function should be used in combination with the mission_status function
|
|
22
|
-
if the robot is designed to run full missions and not in a taskwise
|
|
23
|
-
configuration.
|
|
24
|
-
|
|
25
21
|
Parameters
|
|
26
22
|
----------
|
|
27
23
|
mission: Mission
|
|
@@ -38,8 +34,6 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
38
34
|
RobotException
|
|
39
35
|
Will catch all RobotExceptions not previously listed and retry scheduling of
|
|
40
36
|
the mission until the number of allowed retries is exceeded
|
|
41
|
-
NotImplementedError
|
|
42
|
-
If the robot is designed for taskwise mission execution
|
|
43
37
|
|
|
44
38
|
"""
|
|
45
39
|
raise NotImplementedError
|
|
@@ -48,10 +42,6 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
48
42
|
def initiate_task(self, task: Task) -> None:
|
|
49
43
|
"""Send a task to the robot and initiate the execution of the task
|
|
50
44
|
|
|
51
|
-
This function should be used in combination with the task_status function
|
|
52
|
-
if the robot is designed to run taskwise missions and not in a full mission
|
|
53
|
-
configuration.
|
|
54
|
-
|
|
55
45
|
Parameters
|
|
56
46
|
----------
|
|
57
47
|
task : Task
|
|
@@ -71,7 +61,7 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
71
61
|
of the task until the number of allowed retries is exceeded before the task
|
|
72
62
|
will be marked as failed and the mission cancelled
|
|
73
63
|
NotImplementedError
|
|
74
|
-
If
|
|
64
|
+
If there is a mismatch between the implemented tasks and listed capabilities
|
|
75
65
|
|
|
76
66
|
"""
|
|
77
67
|
raise NotImplementedError
|
|
@@ -80,10 +70,6 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
80
70
|
def task_status(self, task_id: str) -> TaskStatus:
|
|
81
71
|
"""Gets the status of the currently active task on robot.
|
|
82
72
|
|
|
83
|
-
This function should be used in combination with the initiate_task function
|
|
84
|
-
if the robot is designed to run taskwise missions and not in a full mission
|
|
85
|
-
configuration.
|
|
86
|
-
|
|
87
73
|
Returns
|
|
88
74
|
-------
|
|
89
75
|
TaskStatus
|
|
@@ -93,8 +79,6 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
93
79
|
------
|
|
94
80
|
RobotException
|
|
95
81
|
If the task status could not be retrieved.
|
|
96
|
-
NotImplementedError
|
|
97
|
-
If the robot is designed for full mission execution.
|
|
98
82
|
|
|
99
83
|
"""
|
|
100
84
|
raise NotImplementedError
|