isar 1.24.2__tar.gz → 1.24.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- {isar-1.24.2 → isar-1.24.4}/PKG-INFO +1 -1
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/api.py +21 -1
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/models/start_mission_definition.py +1 -1
- isar-1.24.4/src/isar/apis/robot_control/robot_controller.py +35 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/schedule/scheduling_controller.py +0 -10
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/keyvault/keyvault_service.py +1 -1
- {isar-1.24.2 → isar-1.24.4}/src/isar/modules.py +22 -3
- isar-1.24.4/src/isar/services/utilities/robot_utilities.py +23 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/state_machine.py +0 -2
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/monitor.py +1 -1
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/SOURCES.txt +3 -3
- isar-1.24.4/src/robot_interface/models/robots/media.py +13 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/robot_interface.py +14 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/telemetry/payloads.py +0 -8
- {isar-1.24.2 → isar-1.24.4}/tests/conftest.py +3 -3
- {isar-1.24.2 → isar-1.24.4}/tests/integration/turtlebot/test_successful_mission.py +2 -2
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/robot_interface.py +9 -1
- isar-1.24.2/src/isar/config/predefined_poses/predefined_poses.py +0 -616
- isar-1.24.2/src/robot_interface/telemetry/media_connection_type.py +0 -5
- isar-1.24.2/tests/mocks/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/.dockerignore +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/release.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/project_automations.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.github/workflows/stale.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/.gitignore +0 -0
- {isar-1.24.2 → isar-1.24.4}/.pre-commit-config.yaml +0 -0
- {isar-1.24.2 → isar-1.24.4}/Dockerfile +0 -0
- {isar-1.24.2 → isar-1.24.4}/LICENSE +0 -0
- {isar-1.24.2 → isar-1.24.4}/README.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/SECURITY.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/docker-compose-turtlebot.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/docker-compose.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/Makefile +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/make.bat +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/rst_processing.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/source/conf.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/source/index.rst +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/source/readme_link.md +0 -0
- {isar-1.24.2 → isar-1.24.4}/docs/state_machine_diagram.png +0 -0
- {isar-1.24.2 → isar-1.24.4}/main.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/pyproject.toml +0 -0
- {isar-1.24.2 → isar-1.24.4}/radixconfig.yml +0 -0
- {isar-1.24.2 → isar-1.24.4}/requirements.txt +0 -0
- {isar-1.24.2 → isar-1.24.4}/setup.cfg +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/models/models.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/configuration_error.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/log.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/logging.conf +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/settings.env +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/config/settings.py +0 -0
- {isar-1.24.2/src/isar/config/predefined_poses → isar-1.24.4/src/isar/mission_planner}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.24.2/src/isar/mission_planner → isar-1.24.4/src/isar/models}/__init__.py +0 -0
- {isar-1.24.2/src/isar/models → isar-1.24.4/src/isar/models/communication}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/message.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.24.2/src/isar/models/communication → isar-1.24.4/src/isar/models/mission_metadata}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/script.py +0 -0
- {isar-1.24.2/src/isar/models/mission_metadata → isar-1.24.4/src/isar/services}/__init__.py +0 -0
- {isar-1.24.2/src/isar/services → isar-1.24.4/src/isar/services/auth}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.24.2/src/isar/services/auth → isar-1.24.4/src/isar/services/readers}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/readers/base_reader.py +0 -0
- {isar-1.24.2/src/isar/services/readers → isar-1.24.4/src/isar/services/service_connections}/__init__.py +0 -0
- {isar-1.24.2/src/isar/services/service_connections → isar-1.24.4/src/isar/services/service_connections/mqtt}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.24.2/src/isar/services/service_connections/mqtt → isar-1.24.4/src/isar/services/service_connections/stid}/__init__.py +0 -0
- {isar-1.24.2/src/isar/services/service_connections/stid → isar-1.24.4/src/isar/services/utilities}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/utilities/scheduling_utilities.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.24.2/src/isar/services/utilities → isar-1.24.4/src/isar/state_machine}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/idle.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/initialize.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/initiate.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states/stop.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.24.2/src/isar/state_machine → isar-1.24.4/src/isar/storage}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/local_storage.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/slimm_storage.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/uploader.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar/storage/utilities.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.24.2/src/isar/storage → isar-1.24.4/src/robot_interface}/__init__.py +0 -0
- {isar-1.24.2/src/robot_interface → isar-1.24.4/src/robot_interface/models}/__init__.py +0 -0
- {isar-1.24.2/src/robot_interface/models → isar-1.24.4/src/robot_interface/models/exceptions}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/inspection/inspection.py +0 -0
- {isar-1.24.2/src/robot_interface/models/exceptions → isar-1.24.4/src/robot_interface/models/mission}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/mission/task.py +0 -0
- {isar-1.24.2/src/robot_interface/models/mission → isar-1.24.4/src/robot_interface/models/robots}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.24.2/src/robot_interface/models/robots → isar-1.24.4/src/robot_interface/telemetry}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.24.2/src/robot_interface/telemetry → isar-1.24.4/src/robot_interface/utilities}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.24.2/src/robot_interface/utilities → isar-1.24.4/tests}/__init__.py +0 -0
- {isar-1.24.2/tests → isar-1.24.4/tests/integration}/__init__.py +0 -0
- {isar-1.24.2/tests/integration → isar-1.24.4/tests/integration/turtlebot}/__init__.py +0 -0
- {isar-1.24.2/tests/integration/turtlebot → isar-1.24.4/tests/integration/turtlebot/config}/__init__.py +0 -0
- {isar-1.24.2/tests/integration/turtlebot/config → isar-1.24.4/tests/integration/turtlebot/config/maps}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.24.2/tests/integration/turtlebot/config/maps → isar-1.24.4/tests/integration/turtlebot/config/missions}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.24.2/tests/integration/turtlebot/config/missions → isar-1.24.4/tests/isar}/__init__.py +0 -0
- {isar-1.24.2/tests/isar → isar-1.24.4/tests/isar/apis}/__init__.py +0 -0
- {isar-1.24.2/tests/isar/apis → isar-1.24.4/tests/isar/apis/scheduler}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.24.2/tests/isar/apis/scheduler → isar-1.24.4/tests/isar/apis/security}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.24.2/tests/isar/apis/security → isar-1.24.4/tests/isar/mission}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.24.2/tests/isar/mission → isar-1.24.4/tests/isar/models}/__init__.py +0 -0
- {isar-1.24.2/tests/isar/models → isar-1.24.4/tests/isar/models/communication}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/models/example_mission_definition.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/models/test_start_mission_definition.py +0 -0
- {isar-1.24.2/tests/isar/models/communication → isar-1.24.4/tests/isar/services}/__init__.py +0 -0
- {isar-1.24.2/tests/isar/services → isar-1.24.4/tests/isar/services/readers}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/services/readers/test_base_reader.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.24.2/tests/isar/services/readers → isar-1.24.4/tests/isar/services/service_connections}/__init__.py +0 -0
- {isar-1.24.2/tests/isar/services/service_connections → isar-1.24.4/tests/isar/services/service_connections/echo}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.24.2/tests/isar/services/service_connections/echo → isar-1.24.4/tests/isar/services/utilities}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.24.2/tests/isar/services/utilities → isar-1.24.4/tests/isar/state_machine}/__init__.py +0 -0
- {isar-1.24.2/tests/isar/state_machine → isar-1.24.4/tests/isar/state_machine/states}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/state_machine/test_state_machine.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.24.2/tests/isar/state_machine/states → isar-1.24.4/tests/mocks}/__init__.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/blob_storage.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/mission_definition.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/pose.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/request.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/status.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/task.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/mocks/token.py +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_json_file.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.24.2 → isar-1.24.4}/tests/test_modules.py +0 -0
|
@@ -17,6 +17,7 @@ from opencensus.trace.tracer import Tracer
|
|
|
17
17
|
from pydantic import AnyHttpUrl
|
|
18
18
|
|
|
19
19
|
from isar.apis.models.models import ControlMissionResponse, StartMissionResponse
|
|
20
|
+
from isar.apis.robot_control.robot_controller import RobotController
|
|
20
21
|
from isar.apis.schedule.scheduling_controller import SchedulingController
|
|
21
22
|
from isar.apis.security.authentication import Authenticator
|
|
22
23
|
from isar.config.configuration_error import ConfigurationError
|
|
@@ -34,12 +35,14 @@ class API:
|
|
|
34
35
|
self,
|
|
35
36
|
authenticator: Authenticator,
|
|
36
37
|
scheduling_controller: SchedulingController,
|
|
38
|
+
robot_controller: RobotController,
|
|
37
39
|
keyvault_client: Keyvault,
|
|
38
40
|
port: int = settings.API_PORT,
|
|
39
41
|
azure_ai_logging_enabled: bool = settings.LOG_HANDLER_APPLICATION_INSIGHTS_ENABLED,
|
|
40
42
|
) -> None:
|
|
41
43
|
self.authenticator: Authenticator = authenticator
|
|
42
44
|
self.scheduling_controller: SchedulingController = scheduling_controller
|
|
45
|
+
self.robot_controller: RobotController = robot_controller
|
|
43
46
|
self.keyvault_client: Keyvault = keyvault_client
|
|
44
47
|
self.host: str = "0.0.0.0" # Locking uvicorn to use 0.0.0.0
|
|
45
48
|
self.port: int = port
|
|
@@ -98,6 +101,8 @@ class API:
|
|
|
98
101
|
|
|
99
102
|
app.include_router(router=self._create_info_router())
|
|
100
103
|
|
|
104
|
+
app.include_router(router=self._create_media_control_router())
|
|
105
|
+
|
|
101
106
|
return app
|
|
102
107
|
|
|
103
108
|
def _create_scheduler_router(self) -> APIRouter:
|
|
@@ -277,7 +282,7 @@ class API:
|
|
|
277
282
|
|
|
278
283
|
router.add_api_route(
|
|
279
284
|
path="/info/robot-settings",
|
|
280
|
-
endpoint=self.
|
|
285
|
+
endpoint=self.robot_controller.get_info,
|
|
281
286
|
methods=["GET"],
|
|
282
287
|
dependencies=[authentication_dependency],
|
|
283
288
|
summary="Information about the robot-settings",
|
|
@@ -285,6 +290,21 @@ class API:
|
|
|
285
290
|
|
|
286
291
|
return router
|
|
287
292
|
|
|
293
|
+
def _create_media_control_router(self) -> APIRouter:
|
|
294
|
+
router: APIRouter = APIRouter(tags=["Media"])
|
|
295
|
+
|
|
296
|
+
authentication_dependency: Security = Security(self.authenticator.get_scheme())
|
|
297
|
+
|
|
298
|
+
router.add_api_route(
|
|
299
|
+
path="/media/media-stream-config",
|
|
300
|
+
endpoint=self.robot_controller.generate_media_config,
|
|
301
|
+
methods=["GET"],
|
|
302
|
+
dependencies=[authentication_dependency],
|
|
303
|
+
summary="Generates a media stream connection config",
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return router
|
|
307
|
+
|
|
288
308
|
def _log_startup_message(self) -> None:
|
|
289
309
|
address_format = "%s://%s:%d/docs"
|
|
290
310
|
message = f"Uvicorn running on {address_format} (Press CTRL+C to quit)"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from injector import inject
|
|
5
|
+
|
|
6
|
+
from isar.apis.models.models import (
|
|
7
|
+
RobotInfoResponse,
|
|
8
|
+
TaskResponse,
|
|
9
|
+
)
|
|
10
|
+
from isar.config.settings import robot_settings, settings
|
|
11
|
+
from isar.services.utilities.robot_utilities import RobotUtilities
|
|
12
|
+
from robot_interface.models.mission.task import Task
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RobotController:
|
|
16
|
+
@inject
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
robot_utilities: RobotUtilities,
|
|
20
|
+
):
|
|
21
|
+
self.robot_utilities: RobotUtilities = robot_utilities
|
|
22
|
+
self.logger = logging.getLogger("api")
|
|
23
|
+
|
|
24
|
+
def generate_media_config(self):
|
|
25
|
+
return self.robot_utilities.generate_media_config()
|
|
26
|
+
|
|
27
|
+
def get_info(self):
|
|
28
|
+
return RobotInfoResponse(
|
|
29
|
+
robot_package=settings.ROBOT_PACKAGE,
|
|
30
|
+
isar_id=settings.ISAR_ID,
|
|
31
|
+
robot_name=settings.ROBOT_NAME,
|
|
32
|
+
robot_capabilities=robot_settings.CAPABILITIES,
|
|
33
|
+
robot_map_name=settings.DEFAULT_MAP,
|
|
34
|
+
plant_short_name=settings.PLANT_SHORT_NAME,
|
|
35
|
+
)
|
|
@@ -295,16 +295,6 @@ class SchedulingController:
|
|
|
295
295
|
)
|
|
296
296
|
return self._api_response(mission)
|
|
297
297
|
|
|
298
|
-
def get_info(self):
|
|
299
|
-
return RobotInfoResponse(
|
|
300
|
-
robot_package=settings.ROBOT_PACKAGE,
|
|
301
|
-
isar_id=settings.ISAR_ID,
|
|
302
|
-
robot_name=settings.ROBOT_NAME,
|
|
303
|
-
robot_capabilities=robot_settings.CAPABILITIES,
|
|
304
|
-
robot_map_name=settings.DEFAULT_MAP,
|
|
305
|
-
plant_short_name=settings.PLANT_SHORT_NAME,
|
|
306
|
-
)
|
|
307
|
-
|
|
308
298
|
def _api_response(self, mission: Mission) -> StartMissionResponse:
|
|
309
299
|
return StartMissionResponse(
|
|
310
300
|
id=mission.id,
|
|
@@ -65,7 +65,7 @@ class Keyvault:
|
|
|
65
65
|
raise KeyvaultError # type: ignore
|
|
66
66
|
|
|
67
67
|
def get_secret_client(self) -> SecretClient:
|
|
68
|
-
if self.client
|
|
68
|
+
if self.client is None:
|
|
69
69
|
try:
|
|
70
70
|
credential: Union[ClientSecretCredential, DefaultAzureCredential]
|
|
71
71
|
if self.client_id and self.client_secret and self.tenant_id:
|
|
@@ -8,6 +8,7 @@ from injector import Injector, Module, multiprovider, provider, singleton
|
|
|
8
8
|
|
|
9
9
|
from isar.apis.api import API
|
|
10
10
|
from isar.apis.schedule.scheduling_controller import SchedulingController
|
|
11
|
+
from isar.apis.robot_control.robot_controller import RobotController
|
|
11
12
|
from isar.apis.security.authentication import Authenticator
|
|
12
13
|
from isar.config.keyvault.keyvault_service import Keyvault
|
|
13
14
|
from isar.config.settings import settings
|
|
@@ -18,6 +19,7 @@ from isar.mission_planner.task_selector_interface import TaskSelectorInterface
|
|
|
18
19
|
from isar.models.communication.queues.queues import Queues
|
|
19
20
|
from isar.services.service_connections.request_handler import RequestHandler
|
|
20
21
|
from isar.services.utilities.scheduling_utilities import SchedulingUtilities
|
|
22
|
+
from isar.services.utilities.robot_utilities import RobotUtilities
|
|
21
23
|
from isar.state_machine.state_machine import StateMachine
|
|
22
24
|
from isar.storage.blob_storage import BlobStorage
|
|
23
25
|
from isar.storage.local_storage import LocalStorage
|
|
@@ -35,9 +37,10 @@ class APIModule(Module):
|
|
|
35
37
|
self,
|
|
36
38
|
authenticator: Authenticator,
|
|
37
39
|
scheduling_controller: SchedulingController,
|
|
40
|
+
robot_controller: RobotController,
|
|
38
41
|
keyvault: Keyvault,
|
|
39
42
|
) -> API:
|
|
40
|
-
return API(authenticator, scheduling_controller, keyvault)
|
|
43
|
+
return API(authenticator, scheduling_controller, robot_controller, keyvault)
|
|
41
44
|
|
|
42
45
|
@provider
|
|
43
46
|
@singleton
|
|
@@ -47,6 +50,14 @@ class APIModule(Module):
|
|
|
47
50
|
) -> SchedulingController:
|
|
48
51
|
return SchedulingController(scheduling_utilities)
|
|
49
52
|
|
|
53
|
+
@provider
|
|
54
|
+
@singleton
|
|
55
|
+
def provide_robot_controller(
|
|
56
|
+
self,
|
|
57
|
+
robot_utilities: RobotUtilities,
|
|
58
|
+
) -> RobotController:
|
|
59
|
+
return RobotController(robot_utilities)
|
|
60
|
+
|
|
50
61
|
|
|
51
62
|
class AuthenticationModule(Module):
|
|
52
63
|
@provider
|
|
@@ -142,7 +153,7 @@ class UploaderModule(Module):
|
|
|
142
153
|
)
|
|
143
154
|
|
|
144
155
|
|
|
145
|
-
class
|
|
156
|
+
class SchedulingUtilitiesModule(Module):
|
|
146
157
|
@provider
|
|
147
158
|
@singleton
|
|
148
159
|
def provide_scheduling_utilities(
|
|
@@ -151,6 +162,13 @@ class UtilitiesModule(Module):
|
|
|
151
162
|
return SchedulingUtilities(queues, mission_planner)
|
|
152
163
|
|
|
153
164
|
|
|
165
|
+
class RobotUtilitiesModule(Module):
|
|
166
|
+
@provider
|
|
167
|
+
@singleton
|
|
168
|
+
def provide_robot_utilities(self, robot: RobotInterface) -> RobotUtilities:
|
|
169
|
+
return RobotUtilities(robot)
|
|
170
|
+
|
|
171
|
+
|
|
154
172
|
class ServiceModule(Module):
|
|
155
173
|
@provider
|
|
156
174
|
@singleton
|
|
@@ -193,7 +211,8 @@ modules: Dict[str, Tuple[Module, Union[str, bool]]] = {
|
|
|
193
211
|
"storage_blob": (BlobStorageModule, settings.STORAGE_BLOB_ENABLED),
|
|
194
212
|
"storage_slimm": (SlimmStorageModule, settings.STORAGE_SLIMM_ENABLED),
|
|
195
213
|
"mqtt": (MqttModule, "required"),
|
|
196
|
-
"utilities": (
|
|
214
|
+
"utilities": (SchedulingUtilitiesModule, "required"),
|
|
215
|
+
"robot_utilities": (RobotUtilitiesModule, "required"),
|
|
197
216
|
}
|
|
198
217
|
|
|
199
218
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from injector import inject
|
|
4
|
+
|
|
5
|
+
from robot_interface.models.robots.media import MediaConfig
|
|
6
|
+
from robot_interface.robot_interface import RobotInterface
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RobotUtilities:
|
|
10
|
+
"""
|
|
11
|
+
Contains utility functions for getting robot information from the API.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
@inject
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
robot: RobotInterface,
|
|
18
|
+
):
|
|
19
|
+
self.robot: RobotInterface = robot
|
|
20
|
+
self.logger = logging.getLogger("api")
|
|
21
|
+
|
|
22
|
+
def generate_media_config(self) -> MediaConfig:
|
|
23
|
+
return self.robot.generate_media_config()
|
|
@@ -237,8 +237,6 @@ class StateMachine(object):
|
|
|
237
237
|
|
|
238
238
|
self.current_state: State = States(self.state) # type: ignore
|
|
239
239
|
|
|
240
|
-
self.predefined_mission_id: Optional[int] = None
|
|
241
|
-
|
|
242
240
|
self.transitions_log_length: int = transitions_log_length
|
|
243
241
|
self.transitions_list: Deque[States] = deque([], self.transitions_log_length)
|
|
244
242
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import time
|
|
3
3
|
from copy import deepcopy
|
|
4
|
-
from typing import TYPE_CHECKING, Callable, Optional,
|
|
4
|
+
from typing import TYPE_CHECKING, Callable, Optional, Tuple, Union
|
|
5
5
|
|
|
6
6
|
from injector import inject
|
|
7
7
|
from transitions import State
|
|
@@ -42,6 +42,7 @@ src/isar/apis/api.py
|
|
|
42
42
|
src/isar/apis/models/__init__.py
|
|
43
43
|
src/isar/apis/models/models.py
|
|
44
44
|
src/isar/apis/models/start_mission_definition.py
|
|
45
|
+
src/isar/apis/robot_control/robot_controller.py
|
|
45
46
|
src/isar/apis/schedule/__init__.py
|
|
46
47
|
src/isar/apis/schedule/scheduling_controller.py
|
|
47
48
|
src/isar/apis/security/__init__.py
|
|
@@ -70,8 +71,6 @@ src/isar/config/predefined_mission_definition/default_turtlebot.json
|
|
|
70
71
|
src/isar/config/predefined_missions/__init__.py
|
|
71
72
|
src/isar/config/predefined_missions/default.json
|
|
72
73
|
src/isar/config/predefined_missions/default_turtlebot.json
|
|
73
|
-
src/isar/config/predefined_poses/__init__.py
|
|
74
|
-
src/isar/config/predefined_poses/predefined_poses.py
|
|
75
74
|
src/isar/mission_planner/__init__.py
|
|
76
75
|
src/isar/mission_planner/local_planner.py
|
|
77
76
|
src/isar/mission_planner/mission_planner_interface.py
|
|
@@ -100,6 +99,7 @@ src/isar/services/service_connections/mqtt/robot_info_publisher.py
|
|
|
100
99
|
src/isar/services/service_connections/stid/__init__.py
|
|
101
100
|
src/isar/services/utilities/__init__.py
|
|
102
101
|
src/isar/services/utilities/queue_utilities.py
|
|
102
|
+
src/isar/services/utilities/robot_utilities.py
|
|
103
103
|
src/isar/services/utilities/scheduling_utilities.py
|
|
104
104
|
src/isar/services/utilities/threaded_request.py
|
|
105
105
|
src/isar/state_machine/__init__.py
|
|
@@ -136,9 +136,9 @@ src/robot_interface/models/mission/mission.py
|
|
|
136
136
|
src/robot_interface/models/mission/status.py
|
|
137
137
|
src/robot_interface/models/mission/task.py
|
|
138
138
|
src/robot_interface/models/robots/__init__.py
|
|
139
|
+
src/robot_interface/models/robots/media.py
|
|
139
140
|
src/robot_interface/models/robots/robot_model.py
|
|
140
141
|
src/robot_interface/telemetry/__init__.py
|
|
141
|
-
src/robot_interface/telemetry/media_connection_type.py
|
|
142
142
|
src/robot_interface/telemetry/mqtt_client.py
|
|
143
143
|
src/robot_interface/telemetry/payloads.py
|
|
144
144
|
src/robot_interface/utilities/__init__.py
|
|
@@ -3,6 +3,7 @@ from queue import Queue
|
|
|
3
3
|
from threading import Thread
|
|
4
4
|
from typing import Callable, List
|
|
5
5
|
|
|
6
|
+
from robot_interface.models.robots.media import MediaConfig
|
|
6
7
|
from robot_interface.models.initialize import InitializeParams
|
|
7
8
|
from robot_interface.models.inspection.inspection import Inspection
|
|
8
9
|
from robot_interface.models.mission.mission import Mission
|
|
@@ -224,6 +225,19 @@ class RobotInterface(metaclass=ABCMeta):
|
|
|
224
225
|
"""
|
|
225
226
|
raise NotImplementedError
|
|
226
227
|
|
|
228
|
+
@abstractmethod
|
|
229
|
+
def generate_media_config(self) -> MediaConfig:
|
|
230
|
+
"""
|
|
231
|
+
Generate a JSON containing the url and token needed to establish a media stream
|
|
232
|
+
connection to a robot.
|
|
233
|
+
|
|
234
|
+
Returns
|
|
235
|
+
-------
|
|
236
|
+
MediaConfig
|
|
237
|
+
An object containing the connection information for a media stream connection
|
|
238
|
+
"""
|
|
239
|
+
raise NotImplementedError
|
|
240
|
+
|
|
227
241
|
@abstractmethod
|
|
228
242
|
def get_telemetry_publishers(
|
|
229
243
|
self, queue: Queue, isar_id: str, robot_name: str
|
|
@@ -6,7 +6,6 @@ from alitra import Pose
|
|
|
6
6
|
from transitions import State
|
|
7
7
|
|
|
8
8
|
from robot_interface.models.mission.status import RobotStatus
|
|
9
|
-
from robot_interface.telemetry.media_connection_type import MediaConnectionType
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
@dataclass
|
|
@@ -56,13 +55,6 @@ class VideoStream:
|
|
|
56
55
|
type: str
|
|
57
56
|
|
|
58
57
|
|
|
59
|
-
@dataclass
|
|
60
|
-
class MediaConfig(TelemetryPayload):
|
|
61
|
-
url: str
|
|
62
|
-
token: str
|
|
63
|
-
media_connection_type: MediaConnectionType
|
|
64
|
-
|
|
65
|
-
|
|
66
58
|
@dataclass
|
|
67
59
|
class RobotStatusPayload:
|
|
68
60
|
isar_id: str
|
|
@@ -15,7 +15,7 @@ from isar.modules import (
|
|
|
15
15
|
SequentialTaskSelectorModule,
|
|
16
16
|
ServiceModule,
|
|
17
17
|
StateMachineModule,
|
|
18
|
-
|
|
18
|
+
SchedulingUtilitiesModule,
|
|
19
19
|
)
|
|
20
20
|
from isar.services.service_connections.request_handler import RequestHandler
|
|
21
21
|
from isar.services.utilities.scheduling_utilities import SchedulingUtilities
|
|
@@ -47,7 +47,7 @@ def injector():
|
|
|
47
47
|
ServiceModule,
|
|
48
48
|
StateMachineModule,
|
|
49
49
|
SequentialTaskSelectorModule,
|
|
50
|
-
|
|
50
|
+
SchedulingUtilitiesModule,
|
|
51
51
|
]
|
|
52
52
|
)
|
|
53
53
|
|
|
@@ -66,7 +66,7 @@ def injector_auth():
|
|
|
66
66
|
RequestHandlerModule,
|
|
67
67
|
ServiceModule,
|
|
68
68
|
StateMachineModule,
|
|
69
|
-
|
|
69
|
+
SchedulingUtilitiesModule,
|
|
70
70
|
]
|
|
71
71
|
)
|
|
72
72
|
|
|
@@ -23,7 +23,7 @@ from isar.modules import (
|
|
|
23
23
|
RobotModule,
|
|
24
24
|
ServiceModule,
|
|
25
25
|
StateMachineModule,
|
|
26
|
-
|
|
26
|
+
SchedulingUtilitiesModule,
|
|
27
27
|
)
|
|
28
28
|
from isar.services.readers.base_reader import BaseReader
|
|
29
29
|
from isar.state_machine.states_enum import States
|
|
@@ -57,7 +57,7 @@ def injector_turtlebot():
|
|
|
57
57
|
StateMachineModule,
|
|
58
58
|
LocalPlannerModule,
|
|
59
59
|
LocalStorageModule,
|
|
60
|
-
|
|
60
|
+
SchedulingUtilitiesModule,
|
|
61
61
|
MockMqttModule,
|
|
62
62
|
]
|
|
63
63
|
)
|
|
@@ -6,6 +6,8 @@ from typing import Callable, List, Sequence
|
|
|
6
6
|
|
|
7
7
|
from alitra import Frame, Orientation, Pose, Position
|
|
8
8
|
|
|
9
|
+
from robot_interface.models.robots.media import MediaConnectionType
|
|
10
|
+
from robot_interface.models.robots.media import MediaConfig
|
|
9
11
|
from robot_interface.models.initialize import InitializeParams
|
|
10
12
|
from robot_interface.models.inspection.inspection import (
|
|
11
13
|
Image,
|
|
@@ -20,7 +22,6 @@ from robot_interface.robot_interface import RobotInterface
|
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
class MockRobot(RobotInterface):
|
|
23
|
-
|
|
24
25
|
def __init__(
|
|
25
26
|
self,
|
|
26
27
|
mission_status: MissionStatus = MissionStatus.Successful,
|
|
@@ -62,6 +63,13 @@ class MockRobot(RobotInterface):
|
|
|
62
63
|
image.data = b"Some binary image data"
|
|
63
64
|
return image
|
|
64
65
|
|
|
66
|
+
def generate_media_config(self) -> MediaConfig:
|
|
67
|
+
return MediaConfig(
|
|
68
|
+
url="mockURL",
|
|
69
|
+
token="mockToken",
|
|
70
|
+
media_connection_type=MediaConnectionType.LiveKit,
|
|
71
|
+
)
|
|
72
|
+
|
|
65
73
|
def register_inspection_callback(
|
|
66
74
|
self, callback_function: Callable[[Inspection, Mission], None]
|
|
67
75
|
) -> None:
|