isar 1.22.3__tar.gz → 1.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of isar might be problematic. Click here for more details.

Files changed (216) hide show
  1. {isar-1.22.3 → isar-1.23.0}/PKG-INFO +1 -1
  2. {isar-1.22.3 → isar-1.23.0}/requirements.txt +17 -18
  3. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/api.py +1 -0
  4. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/models/models.py +2 -7
  5. isar-1.23.0/src/isar/apis/models/start_mission_definition.py +226 -0
  6. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/schedule/scheduling_controller.py +11 -20
  7. isar-1.23.0/src/isar/config/predefined_missions/default.json +74 -0
  8. isar-1.23.0/src/isar/config/predefined_missions/default_turtlebot.json +106 -0
  9. {isar-1.22.3 → isar-1.23.0}/src/isar/config/settings.env +1 -1
  10. {isar-1.22.3 → isar-1.23.0}/src/isar/config/settings.py +3 -3
  11. {isar-1.22.3 → isar-1.23.0}/src/isar/mission_planner/local_planner.py +3 -0
  12. {isar-1.22.3 → isar-1.23.0}/src/isar/mission_planner/sequential_task_selector.py +3 -3
  13. {isar-1.22.3 → isar-1.23.0}/src/isar/mission_planner/task_selector_interface.py +4 -4
  14. {isar-1.22.3 → isar-1.23.0}/src/isar/script.py +1 -1
  15. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +1 -1
  16. {isar-1.22.3 → isar-1.23.0}/src/isar/services/utilities/scheduling_utilities.py +3 -4
  17. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/state_machine.py +22 -98
  18. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/idle.py +2 -0
  19. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/initialize.py +1 -1
  20. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/initiate.py +10 -10
  21. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/monitor.py +78 -98
  22. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/offline.py +1 -0
  23. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/paused.py +1 -1
  24. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/stop.py +1 -1
  25. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/PKG-INFO +1 -1
  26. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/SOURCES.txt +0 -2
  27. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/exceptions/robot_exceptions.py +3 -3
  28. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/inspection/inspection.py +1 -1
  29. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/mission/mission.py +2 -2
  30. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/mission/status.py +0 -8
  31. isar-1.23.0/src/robot_interface/models/mission/task.py +197 -0
  32. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/robot_interface.py +29 -54
  33. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/test_successful_mission.py +4 -7
  34. {isar-1.22.3 → isar-1.23.0}/tests/isar/apis/scheduler/test_scheduler_router.py +16 -45
  35. isar-1.23.0/tests/isar/mission/test_mission.py +134 -0
  36. isar-1.23.0/tests/isar/models/example_mission_definition.json +37 -0
  37. {isar-1.22.3 → isar-1.23.0}/tests/isar/models/test_start_mission_definition.py +11 -42
  38. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/readers/test_base_reader.py +3 -7
  39. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/readers/test_mission_reader.py +51 -50
  40. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/utilities/test_scheduling_utilities.py +2 -2
  41. {isar-1.22.3 → isar-1.23.0}/tests/isar/state_machine/states/test_monitor.py +15 -20
  42. {isar-1.22.3 → isar-1.23.0}/tests/isar/state_machine/test_state_machine.py +38 -39
  43. {isar-1.22.3 → isar-1.23.0}/tests/isar/storage/test_uploader.py +2 -2
  44. isar-1.23.0/tests/mocks/mission_definition.py +119 -0
  45. {isar-1.22.3 → isar-1.23.0}/tests/mocks/robot_interface.py +12 -12
  46. isar-1.23.0/tests/mocks/task.py +16 -0
  47. isar-1.23.0/tests/test_data/test_mission_working.json +93 -0
  48. isar-1.23.0/tests/test_data/test_thermal_image_mission.json +30 -0
  49. isar-1.22.3/src/isar/apis/models/start_mission_definition.py +0 -237
  50. isar-1.22.3/src/isar/config/predefined_missions/default.json +0 -92
  51. isar-1.22.3/src/isar/config/predefined_missions/default_turtlebot.json +0 -110
  52. isar-1.22.3/src/robot_interface/models/mission/step.py +0 -234
  53. isar-1.22.3/src/robot_interface/models/mission/task.py +0 -130
  54. isar-1.22.3/tests/isar/mission/test_mission.py +0 -171
  55. isar-1.22.3/tests/isar/models/example_mission_definition.json +0 -40
  56. isar-1.22.3/tests/mocks/mission_definition.py +0 -179
  57. isar-1.22.3/tests/mocks/step.py +0 -14
  58. isar-1.22.3/tests/mocks/task.py +0 -0
  59. isar-1.22.3/tests/test_data/test_mission_working.json +0 -115
  60. isar-1.22.3/tests/test_data/test_thermal_image_mission.json +0 -18
  61. {isar-1.22.3 → isar-1.23.0}/.dockerignore +0 -0
  62. {isar-1.22.3 → isar-1.23.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  63. {isar-1.22.3 → isar-1.23.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  64. {isar-1.22.3 → isar-1.23.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  65. {isar-1.22.3 → isar-1.23.0}/.github/release.yml +0 -0
  66. {isar-1.22.3 → isar-1.23.0}/.github/workflows/compile_requirements.yml +0 -0
  67. {isar-1.22.3 → isar-1.23.0}/.github/workflows/project_automations.yml +0 -0
  68. {isar-1.22.3 → isar-1.23.0}/.github/workflows/publish_isar_base_image.yml +0 -0
  69. {isar-1.22.3 → isar-1.23.0}/.github/workflows/pythonpackage.yml +0 -0
  70. {isar-1.22.3 → isar-1.23.0}/.github/workflows/pythonpublish.yml +0 -0
  71. {isar-1.22.3 → isar-1.23.0}/.github/workflows/stale.yml +0 -0
  72. {isar-1.22.3 → isar-1.23.0}/.gitignore +0 -0
  73. {isar-1.22.3 → isar-1.23.0}/.pre-commit-config.yaml +0 -0
  74. {isar-1.22.3 → isar-1.23.0}/Dockerfile +0 -0
  75. {isar-1.22.3 → isar-1.23.0}/LICENSE +0 -0
  76. {isar-1.22.3 → isar-1.23.0}/README.md +0 -0
  77. {isar-1.22.3 → isar-1.23.0}/SECURITY.md +0 -0
  78. {isar-1.22.3 → isar-1.23.0}/docker-compose-turtlebot.yml +0 -0
  79. {isar-1.22.3 → isar-1.23.0}/docker-compose.yml +0 -0
  80. {isar-1.22.3 → isar-1.23.0}/docs/Makefile +0 -0
  81. {isar-1.22.3 → isar-1.23.0}/docs/make.bat +0 -0
  82. {isar-1.22.3 → isar-1.23.0}/docs/rst_processing.py +0 -0
  83. {isar-1.22.3 → isar-1.23.0}/docs/source/conf.py +0 -0
  84. {isar-1.22.3 → isar-1.23.0}/docs/source/index.rst +0 -0
  85. {isar-1.22.3 → isar-1.23.0}/docs/source/readme_link.md +0 -0
  86. {isar-1.22.3 → isar-1.23.0}/docs/state_machine_diagram.png +0 -0
  87. {isar-1.22.3 → isar-1.23.0}/main.py +0 -0
  88. {isar-1.22.3 → isar-1.23.0}/pyproject.toml +0 -0
  89. {isar-1.22.3 → isar-1.23.0}/radixconfig.yml +0 -0
  90. {isar-1.22.3 → isar-1.23.0}/setup.cfg +0 -0
  91. {isar-1.22.3 → isar-1.23.0}/src/isar/__init__.py +0 -0
  92. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/__init__.py +0 -0
  93. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/models/__init__.py +0 -0
  94. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/schedule/__init__.py +0 -0
  95. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/security/__init__.py +0 -0
  96. {isar-1.22.3 → isar-1.23.0}/src/isar/apis/security/authentication.py +0 -0
  97. {isar-1.22.3 → isar-1.23.0}/src/isar/config/__init__.py +0 -0
  98. {isar-1.22.3 → isar-1.23.0}/src/isar/config/certs/ca-cert.pem +0 -0
  99. {isar-1.22.3 → isar-1.23.0}/src/isar/config/configuration_error.py +0 -0
  100. {isar-1.22.3 → isar-1.23.0}/src/isar/config/keyvault/__init__.py +0 -0
  101. {isar-1.22.3 → isar-1.23.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
  102. {isar-1.22.3 → isar-1.23.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
  103. {isar-1.22.3 → isar-1.23.0}/src/isar/config/log.py +0 -0
  104. {isar-1.22.3 → isar-1.23.0}/src/isar/config/logging.conf +0 -0
  105. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  106. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  107. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/default_map.json +0 -0
  108. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/klab_b.json +0 -0
  109. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/klab_compressor.json +0 -0
  110. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
  111. {isar-1.22.3 → isar-1.23.0}/src/isar/config/maps/turtleworld.json +0 -0
  112. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  113. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  114. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  115. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  116. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_missions/__init__.py +0 -0
  117. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_poses/__init__.py +0 -0
  118. {isar-1.22.3 → isar-1.23.0}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
  119. {isar-1.22.3 → isar-1.23.0}/src/isar/mission_planner/__init__.py +0 -0
  120. {isar-1.22.3 → isar-1.23.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  121. {isar-1.22.3 → isar-1.23.0}/src/isar/models/__init__.py +0 -0
  122. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/__init__.py +0 -0
  123. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/message.py +0 -0
  124. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/queues/__init__.py +0 -0
  125. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/queues/queue_io.py +0 -0
  126. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  127. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/queues/queues.py +0 -0
  128. {isar-1.22.3 → isar-1.23.0}/src/isar/models/communication/queues/status_queue.py +0 -0
  129. {isar-1.22.3 → isar-1.23.0}/src/isar/models/mission_metadata/__init__.py +0 -0
  130. {isar-1.22.3 → isar-1.23.0}/src/isar/modules.py +0 -0
  131. {isar-1.22.3 → isar-1.23.0}/src/isar/services/__init__.py +0 -0
  132. {isar-1.22.3 → isar-1.23.0}/src/isar/services/auth/__init__.py +0 -0
  133. {isar-1.22.3 → isar-1.23.0}/src/isar/services/auth/azure_credentials.py +0 -0
  134. {isar-1.22.3 → isar-1.23.0}/src/isar/services/readers/__init__.py +0 -0
  135. {isar-1.22.3 → isar-1.23.0}/src/isar/services/readers/base_reader.py +0 -0
  136. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/__init__.py +0 -0
  137. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  138. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  139. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  140. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/request_handler.py +0 -0
  141. {isar-1.22.3 → isar-1.23.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
  142. {isar-1.22.3 → isar-1.23.0}/src/isar/services/utilities/__init__.py +0 -0
  143. {isar-1.22.3 → isar-1.23.0}/src/isar/services/utilities/queue_utilities.py +0 -0
  144. {isar-1.22.3 → isar-1.23.0}/src/isar/services/utilities/threaded_request.py +0 -0
  145. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/__init__.py +0 -0
  146. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/__init__.py +0 -0
  147. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states/off.py +0 -0
  148. {isar-1.22.3 → isar-1.23.0}/src/isar/state_machine/states_enum.py +0 -0
  149. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/__init__.py +0 -0
  150. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/blob_storage.py +0 -0
  151. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/local_storage.py +0 -0
  152. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/slimm_storage.py +0 -0
  153. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/storage_interface.py +0 -0
  154. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/uploader.py +0 -0
  155. {isar-1.22.3 → isar-1.23.0}/src/isar/storage/utilities.py +0 -0
  156. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/dependency_links.txt +0 -0
  157. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/entry_points.txt +0 -0
  158. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/requires.txt +0 -0
  159. {isar-1.22.3 → isar-1.23.0}/src/isar.egg-info/top_level.txt +0 -0
  160. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/__init__.py +0 -0
  161. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/__init__.py +0 -0
  162. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
  163. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/initialize/__init__.py +0 -0
  164. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  165. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/inspection/__init__.py +0 -0
  166. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/mission/__init__.py +0 -0
  167. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/robots/__init__.py +0 -0
  168. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/models/robots/robot_model.py +0 -0
  169. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/telemetry/__init__.py +0 -0
  170. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/telemetry/media_connection_type.py +0 -0
  171. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  172. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/telemetry/payloads.py +0 -0
  173. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/test_robot_interface.py +0 -0
  174. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/utilities/__init__.py +0 -0
  175. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/utilities/json_service.py +0 -0
  176. {isar-1.22.3 → isar-1.23.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  177. {isar-1.22.3 → isar-1.23.0}/tests/__init__.py +0 -0
  178. {isar-1.22.3 → isar-1.23.0}/tests/conftest.py +0 -0
  179. {isar-1.22.3 → isar-1.23.0}/tests/integration/__init__.py +0 -0
  180. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/__init__.py +0 -0
  181. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/config/__init__.py +0 -0
  182. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  183. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  184. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  185. {isar-1.22.3 → isar-1.23.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
  186. {isar-1.22.3 → isar-1.23.0}/tests/isar/__init__.py +0 -0
  187. {isar-1.22.3 → isar-1.23.0}/tests/isar/apis/__init__.py +0 -0
  188. {isar-1.22.3 → isar-1.23.0}/tests/isar/apis/scheduler/__init__.py +0 -0
  189. {isar-1.22.3 → isar-1.23.0}/tests/isar/apis/security/__init__.py +0 -0
  190. {isar-1.22.3 → isar-1.23.0}/tests/isar/apis/security/test_authentication.py +0 -0
  191. {isar-1.22.3 → isar-1.23.0}/tests/isar/mission/__init__.py +0 -0
  192. {isar-1.22.3 → isar-1.23.0}/tests/isar/models/__init__.py +0 -0
  193. {isar-1.22.3 → isar-1.23.0}/tests/isar/models/communication/__init__.py +0 -0
  194. {isar-1.22.3 → isar-1.23.0}/tests/isar/models/communication/test_queues.py +0 -0
  195. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/__init__.py +0 -0
  196. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/readers/__init__.py +0 -0
  197. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/service_connections/__init__.py +0 -0
  198. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  199. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  200. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/utilities/__init__.py +0 -0
  201. {isar-1.22.3 → isar-1.23.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  202. {isar-1.22.3 → isar-1.23.0}/tests/isar/state_machine/__init__.py +0 -0
  203. {isar-1.22.3 → isar-1.23.0}/tests/isar/state_machine/states/__init__.py +0 -0
  204. {isar-1.22.3 → isar-1.23.0}/tests/isar/storage/test_blob_storage.py +0 -0
  205. {isar-1.22.3 → isar-1.23.0}/tests/mocks/__init__.py +0 -0
  206. {isar-1.22.3 → isar-1.23.0}/tests/mocks/blob_storage.py +0 -0
  207. {isar-1.22.3 → isar-1.23.0}/tests/mocks/mqtt_client.py +0 -0
  208. {isar-1.22.3 → isar-1.23.0}/tests/mocks/pose.py +0 -0
  209. {isar-1.22.3 → isar-1.23.0}/tests/mocks/request.py +0 -0
  210. {isar-1.22.3 → isar-1.23.0}/tests/mocks/status.py +0 -0
  211. {isar-1.22.3 → isar-1.23.0}/tests/mocks/token.py +0 -0
  212. {isar-1.22.3 → isar-1.23.0}/tests/test_data/test_json_file.json +0 -0
  213. {isar-1.22.3 → isar-1.23.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
  214. {isar-1.22.3 → isar-1.23.0}/tests/test_data/test_mission_not_working.json +0 -0
  215. {isar-1.22.3 → isar-1.23.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  216. {isar-1.22.3 → isar-1.23.0}/tests/test_modules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.22.3
3
+ Version: 1.23.0
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -8,23 +8,23 @@ alitra==1.1.3
8
8
  # via isar (pyproject.toml)
9
9
  annotated-types==0.7.0
10
10
  # via pydantic
11
- anyio==4.4.0
11
+ anyio==4.6.0
12
12
  # via
13
13
  # httpx
14
14
  # starlette
15
- azure-core==1.30.2
15
+ azure-core==1.31.0
16
16
  # via
17
17
  # azure-identity
18
18
  # azure-keyvault-secrets
19
19
  # azure-storage-blob
20
20
  # opencensus-ext-azure
21
- azure-identity==1.17.1
21
+ azure-identity==1.18.0
22
22
  # via
23
23
  # isar (pyproject.toml)
24
24
  # opencensus-ext-azure
25
25
  azure-keyvault-secrets==4.8.0
26
26
  # via isar (pyproject.toml)
27
- azure-storage-blob==12.22.0
27
+ azure-storage-blob==12.23.1
28
28
  # via isar (pyproject.toml)
29
29
  backoff==2.2.1
30
30
  # via isar (pyproject.toml)
@@ -54,15 +54,15 @@ dacite==1.8.1
54
54
  # via
55
55
  # alitra
56
56
  # isar (pyproject.toml)
57
- fastapi==0.114.1
57
+ fastapi==0.115.0
58
58
  # via
59
59
  # fastapi-azure-auth
60
60
  # isar (pyproject.toml)
61
61
  fastapi-azure-auth==5.0.1
62
62
  # via isar (pyproject.toml)
63
- google-api-core==2.19.2
63
+ google-api-core==2.20.0
64
64
  # via opencensus
65
- google-auth==2.34.0
65
+ google-auth==2.35.0
66
66
  # via google-api-core
67
67
  googleapis-common-protos==1.65.0
68
68
  # via google-api-core
@@ -70,18 +70,18 @@ h11==0.14.0
70
70
  # via
71
71
  # httpcore
72
72
  # uvicorn
73
- httpcore==1.0.5
73
+ httpcore==1.0.6
74
74
  # via httpx
75
75
  httpx==0.27.2
76
76
  # via fastapi-azure-auth
77
- idna==3.8
77
+ idna==3.10
78
78
  # via
79
79
  # anyio
80
80
  # httpx
81
81
  # requests
82
82
  injector==0.22.0
83
83
  # via isar (pyproject.toml)
84
- isodate==0.6.1
84
+ isodate==0.7.0
85
85
  # via
86
86
  # azure-keyvault-secrets
87
87
  # azure-storage-blob
@@ -91,7 +91,7 @@ msal==1.31.0
91
91
  # msal-extensions
92
92
  msal-extensions==1.2.0
93
93
  # via azure-identity
94
- numpy==2.1.1
94
+ numpy==2.1.2
95
95
  # via
96
96
  # alitra
97
97
  # isar (pyproject.toml)
@@ -115,7 +115,7 @@ portalocker==2.10.1
115
115
  # via msal-extensions
116
116
  proto-plus==1.24.0
117
117
  # via google-api-core
118
- protobuf==5.28.1
118
+ protobuf==5.28.2
119
119
  # via
120
120
  # google-api-core
121
121
  # googleapis-common-protos
@@ -130,12 +130,12 @@ pyasn1-modules==0.4.1
130
130
  # via google-auth
131
131
  pycparser==2.22
132
132
  # via cffi
133
- pydantic==2.9.1
133
+ pydantic==2.9.2
134
134
  # via
135
135
  # fastapi
136
136
  # isar (pyproject.toml)
137
137
  # pydantic-settings
138
- pydantic-core==2.23.3
138
+ pydantic-core==2.23.4
139
139
  # via pydantic
140
140
  pydantic-settings==2.5.2
141
141
  # via isar (pyproject.toml)
@@ -168,14 +168,13 @@ scipy==1.14.1
168
168
  six==1.16.0
169
169
  # via
170
170
  # azure-core
171
- # isodate
172
171
  # opencensus
173
172
  # transitions
174
173
  sniffio==1.3.1
175
174
  # via
176
175
  # anyio
177
176
  # httpx
178
- starlette==0.38.5
177
+ starlette==0.38.6
179
178
  # via fastapi
180
179
  transitions==0.9.2
181
180
  # via isar (pyproject.toml)
@@ -188,9 +187,9 @@ typing-extensions==4.12.2
188
187
  # fastapi
189
188
  # pydantic
190
189
  # pydantic-core
191
- urllib3==2.2.2
190
+ urllib3==2.2.3
192
191
  # via requests
193
- uvicorn==0.30.6
192
+ uvicorn==0.31.0
194
193
  # via isar (pyproject.toml)
195
194
  wrapt==1.16.0
196
195
  # via opencensus-ext-requests
@@ -213,6 +213,7 @@ class API:
213
213
  methods=["POST"],
214
214
  dependencies=[authentication_dependency],
215
215
  summary="Drive to the provided pose",
216
+ deprecated=True,
216
217
  responses={
217
218
  HTTPStatus.OK.value: {
218
219
  "description": "Drive to succesfully started",
@@ -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
- steps: List[StepResponse]
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 List, Optional
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.step import (
25
- DriveToPose,
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
- step: DriveToPose = DriveToPose(pose=pose)
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
- step: DriveToPose = DriveToPose(pose=pose)
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 step",
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
- step: DriveToPose = DriveToPose(pose=pose)
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
- step: Localize = Localize(localization_pose=pose)
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
- step: MoveArm = MoveArm(arm_pose=arm_pose_literal)
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: Task) -> TaskResponse:
326
- steps: List[dict] = []
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
+ }
@@ -1,6 +1,6 @@
1
1
  ISAR_ROBOT_PACKAGE = isar_robot
2
2
 
3
- ISAR_RUN_MISSION_STEPWISE = true
3
+ ISAR_RUN_MISSION_BY_TASK = true
4
4
 
5
5
  ISAR_STORAGE_LOCAL_ENABLED = true
6
6
  ISAR_STORAGE_BLOB_ENABLED = false