isar 1.16.9__tar.gz → 1.16.11__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.
Files changed (203) hide show
  1. {isar-1.16.9 → isar-1.16.11}/.github/workflows/pythonpackage.yml +1 -1
  2. {isar-1.16.9 → isar-1.16.11}/Dockerfile +10 -4
  3. {isar-1.16.9 → isar-1.16.11}/PKG-INFO +8 -8
  4. {isar-1.16.9 → isar-1.16.11}/README.md +6 -6
  5. isar-1.16.11/SECURITY.md +18 -0
  6. {isar-1.16.9 → isar-1.16.11}/setup.py +1 -1
  7. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/models/start_mission_definition.py +75 -39
  8. {isar-1.16.9 → isar-1.16.11}/src/isar/config/log.py +3 -1
  9. isar-1.16.11/src/isar/config/predefined_mission_definition/default_exr.json +51 -0
  10. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/mqtt/mqtt_client.py +1 -1
  11. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/mqtt/robot_status_publisher.py +15 -9
  12. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/state_machine.py +9 -9
  13. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/idle.py +3 -3
  14. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/monitor.py +6 -6
  15. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/slimm_storage.py +22 -18
  16. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/utilities.py +5 -3
  17. {isar-1.16.9 → isar-1.16.11}/src/isar.egg-info/PKG-INFO +8 -8
  18. {isar-1.16.9 → isar-1.16.11}/src/isar.egg-info/SOURCES.txt +2 -0
  19. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/mission/step.py +1 -1
  20. {isar-1.16.9 → isar-1.16.11}/.dockerignore +0 -0
  21. {isar-1.16.9 → isar-1.16.11}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {isar-1.16.9 → isar-1.16.11}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  23. {isar-1.16.9 → isar-1.16.11}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  24. {isar-1.16.9 → isar-1.16.11}/.github/release.yml +0 -0
  25. {isar-1.16.9 → isar-1.16.11}/.github/workflows/project_automations.yml +0 -0
  26. {isar-1.16.9 → isar-1.16.11}/.github/workflows/publish_isar_base_image.yml +0 -0
  27. {isar-1.16.9 → isar-1.16.11}/.github/workflows/pythonpublish.yml +0 -0
  28. {isar-1.16.9 → isar-1.16.11}/.github/workflows/repository_dispatch_on_merge.yml +0 -0
  29. {isar-1.16.9 → isar-1.16.11}/.github/workflows/stale.yml +0 -0
  30. {isar-1.16.9 → isar-1.16.11}/.gitignore +0 -0
  31. {isar-1.16.9 → isar-1.16.11}/.pre-commit-config.yaml +0 -0
  32. {isar-1.16.9 → isar-1.16.11}/LICENSE +0 -0
  33. {isar-1.16.9 → isar-1.16.11}/docker-compose-turtlebot.yml +0 -0
  34. {isar-1.16.9 → isar-1.16.11}/docker-compose.yml +0 -0
  35. {isar-1.16.9 → isar-1.16.11}/docs/Makefile +0 -0
  36. {isar-1.16.9 → isar-1.16.11}/docs/make.bat +0 -0
  37. {isar-1.16.9 → isar-1.16.11}/docs/rst_processing.py +0 -0
  38. {isar-1.16.9 → isar-1.16.11}/docs/source/conf.py +0 -0
  39. {isar-1.16.9 → isar-1.16.11}/docs/source/index.rst +0 -0
  40. {isar-1.16.9 → isar-1.16.11}/docs/source/readme_link.md +0 -0
  41. {isar-1.16.9 → isar-1.16.11}/docs/state_machine_diagram.png +0 -0
  42. {isar-1.16.9 → isar-1.16.11}/main.py +0 -0
  43. {isar-1.16.9 → isar-1.16.11}/pyproject.toml +0 -0
  44. {isar-1.16.9 → isar-1.16.11}/radixconfig.yml +0 -0
  45. {isar-1.16.9 → isar-1.16.11}/setup.cfg +0 -0
  46. {isar-1.16.9 → isar-1.16.11}/src/isar/__init__.py +0 -0
  47. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/__init__.py +0 -0
  48. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/api.py +0 -0
  49. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/models/__init__.py +0 -0
  50. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/models/models.py +0 -0
  51. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/schedule/__init__.py +0 -0
  52. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  53. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/security/__init__.py +0 -0
  54. {isar-1.16.9 → isar-1.16.11}/src/isar/apis/security/authentication.py +0 -0
  55. {isar-1.16.9 → isar-1.16.11}/src/isar/config/__init__.py +0 -0
  56. {isar-1.16.9 → isar-1.16.11}/src/isar/config/certs/ca-cert.pem +0 -0
  57. {isar-1.16.9 → isar-1.16.11}/src/isar/config/configuration_error.py +0 -0
  58. {isar-1.16.9 → isar-1.16.11}/src/isar/config/keyvault/__init__.py +0 -0
  59. {isar-1.16.9 → isar-1.16.11}/src/isar/config/keyvault/keyvault_error.py +0 -0
  60. {isar-1.16.9 → isar-1.16.11}/src/isar/config/keyvault/keyvault_service.py +0 -0
  61. {isar-1.16.9 → isar-1.16.11}/src/isar/config/logging.conf +0 -0
  62. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  63. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  64. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/default_map.json +0 -0
  65. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/klab_b.json +0 -0
  66. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/klab_compressor.json +0 -0
  67. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/klab_turtlebot.json +0 -0
  68. {isar-1.16.9 → isar-1.16.11}/src/isar/config/maps/turtleworld.json +0 -0
  69. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  70. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  71. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  72. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_missions/__init__.py +0 -0
  73. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_missions/default.json +0 -0
  74. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  75. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_poses/__init__.py +0 -0
  76. {isar-1.16.9 → isar-1.16.11}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
  77. {isar-1.16.9 → isar-1.16.11}/src/isar/config/settings.env +0 -0
  78. {isar-1.16.9 → isar-1.16.11}/src/isar/config/settings.py +0 -0
  79. {isar-1.16.9 → isar-1.16.11}/src/isar/mission_planner/__init__.py +0 -0
  80. {isar-1.16.9 → isar-1.16.11}/src/isar/mission_planner/local_planner.py +0 -0
  81. {isar-1.16.9 → isar-1.16.11}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  82. {isar-1.16.9 → isar-1.16.11}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  83. {isar-1.16.9 → isar-1.16.11}/src/isar/mission_planner/task_selector_interface.py +0 -0
  84. {isar-1.16.9 → isar-1.16.11}/src/isar/models/__init__.py +0 -0
  85. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/__init__.py +0 -0
  86. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/message.py +0 -0
  87. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/queues/__init__.py +0 -0
  88. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/queues/queue_io.py +0 -0
  89. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  90. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/queues/queues.py +0 -0
  91. {isar-1.16.9 → isar-1.16.11}/src/isar/models/communication/queues/status_queue.py +0 -0
  92. {isar-1.16.9 → isar-1.16.11}/src/isar/models/mission_metadata/__init__.py +0 -0
  93. {isar-1.16.9 → isar-1.16.11}/src/isar/modules.py +0 -0
  94. {isar-1.16.9 → isar-1.16.11}/src/isar/services/__init__.py +0 -0
  95. {isar-1.16.9 → isar-1.16.11}/src/isar/services/auth/__init__.py +0 -0
  96. {isar-1.16.9 → isar-1.16.11}/src/isar/services/auth/azure_credentials.py +0 -0
  97. {isar-1.16.9 → isar-1.16.11}/src/isar/services/readers/__init__.py +0 -0
  98. {isar-1.16.9 → isar-1.16.11}/src/isar/services/readers/base_reader.py +0 -0
  99. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/__init__.py +0 -0
  100. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  101. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  102. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  103. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/request_handler.py +0 -0
  104. {isar-1.16.9 → isar-1.16.11}/src/isar/services/service_connections/stid/__init__.py +0 -0
  105. {isar-1.16.9 → isar-1.16.11}/src/isar/services/utilities/__init__.py +0 -0
  106. {isar-1.16.9 → isar-1.16.11}/src/isar/services/utilities/queue_utilities.py +0 -0
  107. {isar-1.16.9 → isar-1.16.11}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  108. {isar-1.16.9 → isar-1.16.11}/src/isar/services/utilities/threaded_request.py +0 -0
  109. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/__init__.py +0 -0
  110. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/__init__.py +0 -0
  111. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/initialize.py +0 -0
  112. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/initiate.py +0 -0
  113. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/off.py +0 -0
  114. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/paused.py +0 -0
  115. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states/stop.py +0 -0
  116. {isar-1.16.9 → isar-1.16.11}/src/isar/state_machine/states_enum.py +0 -0
  117. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/__init__.py +0 -0
  118. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/blob_storage.py +0 -0
  119. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/local_storage.py +0 -0
  120. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/storage_interface.py +0 -0
  121. {isar-1.16.9 → isar-1.16.11}/src/isar/storage/uploader.py +0 -0
  122. {isar-1.16.9 → isar-1.16.11}/src/isar.egg-info/dependency_links.txt +0 -0
  123. {isar-1.16.9 → isar-1.16.11}/src/isar.egg-info/requires.txt +0 -0
  124. {isar-1.16.9 → isar-1.16.11}/src/isar.egg-info/top_level.txt +0 -0
  125. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/__init__.py +0 -0
  126. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/__init__.py +0 -0
  127. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/exceptions/__init__.py +0 -0
  128. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  129. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/initialize/__init__.py +0 -0
  130. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  131. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/inspection/__init__.py +0 -0
  132. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/inspection/inspection.py +0 -0
  133. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/mission/__init__.py +0 -0
  134. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/mission/mission.py +0 -0
  135. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/mission/status.py +0 -0
  136. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/mission/task.py +0 -0
  137. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/robots/__init__.py +0 -0
  138. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/models/robots/robot_model.py +0 -0
  139. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/robot_interface.py +0 -0
  140. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/telemetry/__init__.py +0 -0
  141. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  142. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/telemetry/payloads.py +0 -0
  143. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/test_robot_interface.py +0 -0
  144. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/utilities/__init__.py +0 -0
  145. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/utilities/json_service.py +0 -0
  146. {isar-1.16.9 → isar-1.16.11}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  147. {isar-1.16.9 → isar-1.16.11}/tests/__init__.py +0 -0
  148. {isar-1.16.9 → isar-1.16.11}/tests/conftest.py +0 -0
  149. {isar-1.16.9 → isar-1.16.11}/tests/integration/__init__.py +0 -0
  150. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/__init__.py +0 -0
  151. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/config/__init__.py +0 -0
  152. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  153. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  154. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  155. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/config/missions/default.json +0 -0
  156. {isar-1.16.9 → isar-1.16.11}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  157. {isar-1.16.9 → isar-1.16.11}/tests/isar/__init__.py +0 -0
  158. {isar-1.16.9 → isar-1.16.11}/tests/isar/apis/__init__.py +0 -0
  159. {isar-1.16.9 → isar-1.16.11}/tests/isar/apis/scheduler/__init__.py +0 -0
  160. {isar-1.16.9 → isar-1.16.11}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  161. {isar-1.16.9 → isar-1.16.11}/tests/isar/apis/security/__init__.py +0 -0
  162. {isar-1.16.9 → isar-1.16.11}/tests/isar/apis/security/test_authentication.py +0 -0
  163. {isar-1.16.9 → isar-1.16.11}/tests/isar/mission/__init__.py +0 -0
  164. {isar-1.16.9 → isar-1.16.11}/tests/isar/mission/test_mission.py +0 -0
  165. {isar-1.16.9 → isar-1.16.11}/tests/isar/models/__init__.py +0 -0
  166. {isar-1.16.9 → isar-1.16.11}/tests/isar/models/communication/__init__.py +0 -0
  167. {isar-1.16.9 → isar-1.16.11}/tests/isar/models/communication/test_queues.py +0 -0
  168. {isar-1.16.9 → isar-1.16.11}/tests/isar/models/example_mission_definition.json +0 -0
  169. {isar-1.16.9 → isar-1.16.11}/tests/isar/models/test_start_mission_definition.py +0 -0
  170. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/__init__.py +0 -0
  171. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/readers/__init__.py +0 -0
  172. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/readers/test_base_reader.py +0 -0
  173. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/readers/test_mission_reader.py +0 -0
  174. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/service_connections/__init__.py +0 -0
  175. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  176. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  177. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/utilities/__init__.py +0 -0
  178. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  179. {isar-1.16.9 → isar-1.16.11}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  180. {isar-1.16.9 → isar-1.16.11}/tests/isar/state_machine/__init__.py +0 -0
  181. {isar-1.16.9 → isar-1.16.11}/tests/isar/state_machine/states/__init__.py +0 -0
  182. {isar-1.16.9 → isar-1.16.11}/tests/isar/state_machine/states/test_monitor.py +0 -0
  183. {isar-1.16.9 → isar-1.16.11}/tests/isar/state_machine/test_state_machine.py +0 -0
  184. {isar-1.16.9 → isar-1.16.11}/tests/isar/storage/test_blob_storage.py +0 -0
  185. {isar-1.16.9 → isar-1.16.11}/tests/isar/storage/test_uploader.py +0 -0
  186. {isar-1.16.9 → isar-1.16.11}/tests/mocks/__init__.py +0 -0
  187. {isar-1.16.9 → isar-1.16.11}/tests/mocks/blob_storage.py +0 -0
  188. {isar-1.16.9 → isar-1.16.11}/tests/mocks/mission_definition.py +0 -0
  189. {isar-1.16.9 → isar-1.16.11}/tests/mocks/mqtt_client.py +0 -0
  190. {isar-1.16.9 → isar-1.16.11}/tests/mocks/pose.py +0 -0
  191. {isar-1.16.9 → isar-1.16.11}/tests/mocks/request.py +0 -0
  192. {isar-1.16.9 → isar-1.16.11}/tests/mocks/robot_interface.py +0 -0
  193. {isar-1.16.9 → isar-1.16.11}/tests/mocks/status.py +0 -0
  194. {isar-1.16.9 → isar-1.16.11}/tests/mocks/step.py +0 -0
  195. {isar-1.16.9 → isar-1.16.11}/tests/mocks/task.py +0 -0
  196. {isar-1.16.9 → isar-1.16.11}/tests/mocks/token.py +0 -0
  197. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_json_file.json +0 -0
  198. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_map_config/test_map_config.json +0 -0
  199. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_mission_not_working.json +0 -0
  200. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_mission_working.json +0 -0
  201. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  202. {isar-1.16.9 → isar-1.16.11}/tests/test_data/test_thermal_image_mission.json +0 -0
  203. {isar-1.16.9 → isar-1.16.11}/tests/test_modules.py +0 -0
