isar 1.30.5__tar.gz → 1.34.5__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.30.5 → isar-1.34.5}/.github/workflows/compile_requirements.yml +1 -1
- isar-1.34.5/.github/workflows/execute_stale_labeler.yml +17 -0
- {isar-1.30.5 → isar-1.34.5}/.github/workflows/project_automations.yml +11 -5
- {isar-1.30.5 → isar-1.34.5}/.github/workflows/pythonpackage.yml +3 -0
- {isar-1.30.5 → isar-1.34.5}/.github/workflows/pythonpublish.yml +3 -0
- isar-1.34.5/.github/workflows/synchronize_labels.yml +13 -0
- isar-1.34.5/.github/workflows/trivy-config.yml +43 -0
- isar-1.34.5/Makefile +23 -0
- {isar-1.30.5 → isar-1.34.5}/PKG-INFO +23 -68
- {isar-1.30.5 → isar-1.34.5}/README.md +11 -63
- isar-1.34.5/docs/full_state_machine_diagram.png +0 -0
- isar-1.34.5/docs/mission_state_machine_diagram.png +0 -0
- isar-1.34.5/docs/robot_status_state_machine_diagram.png +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/update_state_diagram.py +53 -3
- {isar-1.30.5 → isar-1.34.5}/pyproject.toml +11 -4
- isar-1.34.5/requirements.txt +324 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/api.py +78 -60
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/models/models.py +18 -4
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/models/start_mission_definition.py +8 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/robot_control/robot_controller.py +5 -2
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/schedule/scheduling_controller.py +117 -90
- isar-1.34.5/src/isar/config/log.py +58 -0
- isar-1.34.5/src/isar/config/logging.conf +40 -0
- isar-1.34.5/src/isar/config/open_telemetry.py +102 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_missions/default.json +1 -1
- isar-1.30.5/src/isar/config/predefined_missions/default_turtlebot.json → isar-1.34.5/src/isar/config/predefined_missions/default_extra_capabilities.json +1 -1
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/settings.py +45 -11
- isar-1.34.5/src/isar/eventhandlers/eventhandler.py +115 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/mission_planner/local_planner.py +0 -3
- isar-1.34.5/src/isar/models/events.py +183 -0
- isar-1.34.5/src/isar/models/status.py +18 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/modules.py +6 -12
- isar-1.34.5/src/isar/robot/robot.py +348 -0
- isar-1.34.5/src/isar/robot/robot_battery.py +60 -0
- isar-1.34.5/src/isar/robot/robot_monitor_mission.py +415 -0
- isar-1.34.5/src/isar/robot/robot_pause_mission.py +74 -0
- isar-1.34.5/src/isar/robot/robot_resume_mission.py +67 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/robot/robot_start_mission.py +13 -31
- {isar-1.30.5 → isar-1.34.5}/src/isar/robot/robot_status.py +14 -9
- {isar-1.30.5 → isar-1.34.5}/src/isar/robot/robot_stop_mission.py +11 -14
- isar-1.34.5/src/isar/robot/robot_upload_inspection.py +75 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/script.py +11 -17
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/service_connections/mqtt/mqtt_client.py +45 -9
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +3 -0
- isar-1.34.5/src/isar/services/service_connections/persistent_memory.py +69 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/utilities/robot_utilities.py +0 -3
- isar-1.34.5/src/isar/services/utilities/scheduling_utilities.py +563 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/state_machine/state_machine.py +136 -134
- isar-1.34.5/src/isar/state_machine/states/await_next_mission.py +108 -0
- isar-1.34.5/src/isar/state_machine/states/blocked_protective_stop.py +49 -0
- isar-1.34.5/src/isar/state_machine/states/going_to_lockdown.py +88 -0
- isar-1.34.5/src/isar/state_machine/states/going_to_recharging.py +81 -0
- isar-1.34.5/src/isar/state_machine/states/home.py +112 -0
- isar-1.34.5/src/isar/state_machine/states/intervention_needed.py +59 -0
- isar-1.34.5/src/isar/state_machine/states/lockdown.py +38 -0
- isar-1.34.5/src/isar/state_machine/states/maintenance.py +36 -0
- isar-1.34.5/src/isar/state_machine/states/monitor.py +131 -0
- isar-1.34.5/src/isar/state_machine/states/offline.py +49 -0
- isar-1.34.5/src/isar/state_machine/states/paused.py +90 -0
- isar-1.34.5/src/isar/state_machine/states/pausing.py +59 -0
- isar-1.34.5/src/isar/state_machine/states/pausing_return_home.py +59 -0
- isar-1.34.5/src/isar/state_machine/states/recharging.py +80 -0
- isar-1.34.5/src/isar/state_machine/states/resuming.py +57 -0
- isar-1.34.5/src/isar/state_machine/states/resuming_return_home.py +64 -0
- isar-1.34.5/src/isar/state_machine/states/return_home_paused.py +103 -0
- isar-1.34.5/src/isar/state_machine/states/returning_home.py +160 -0
- isar-1.34.5/src/isar/state_machine/states/stopping.py +58 -0
- isar-1.34.5/src/isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
- isar-1.34.5/src/isar/state_machine/states/stopping_go_to_lockdown.py +59 -0
- isar-1.34.5/src/isar/state_machine/states/stopping_go_to_recharge.py +51 -0
- isar-1.34.5/src/isar/state_machine/states/stopping_return_home.py +73 -0
- isar-1.34.5/src/isar/state_machine/states/unknown_status.py +65 -0
- isar-1.34.5/src/isar/state_machine/states_enum.py +31 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/fail_mission.py +19 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/finish_mission.py +9 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/pause.py +9 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/resume.py +9 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/state_machine/transitions/functions/return_home.py +11 -10
- isar-1.34.5/src/isar/state_machine/transitions/functions/robot_status.py +36 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/start_mission.py +40 -0
- isar-1.34.5/src/isar/state_machine/transitions/functions/stop.py +33 -0
- isar-1.34.5/src/isar/state_machine/transitions/mission.py +255 -0
- isar-1.34.5/src/isar/state_machine/transitions/return_home.py +172 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/state_machine/transitions/robot_status.py +21 -10
- isar-1.34.5/src/isar/state_machine/utils/common_event_handlers.py +98 -0
- isar-1.34.5/src/isar/storage/blob_storage.py +101 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/storage/local_storage.py +25 -12
- {isar-1.30.5 → isar-1.34.5}/src/isar/storage/storage_interface.py +28 -7
- {isar-1.30.5 → isar-1.34.5}/src/isar/storage/uploader.py +49 -17
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/PKG-INFO +23 -68
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/SOURCES.txt +33 -23
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/requires.txt +11 -4
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/exceptions/robot_exceptions.py +24 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/inspection/inspection.py +6 -15
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/mission/status.py +1 -2
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/mission/task.py +0 -24
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/robot_interface.py +53 -5
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/telemetry/mqtt_client.py +62 -6
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/telemetry/payloads.py +26 -5
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/utilities/json_service.py +6 -0
- {isar-1.30.5 → isar-1.34.5}/tests/conftest.py +30 -7
- {isar-1.30.5 → isar-1.34.5}/tests/integration/turtlebot/test_successful_mission.py +2 -2
- {isar-1.30.5 → isar-1.34.5}/tests/isar/apis/scheduler/test_scheduler_router.py +57 -75
- isar-1.34.5/tests/isar/models/communication/test_events.py +44 -0
- isar-1.34.5/tests/isar/services/utilities/test_queue_utilities.py +34 -0
- isar-1.34.5/tests/isar/services/utilities/test_scheduling_utilities.py +124 -0
- isar-1.34.5/tests/isar/state_machine/test_state_machine.py +1591 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/storage/test_uploader.py +32 -1
- isar-1.34.5/tests/test_double/blob_storage.py +41 -0
- isar-1.34.5/tests/test_double/mqtt_client.py +37 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/robot_interface.py +81 -47
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/status.py +1 -1
- isar-1.34.5/tests/test_maintenance_mode.py +103 -0
- isar-1.30.5/docs/full_state_machine_diagram.png +0 -0
- isar-1.30.5/docs/mission_state_machine_diagram.png +0 -0
- isar-1.30.5/docs/robot_status_state_machine_diagram.png +0 -0
- isar-1.30.5/requirements.txt +0 -196
- isar-1.30.5/src/isar/config/log.py +0 -67
- isar-1.30.5/src/isar/config/logging.conf +0 -58
- isar-1.30.5/src/isar/mission_planner/sequential_task_selector.py +0 -23
- isar-1.30.5/src/isar/mission_planner/task_selector_interface.py +0 -31
- isar-1.30.5/src/isar/models/communication/message.py +0 -8
- isar-1.30.5/src/isar/models/communication/queues/events.py +0 -58
- isar-1.30.5/src/isar/models/communication/queues/queue_io.py +0 -12
- isar-1.30.5/src/isar/models/communication/queues/queue_timeout_error.py +0 -2
- isar-1.30.5/src/isar/models/communication/queues/queue_utils.py +0 -38
- isar-1.30.5/src/isar/models/communication/queues/status_queue.py +0 -22
- isar-1.30.5/src/isar/robot/robot.py +0 -134
- isar-1.30.5/src/isar/robot/robot_task_status.py +0 -91
- isar-1.30.5/src/isar/services/utilities/queue_utilities.py +0 -39
- isar-1.30.5/src/isar/services/utilities/scheduling_utilities.py +0 -291
- isar-1.30.5/src/isar/state_machine/generic_states/idle.py +0 -133
- isar-1.30.5/src/isar/state_machine/generic_states/ongoing_mission.py +0 -294
- isar-1.30.5/src/isar/state_machine/generic_states/robot_unavailable.py +0 -61
- isar-1.30.5/src/isar/state_machine/states/await_next_mission.py +0 -20
- isar-1.30.5/src/isar/state_machine/states/blocked_protective_stop.py +0 -24
- isar-1.30.5/src/isar/state_machine/states/home.py +0 -19
- isar-1.30.5/src/isar/state_machine/states/monitor.py +0 -24
- isar-1.30.5/src/isar/state_machine/states/offline.py +0 -22
- isar-1.30.5/src/isar/state_machine/states/paused.py +0 -44
- isar-1.30.5/src/isar/state_machine/states/returning_home.py +0 -24
- isar-1.30.5/src/isar/state_machine/states/robot_standing_still.py +0 -20
- isar-1.30.5/src/isar/state_machine/states/stopping.py +0 -75
- isar-1.30.5/src/isar/state_machine/states/unknown_status.py +0 -74
- isar-1.30.5/src/isar/state_machine/states_enum.py +0 -17
- isar-1.30.5/src/isar/state_machine/transitions/functions/fail_mission.py +0 -13
- isar-1.30.5/src/isar/state_machine/transitions/functions/finish_mission.py +0 -39
- isar-1.30.5/src/isar/state_machine/transitions/functions/pause.py +0 -24
- isar-1.30.5/src/isar/state_machine/transitions/functions/resume.py +0 -27
- isar-1.30.5/src/isar/state_machine/transitions/functions/robot_status.py +0 -27
- isar-1.30.5/src/isar/state_machine/transitions/functions/start_mission.py +0 -74
- isar-1.30.5/src/isar/state_machine/transitions/functions/stop.py +0 -92
- isar-1.30.5/src/isar/state_machine/transitions/mission.py +0 -134
- isar-1.30.5/src/isar/state_machine/transitions/return_home.py +0 -69
- isar-1.30.5/src/isar/storage/blob_storage.py +0 -83
- isar-1.30.5/tests/isar/models/communication/test_queues.py +0 -49
- isar-1.30.5/tests/isar/services/service_connections/echo/__init__.py +0 -0
- isar-1.30.5/tests/isar/services/utilities/__init__.py +0 -0
- isar-1.30.5/tests/isar/services/utilities/test_queue_utilities.py +0 -38
- isar-1.30.5/tests/isar/services/utilities/test_scheduling_utilities.py +0 -65
- isar-1.30.5/tests/isar/state_machine/__init__.py +0 -0
- isar-1.30.5/tests/isar/state_machine/states/__init__.py +0 -0
- isar-1.30.5/tests/isar/state_machine/states/test_monitor.py +0 -50
- isar-1.30.5/tests/isar/state_machine/test_state_machine.py +0 -530
- isar-1.30.5/tests/isar/storage/test_blob_storage.py +0 -18
- isar-1.30.5/tests/test_double/__init__.py +0 -0
- isar-1.30.5/tests/test_double/blob_storage.py +0 -20
- isar-1.30.5/tests/test_double/mqtt_client.py +0 -10
- {isar-1.30.5 → isar-1.34.5}/.dockerignore +0 -0
- {isar-1.30.5 → isar-1.34.5}/.env.test +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/release.yml +0 -0
- {isar-1.30.5 → isar-1.34.5}/.github/workflows/stale.yml +0 -0
- {isar-1.30.5 → isar-1.34.5}/.gitignore +0 -0
- {isar-1.30.5 → isar-1.34.5}/.pre-commit-config.yaml +0 -0
- {isar-1.30.5 → isar-1.34.5}/LICENSE +0 -0
- {isar-1.30.5 → isar-1.34.5}/SECURITY.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/Makefile +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/make.bat +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/rst_processing.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/source/conf.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/source/index.rst +0 -0
- {isar-1.30.5 → isar-1.34.5}/docs/source/readme_link.md +0 -0
- {isar-1.30.5 → isar-1.34.5}/main.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/radixconfig.yml +0 -0
- {isar-1.30.5 → isar-1.34.5}/setup.cfg +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/configuration_error.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/models/__init__.py +0 -0
- {isar-1.30.5/src/isar/models/communication → isar-1.34.5/src/isar/services}/__init__.py +0 -0
- {isar-1.30.5/src/isar/models/communication/queues → isar-1.34.5/src/isar/services/auth}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.30.5/src/isar/models/mission_metadata → isar-1.34.5/src/isar/services/service_connections}/__init__.py +0 -0
- {isar-1.30.5/src/isar/services → isar-1.34.5/src/isar/services/service_connections/mqtt}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.30.5/src/isar/services/auth → isar-1.34.5/src/isar/services/utilities}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.30.5/src/isar/services/service_connections → isar-1.34.5/src/isar/state_machine}/__init__.py +0 -0
- {isar-1.30.5/src/isar/services/service_connections/mqtt → isar-1.34.5/src/isar/state_machine/states}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/state_machine/transitions/functions/utils.py +0 -0
- {isar-1.30.5/src/isar/services/service_connections/stid → isar-1.34.5/src/isar/storage}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar/storage/utilities.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.30.5/src/isar/services/utilities → isar-1.34.5/src/robot_interface}/__init__.py +0 -0
- {isar-1.30.5/src/isar/state_machine → isar-1.34.5/src/robot_interface/models}/__init__.py +0 -0
- {isar-1.30.5/src/isar/state_machine/states → isar-1.34.5/src/robot_interface/models/exceptions}/__init__.py +0 -0
- {isar-1.30.5/src/isar/storage → isar-1.34.5/src/robot_interface/models/initialize}/__init__.py +0 -0
- {isar-1.30.5/src/robot_interface → isar-1.34.5/src/robot_interface/models/inspection}/__init__.py +0 -0
- {isar-1.30.5/src/robot_interface/models → isar-1.34.5/src/robot_interface/models/mission}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.30.5/src/robot_interface/models/exceptions → isar-1.34.5/src/robot_interface/models/robots}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.30.5/src/robot_interface/models/initialize → isar-1.34.5/src/robot_interface/telemetry}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.30.5/src/robot_interface/models/inspection → isar-1.34.5/src/robot_interface/utilities}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.30.5/src/robot_interface/models/mission → isar-1.34.5/tests}/__init__.py +0 -0
- {isar-1.30.5/src/robot_interface/models/robots → isar-1.34.5/tests/integration}/__init__.py +0 -0
- {isar-1.30.5/src/robot_interface/telemetry → isar-1.34.5/tests/integration/turtlebot}/__init__.py +0 -0
- {isar-1.30.5/src/robot_interface/utilities → isar-1.34.5/tests/integration/turtlebot/config}/__init__.py +0 -0
- {isar-1.30.5/tests → isar-1.34.5/tests/integration/turtlebot/config/maps}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.30.5/tests/integration → isar-1.34.5/tests/integration/turtlebot/config/missions}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.30.5/tests/integration/turtlebot → isar-1.34.5/tests/isar}/__init__.py +0 -0
- {isar-1.30.5/tests/integration/turtlebot/config → isar-1.34.5/tests/isar/apis}/__init__.py +0 -0
- {isar-1.30.5/tests/integration/turtlebot/config/maps → isar-1.34.5/tests/isar/apis/models}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.30.5/tests/integration/turtlebot/config/missions → isar-1.34.5/tests/isar/apis/scheduler}/__init__.py +0 -0
- {isar-1.30.5/tests/isar → isar-1.34.5/tests/isar/apis/security}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.30.5/tests/isar/apis → isar-1.34.5/tests/isar/mission}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.30.5/tests/isar/apis → isar-1.34.5/tests/isar}/models/__init__.py +0 -0
- {isar-1.30.5/tests/isar/apis/scheduler → isar-1.34.5/tests/isar/models/communication}/__init__.py +0 -0
- {isar-1.30.5/tests/isar/apis/security → isar-1.34.5/tests/isar/services}/__init__.py +0 -0
- {isar-1.30.5/tests/isar/mission → isar-1.34.5/tests/isar/services/readers}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.30.5/tests/isar/models → isar-1.34.5/tests/isar/services/service_connections}/__init__.py +0 -0
- {isar-1.30.5/tests/isar/models/communication → isar-1.34.5/tests/isar/services/service_connections/echo}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.30.5/tests/isar/services → isar-1.34.5/tests/isar/services/utilities}/__init__.py +0 -0
- {isar-1.30.5/tests/isar/services/readers → isar-1.34.5/tests/isar/state_machine}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.30.5/tests/isar/services/service_connections → isar-1.34.5/tests/test_double}/__init__.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/mission_definition.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/pose.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/request.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/task.py +0 -0
- {isar-1.30.5 → isar-1.34.5}/tests/test_double/token.py +0 -0
|
@@ -38,7 +38,7 @@ jobs:
|
|
|
38
38
|
pip-compile --output-file=requirements.txt pyproject.toml --upgrade
|
|
39
39
|
|
|
40
40
|
- name: Create Pull Request
|
|
41
|
-
uses: peter-evans/create-pull-request@
|
|
41
|
+
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e #v7
|
|
42
42
|
with:
|
|
43
43
|
commit-message: "GHA: Update dependencies"
|
|
44
44
|
title: Update dependencies
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Execute stale labeler
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "35 6 * * *"
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
actions: write
|
|
10
|
+
issues: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
labels:
|
|
15
|
+
uses: equinor/armada/.github/workflows/mark_issues_and_prs_as_stale.yml@main
|
|
16
|
+
secrets:
|
|
17
|
+
STALE_ISSUE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
name: Project automations
|
|
2
|
+
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
issues: write
|
|
6
|
+
pull-requests: write
|
|
7
|
+
|
|
2
8
|
on:
|
|
3
9
|
issues:
|
|
4
10
|
types:
|
|
@@ -19,7 +25,7 @@ jobs:
|
|
|
19
25
|
if: github.event_name == 'issues' && github.event.action == 'opened' || github.event.action == 'reopened'
|
|
20
26
|
steps:
|
|
21
27
|
- name: 'Move issue to "Todo"'
|
|
22
|
-
uses: leonsteinhaeuser/project-beta-automations@
|
|
28
|
+
uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
|
|
23
29
|
with:
|
|
24
30
|
gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
25
31
|
organization: equinor
|
|
@@ -32,7 +38,7 @@ jobs:
|
|
|
32
38
|
if: github.event_name == 'issues' && github.event.action == 'closed'
|
|
33
39
|
steps:
|
|
34
40
|
- name: 'Moved issue to "Done"'
|
|
35
|
-
uses: leonsteinhaeuser/project-beta-automations@
|
|
41
|
+
uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
|
|
36
42
|
with:
|
|
37
43
|
gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
38
44
|
organization: equinor
|
|
@@ -45,7 +51,7 @@ jobs:
|
|
|
45
51
|
if: github.event_name == 'pull_request' && github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'review_requested'
|
|
46
52
|
steps:
|
|
47
53
|
- name: 'Move PR to "In Progress"'
|
|
48
|
-
uses: leonsteinhaeuser/project-beta-automations@
|
|
54
|
+
uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
|
|
49
55
|
with:
|
|
50
56
|
gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
51
57
|
organization: equinor
|
|
@@ -58,7 +64,7 @@ jobs:
|
|
|
58
64
|
if: github.event_name == 'pull_request' && github.event.action == 'ready_for_review'
|
|
59
65
|
steps:
|
|
60
66
|
- name: 'Move PR to "Review"'
|
|
61
|
-
uses: leonsteinhaeuser/project-beta-automations@
|
|
67
|
+
uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
|
|
62
68
|
with:
|
|
63
69
|
gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
64
70
|
organization: equinor
|
|
@@ -71,7 +77,7 @@ jobs:
|
|
|
71
77
|
if: github.event_name == 'pull_request' && github.event.action == 'closed'
|
|
72
78
|
steps:
|
|
73
79
|
- name: 'Move PR to "Done"'
|
|
74
|
-
uses: leonsteinhaeuser/project-beta-automations@
|
|
80
|
+
uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
|
|
75
81
|
with:
|
|
76
82
|
gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
77
83
|
organization: equinor
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: Execute label synchronization
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
|
|
5
|
+
permissions:
|
|
6
|
+
contents: read
|
|
7
|
+
issues: write
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
labels:
|
|
11
|
+
uses: equinor/armada/.github/workflows/synchronize_labels.yml@main
|
|
12
|
+
secrets:
|
|
13
|
+
LABEL_SYNC_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# from https://github.com/equinor/appsec-ghas-examples/blob/main/.github/workflows/trivy-config.yml
|
|
2
|
+
name: Trivy IaC & Dockerfile Scanning
|
|
3
|
+
permissions: {}
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [ "main" ]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ "main" ]
|
|
9
|
+
schedule:
|
|
10
|
+
- cron: '36 0 * * 3'
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
trivy-scan:
|
|
14
|
+
name: Scan on Main with Trivy
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
timeout-minutes: 30
|
|
17
|
+
permissions:
|
|
18
|
+
security-events: write
|
|
19
|
+
|
|
20
|
+
contents: read
|
|
21
|
+
actions: read
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- name: Checkout code
|
|
25
|
+
uses: actions/checkout@v5
|
|
26
|
+
with:
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
|
|
29
|
+
- name: Run Trivy vulnerability Scanner
|
|
30
|
+
uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8
|
|
31
|
+
with:
|
|
32
|
+
scan-type: 'config'
|
|
33
|
+
severity: 'CRITICAL,HIGH'
|
|
34
|
+
limit-severities-for-sarif: true
|
|
35
|
+
format: 'sarif'
|
|
36
|
+
output: 'trivy-results-iac.sarif'
|
|
37
|
+
exit-code: '0'
|
|
38
|
+
|
|
39
|
+
- name: Upload scan results to GitHub Security tab
|
|
40
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
41
|
+
with:
|
|
42
|
+
sarif_file: 'trivy-results-iac.sarif'
|
|
43
|
+
|
isar-1.34.5/Makefile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
run:
|
|
2
|
+
isar-start
|
|
3
|
+
|
|
4
|
+
test:
|
|
5
|
+
ENVIRONMENT=local ISAR_ENV=test pytest .
|
|
6
|
+
|
|
7
|
+
format:
|
|
8
|
+
isort .
|
|
9
|
+
black .
|
|
10
|
+
ruff check . --fix
|
|
11
|
+
|
|
12
|
+
check:
|
|
13
|
+
mypy .
|
|
14
|
+
|
|
15
|
+
run-debug: # debug logs
|
|
16
|
+
API_LOG_LEVEL=DEBUG \
|
|
17
|
+
MAIN_LOG_LEVEL=DEBUG \
|
|
18
|
+
MQTT_LOG_LEVEL=DEBUG \
|
|
19
|
+
STATE_MACHINE_LOG_LEVEL=DEBUG \
|
|
20
|
+
UPLOADER_LOG_LEVEL=DEBUG \
|
|
21
|
+
CONSOLE_LOG_LEVEL=DEBUG \
|
|
22
|
+
ISAR_DEBUG_LOG_FORMATTER=True \
|
|
23
|
+
isar-start
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: isar
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.34.5
|
|
4
4
|
Summary: Integration and Supervisory control of Autonomous Robots
|
|
5
5
|
Author-email: Equinor ASA <fg_robots_dev@equinor.com>
|
|
6
6
|
License: Eclipse Public License version 2.0
|
|
@@ -110,12 +110,9 @@ Requires-Dist: backoff
|
|
|
110
110
|
Requires-Dist: click
|
|
111
111
|
Requires-Dist: dacite
|
|
112
112
|
Requires-Dist: fastapi-azure-auth
|
|
113
|
-
Requires-Dist: fastapi
|
|
113
|
+
Requires-Dist: fastapi>=0.121.0
|
|
114
114
|
Requires-Dist: dependency-injector
|
|
115
115
|
Requires-Dist: numpy
|
|
116
|
-
Requires-Dist: opencensus-ext-azure
|
|
117
|
-
Requires-Dist: opencensus-ext-logging
|
|
118
|
-
Requires-Dist: opencensus-ext-requests
|
|
119
116
|
Requires-Dist: paho-mqtt
|
|
120
117
|
Requires-Dist: pydantic_settings
|
|
121
118
|
Requires-Dist: pydantic
|
|
@@ -124,8 +121,17 @@ Requires-Dist: python-dotenv
|
|
|
124
121
|
Requires-Dist: PyYAML
|
|
125
122
|
Requires-Dist: requests-toolbelt
|
|
126
123
|
Requires-Dist: requests
|
|
124
|
+
Requires-Dist: starlette>=0.49.1
|
|
127
125
|
Requires-Dist: transitions
|
|
128
126
|
Requires-Dist: uvicorn
|
|
127
|
+
Requires-Dist: opentelemetry-api
|
|
128
|
+
Requires-Dist: opentelemetry-sdk
|
|
129
|
+
Requires-Dist: opentelemetry-exporter-otlp
|
|
130
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi
|
|
131
|
+
Requires-Dist: azure-monitor-opentelemetry
|
|
132
|
+
Requires-Dist: azure-monitor-opentelemetry-exporter>=1.0.0b38
|
|
133
|
+
Requires-Dist: pymysql
|
|
134
|
+
Requires-Dist: sqlalchemy
|
|
129
135
|
Provides-Extra: dev
|
|
130
136
|
Requires-Dist: black; extra == "dev"
|
|
131
137
|
Requires-Dist: isort; extra == "dev"
|
|
@@ -137,6 +143,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
|
137
143
|
Requires-Dist: pytest; extra == "dev"
|
|
138
144
|
Requires-Dist: requests-mock; extra == "dev"
|
|
139
145
|
Requires-Dist: ruff; extra == "dev"
|
|
146
|
+
Requires-Dist: testcontainers[mysql]; extra == "dev"
|
|
140
147
|
Dynamic: license-file
|
|
141
148
|
|
|
142
149
|
# ISAR
|
|
@@ -230,6 +237,15 @@ ISAR_ROBOT_PACKAGE = isar_turtlebot
|
|
|
230
237
|
ISAR_DEFAULT_MAP = turtleworld
|
|
231
238
|
```
|
|
232
239
|
|
|
240
|
+
### Run with make
|
|
241
|
+
Common commands for the project are in [Makefile](./Makefile).
|
|
242
|
+
This requires the CLI program `make`.
|
|
243
|
+
|
|
244
|
+
Usage:
|
|
245
|
+
```bash
|
|
246
|
+
make <command-in-makefile> # for example: make run
|
|
247
|
+
```
|
|
248
|
+
|
|
233
249
|
### Run ISAR server
|
|
234
250
|
|
|
235
251
|
To run ISAR:
|
|
@@ -366,7 +382,7 @@ States.Paused,
|
|
|
366
382
|
indicates that the state machine is already running. For running a mission the state machine need to be in the states
|
|
367
383
|
|
|
368
384
|
```
|
|
369
|
-
States.Home, States.
|
|
385
|
+
States.Home, States.AwaitNextMission or States.ReturningHome
|
|
370
386
|
```
|
|
371
387
|
|
|
372
388
|
### FastAPI
|
|
@@ -399,68 +415,6 @@ You can create your own storage module by implementing the [storage interface](.
|
|
|
399
415
|
and adding your storage module to the selection [here](./src/isar/modules.py). Note that you must add your module as an
|
|
400
416
|
option in the dictionary.
|
|
401
417
|
|
|
402
|
-
## Task selection
|
|
403
|
-
|
|
404
|
-
The tasks of a mission are selected based on a task selector module, defined by the `TASK_SELECTOR` configuration variable. The default task selector is `sequential`. When using the default module, tasks are executed in sequential order defined by the current input mission.
|
|
405
|
-
|
|
406
|
-
### Implement you own task selector module
|
|
407
|
-
|
|
408
|
-
Custom task selector modules may be added by implementing additional versions of the [task selector interface](./src/isar/mission_planner/task_selector_interface.py).
|
|
409
|
-
|
|
410
|
-
For every custom module, the interface function `next_task()` must be implemented. All interface implementations by default have access to the list of tasks in the current mission through the member `self.tasks`, however additional variables may be supplied by adding arguments to `next_task()`. To comply with the interface definition, the function should return the next task upon every call, and raise the `TaskSelectorStop` exception when all tasks in the current mission have been completed:
|
|
411
|
-
|
|
412
|
-
```python
|
|
413
|
-
class CustomTaskSelector(TaskSelectorInterface):
|
|
414
|
-
...
|
|
415
|
-
def next_task(...) -> Task:
|
|
416
|
-
|
|
417
|
-
# Add code here
|
|
418
|
-
...
|
|
419
|
-
|
|
420
|
-
# Raise `TaskSelectorStop` when all tasks have been completed
|
|
421
|
-
...
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
Optionally, the `initialize()` function may be extended by supplementing the parameter list or function body:
|
|
425
|
-
|
|
426
|
-
```python
|
|
427
|
-
class CustomTaskSelector(TaskSelectorInterface):
|
|
428
|
-
...
|
|
429
|
-
def initialize(self, tasks: List[Task], ...) -> None:
|
|
430
|
-
super.initialize(tasks=tasks)
|
|
431
|
-
|
|
432
|
-
# Add supplementary code here
|
|
433
|
-
...
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
A custom task selector may be made available during [module selection](./src/isar/modules.py) by adding it to the series of options in the dictionary of injector modules. It can then be activated by overriding the task selector configuration variable:
|
|
437
|
-
|
|
438
|
-
```python
|
|
439
|
-
# Add custom task selector module to `modules.py`
|
|
440
|
-
|
|
441
|
-
class CustomTaskSelectorModule(Module):
|
|
442
|
-
@provider
|
|
443
|
-
@singleton
|
|
444
|
-
def provide_task_selector(self) -> TaskSelectorInterface:
|
|
445
|
-
return CustomTaskSelector()
|
|
446
|
-
|
|
447
|
-
...
|
|
448
|
-
|
|
449
|
-
# Make it available to select during injector instantiation
|
|
450
|
-
|
|
451
|
-
modules: dict[str, tuple[Module, Union[str, bool]]] = {
|
|
452
|
-
...
|
|
453
|
-
"task_selector": (
|
|
454
|
-
{
|
|
455
|
-
"sequential": SequentialTaskSelectorModule,
|
|
456
|
-
"custom": CustomTaskSelectorModule
|
|
457
|
-
}
|
|
458
|
-
...
|
|
459
|
-
)
|
|
460
|
-
...
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
418
|
## API authentication
|
|
465
419
|
|
|
466
420
|
The API has an option to include user authentication. This can be enabled by setting the environment variable
|
|
@@ -477,6 +431,7 @@ Enabling API authentication also requires the same environment variables. The re
|
|
|
477
431
|
AZURE_CLIENT_ID
|
|
478
432
|
AZURE_TENANT_ID
|
|
479
433
|
AZURE_CLIENT_SECRET
|
|
434
|
+
ISAR_BLOB_STORAGE_ACCOUNT
|
|
480
435
|
```
|
|
481
436
|
|
|
482
437
|
## MQTT communication
|
|
@@ -89,6 +89,15 @@ ISAR_ROBOT_PACKAGE = isar_turtlebot
|
|
|
89
89
|
ISAR_DEFAULT_MAP = turtleworld
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
+
### Run with make
|
|
93
|
+
Common commands for the project are in [Makefile](./Makefile).
|
|
94
|
+
This requires the CLI program `make`.
|
|
95
|
+
|
|
96
|
+
Usage:
|
|
97
|
+
```bash
|
|
98
|
+
make <command-in-makefile> # for example: make run
|
|
99
|
+
```
|
|
100
|
+
|
|
92
101
|
### Run ISAR server
|
|
93
102
|
|
|
94
103
|
To run ISAR:
|
|
@@ -225,7 +234,7 @@ States.Paused,
|
|
|
225
234
|
indicates that the state machine is already running. For running a mission the state machine need to be in the states
|
|
226
235
|
|
|
227
236
|
```
|
|
228
|
-
States.Home, States.
|
|
237
|
+
States.Home, States.AwaitNextMission or States.ReturningHome
|
|
229
238
|
```
|
|
230
239
|
|
|
231
240
|
### FastAPI
|
|
@@ -258,68 +267,6 @@ You can create your own storage module by implementing the [storage interface](.
|
|
|
258
267
|
and adding your storage module to the selection [here](./src/isar/modules.py). Note that you must add your module as an
|
|
259
268
|
option in the dictionary.
|
|
260
269
|
|
|
261
|
-
## Task selection
|
|
262
|
-
|
|
263
|
-
The tasks of a mission are selected based on a task selector module, defined by the `TASK_SELECTOR` configuration variable. The default task selector is `sequential`. When using the default module, tasks are executed in sequential order defined by the current input mission.
|
|
264
|
-
|
|
265
|
-
### Implement you own task selector module
|
|
266
|
-
|
|
267
|
-
Custom task selector modules may be added by implementing additional versions of the [task selector interface](./src/isar/mission_planner/task_selector_interface.py).
|
|
268
|
-
|
|
269
|
-
For every custom module, the interface function `next_task()` must be implemented. All interface implementations by default have access to the list of tasks in the current mission through the member `self.tasks`, however additional variables may be supplied by adding arguments to `next_task()`. To comply with the interface definition, the function should return the next task upon every call, and raise the `TaskSelectorStop` exception when all tasks in the current mission have been completed:
|
|
270
|
-
|
|
271
|
-
```python
|
|
272
|
-
class CustomTaskSelector(TaskSelectorInterface):
|
|
273
|
-
...
|
|
274
|
-
def next_task(...) -> Task:
|
|
275
|
-
|
|
276
|
-
# Add code here
|
|
277
|
-
...
|
|
278
|
-
|
|
279
|
-
# Raise `TaskSelectorStop` when all tasks have been completed
|
|
280
|
-
...
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
Optionally, the `initialize()` function may be extended by supplementing the parameter list or function body:
|
|
284
|
-
|
|
285
|
-
```python
|
|
286
|
-
class CustomTaskSelector(TaskSelectorInterface):
|
|
287
|
-
...
|
|
288
|
-
def initialize(self, tasks: List[Task], ...) -> None:
|
|
289
|
-
super.initialize(tasks=tasks)
|
|
290
|
-
|
|
291
|
-
# Add supplementary code here
|
|
292
|
-
...
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
A custom task selector may be made available during [module selection](./src/isar/modules.py) by adding it to the series of options in the dictionary of injector modules. It can then be activated by overriding the task selector configuration variable:
|
|
296
|
-
|
|
297
|
-
```python
|
|
298
|
-
# Add custom task selector module to `modules.py`
|
|
299
|
-
|
|
300
|
-
class CustomTaskSelectorModule(Module):
|
|
301
|
-
@provider
|
|
302
|
-
@singleton
|
|
303
|
-
def provide_task_selector(self) -> TaskSelectorInterface:
|
|
304
|
-
return CustomTaskSelector()
|
|
305
|
-
|
|
306
|
-
...
|
|
307
|
-
|
|
308
|
-
# Make it available to select during injector instantiation
|
|
309
|
-
|
|
310
|
-
modules: dict[str, tuple[Module, Union[str, bool]]] = {
|
|
311
|
-
...
|
|
312
|
-
"task_selector": (
|
|
313
|
-
{
|
|
314
|
-
"sequential": SequentialTaskSelectorModule,
|
|
315
|
-
"custom": CustomTaskSelectorModule
|
|
316
|
-
}
|
|
317
|
-
...
|
|
318
|
-
)
|
|
319
|
-
...
|
|
320
|
-
}
|
|
321
|
-
```
|
|
322
|
-
|
|
323
270
|
## API authentication
|
|
324
271
|
|
|
325
272
|
The API has an option to include user authentication. This can be enabled by setting the environment variable
|
|
@@ -336,6 +283,7 @@ Enabling API authentication also requires the same environment variables. The re
|
|
|
336
283
|
AZURE_CLIENT_ID
|
|
337
284
|
AZURE_TENANT_ID
|
|
338
285
|
AZURE_CLIENT_SECRET
|
|
286
|
+
ISAR_BLOB_STORAGE_ACCOUNT
|
|
339
287
|
```
|
|
340
288
|
|
|
341
289
|
## MQTT communication
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -13,9 +13,59 @@ from isar.state_machine.transitions.return_home import get_return_home_transitio
|
|
|
13
13
|
from isar.state_machine.transitions.robot_status import get_robot_status_transitions
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
def extract_function_name_from_callable(func):
|
|
17
|
+
try:
|
|
18
|
+
closure = getattr(func, "__closure__", None)
|
|
19
|
+
if closure:
|
|
20
|
+
for cell in closure:
|
|
21
|
+
obj = cell.cell_contents
|
|
22
|
+
if callable(obj):
|
|
23
|
+
return getattr(obj, "__name__", str(obj))
|
|
24
|
+
|
|
25
|
+
return getattr(func, "__name__", str(func))
|
|
26
|
+
except Exception:
|
|
27
|
+
return "unknown"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def embed_conditions_in_trigger(transitions: List[dict]) -> List[dict]:
|
|
31
|
+
updated = []
|
|
32
|
+
for t in transitions:
|
|
33
|
+
trigger = t.get("trigger", "")
|
|
34
|
+
conditions = t.get("conditions", [])
|
|
35
|
+
|
|
36
|
+
if not isinstance(conditions, list):
|
|
37
|
+
conditions = [conditions]
|
|
38
|
+
|
|
39
|
+
condition_names = []
|
|
40
|
+
|
|
41
|
+
for cond in conditions:
|
|
42
|
+
name = extract_function_name_from_callable(cond)
|
|
43
|
+
condition_names.append(name)
|
|
44
|
+
|
|
45
|
+
befores = t.get("before", [])
|
|
46
|
+
if not isinstance(befores, list):
|
|
47
|
+
befores = [befores]
|
|
48
|
+
before_names = [extract_function_name_from_callable(b) for b in befores]
|
|
49
|
+
|
|
50
|
+
label_parts = [trigger]
|
|
51
|
+
if condition_names:
|
|
52
|
+
label_parts.append(f"[{'; '.join(condition_names)}]")
|
|
53
|
+
if before_names:
|
|
54
|
+
label_parts.append(f"/ {'; '.join(before_names)}")
|
|
55
|
+
|
|
56
|
+
new_trigger = " ".join(label_parts)
|
|
57
|
+
|
|
58
|
+
t_copy = t.copy()
|
|
59
|
+
t_copy["trigger"] = new_trigger
|
|
60
|
+
updated.append(t_copy)
|
|
61
|
+
|
|
62
|
+
return updated
|
|
63
|
+
|
|
64
|
+
|
|
16
65
|
def draw_diagram(states: List[State], transitions: List[dict], name: str):
|
|
66
|
+
transitions_with_conditions = embed_conditions_in_trigger(transitions)
|
|
17
67
|
machine = GraphMachine(states=states, initial="unknown_status", queued=True)
|
|
18
|
-
machine.add_transitions(
|
|
68
|
+
machine.add_transitions(transitions_with_conditions)
|
|
19
69
|
gp = machine.get_combined_graph()
|
|
20
70
|
|
|
21
71
|
state_machine_diagram_file = (
|
|
@@ -25,12 +75,12 @@ def draw_diagram(states: List[State], transitions: List[dict], name: str):
|
|
|
25
75
|
if os.path.isfile(state_machine_diagram_file):
|
|
26
76
|
os.remove(state_machine_diagram_file)
|
|
27
77
|
|
|
28
|
-
gp.draw(state_machine_diagram_file, prog="dot")
|
|
78
|
+
gp.draw(str(state_machine_diagram_file), prog="dot", format="png")
|
|
29
79
|
|
|
30
80
|
|
|
31
81
|
if __name__ == "__main__":
|
|
32
82
|
injector: Injector = get_injector()
|
|
33
|
-
state_machine: StateMachine = injector.
|
|
83
|
+
state_machine: StateMachine = injector.state_machine()
|
|
34
84
|
|
|
35
85
|
mission_extended_transitions: List[dict] = []
|
|
36
86
|
for transition in get_mission_transitions(state_machine):
|
|
@@ -33,12 +33,9 @@ dependencies = [
|
|
|
33
33
|
"click",
|
|
34
34
|
"dacite",
|
|
35
35
|
"fastapi-azure-auth",
|
|
36
|
-
"fastapi",
|
|
36
|
+
"fastapi>=0.121.0",
|
|
37
37
|
"dependency-injector",
|
|
38
38
|
"numpy",
|
|
39
|
-
"opencensus-ext-azure",
|
|
40
|
-
"opencensus-ext-logging",
|
|
41
|
-
"opencensus-ext-requests",
|
|
42
39
|
"paho-mqtt",
|
|
43
40
|
"pydantic_settings",
|
|
44
41
|
"pydantic",
|
|
@@ -47,8 +44,17 @@ dependencies = [
|
|
|
47
44
|
"PyYAML",
|
|
48
45
|
"requests-toolbelt",
|
|
49
46
|
"requests",
|
|
47
|
+
"starlette>=0.49.1",
|
|
50
48
|
"transitions",
|
|
51
49
|
"uvicorn",
|
|
50
|
+
"opentelemetry-api",
|
|
51
|
+
"opentelemetry-sdk",
|
|
52
|
+
"opentelemetry-exporter-otlp",
|
|
53
|
+
"opentelemetry-instrumentation-fastapi",
|
|
54
|
+
"azure-monitor-opentelemetry",
|
|
55
|
+
"azure-monitor-opentelemetry-exporter>=1.0.0b38",
|
|
56
|
+
"pymysql",
|
|
57
|
+
"sqlalchemy"
|
|
52
58
|
]
|
|
53
59
|
dynamic = ["version"]
|
|
54
60
|
|
|
@@ -70,6 +76,7 @@ dev = [
|
|
|
70
76
|
"pytest",
|
|
71
77
|
"requests-mock",
|
|
72
78
|
"ruff",
|
|
79
|
+
"testcontainers[mysql]",
|
|
73
80
|
]
|
|
74
81
|
|
|
75
82
|
[tool.setuptools_scm]
|