isar 1.22.4__tar.gz → 1.23.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- {isar-1.22.4 → isar-1.23.1}/PKG-INFO +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/api.py +1 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/models/models.py +2 -7
- isar-1.23.1/src/isar/apis/models/start_mission_definition.py +226 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/schedule/scheduling_controller.py +11 -20
- isar-1.23.1/src/isar/config/predefined_missions/default.json +74 -0
- isar-1.23.1/src/isar/config/predefined_missions/default_turtlebot.json +106 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/settings.env +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/settings.py +3 -3
- {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/local_planner.py +3 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/sequential_task_selector.py +3 -3
- {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/task_selector_interface.py +4 -4
- {isar-1.22.4 → isar-1.23.1}/src/isar/script.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/scheduling_utilities.py +3 -4
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/state_machine.py +22 -98
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/initialize.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/initiate.py +10 -10
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/monitor.py +77 -100
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/paused.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/stop.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/SOURCES.txt +0 -2
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/exceptions/robot_exceptions.py +4 -4
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/inspection/inspection.py +1 -1
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/mission.py +2 -2
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/status.py +0 -8
- isar-1.23.1/src/robot_interface/models/mission/task.py +197 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/robot_interface.py +29 -54
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/test_successful_mission.py +4 -7
- {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/scheduler/test_scheduler_router.py +16 -45
- isar-1.23.1/tests/isar/mission/test_mission.py +134 -0
- isar-1.23.1/tests/isar/models/example_mission_definition.json +37 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/models/test_start_mission_definition.py +11 -42
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/test_base_reader.py +3 -7
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/test_mission_reader.py +51 -50
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/test_scheduling_utilities.py +2 -2
- {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/states/test_monitor.py +15 -20
- {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/test_state_machine.py +38 -39
- {isar-1.22.4 → isar-1.23.1}/tests/isar/storage/test_uploader.py +2 -2
- isar-1.23.1/tests/mocks/mission_definition.py +119 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/robot_interface.py +12 -12
- isar-1.23.1/tests/mocks/task.py +16 -0
- isar-1.23.1/tests/test_data/test_mission_working.json +93 -0
- isar-1.23.1/tests/test_data/test_thermal_image_mission.json +30 -0
- isar-1.22.4/src/isar/apis/models/start_mission_definition.py +0 -237
- isar-1.22.4/src/isar/config/predefined_missions/default.json +0 -92
- isar-1.22.4/src/isar/config/predefined_missions/default_turtlebot.json +0 -110
- isar-1.22.4/src/robot_interface/models/mission/step.py +0 -234
- isar-1.22.4/src/robot_interface/models/mission/task.py +0 -130
- isar-1.22.4/tests/isar/mission/test_mission.py +0 -171
- isar-1.22.4/tests/isar/models/example_mission_definition.json +0 -40
- isar-1.22.4/tests/mocks/mission_definition.py +0 -179
- isar-1.22.4/tests/mocks/step.py +0 -14
- isar-1.22.4/tests/mocks/task.py +0 -0
- isar-1.22.4/tests/test_data/test_mission_working.json +0 -115
- isar-1.22.4/tests/test_data/test_thermal_image_mission.json +0 -18
- {isar-1.22.4 → isar-1.23.1}/.dockerignore +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/release.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/project_automations.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.github/workflows/stale.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/.gitignore +0 -0
- {isar-1.22.4 → isar-1.23.1}/.pre-commit-config.yaml +0 -0
- {isar-1.22.4 → isar-1.23.1}/Dockerfile +0 -0
- {isar-1.22.4 → isar-1.23.1}/LICENSE +0 -0
- {isar-1.22.4 → isar-1.23.1}/README.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/SECURITY.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/docker-compose-turtlebot.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/docker-compose.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/Makefile +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/make.bat +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/rst_processing.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/source/conf.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/source/index.rst +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/source/readme_link.md +0 -0
- {isar-1.22.4 → isar-1.23.1}/docs/state_machine_diagram.png +0 -0
- {isar-1.22.4 → isar-1.23.1}/main.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/pyproject.toml +0 -0
- {isar-1.22.4 → isar-1.23.1}/radixconfig.yml +0 -0
- {isar-1.22.4 → isar-1.23.1}/requirements.txt +0 -0
- {isar-1.22.4 → isar-1.23.1}/setup.cfg +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/configuration_error.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/log.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/logging.conf +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_poses/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/message.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/modules.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/readers/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/readers/base_reader.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/idle.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/local_storage.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/slimm_storage.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/uploader.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar/storage/utilities.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/media_connection_type.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/payloads.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/conftest.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/mission/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/models/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/__init__.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/blob_storage.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/pose.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/request.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/status.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/mocks/token.py +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_json_file.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.22.4 → isar-1.23.1}/tests/test_modules.py +0 -0
|
@@ -3,16 +3,13 @@ from typing import List, Optional
|
|
|
3
3
|
from alitra import Frame, Orientation, Pose, Position
|
|
4
4
|
from pydantic import BaseModel, Field
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
class StepResponse(BaseModel):
|
|
8
|
-
id: str
|
|
9
|
-
type: str
|
|
6
|
+
from robot_interface.models.mission.task import TaskTypes
|
|
10
7
|
|
|
11
8
|
|
|
12
9
|
class TaskResponse(BaseModel):
|
|
13
10
|
id: str
|
|
14
11
|
tag_id: Optional[str] = None
|
|
15
|
-
|
|
12
|
+
type: TaskTypes
|
|
16
13
|
|
|
17
14
|
|
|
18
15
|
class StartMissionResponse(BaseModel):
|
|
@@ -25,8 +22,6 @@ class ControlMissionResponse(BaseModel):
|
|
|
25
22
|
mission_status: str
|
|
26
23
|
task_id: str
|
|
27
24
|
task_status: str
|
|
28
|
-
step_id: str
|
|
29
|
-
step_status: str
|
|
30
25
|
|
|
31
26
|
|
|
32
27
|
class RobotInfoResponse(BaseModel):
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from alitra import Frame, Orientation, Pose, Position
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from isar.apis.models.models import InputPose, InputPosition
|
|
9
|
+
from isar.config.settings import settings
|
|
10
|
+
from isar.mission_planner.mission_planner_interface import MissionPlannerError
|
|
11
|
+
from robot_interface.models.inspection.inspection import Inspection, InspectionMetadata
|
|
12
|
+
from robot_interface.models.mission.mission import Mission
|
|
13
|
+
from robot_interface.models.mission.task import (
|
|
14
|
+
TASKS,
|
|
15
|
+
DockingProcedure,
|
|
16
|
+
Localize,
|
|
17
|
+
RecordAudio,
|
|
18
|
+
ReturnToHome,
|
|
19
|
+
TakeImage,
|
|
20
|
+
TakeThermalImage,
|
|
21
|
+
TakeThermalVideo,
|
|
22
|
+
TakeVideo,
|
|
23
|
+
)
|
|
24
|
+
from robot_interface.models.mission.task import Task
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class InspectionTypes(str, Enum):
|
|
28
|
+
image: str = "Image"
|
|
29
|
+
thermal_image: str = "ThermalImage"
|
|
30
|
+
video: str = "Video"
|
|
31
|
+
thermal_video: str = "ThermalVideo"
|
|
32
|
+
audio: str = "Audio"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TaskType(str, Enum):
|
|
36
|
+
Inspection: str = "inspection"
|
|
37
|
+
Localization: str = "localization"
|
|
38
|
+
ReturnToHome: str = "return_to_home"
|
|
39
|
+
Dock: str = "dock"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class StartMissionInspectionDefinition(BaseModel):
|
|
43
|
+
type: InspectionTypes = Field(default=InspectionTypes.image)
|
|
44
|
+
inspection_target: InputPosition
|
|
45
|
+
analysis_type: Optional[str] = None
|
|
46
|
+
duration: Optional[float] = None
|
|
47
|
+
metadata: Optional[dict] = None
|
|
48
|
+
id: Optional[str] = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class StartMissionTaskDefinition(BaseModel):
|
|
52
|
+
type: TaskType = Field(default=TaskType.Inspection)
|
|
53
|
+
pose: InputPose
|
|
54
|
+
inspection: StartMissionInspectionDefinition
|
|
55
|
+
tag: Optional[str] = None
|
|
56
|
+
id: Optional[str] = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class StartMissionDefinition(BaseModel):
|
|
60
|
+
tasks: List[StartMissionTaskDefinition]
|
|
61
|
+
id: Optional[str] = None
|
|
62
|
+
name: Optional[str] = None
|
|
63
|
+
start_pose: Optional[InputPose] = None
|
|
64
|
+
dock: Optional[bool] = None
|
|
65
|
+
undock: Optional[bool] = None
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def to_isar_mission(start_mission_definition: StartMissionDefinition) -> Mission:
|
|
69
|
+
isar_tasks: List[TASKS] = []
|
|
70
|
+
|
|
71
|
+
for start_mission_task_definition in start_mission_definition.tasks:
|
|
72
|
+
task: TASKS = create_isar_task(start_mission_task_definition)
|
|
73
|
+
if start_mission_task_definition.id:
|
|
74
|
+
task.id = start_mission_task_definition.id
|
|
75
|
+
isar_tasks.append(task)
|
|
76
|
+
|
|
77
|
+
if not isar_tasks:
|
|
78
|
+
raise MissionPlannerError("Mission does not contain any valid tasks")
|
|
79
|
+
|
|
80
|
+
check_for_duplicate_ids(isar_tasks)
|
|
81
|
+
|
|
82
|
+
isar_mission: Mission = Mission(tasks=isar_tasks)
|
|
83
|
+
|
|
84
|
+
isar_mission.dock = start_mission_definition.dock
|
|
85
|
+
isar_mission.undock = start_mission_definition.undock
|
|
86
|
+
|
|
87
|
+
if start_mission_definition.name:
|
|
88
|
+
isar_mission.name = start_mission_definition.name
|
|
89
|
+
else:
|
|
90
|
+
isar_mission.name = _build_mission_name()
|
|
91
|
+
|
|
92
|
+
if start_mission_definition.id:
|
|
93
|
+
isar_mission.id = start_mission_definition.id
|
|
94
|
+
|
|
95
|
+
if start_mission_definition.start_pose:
|
|
96
|
+
input_pose: InputPose = start_mission_definition.start_pose
|
|
97
|
+
input_frame: Frame = Frame(name=input_pose.frame_name)
|
|
98
|
+
input_position: Position = Position(
|
|
99
|
+
input_pose.position.x,
|
|
100
|
+
input_pose.position.y,
|
|
101
|
+
input_pose.position.z,
|
|
102
|
+
input_frame,
|
|
103
|
+
)
|
|
104
|
+
input_orientation: Orientation = Orientation(
|
|
105
|
+
input_pose.orientation.x,
|
|
106
|
+
input_pose.orientation.y,
|
|
107
|
+
input_pose.orientation.z,
|
|
108
|
+
input_pose.orientation.w,
|
|
109
|
+
input_frame,
|
|
110
|
+
)
|
|
111
|
+
isar_mission.start_pose = Pose(
|
|
112
|
+
position=input_position, orientation=input_orientation, frame=input_frame
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return isar_mission
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def check_for_duplicate_ids(items: List[TASKS]):
|
|
119
|
+
duplicate_ids = get_duplicate_ids(items=items)
|
|
120
|
+
if len(duplicate_ids) > 0:
|
|
121
|
+
raise MissionPlannerError(
|
|
122
|
+
f"Failed to create as there were duplicate IDs which is not allowed "
|
|
123
|
+
f"({duplicate_ids})"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def create_isar_task(start_mission_task_definition) -> TASKS:
|
|
128
|
+
|
|
129
|
+
if start_mission_task_definition.type == TaskType.Inspection:
|
|
130
|
+
return create_inspection_task(start_mission_task_definition)
|
|
131
|
+
elif start_mission_task_definition.type == TaskType.Localization:
|
|
132
|
+
return create_localization_task(start_mission_task_definition)
|
|
133
|
+
elif start_mission_task_definition.type == TaskType.ReturnToHome:
|
|
134
|
+
return create_return_to_home_task(start_mission_task_definition)
|
|
135
|
+
elif start_mission_task_definition.type == TaskType.Dock:
|
|
136
|
+
return create_dock_task()
|
|
137
|
+
else:
|
|
138
|
+
raise MissionPlannerError(
|
|
139
|
+
f"Failed to create task: '{start_mission_task_definition.type}' is not a valid"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def create_inspection_task(
|
|
144
|
+
start_mission_task_definition: StartMissionTaskDefinition,
|
|
145
|
+
) -> TASKS:
|
|
146
|
+
|
|
147
|
+
if start_mission_task_definition.inspection.type == InspectionTypes.image:
|
|
148
|
+
return TakeImage(
|
|
149
|
+
target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
|
|
150
|
+
tag_id=start_mission_task_definition.tag,
|
|
151
|
+
robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
|
|
152
|
+
metadata=start_mission_task_definition.inspection.metadata,
|
|
153
|
+
)
|
|
154
|
+
elif start_mission_task_definition.inspection.type == InspectionTypes.video:
|
|
155
|
+
return TakeVideo(
|
|
156
|
+
target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
|
|
157
|
+
duration=start_mission_task_definition.inspection.duration,
|
|
158
|
+
tag_id=start_mission_task_definition.tag,
|
|
159
|
+
robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
|
|
160
|
+
metadata=start_mission_task_definition.inspection.metadata,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
elif start_mission_task_definition.inspection.type == InspectionTypes.thermal_image:
|
|
164
|
+
return TakeThermalImage(
|
|
165
|
+
target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
|
|
166
|
+
tag_id=start_mission_task_definition.tag,
|
|
167
|
+
robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
|
|
168
|
+
metadata=start_mission_task_definition.inspection.metadata,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
elif start_mission_task_definition.inspection.type == InspectionTypes.thermal_video:
|
|
172
|
+
return TakeThermalVideo(
|
|
173
|
+
target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
|
|
174
|
+
duration=start_mission_task_definition.inspection.duration,
|
|
175
|
+
tag_id=start_mission_task_definition.tag,
|
|
176
|
+
robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
|
|
177
|
+
metadata=start_mission_task_definition.inspection.metadata,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
elif start_mission_task_definition.inspection.type == InspectionTypes.audio:
|
|
181
|
+
return RecordAudio(
|
|
182
|
+
target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
|
|
183
|
+
duration=start_mission_task_definition.inspection.duration,
|
|
184
|
+
tag_id=start_mission_task_definition.tag,
|
|
185
|
+
robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
|
|
186
|
+
metadata=start_mission_task_definition.inspection.metadata,
|
|
187
|
+
)
|
|
188
|
+
else:
|
|
189
|
+
raise ValueError(
|
|
190
|
+
f"Inspection type '{start_mission_task_definition.inspection.type}' not supported"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def create_localization_task(
|
|
195
|
+
start_mission_task_definition: StartMissionTaskDefinition,
|
|
196
|
+
) -> Localize:
|
|
197
|
+
return Localize(
|
|
198
|
+
localization_pose=start_mission_task_definition.pose.to_alitra_pose()
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def create_return_to_home_task(
|
|
203
|
+
start_mission_task_definition: StartMissionTaskDefinition,
|
|
204
|
+
) -> ReturnToHome:
|
|
205
|
+
return ReturnToHome(pose=start_mission_task_definition.pose.to_alitra_pose())
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def create_dock_task() -> DockingProcedure:
|
|
209
|
+
return DockingProcedure(behavior="dock")
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def get_duplicate_ids(items: List[TASKS]) -> List[str]:
|
|
213
|
+
unique_ids: List[str] = []
|
|
214
|
+
duplicate_ids: List[str] = []
|
|
215
|
+
for item in items:
|
|
216
|
+
id: str = item.id
|
|
217
|
+
if id not in unique_ids:
|
|
218
|
+
unique_ids.append(id)
|
|
219
|
+
else:
|
|
220
|
+
duplicate_ids.append(id)
|
|
221
|
+
|
|
222
|
+
return duplicate_ids
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _build_mission_name() -> str:
|
|
226
|
+
return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from http import HTTPStatus
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
from alitra import Pose
|
|
6
6
|
from fastapi import Body, HTTPException, Path
|
|
@@ -21,8 +21,8 @@ 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.
|
|
25
|
-
|
|
24
|
+
from robot_interface.models.mission.task import (
|
|
25
|
+
TASKS,
|
|
26
26
|
Localize,
|
|
27
27
|
MoveArm,
|
|
28
28
|
ReturnToHome,
|
|
@@ -67,8 +67,7 @@ class SchedulingController:
|
|
|
67
67
|
mission: Mission = self.scheduling_utilities.get_mission(mission_id)
|
|
68
68
|
if return_pose:
|
|
69
69
|
pose: Pose = return_pose.to_alitra_pose()
|
|
70
|
-
|
|
71
|
-
mission.tasks.append(Task(steps=[step]))
|
|
70
|
+
mission.tasks.append(ReturnToHome(pose=pose))
|
|
72
71
|
|
|
73
72
|
self.scheduling_utilities.verify_robot_capable_of_mission(
|
|
74
73
|
mission=mission, robot_capabilities=robot_settings.CAPABILITIES
|
|
@@ -136,8 +135,7 @@ class SchedulingController:
|
|
|
136
135
|
)
|
|
137
136
|
if return_pose:
|
|
138
137
|
pose: Pose = return_pose.to_alitra_pose()
|
|
139
|
-
|
|
140
|
-
mission.tasks.append(Task(steps=[step]))
|
|
138
|
+
mission.tasks.append(ReturnToHome(pose=pose))
|
|
141
139
|
|
|
142
140
|
initial_pose_alitra: Optional[Pose] = (
|
|
143
141
|
initial_pose.to_alitra_pose() if initial_pose else None
|
|
@@ -211,7 +209,7 @@ class SchedulingController:
|
|
|
211
209
|
target_pose: InputPose = Body(
|
|
212
210
|
default=None,
|
|
213
211
|
title="Target Pose",
|
|
214
|
-
description="The target pose for the drive_to
|
|
212
|
+
description="The target pose for the drive_to task",
|
|
215
213
|
),
|
|
216
214
|
) -> StartMissionResponse:
|
|
217
215
|
self.logger.info("Received request to start new drive-to mission")
|
|
@@ -221,8 +219,7 @@ class SchedulingController:
|
|
|
221
219
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
222
220
|
|
|
223
221
|
pose: Pose = target_pose.to_alitra_pose()
|
|
224
|
-
|
|
225
|
-
mission: Mission = Mission(tasks=[Task(steps=[step])])
|
|
222
|
+
mission: Mission = Mission(tasks=[ReturnToHome(pose=pose)])
|
|
226
223
|
|
|
227
224
|
self.logger.info(
|
|
228
225
|
f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -246,8 +243,7 @@ class SchedulingController:
|
|
|
246
243
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
247
244
|
|
|
248
245
|
pose: Pose = localization_pose.to_alitra_pose()
|
|
249
|
-
|
|
250
|
-
mission: Mission = Mission(tasks=[Task(steps=[step])])
|
|
246
|
+
mission: Mission = Mission(tasks=[Localize(localization_pose=pose)])
|
|
251
247
|
|
|
252
248
|
self.logger.info(
|
|
253
249
|
f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -294,8 +290,7 @@ class SchedulingController:
|
|
|
294
290
|
|
|
295
291
|
self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
|
|
296
292
|
|
|
297
|
-
|
|
298
|
-
mission: Mission = Mission(tasks=[Task(steps=[step])])
|
|
293
|
+
mission: Mission = Mission(tasks=[MoveArm(arm_pose=arm_pose_literal)])
|
|
299
294
|
|
|
300
295
|
self.logger.info(
|
|
301
296
|
f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
|
|
@@ -322,9 +317,5 @@ class SchedulingController:
|
|
|
322
317
|
tasks=[self._task_api_response(task) for task in mission.tasks],
|
|
323
318
|
)
|
|
324
319
|
|
|
325
|
-
def _task_api_response(self, task:
|
|
326
|
-
|
|
327
|
-
for step in task.steps:
|
|
328
|
-
steps.append({"id": step.id, "type": step.__class__.__name__})
|
|
329
|
-
|
|
330
|
-
return TaskResponse(id=task.id, tag_id=task.tag_id, steps=steps)
|
|
320
|
+
def _task_api_response(self, task: TASKS) -> TaskResponse:
|
|
321
|
+
return TaskResponse(id=task.id, tag_id=task.tag_id, type=task.type)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "1",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"type": "take_image",
|
|
6
|
+
"robot_pose": {
|
|
7
|
+
"position": {
|
|
8
|
+
"x": -2,
|
|
9
|
+
"y": -2,
|
|
10
|
+
"z": 0,
|
|
11
|
+
"frame": "asset"
|
|
12
|
+
},
|
|
13
|
+
"orientation": {
|
|
14
|
+
"x": 0,
|
|
15
|
+
"y": 0,
|
|
16
|
+
"z": 0.4794255,
|
|
17
|
+
"w": 0.8775826,
|
|
18
|
+
"frame": "asset"
|
|
19
|
+
},
|
|
20
|
+
"frame": "asset"
|
|
21
|
+
},
|
|
22
|
+
"target": {
|
|
23
|
+
"x": 2,
|
|
24
|
+
"y": 2,
|
|
25
|
+
"z": 0,
|
|
26
|
+
"frame": "robot"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"type": "take_thermal_image",
|
|
31
|
+
"robot_pose": {
|
|
32
|
+
"position": {
|
|
33
|
+
"x": -2,
|
|
34
|
+
"y": 2,
|
|
35
|
+
"z": 0,
|
|
36
|
+
"frame": "asset"
|
|
37
|
+
},
|
|
38
|
+
"orientation": {
|
|
39
|
+
"x": 0,
|
|
40
|
+
"y": 0,
|
|
41
|
+
"z": 0.4794255,
|
|
42
|
+
"w": 0.8775826,
|
|
43
|
+
"frame": "asset"
|
|
44
|
+
},
|
|
45
|
+
"frame": "asset"
|
|
46
|
+
},
|
|
47
|
+
"target": {
|
|
48
|
+
"x": 2,
|
|
49
|
+
"y": 2,
|
|
50
|
+
"z": 0,
|
|
51
|
+
"frame": "robot"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"type": "return_to_home",
|
|
56
|
+
"pose": {
|
|
57
|
+
"position": {
|
|
58
|
+
"x": 2,
|
|
59
|
+
"y": 2,
|
|
60
|
+
"z": 0,
|
|
61
|
+
"frame": "asset"
|
|
62
|
+
},
|
|
63
|
+
"orientation": {
|
|
64
|
+
"x": 0,
|
|
65
|
+
"y": 0,
|
|
66
|
+
"z": 0.4794255,
|
|
67
|
+
"w": 0.8775826,
|
|
68
|
+
"frame": "asset"
|
|
69
|
+
},
|
|
70
|
+
"frame": "asset"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "2",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"type": "take_image",
|
|
6
|
+
"robot_pose": {
|
|
7
|
+
"position": {
|
|
8
|
+
"x": -3.6,
|
|
9
|
+
"y": 4,
|
|
10
|
+
"z": 0,
|
|
11
|
+
"frame": "asset"
|
|
12
|
+
},
|
|
13
|
+
"orientation": {
|
|
14
|
+
"x": 0,
|
|
15
|
+
"y": 0,
|
|
16
|
+
"z": -0.7286672256879113,
|
|
17
|
+
"w": -0.6848660759820616,
|
|
18
|
+
"frame": "asset"
|
|
19
|
+
},
|
|
20
|
+
"frame": "asset"
|
|
21
|
+
},
|
|
22
|
+
"target": {
|
|
23
|
+
"x": -4.7,
|
|
24
|
+
"y": 4.9,
|
|
25
|
+
"z": 0,
|
|
26
|
+
"frame": "robot"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
{
|
|
31
|
+
"type": "take_image",
|
|
32
|
+
"robot_pose": {
|
|
33
|
+
"position": {
|
|
34
|
+
"x": 4.7,
|
|
35
|
+
"y": 3,
|
|
36
|
+
"z": 0,
|
|
37
|
+
"frame": "asset"
|
|
38
|
+
},
|
|
39
|
+
"orientation": {
|
|
40
|
+
"x": 0,
|
|
41
|
+
"y": 0,
|
|
42
|
+
"z": 0.5769585,
|
|
43
|
+
"w": 0.8167734,
|
|
44
|
+
"frame": "asset"
|
|
45
|
+
},
|
|
46
|
+
"frame": "asset"
|
|
47
|
+
},
|
|
48
|
+
"target": {
|
|
49
|
+
"x": 5.6,
|
|
50
|
+
"y": 5.2,
|
|
51
|
+
"z": 0,
|
|
52
|
+
"frame": "robot"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"type": "take_thermal_image",
|
|
57
|
+
"robot_pose": {
|
|
58
|
+
"position": {
|
|
59
|
+
"x": 4.7,
|
|
60
|
+
"y": 3,
|
|
61
|
+
"z": 0,
|
|
62
|
+
"frame": "asset"
|
|
63
|
+
},
|
|
64
|
+
"orientation": {
|
|
65
|
+
"x": 0,
|
|
66
|
+
"y": 0,
|
|
67
|
+
"z": 0.5769585,
|
|
68
|
+
"w": 0.8167734,
|
|
69
|
+
"frame": "asset"
|
|
70
|
+
},
|
|
71
|
+
"frame": "asset"
|
|
72
|
+
},
|
|
73
|
+
"target": {
|
|
74
|
+
"x": 3.1,
|
|
75
|
+
"y": 5.2,
|
|
76
|
+
"z": 0,
|
|
77
|
+
"frame": "robot"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"type": "take_thermal_image",
|
|
82
|
+
"robot_pose": {
|
|
83
|
+
"position": {
|
|
84
|
+
"x": 0.95,
|
|
85
|
+
"y": 2.6,
|
|
86
|
+
"z": 0,
|
|
87
|
+
"frame": "asset"
|
|
88
|
+
},
|
|
89
|
+
"orientation": {
|
|
90
|
+
"x": 0,
|
|
91
|
+
"y": 0,
|
|
92
|
+
"z": -0.6992469,
|
|
93
|
+
"w": 0.7148802,
|
|
94
|
+
"frame": "asset"
|
|
95
|
+
},
|
|
96
|
+
"frame": "asset"
|
|
97
|
+
},
|
|
98
|
+
"target": {
|
|
99
|
+
"x": 1.9,
|
|
100
|
+
"y": 1.9,
|
|
101
|
+
"z": 0,
|
|
102
|
+
"frame": "robot"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
}
|
|
@@ -26,7 +26,7 @@ class Settings(BaseSettings):
|
|
|
26
26
|
ROBOT_PACKAGE: str = Field(default="isar_robot")
|
|
27
27
|
|
|
28
28
|
# The run mode of the robot (stepwise or full mission)
|
|
29
|
-
|
|
29
|
+
RUN_MISSION_BY_TASK: bool = Field(default=True)
|
|
30
30
|
|
|
31
31
|
# Determines the local path in which results from missions are stored
|
|
32
32
|
LOCAL_STORAGE_PATH: str = Field(default="./results")
|
|
@@ -327,7 +327,7 @@ class RobotSettings(BaseSettings):
|
|
|
327
327
|
|
|
328
328
|
# ISAR steps the robot is capable of performing
|
|
329
329
|
# This should be set in the robot package settings.env file
|
|
330
|
-
CAPABILITIES: List[str] = Field(default=["
|
|
330
|
+
CAPABILITIES: List[str] = Field(default=["return_to_home", "take_image"])
|
|
331
331
|
|
|
332
332
|
# Model of the robot which ISAR is connected to
|
|
333
333
|
# This should be set in the robot package settings.env file
|
|
@@ -345,6 +345,6 @@ class RobotSettings(BaseSettings):
|
|
|
345
345
|
|
|
346
346
|
robot_settings = RobotSettings()
|
|
347
347
|
|
|
348
|
-
if not settings.
|
|
348
|
+
if not settings.RUN_MISSION_BY_TASK: # If mission-wise, do not run localize missions
|
|
349
349
|
if "localize" in robot_settings.CAPABILITIES:
|
|
350
350
|
robot_settings.CAPABILITIES.remove("localize")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from pathlib import Path
|
|
3
|
+
from typing import List, Optional
|
|
3
4
|
|
|
4
5
|
from alitra import Frame
|
|
5
6
|
from injector import inject
|
|
@@ -13,6 +14,7 @@ from isar.mission_planner.mission_planner_interface import (
|
|
|
13
14
|
from isar.services.readers.base_reader import BaseReader, BaseReaderError
|
|
14
15
|
from robot_interface.models.mission.mission import Mission
|
|
15
16
|
|
|
17
|
+
|
|
16
18
|
logger = logging.getLogger("api")
|
|
17
19
|
|
|
18
20
|
|
|
@@ -38,6 +40,7 @@ class LocalPlanner(MissionPlannerInterface):
|
|
|
38
40
|
@staticmethod
|
|
39
41
|
def read_mission_from_file(mission_path: Path) -> Mission:
|
|
40
42
|
mission_dict: dict = BaseReader.read_json(location=mission_path)
|
|
43
|
+
|
|
41
44
|
mission: Mission = BaseReader.dict_to_dataclass(
|
|
42
45
|
dataclass_dict=mission_dict,
|
|
43
46
|
target_dataclass=Mission,
|
|
@@ -4,7 +4,7 @@ from isar.mission_planner.task_selector_interface import (
|
|
|
4
4
|
TaskSelectorInterface,
|
|
5
5
|
TaskSelectorStop,
|
|
6
6
|
)
|
|
7
|
-
from robot_interface.models.mission.task import Task
|
|
7
|
+
from robot_interface.models.mission.task import TASKS, Task
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class SequentialTaskSelector(TaskSelectorInterface):
|
|
@@ -12,11 +12,11 @@ class SequentialTaskSelector(TaskSelectorInterface):
|
|
|
12
12
|
super().__init__()
|
|
13
13
|
self._iterator: Iterator = None
|
|
14
14
|
|
|
15
|
-
def initialize(self, tasks: List[
|
|
15
|
+
def initialize(self, tasks: List[TASKS]) -> None:
|
|
16
16
|
super().initialize(tasks=tasks)
|
|
17
17
|
self._iterator = iter(self.tasks)
|
|
18
18
|
|
|
19
|
-
def next_task(self) ->
|
|
19
|
+
def next_task(self) -> TASKS:
|
|
20
20
|
try:
|
|
21
21
|
return next(self._iterator)
|
|
22
22
|
except StopIteration:
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
from typing import List
|
|
3
3
|
|
|
4
|
-
from robot_interface.models.mission.task import Task
|
|
4
|
+
from robot_interface.models.mission.task import TASKS, Task
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class TaskSelectorInterface(metaclass=ABCMeta):
|
|
8
8
|
def __init__(self) -> None:
|
|
9
|
-
self.tasks: List[
|
|
9
|
+
self.tasks: List[TASKS] = None
|
|
10
10
|
|
|
11
|
-
def initialize(self, tasks: List[
|
|
11
|
+
def initialize(self, tasks: List[TASKS]) -> None:
|
|
12
12
|
self.tasks = tasks
|
|
13
13
|
|
|
14
14
|
@abstractmethod
|
|
15
|
-
def next_task(self) ->
|
|
15
|
+
def next_task(self) -> TASKS:
|
|
16
16
|
"""
|
|
17
17
|
Returns
|
|
18
18
|
-------
|
|
@@ -63,7 +63,7 @@ def print_startup_info():
|
|
|
63
63
|
print_setting(fillchar="-")
|
|
64
64
|
print_setting("Robot package", settings.ROBOT_PACKAGE)
|
|
65
65
|
print_setting("Robot name", settings.ROBOT_NAME)
|
|
66
|
-
print_setting("Run mission stepwise", settings.
|
|
66
|
+
print_setting("Run mission stepwise", settings.RUN_MISSION_BY_TASK)
|
|
67
67
|
print_setting("Running on port", settings.API_PORT)
|
|
68
68
|
print_setting("Mission planner", settings.MISSION_PLANNER)
|
|
69
69
|
print_setting("Using local storage", settings.STORAGE_LOCAL_ENABLED)
|
|
@@ -99,7 +99,7 @@ class MqttClient(MqttClientInterface):
|
|
|
99
99
|
)
|
|
100
100
|
def connect(self, host: str, port: int) -> None:
|
|
101
101
|
self.logger.info("Attempting to connect to MQTT Broker")
|
|
102
|
-
self.logger.
|
|
102
|
+
self.logger.info(f"Host: {host}, Port: {port}")
|
|
103
103
|
self.client.connect(host=host, port=port)
|
|
104
104
|
|
|
105
105
|
def publish(self, topic: str, payload: str, qos: int = 0, retain: bool = False):
|
|
@@ -101,10 +101,9 @@ class SchedulingUtilities:
|
|
|
101
101
|
is_capable: bool = True
|
|
102
102
|
missing_capabilities: Set[str] = set()
|
|
103
103
|
for task in mission.tasks:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
missing_capabilities.add(step.type)
|
|
104
|
+
if not task.type in robot_capabilities:
|
|
105
|
+
is_capable = False
|
|
106
|
+
missing_capabilities.add(task.type)
|
|
108
107
|
|
|
109
108
|
if not is_capable:
|
|
110
109
|
error_message = (
|