@@ -14,7 +14,7 @@ jobs:
14
14
  strategy:
15
15
  fail-fast: false
16
16
  matrix:
17
- python-version: ["3.8", "3.9", "3.10"]
17
+ python-version: ["3.10", "3.11", "3.12"]
18
18
 
19
19
  steps:
20
20
  - uses: actions/checkout@v3
@@ -1,13 +1,13 @@
1
- FROM python:3.10-slim
1
+ FROM python:3.10-slim AS builder
2
2
 
3
- WORKDIR /app
3
+ RUN apt-get update
4
+ RUN apt-get install -y --no-install-recommends build-essential gcc
5
+ RUN python -m pip install --upgrade pip
4
6
 
5
7
  ENV VIRTUAL_ENV=/venv
6
8
  RUN python -m venv --copies $VIRTUAL_ENV
7
9
  ENV PATH="$VIRTUAL_ENV/bin:$PATH"
8
10
 
9
- RUN python -m pip install --upgrade pip
10
-
11
11
  # Install dependencies before ISAR to cache pip installation
12
12
  RUN mkdir -p src
13
13
  COPY setup.py README.md ./
@@ -20,6 +20,12 @@ COPY . .
20
20
 
21
21
  RUN pip install .
22
22
 
23
+ FROM python:3.10-slim
24
+ COPY --from=builder $VIRTUAL_ENV $VIRTUAL_ENV
25
+ ENV PATH="$VIRTUAL_ENV/bin:$PATH"
26
+
27
+ WORKDIR /app
28
+
23
29
  EXPOSE 3000
24
30
 
25
31
  # Env variable for ISAR to know it is running in docker
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.16.9
3
+ Version: 1.16.11
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Home-page: https://github.com/equinor/isar
6
6
  Author: Equinor ASA
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python
12
12
  Classifier: Topic :: Scientific/Engineering
13
13
  Classifier: Topic :: Scientific/Engineering :: Physics
14
14
  Classifier: Topic :: Software Development :: Libraries
15
- Requires-Python: >=3.8
15
+ Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: alitra>=1.1.0
@@ -246,12 +246,6 @@ make docs
246
246
 
247
247
  The documentation can now be viewed at `docs/build/html/index.html`.
248
248
 
249
- ### Contributing
250
-
251
- We welcome all kinds of contributions, including code, bug reports, issues, feature requests, and documentation. The
252
- preferred way of submitting a contribution is to either make an [issue](https://github.com/equinor/isar/issues) on
253
- GitHub or by forking the project on GitHub and making a pull requests.
254
-
255
249
  ## Components
256
250
 
257
251
  The system consists of two main components.
@@ -420,3 +414,9 @@ ISAR_MQTT_PASSWORD
420
414
  ```
421
415
 
422
416
  If not specified the password will default to an empty string.
417
+
418
+ # Contributions
419
+
420
+ Equinor welcomes all kinds of contributions, including code, bug reports, issues, feature requests, and documentation
421
+ Please initiate your contribution by creating an [issue](https://github.com/equinor/isar/issues) or by forking the
422
+ project and making a pull requests. Commit messages shall be written according to [this guide](https://cbea.msgit-commit/).
@@ -192,12 +192,6 @@ make docs
192
192
 
193
193
  The documentation can now be viewed at `docs/build/html/index.html`.
194
194
 
195
- ### Contributing
196
-
197
- We welcome all kinds of contributions, including code, bug reports, issues, feature requests, and documentation. The
198
- preferred way of submitting a contribution is to either make an [issue](https://github.com/equinor/isar/issues) on
199
- GitHub or by forking the project on GitHub and making a pull requests.
200
-
201
195
  ## Components
202
196
 
203
197
  The system consists of two main components.
@@ -366,3 +360,9 @@ ISAR_MQTT_PASSWORD
366
360
  ```
367
361
 
368
362
  If not specified the password will default to an empty string.
363
+
364
+ # Contributions
365
+
366
+ Equinor welcomes all kinds of contributions, including code, bug reports, issues, feature requests, and documentation
367
+ Please initiate your contribution by creating an [issue](https://github.com/equinor/isar/issues) or by forking the
368
+ project and making a pull requests. Commit messages shall be written according to [this guide](https://cbea.msgit-commit/).
@@ -0,0 +1,18 @@
1
+ ## SECURITY.md template for isar (public repository)
2
+
3
+ If you discover a security vulnerability in this project, please follow these steps to responsibly disclose it:
4
+
5
+ 1. **Do not** create a public GitHub issue for the vulnerability.
6
+ 2. Follow our guideline for Responsible Disclosure Policy at [https://www.equinor.com/about-us/csirt](https://www.equinor.com/about-us/csirt) to report the issue
7
+
8
+ The following information will help us triage your report more quickly:
9
+
10
+ - Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
11
+ - Full paths of source file(s) related to the manifestation of the issue
12
+ - The location of the affected source code (tag/branch/commit or direct URL)
13
+ - Any special configuration required to reproduce the issue
14
+ - Step-by-step instructions to reproduce the issue
15
+ - Proof-of-concept or exploit code (if possible)
16
+ - Impact of the issue, including how an attacker might exploit the issue
17
+
18
+ We prefer all communications to be in English.
@@ -66,5 +66,5 @@ setup(
66
66
  "sphinx",
67
67
  ]
68
68
  },
69
- python_requires=">=3.8",
69
+ python_requires=">=3.10",
70
70
  )
@@ -10,9 +10,11 @@ from isar.config.settings import settings
10
10
  from isar.mission_planner.mission_planner_interface import MissionPlannerError
11
11
  from robot_interface.models.mission.mission import Mission
12
12
  from robot_interface.models.mission.step import (
13
- STEPS,
13
+ DockingProcedure,
14
14
  DriveToPose,
15
+ Localize,
15
16
  RecordAudio,
17
+ STEPS,
16
18
  TakeImage,
17
19
  TakeThermalImage,
18
20
  TakeThermalVideo,
@@ -29,6 +31,13 @@ class InspectionTypes(str, Enum):
29
31
  audio: str = "Audio"
30
32
 
31
33
 
34
+ class TaskType(str, Enum):
35
+ Inspection: str = "inspection"
36
+ DriveTo: str = "drive_to"
37
+ Localization: str = "localization"
38
+ Dock: str = "dock"
39
+
40
+
32
41
  class StartMissionInspectionDefinition(BaseModel):
33
42
  type: InspectionTypes = Field(default=InspectionTypes.image)
34
43
  inspection_target: InputPosition
@@ -39,6 +48,7 @@ class StartMissionInspectionDefinition(BaseModel):
39
48
 
40
49
 
41
50
  class StartMissionTaskDefinition(BaseModel):
51
+ type: TaskType = Field(default=TaskType.Inspection)
42
52
  pose: InputPose
43
53
  inspections: List[StartMissionInspectionDefinition]
44
54
  tag: Optional[str] = None
@@ -53,35 +63,13 @@ class StartMissionDefinition(BaseModel):
53
63
 
54
64
  def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
55
65
  isar_tasks: List[Task] = []
56
- all_inspection_steps: List[STEPS] = []
57
- duplicate_ids: List[str] = []
66
+ all_steps_in_mission: List[STEPS] = []
58
67
 
59
68
  for task in mission_definition.tasks:
60
- try:
61
- tag_id: Optional[str] = task.tag
62
- drive_step: DriveToPose = DriveToPose(pose=task.pose.to_alitra_pose())
63
- inspection_steps: List[STEPS] = [
64
- create_inspection_step(
65
- inspection_type=inspection.type,
66
- duration=inspection.duration,
67
- target=inspection.inspection_target.to_alitra_position(),
68
- tag_id=tag_id,
69
- metadata=inspection.metadata,
70
- id=inspection.id,
71
- )
72
- for inspection in task.inspections
73
- ]
74
- except ValueError as e:
75
- raise MissionPlannerError(f"Failed to create task: {str(e)}")
76
-
77
- duplicate_ids = get_duplicate_ids(items=inspection_steps)
78
- if len(duplicate_ids) > 0:
79
- raise MissionPlannerError(
80
- f"Failed to create task: Duplicate step IDs are not allowed ({duplicate_ids})"
81
- )
82
- all_inspection_steps.extend(inspection_steps)
83
-
84
- isar_task: Task = Task(steps=[drive_step, *inspection_steps], tag_id=tag_id)
69
+ steps: List[STEPS] = generate_steps(task)
70
+ all_steps_in_mission.extend(steps)
71
+
72
+ isar_task: Task = Task(steps=steps, tag_id=task.tag)
85
73
  if task.id:
86
74
  isar_task.id = task.id
87
75
  isar_tasks.append(isar_task)
@@ -89,17 +77,8 @@ def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
89
77
  if not isar_tasks:
90
78
  raise MissionPlannerError("Mission does not contain any valid tasks")
91
79
 
92
- duplicate_ids = get_duplicate_ids(items=isar_tasks)
93
- if len(duplicate_ids) > 0:
94
- raise MissionPlannerError(
95
- f"Failed to create mission: Duplicate task IDs are not allowed ({duplicate_ids})"
96
- )
97
-
98
- duplicate_ids = get_duplicate_ids(items=all_inspection_steps)
99
- if len(duplicate_ids) > 0:
100
- raise MissionPlannerError(
101
- f"Failed to create task: Duplicate step IDs are not allowed ({duplicate_ids})"
102
- )
80
+ check_for_duplicate_ids(isar_tasks)
81
+ check_for_duplicate_ids(all_steps_in_mission)
103
82
 
104
83
  isar_mission: Mission = Mission(tasks=isar_tasks)
105
84
 
@@ -114,6 +93,63 @@ def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
114
93
  return isar_mission
115
94
 
116
95
 
96
+ def check_for_duplicate_ids(items: Union[List[Task], List[STEPS]]):
97
+ duplicate_ids = get_duplicate_ids(items=items)
98
+ if len(duplicate_ids) > 0:
99
+ raise MissionPlannerError(
100
+ f"Failed to create as there were duplicate IDs which is not allowed "
101
+ f"({duplicate_ids})"
102
+ )
103
+
104
+
105
+ def generate_steps(task) -> List[STEPS]:
106
+ steps: List[STEPS] = []
107
+ try:
108
+ match task.type:
109
+ case TaskType.Inspection:
110
+ steps.extend(generate_steps_for_inspection_task(task=task))
111
+ case TaskType.DriveTo:
112
+ steps.append(generate_steps_for_drive_to_task(task=task))
113
+ case TaskType.Localization:
114
+ steps.append(generate_steps_for_localization_task(task=task))
115
+ case TaskType.Dock:
116
+ steps.append(generate_steps_for_dock_task())
117
+ except ValueError as e:
118
+ raise MissionPlannerError(f"Failed to create task: {str(e)}")
119
+
120
+ return steps
121
+
122
+
123
+ def generate_steps_for_inspection_task(task: StartMissionTaskDefinition) -> List[STEPS]:
124
+ drive_step: DriveToPose = DriveToPose(pose=task.pose.to_alitra_pose())
125
+
126
+ inspection_steps: List[STEPS] = [
127
+ create_inspection_step(
128
+ inspection_type=inspection.type,
129
+ duration=inspection.duration,
130
+ target=inspection.inspection_target.to_alitra_position(),
131
+ tag_id=task.tag,
132
+ metadata=inspection.metadata,
133
+ id=inspection.id,
134
+ )
135
+ for inspection in task.inspections
136
+ ]
137
+
138
+ return [drive_step, *inspection_steps]
139
+
140
+
141
+ def generate_steps_for_drive_to_task(task: StartMissionTaskDefinition) -> DriveToPose:
142
+ return DriveToPose(pose=task.pose.to_alitra_pose())
143
+
144
+
145
+ def generate_steps_for_localization_task(task: StartMissionTaskDefinition) -> Localize:
146
+ return Localize(localization_pose=task.pose.to_alitra_pose())
147
+
148
+
149
+ def generate_steps_for_dock_task() -> DockingProcedure:
150
+ return DockingProcedure(behavior="dock")
151
+
152
+
117
153
  def create_inspection_step(
118
154
  inspection_type: InspectionTypes,
119
155
  duration: float,
@@ -54,7 +54,9 @@ def configure_azure_handler(log_config: dict, keyvault: Keyvault) -> logging.Han
54
54
  "application-insights-connection-string"
55
55
  ).value
56
56
  except KeyvaultError:
57
- message: str = f"CRITICAL ERROR: Missing connection string for Application Insights in key vault '{keyvault.name}'."
57
+ message: str = (
58
+ f"CRITICAL ERROR: Missing connection string for Application Insights in key vault '{keyvault.name}'."
59
+ )
58
60
  print(f"\n{message} \n")
59
61
  raise ConfigurationError(message)
60
62
 
@@ -0,0 +1,51 @@
1
+ {
2
+ "mission_definition": {
3
+ "tasks": [
4
+ {
5
+ "pose": {
6
+ "position": {
7
+ "x": -3.2629,
8
+ "y": 3.0795,
9
+ "z": 0.0055,
10
+ "frame_name": "robot"
11
+ },
12
+ "orientation": {
13
+ "x": 0,
14
+ "y": 0,
15
+ "z": 0,
16
+ "w": 1,
17
+ "frame_name": "robot"
18
+ },
19
+ "frame_name": "robot"
20
+ },
21
+ "tag": "equinor_exR_tag_simulator",
22
+ "inspections": [
23
+ {
24
+ "type": "Image",
25
+ "inspection_target": {
26
+ "x": 6.6550,
27
+ "y": 3.7987,
28
+ "z": 0.6145,
29
+ "frame_name": "robot"
30
+ },
31
+ "analysis_types": "CarSeal, Rust",
32
+ "metadata": {
33
+ "zoom": "2x"
34
+ }
35
+ },
36
+ {
37
+ "type": "ThermalVideo",
38
+ "inspection_target": {
39
+ "x": 6.6550,
40
+ "y": 3.7987,
41
+ "z": 0.6145,
42
+ "frame_name": "robot"
43
+ },
44
+ "analysis_types": "GasDetection",
45
+ "duration": 10
46
+ }
47
+ ]
48
+ }
49
+ ]
50
+ }
51
+ }
@@ -53,7 +53,7 @@ class MqttClient(MqttClientInterface):
53
53
 
54
54
  self.port: int = settings.MQTT_PORT
55
55
 
56
- self.client: Client = Client()
56
+ self.client: Client = Client(mqtt.CallbackAPIVersion.VERSION1)
57
57
 
58
58
  self.client.enable_logger(logger=self.logger)
59
59
 
@@ -72,15 +72,21 @@ class RobotStatusPublisher:
72
72
  robot_status=combined_status,
73
73
  previous_robot_status=previous_robot_status,
74
74
  current_isar_state=self.state_machine.current_state,
75
- current_mission_id=self.state_machine.current_mission.id
76
- if self.state_machine.current_mission
77
- else None,
78
- current_task_id=self.state_machine.current_task.id
79
- if self.state_machine.current_task
80
- else None,
81
- current_step_id=self.state_machine.current_step.id
82
- if self.state_machine.current_step
83
- else None,
75
+ current_mission_id=(
76
+ self.state_machine.current_mission.id
77
+ if self.state_machine.current_mission
78
+ else None
79
+ ),
80
+ current_task_id=(
81
+ self.state_machine.current_task.id
82
+ if self.state_machine.current_task
83
+ else None
84
+ ),
85
+ current_step_id=(
86
+ self.state_machine.current_step.id
87
+ if self.state_machine.current_step
88
+ else None
89
+ ),
84
90
  timestamp=datetime.utcnow(),
85
91
  )
86
92
 
@@ -492,9 +492,9 @@ class StateMachine(object):
492
492
  "mission_id": self.current_mission.id if self.current_mission else None,
493
493
  "status": self.current_mission.status if self.current_mission else None,
494
494
  "error_reason": error_message.error_reason if error_message else None,
495
- "error_description": error_message.error_description
496
- if error_message
497
- else None,
495
+ "error_description": (
496
+ error_message.error_description if error_message else None
497
+ ),
498
498
  "timestamp": datetime.utcnow(),
499
499
  },
500
500
  cls=EnhancedJSONEncoder,
@@ -524,9 +524,9 @@ class StateMachine(object):
524
524
  "task_id": task.id if task else None,
525
525
  "status": task.status if task else None,
526
526
  "error_reason": error_message.error_reason if error_message else None,
527
- "error_description": error_message.error_description
528
- if error_message
529
- else None,
527
+ "error_description": (
528
+ error_message.error_description if error_message else None
529
+ ),
530
530
  "timestamp": datetime.utcnow(),
531
531
  },
532
532
  cls=EnhancedJSONEncoder,
@@ -558,9 +558,9 @@ class StateMachine(object):
558
558
  "step_type": step.__class__.__name__ if step else None,
559
559
  "status": step.status if step else None,
560
560
  "error_reason": error_message.error_reason if error_message else None,
561
- "error_description": error_message.error_description
562
- if error_message
563
- else None,
561
+ "error_description": (
562
+ error_message.error_description if error_message else None
563
+ ),
564
564
  "timestamp": datetime.utcnow(),
565
565
  },
566
566
  cls=EnhancedJSONEncoder,
@@ -25,9 +25,9 @@ class Idle(State):
25
25
 
26
26
  def _run(self) -> None:
27
27
  while True:
28
- start_mission: Optional[
29
- StartMissionMessage
30
- ] = self.state_machine.should_start_mission()
28
+ start_mission: Optional[StartMissionMessage] = (
29
+ self.state_machine.should_start_mission()
30
+ )
31
31
  if start_mission:
32
32
  self.state_machine.start_mission(
33
33
  mission=start_mission.mission,
@@ -68,9 +68,9 @@ class Monitor(State):
68
68
  )
69
69
 
70
70
  try:
71
- status: Union[
72
- StepStatus, MissionStatus
73
- ] = self.step_status_thread.get_output()
71
+ status: Union[StepStatus, MissionStatus] = (
72
+ self.step_status_thread.get_output()
73
+ )
74
74
  except ThreadedRequestNotFinishedError:
75
75
  time.sleep(self.state_machine.sleep_time)
76
76
  continue
@@ -145,9 +145,9 @@ class Monitor(State):
145
145
  self, mission: Mission, current_step: InspectionStep
146
146
  ) -> None:
147
147
  try:
148
- inspections: Sequence[
149
- Inspection
150
- ] = self.state_machine.robot.get_inspections(step=current_step)
148
+ inspections: Sequence[Inspection] = (
149
+ self.state_machine.robot.get_inspections(step=current_step)
150
+ )
151
151
 
152
152
  except (RobotRetrieveInspectionException, RobotException) as e:
153
153
  self._set_error_message(e)
@@ -122,16 +122,18 @@ class SlimmStorage(StorageInterface):
122
122
  "ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
123
123
  "ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
124
124
  "ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
125
- "ImageMetadata.AnalysisMethods": inspection.metadata.additional[
126
- "analysis_type"
127
- ]
128
- if inspection.metadata.additional
129
- and inspection.metadata.additional["analysis_type"]
130
- else "N/A",
125
+ "ImageMetadata.AnalysisMethods": (
126
+ inspection.metadata.additional["analysis_type"]
127
+ if inspection.metadata.additional
128
+ and inspection.metadata.additional["analysis_type"]
129
+ else "N/A"
130
+ ),
131
131
  "ImageMetadata.Description": str(inspection.metadata.additional),
132
- "ImageMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
133
- if inspection.metadata.tag_id
134
- else "N/A",
132
+ "ImageMetadata.FunctionalLocation": (
133
+ inspection.metadata.tag_id # noqa: E501
134
+ if inspection.metadata.tag_id
135
+ else "N/A"
136
+ ),
135
137
  "Filename": filename,
136
138
  "AttachedFile": (filename, inspection.data),
137
139
  }
@@ -170,16 +172,18 @@ class SlimmStorage(StorageInterface):
170
172
  "VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
171
173
  "VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
172
174
  "VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
173
- "VideoMetadata.AnalysisMethods": inspection.metadata.additional[
174
- "analysis_type"
175
- ]
176
- if inspection.metadata.additional
177
- and inspection.metadata.additional["analysis_type"]
178
- else "N/A",
175
+ "VideoMetadata.AnalysisMethods": (
176
+ inspection.metadata.additional["analysis_type"]
177
+ if inspection.metadata.additional
178
+ and inspection.metadata.additional["analysis_type"]
179
+ else "N/A"
180
+ ),
179
181
  "VideoMetadata.Description": str(inspection.metadata.additional),
180
- "VideoMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
181
- if inspection.metadata.tag_id
182
- else "N/A",
182
+ "VideoMetadata.FunctionalLocation": (
183
+ inspection.metadata.tag_id # noqa: E501
184
+ if inspection.metadata.tag_id
185
+ else "N/A"
186
+ ),
183
187
  "Filename": filename,
184
188
  "AttachedFile": (filename, inspection.data),
185
189
  }
@@ -40,9 +40,11 @@ def construct_metadata_file(
40
40
  "mission_date": datetime.utcnow().date(),
41
41
  "isar_id": settings.ISAR_ID,
42
42
  "robot_name": settings.ROBOT_NAME,
43
- "analysis_type": inspection.metadata.additional["analysis_type"]
44
- if inspection.metadata.additional
45
- else "N/A",
43
+ "analysis_type": (
44
+ inspection.metadata.additional["analysis_type"]
45
+ if inspection.metadata.additional
46
+ else "N/A"
47
+ ),
46
48
  },
47
49
  "data": [
48
50
  {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.16.9
3
+ Version: 1.16.11
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Home-page: https://github.com/equinor/isar
6
6
  Author: Equinor ASA
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python
12
12
  Classifier: Topic :: Scientific/Engineering
13
13
  Classifier: Topic :: Scientific/Engineering :: Physics
14
14
  Classifier: Topic :: Software Development :: Libraries
15
- Requires-Python: >=3.8
15
+ Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: alitra>=1.1.0
@@ -246,12 +246,6 @@ make docs
246
246
 
247
247
  The documentation can now be viewed at `docs/build/html/index.html`.
248
248
 
249
- ### Contributing
250
-
251
- We welcome all kinds of contributions, including code, bug reports, issues, feature requests, and documentation. The
252
- preferred way of submitting a contribution is to either make an [issue](https://github.com/equinor/isar/issues) on
253
- GitHub or by forking the project on GitHub and making a pull requests.
254
-
255
249
  ## Components
256
250
 
257
251
  The system consists of two main components.
@@ -420,3 +414,9 @@ ISAR_MQTT_PASSWORD
420
414
  ```
421
415
 
422
416
  If not specified the password will default to an empty string.
417
+
418
+ # Contributions
419
+
420
+ Equinor welcomes all kinds of contributions, including code, bug reports, issues, feature requests, and documentation
421
+ Please initiate your contribution by creating an [issue](https://github.com/equinor/isar/issues) or by forking the
422
+ project and making a pull requests. Commit messages shall be written according to [this guide](https://cbea.msgit-commit/).
@@ -4,6 +4,7 @@
4
4
  Dockerfile
5
5
  LICENSE
6
6
  README.md
7
+ SECURITY.md
7
8
  docker-compose-turtlebot.yml
8
9
  docker-compose.yml
9
10
  main.py
@@ -62,6 +63,7 @@ src/isar/config/maps/klab_compressor.json
62
63
  src/isar/config/maps/klab_turtlebot.json
63
64
  src/isar/config/maps/turtleworld.json
64
65
  src/isar/config/predefined_mission_definition/__init__.py
66
+ src/isar/config/predefined_mission_definition/default_exr.json
65
67
  src/isar/config/predefined_mission_definition/default_mission.json
66
68
  src/isar/config/predefined_mission_definition/default_turtlebot.json
67
69
  src/isar/config/predefined_missions/__init__.py
@@ -107,7 +107,7 @@ class DockingProcedure(MotionStep):
107
107
  Step which causes the robot to dock or undock
108
108
  """
109
109
 
110
- behavior: Literal["dock, undock"]
110
+ behavior: Literal["dock", "undock"]
111
111
  type: Literal["docking_procedure"] = "docking_procedure"
112
112
 
113
113
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes