isar 1.20.2__py3-none-any.whl → 1.34.9__py3-none-any.whl

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 (124) hide show
  1. isar/apis/api.py +148 -76
  2. isar/apis/models/__init__.py +0 -1
  3. isar/apis/models/models.py +21 -11
  4. isar/apis/models/start_mission_definition.py +110 -168
  5. isar/apis/robot_control/robot_controller.py +41 -0
  6. isar/apis/schedule/scheduling_controller.py +124 -162
  7. isar/apis/security/authentication.py +5 -5
  8. isar/config/certs/ca-cert.pem +33 -31
  9. isar/config/keyvault/keyvault_service.py +1 -1
  10. isar/config/log.py +45 -40
  11. isar/config/logging.conf +16 -31
  12. isar/config/open_telemetry.py +102 -0
  13. isar/config/predefined_mission_definition/default_exr.json +0 -2
  14. isar/config/predefined_mission_definition/default_mission.json +1 -5
  15. isar/config/predefined_mission_definition/default_turtlebot.json +4 -11
  16. isar/config/predefined_missions/default.json +67 -87
  17. isar/config/predefined_missions/default_extra_capabilities.json +107 -0
  18. isar/config/settings.py +76 -111
  19. isar/eventhandlers/eventhandler.py +123 -0
  20. isar/mission_planner/local_planner.py +6 -20
  21. isar/mission_planner/mission_planner_interface.py +1 -1
  22. isar/models/events.py +184 -0
  23. isar/models/status.py +18 -0
  24. isar/modules.py +118 -199
  25. isar/robot/robot.py +377 -0
  26. isar/robot/robot_battery.py +60 -0
  27. isar/robot/robot_monitor_mission.py +357 -0
  28. isar/robot/robot_pause_mission.py +74 -0
  29. isar/robot/robot_resume_mission.py +67 -0
  30. isar/robot/robot_start_mission.py +66 -0
  31. isar/robot/robot_status.py +61 -0
  32. isar/robot/robot_stop_mission.py +68 -0
  33. isar/robot/robot_upload_inspection.py +75 -0
  34. isar/script.py +57 -40
  35. isar/services/service_connections/mqtt/mqtt_client.py +47 -11
  36. isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +5 -2
  37. isar/services/service_connections/mqtt/robot_info_publisher.py +3 -3
  38. isar/services/service_connections/persistent_memory.py +69 -0
  39. isar/services/utilities/mqtt_utilities.py +93 -0
  40. isar/services/utilities/robot_utilities.py +20 -0
  41. isar/services/utilities/scheduling_utilities.py +393 -65
  42. isar/state_machine/state_machine.py +219 -538
  43. isar/state_machine/states/__init__.py +0 -8
  44. isar/state_machine/states/await_next_mission.py +114 -0
  45. isar/state_machine/states/blocked_protective_stop.py +60 -0
  46. isar/state_machine/states/going_to_lockdown.py +95 -0
  47. isar/state_machine/states/going_to_recharging.py +92 -0
  48. isar/state_machine/states/home.py +115 -0
  49. isar/state_machine/states/intervention_needed.py +77 -0
  50. isar/state_machine/states/lockdown.py +38 -0
  51. isar/state_machine/states/maintenance.py +36 -0
  52. isar/state_machine/states/monitor.py +137 -247
  53. isar/state_machine/states/offline.py +51 -53
  54. isar/state_machine/states/paused.py +92 -23
  55. isar/state_machine/states/pausing.py +48 -0
  56. isar/state_machine/states/pausing_return_home.py +48 -0
  57. isar/state_machine/states/recharging.py +80 -0
  58. isar/state_machine/states/resuming.py +57 -0
  59. isar/state_machine/states/resuming_return_home.py +64 -0
  60. isar/state_machine/states/return_home_paused.py +109 -0
  61. isar/state_machine/states/returning_home.py +217 -0
  62. isar/state_machine/states/stopping.py +61 -0
  63. isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
  64. isar/state_machine/states/stopping_go_to_lockdown.py +60 -0
  65. isar/state_machine/states/stopping_go_to_recharge.py +51 -0
  66. isar/state_machine/states/stopping_return_home.py +77 -0
  67. isar/state_machine/states/unknown_status.py +72 -0
  68. isar/state_machine/states_enum.py +21 -5
  69. isar/state_machine/transitions/mission.py +192 -0
  70. isar/state_machine/transitions/return_home.py +106 -0
  71. isar/state_machine/transitions/robot_status.py +80 -0
  72. isar/state_machine/utils/common_event_handlers.py +73 -0
  73. isar/storage/blob_storage.py +70 -52
  74. isar/storage/local_storage.py +25 -12
  75. isar/storage/storage_interface.py +28 -7
  76. isar/storage/uploader.py +174 -55
  77. isar/storage/utilities.py +32 -29
  78. {isar-1.20.2.dist-info → isar-1.34.9.dist-info}/METADATA +73 -110
  79. isar-1.34.9.dist-info/RECORD +135 -0
  80. {isar-1.20.2.dist-info → isar-1.34.9.dist-info}/WHEEL +1 -1
  81. {isar-1.20.2.dist-info → isar-1.34.9.dist-info}/entry_points.txt +1 -0
  82. robot_interface/models/exceptions/robot_exceptions.py +91 -41
  83. robot_interface/models/initialize/__init__.py +0 -1
  84. robot_interface/models/inspection/__init__.py +0 -13
  85. robot_interface/models/inspection/inspection.py +42 -33
  86. robot_interface/models/mission/mission.py +14 -15
  87. robot_interface/models/mission/status.py +20 -26
  88. robot_interface/models/mission/task.py +154 -121
  89. robot_interface/models/robots/battery_state.py +6 -0
  90. robot_interface/models/robots/media.py +13 -0
  91. robot_interface/models/robots/robot_model.py +7 -7
  92. robot_interface/robot_interface.py +119 -84
  93. robot_interface/telemetry/mqtt_client.py +74 -12
  94. robot_interface/telemetry/payloads.py +91 -13
  95. robot_interface/utilities/json_service.py +7 -1
  96. isar/config/predefined_missions/default_turtlebot.json +0 -110
  97. isar/config/predefined_poses/__init__.py +0 -0
  98. isar/config/predefined_poses/predefined_poses.py +0 -616
  99. isar/config/settings.env +0 -25
  100. isar/mission_planner/sequential_task_selector.py +0 -23
  101. isar/mission_planner/task_selector_interface.py +0 -31
  102. isar/models/communication/__init__.py +0 -0
  103. isar/models/communication/message.py +0 -12
  104. isar/models/communication/queues/__init__.py +0 -4
  105. isar/models/communication/queues/queue_io.py +0 -12
  106. isar/models/communication/queues/queue_timeout_error.py +0 -2
  107. isar/models/communication/queues/queues.py +0 -19
  108. isar/models/communication/queues/status_queue.py +0 -20
  109. isar/models/mission_metadata/__init__.py +0 -0
  110. isar/services/readers/__init__.py +0 -0
  111. isar/services/readers/base_reader.py +0 -37
  112. isar/services/service_connections/stid/__init__.py +0 -0
  113. isar/services/utilities/queue_utilities.py +0 -39
  114. isar/state_machine/states/idle.py +0 -85
  115. isar/state_machine/states/initialize.py +0 -71
  116. isar/state_machine/states/initiate.py +0 -142
  117. isar/state_machine/states/off.py +0 -18
  118. isar/state_machine/states/stop.py +0 -95
  119. isar/storage/slimm_storage.py +0 -191
  120. isar-1.20.2.dist-info/RECORD +0 -116
  121. robot_interface/models/initialize/initialize_params.py +0 -9
  122. robot_interface/models/mission/step.py +0 -234
  123. {isar-1.20.2.dist-info → isar-1.34.9.dist-info/licenses}/LICENSE +0 -0
  124. {isar-1.20.2.dist-info → isar-1.34.9.dist-info}/top_level.txt +0 -0
@@ -1,191 +0,0 @@
1
- import json
2
- import logging
3
-
4
- from azure.identity import DefaultAzureCredential
5
- from injector import inject
6
- from requests import HTTPError, RequestException
7
- from requests_toolbelt import MultipartEncoder
8
-
9
- from isar.config.settings import settings
10
- from isar.services.auth.azure_credentials import AzureCredentials
11
- from isar.services.service_connections.request_handler import RequestHandler
12
- from isar.storage.storage_interface import StorageException, StorageInterface
13
- from isar.storage.utilities import get_filename
14
- from robot_interface.models.inspection.inspection import Inspection, ThermalVideo, Video
15
- from robot_interface.models.mission.mission import Mission
16
-
17
-
18
- class SlimmStorage(StorageInterface):
19
- @inject
20
- def __init__(self, request_handler: RequestHandler) -> None:
21
- self.request_handler: RequestHandler = request_handler
22
- self.logger = logging.getLogger("uploader")
23
-
24
- self.credentials: DefaultAzureCredential = (
25
- AzureCredentials.get_azure_credentials()
26
- )
27
-
28
- client_id: str = settings.SLIMM_CLIENT_ID
29
- scope: str = settings.SLIMM_APP_SCOPE
30
- self.request_scope: str = f"{client_id}/{scope}"
31
-
32
- self.url: str = settings.SLIMM_API_URL
33
-
34
- def store(self, inspection: Inspection, mission: Mission) -> str:
35
- filename: str = get_filename(
36
- inspection=inspection,
37
- )
38
- filename = f"{filename}.{inspection.metadata.file_type}"
39
- if type(inspection) in [Video, ThermalVideo]:
40
- inspection_path = self._store_video(filename, inspection, mission)
41
- else:
42
- inspection_path = self._store_image(filename, inspection, mission)
43
- return inspection_path
44
-
45
- def _store_image(
46
- self, filename: str, inspection: Inspection, mission: Mission
47
- ) -> str:
48
- multiform_body: MultipartEncoder = self._construct_multiform_request_image(
49
- filename=filename, inspection=inspection, mission=mission
50
- )
51
- request_url: str = f"{self.url}/UploadSingleImage"
52
- inspection_path = self._ingest(
53
- inspection=inspection,
54
- multiform_body=multiform_body,
55
- request_url=request_url,
56
- )
57
- return inspection_path
58
-
59
- def _store_video(
60
- self, filename: str, inspection: Inspection, mission: Mission
61
- ) -> str:
62
- multiform_body: MultipartEncoder = self._construct_multiform_request_video(
63
- filename=filename, inspection=inspection, mission=mission
64
- )
65
- request_url = f"{self.url}/UploadSingleVideo"
66
- inspection_path = self._ingest(
67
- inspection=inspection,
68
- multiform_body=multiform_body,
69
- request_url=request_url,
70
- )
71
- return inspection_path
72
-
73
- def _ingest(
74
- self, inspection: Inspection, multiform_body: MultipartEncoder, request_url: str
75
- ) -> str:
76
- token: str = self.credentials.get_token(self.request_scope).token
77
- try:
78
- response = self.request_handler.post(
79
- url=request_url,
80
- data=multiform_body,
81
- headers={
82
- "Authorization": f"Bearer {token}",
83
- "Content-Type": multiform_body.content_type,
84
- },
85
- )
86
- guid = json.loads(response.text)["guid"]
87
- self.logger.info(f"SLIMM upload GUID: {guid}")
88
- except (RequestException, HTTPError) as e:
89
- self.logger.warning(
90
- f"Failed to upload inspection: {inspection.id} to SLIMM due to a "
91
- f"request exception"
92
- )
93
- raise StorageException from e
94
- data = json.loads(response.content)
95
- return data["guid"]
96
-
97
- @staticmethod
98
- def _construct_multiform_request_image(
99
- filename: str, inspection: Inspection, mission: Mission
100
- ):
101
- array_of_orientation = (
102
- inspection.metadata.pose.orientation.to_quat_array().tolist()
103
- )
104
- multiform_body: MultipartEncoder = MultipartEncoder(
105
- fields={
106
- "PlantFacilitySAPCode": settings.PLANT_CODE,
107
- "InstCode": settings.PLANT_SHORT_NAME,
108
- "InternalClassification": settings.DATA_CLASSIFICATION,
109
- "IsoCountryCode": "NO",
110
- "Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
111
- "Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
112
- "Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
113
- "SensorCarrier.SensorCarrierId": settings.ISAR_ID,
114
- "SensorCarrier.ModelName": settings.ROBOT_TYPE,
115
- "Mission.MissionId": mission.id,
116
- "Mission.Client": "Equinor",
117
- "ImageMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
118
- "ImageMetadata.X": str(inspection.metadata.pose.position.x),
119
- "ImageMetadata.Y": str(inspection.metadata.pose.position.y),
120
- "ImageMetadata.Z": str(inspection.metadata.pose.position.z),
121
- "ImageMetadata.CameraOrientation1": str(array_of_orientation[0]),
122
- "ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
123
- "ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
124
- "ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
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
- "ImageMetadata.Description": str(inspection.metadata.additional),
132
- "ImageMetadata.FunctionalLocation": (
133
- inspection.metadata.tag_id # noqa: E501
134
- if inspection.metadata.tag_id
135
- else "N/A"
136
- ),
137
- "Filename": filename,
138
- "AttachedFile": (filename, inspection.data),
139
- }
140
- )
141
- return multiform_body
142
-
143
- @staticmethod
144
- def _construct_multiform_request_video(
145
- filename: str,
146
- inspection: Inspection,
147
- mission: Mission,
148
- ):
149
- array_of_orientation = (
150
- inspection.metadata.pose.orientation.to_quat_array().tolist()
151
- )
152
- multiform_body: MultipartEncoder = MultipartEncoder(
153
- fields={
154
- "PlantFacilitySAPCode": settings.PLANT_CODE,
155
- "InstCode": settings.PLANT_SHORT_NAME,
156
- "InternalClassification": settings.DATA_CLASSIFICATION,
157
- "IsoCountryCode": "NO",
158
- "Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
159
- "Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
160
- "Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
161
- "SensorCarrier.SensorCarrierId": settings.ISAR_ID,
162
- "SensorCarrier.ModelName": settings.ROBOT_TYPE,
163
- "Mission.MissionId": mission.id,
164
- "Mission.Client": "Equinor",
165
- "VideoMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
166
- # Converting to int because SLIMM expects an int, while we use floats in operations.
167
- "VideoMetadata.Duration": str(int(inspection.metadata.duration)), # type: ignore
168
- "VideoMetadata.X": str(inspection.metadata.pose.position.x),
169
- "VideoMetadata.Y": str(inspection.metadata.pose.position.y),
170
- "VideoMetadata.Z": str(inspection.metadata.pose.position.z),
171
- "VideoMetadata.CameraOrientation1": str(array_of_orientation[0]),
172
- "VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
173
- "VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
174
- "VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
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
- ),
181
- "VideoMetadata.Description": str(inspection.metadata.additional),
182
- "VideoMetadata.FunctionalLocation": (
183
- inspection.metadata.tag_id # noqa: E501
184
- if inspection.metadata.tag_id
185
- else "N/A"
186
- ),
187
- "Filename": filename,
188
- "AttachedFile": (filename, inspection.data),
189
- }
190
- )
191
- return multiform_body
@@ -1,116 +0,0 @@
1
- isar/__init__.py,sha256=cH8p8bVveu3FUL6kBhldcSlLaoHgD82Kd0-SwSNfGXw,87
2
- isar/modules.py,sha256=aO8bLSC4i_Qo4bOJ6aFfwAZRTJAw8o9SOOfkceUGCiU,6708
3
- isar/script.py,sha256=145KXMqKWkP5SjB2MyvO1HmIPJnFOQdwwWM3jy6s-9A,5260
4
- isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- isar/apis/api.py,sha256=vSXfkWR7iITWbh4BsDzjEDtQrz6KS-vi2S8AeaeDc3Q,13112
6
- isar/apis/models/__init__.py,sha256=NI1BYyN__Ogr00Qqe0XJ-9gEVPva2brXo2RJsbrS4tM,52
7
- isar/apis/models/models.py,sha256=BRm3Wl6TJHdHEKLRQ2SGDx6Y54qq8IesMbBuVO7RuxE,1757
8
- isar/apis/models/start_mission_definition.py,sha256=GuihnkVRXjzopMEiRQ4rOfeCGw98IFK9EYylB-5S0aI,7253
9
- isar/apis/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- isar/apis/schedule/scheduling_controller.py,sha256=w2F-6IKBgVN9HVopAOWBb3KUgPjhsnuPLQ3eqjDNfOg,11888
11
- isar/apis/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- isar/apis/security/authentication.py,sha256=TI8U9Y_L6ihHLMeM50ZONd5EPfuHdw_XMU_Q987W4AY,1975
13
- isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- isar/config/configuration_error.py,sha256=rO6WOhafX6xvVib8WxV-eY483Z0PpN-9PxGsq5ATfKc,46
15
- isar/config/log.py,sha256=zHFLmGWQRn8TrcsxUS6KHpJt2JE86kYazU7b-bkcN9o,2285
16
- isar/config/logging.conf,sha256=mYO1xf27gAopEMHhGzY7-mwyfN16rwRLkPNMvy3zn2g,1127
17
- isar/config/settings.env,sha256=-kivj0osAAKlInnY81ugySTlcImhVABbnj9kUoBDLu8,535
18
- isar/config/settings.py,sha256=pZrZGe60WoMNl_SlCzJFavU3Qqil_ocCuaKcKfDn0KM,13175
19
- isar/config/certs/ca-cert.pem,sha256=gSBTyY0tKSFnssyvrvbFvHpQwii0kEkBryklVmevdtc,2029
20
- isar/config/keyvault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- isar/config/keyvault/keyvault_error.py,sha256=zvPCsZLjboxsxthYkxpRERCTFxYV8R5WmACewAUQLwk,41
22
- isar/config/keyvault/keyvault_service.py,sha256=b2EWNiNQmZ-FUWjZidNg5KXRcVH-U8CsiqcBf1devNw,3124
23
- isar/config/maps/JSP1_intermediate_deck.json,sha256=fdotzN6MVotyLbqpIjRSrbBYM84vogLkdS585NjBnL8,826
24
- isar/config/maps/JSP1_weather_deck.json,sha256=_dG3cSBI8q4_uHqHMOO5kSYqMXn85JL3_9PaH4uk1yQ,832
25
- isar/config/maps/default_map.json,sha256=3CdGMr0Qn3PrL4TfUK8I5a-hotMrS_n5DKfaEORJPT4,776
26
- isar/config/maps/klab_b.json,sha256=qXgWVUYPaTdVuomf6lQL-uRbV3Tsa6CftnzcbT3dY78,842
27
- isar/config/maps/klab_compressor.json,sha256=1Vrk5u_l4WXjrTtG4YfXlrCPbOoRs4TtYHOm0430u2A,803
28
- isar/config/maps/klab_turtlebot.json,sha256=HcB79XFEdY0Wm96EssIFO4TMyAWzc2KENoqN7TbTT0k,823
29
- isar/config/maps/turtleworld.json,sha256=EKLMpSK9Gu2lAN-E9l41XOaO3f9Su5n_I97mA6z7sWY,764
30
- isar/config/predefined_mission_definition/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- isar/config/predefined_mission_definition/default_exr.json,sha256=L3-kqjfgXoULDUgGsD3Zci7m3wdbwAuSrn4yaH4aPIA,1667
32
- isar/config/predefined_mission_definition/default_mission.json,sha256=nEk1ql17RAs2I5Ws2wA-0GJ6oqJco-Q0Q0vhf4k6ajc,2926
33
- isar/config/predefined_mission_definition/default_turtlebot.json,sha256=Ka379MLu8qiGIa6Fu-8p8A4OgHVccLkKYSX0RthUOeI,4060
34
- isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- isar/config/predefined_missions/default.json,sha256=3J1KtQIFKxJsVoKlg0nKsj8asev-2dSz6IOrd4A57jY,2759
36
- isar/config/predefined_missions/default_turtlebot.json,sha256=gStYz_hCgQDBEeUW7W4bq_0R3OO55jRnwZt0CNYvHSM,3352
37
- isar/config/predefined_poses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- isar/config/predefined_poses/predefined_poses.py,sha256=fhq8JF00feDLFKNBlyWeFoLfvfs5dVb__C7CmiVbwmQ,25779
39
- isar/mission_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- isar/mission_planner/local_planner.py,sha256=1Qcz7QntWXuYL1PcF6R9aZNCCdL-j_RJ2UGc1_rNZd8,3037
41
- isar/mission_planner/mission_planner_interface.py,sha256=51k6KKXqC8wZ4Mc8ZWo00Nwy8c6yNa81nEZNZelwJeo,485
42
- isar/mission_planner/sequential_task_selector.py,sha256=4OJ1Rvg6MaDQQxNcgAUtp2gvhHm3Srha5XJUu8X-Uzg,640
43
- isar/mission_planner/task_selector_interface.py,sha256=aXL2RXb_XmTNW-WXt6E7wFfJf_BjbownDa3zSqgQ4Ww,703
44
- isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- isar/models/communication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- isar/models/communication/message.py,sha256=yN4SXYM-W_6u3Cf9yuAE3jy4e6mMrL3yUr-iVV4r55E,241
47
- isar/models/communication/queues/__init__.py,sha256=JqwWbdBQnBeIEhSTjBOkl-O3bYBVBSmjPcWUdscsobw,146
48
- isar/models/communication/queues/queue_io.py,sha256=AnHWUCkZ0tunkxKKeBarq-OUkRM97IaMfA-a1pmf1cQ,394
49
- isar/models/communication/queues/queue_timeout_error.py,sha256=rF8TlNF7RHS_ueTZ5mp7aFkhLY1j0dcwMwH-Ba6lVpE,45
50
- isar/models/communication/queues/queues.py,sha256=FzoqlT4AQ4Q5Jufh6yRPV2uq5iUZd1odrpjBl77yU5o,803
51
- isar/models/communication/queues/status_queue.py,sha256=K_i01uzCu1eciDt9QlDXLBINJnuRLqm6fzrM-PY6qD0,467
52
- isar/models/mission_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
- isar/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- isar/services/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- isar/services/auth/azure_credentials.py,sha256=9PlwGe5FrPRbW2dp0go7LMp8_l_FRvL8xOXotXwzRDo,364
56
- isar/services/readers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- isar/services/readers/base_reader.py,sha256=_fNd5fb5dFeMtOvfWzIAGO-KIgl3zT19iEuzSjeZNPc,987
58
- isar/services/service_connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- isar/services/service_connections/request_handler.py,sha256=0LxC0lu_HXeEf_xmJWjfEsh14oAUI97cpG1IWtBlcs4,4278
60
- isar/services/service_connections/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- isar/services/service_connections/mqtt/mqtt_client.py,sha256=Aib0lqaddxW9aVXXYD7wGL9jIpr2USCCH91SQgFdIG4,3548
62
- isar/services/service_connections/mqtt/robot_heartbeat_publisher.py,sha256=0Qjo2wRZZoooXG-UE4z8YJc9QCCz6v-9YAqHRJgx-kE,1005
63
- isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=f1vhBNPlx6p3Au8l7OsWIJXRM_xjA8qcLHvnkwCtRBM,1388
64
- isar/services/service_connections/stid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
- isar/services/utilities/queue_utilities.py,sha256=Pw3hehSwkXJNeDv-bDVDfs58VOwtt3i5hpiJ2ZpphuQ,1225
67
- isar/services/utilities/scheduling_utilities.py,sha256=LFimEmacML3J9q-FNLfKPhcAr-R3f2rkYkbsoro0Gyo,8434
68
- isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
69
- isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- isar/state_machine/state_machine.py,sha256=-i7m2xVcgL3cW6AIMGAom97wzt433MXM8EQEGUykAJA,23653
71
- isar/state_machine/states_enum.py,sha256=BlrUcBWkM5K6D_UZXRwTaUgGpAagWmVZH6HhDBGzVU4,278
72
- isar/state_machine/states/__init__.py,sha256=kErbKPDTwNfCLijvdyN6_AuOqDwR23nu9F0Qovsnir4,218
73
- isar/state_machine/states/idle.py,sha256=_nrM17s4artaHezanl28_WcNyJod1_hkCyzAqZlPQiE,3034
74
- isar/state_machine/states/initialize.py,sha256=KUuyXVwzWK5bJNspA1JnYO_Xwu8fPPK6bnHK4mtwf5A,2359
75
- isar/state_machine/states/initiate.py,sha256=WqBROOGAh0DVB0f39RFkpqzkr0qrHMyrBGkh2svBbKw,5652
76
- isar/state_machine/states/monitor.py,sha256=t0wtRPrjnWnGQ8JXia7kLkSc8tyd33mBI7UDDAsJ6FM,10874
77
- isar/state_machine/states/off.py,sha256=jjqN_oJMpBtWuY7hP-c9f0w3p2CYCfe-NpmYHHPnmyI,544
78
- isar/state_machine/states/offline.py,sha256=wEMMIwM4JWfmDjI7pe9yKce_Mfz9aXqs6WEkxn8cx5I,2125
79
- isar/state_machine/states/paused.py,sha256=HqrvONw6r6AoYPUyFGGOy2ToT7Tid8JEw2pKp2ZhZ7Y,1004
80
- isar/state_machine/states/stop.py,sha256=zu7bVKR5zfkzU7iCrh8Pe2WRDHHzU2RBeFBxFK6Z-eA,3348
81
- isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- isar/storage/blob_storage.py,sha256=oKdml1VVN8iTr-d_5H4Lz5E7zrhJRknCzOxHD-tO7m8,3230
83
- isar/storage/local_storage.py,sha256=Bnmoi5gyN8r-oRh0aHrOdGqaH3JqRScFKMRXYojW5kY,1855
84
- isar/storage/slimm_storage.py,sha256=Hp7ZIgZgIR4KAFjzxDKfgMZjPZwP2kmdc1gG8zVcsMk,8966
85
- isar/storage/storage_interface.py,sha256=DYDry4I7aZpDHJhsBF6s8zrgokFAc7fdKJKfA8AvL7o,828
86
- isar/storage/uploader.py,sha256=te3GyiSeu96MhbiqQ7ueIMUPLSKblx3UqYAshkxfVIE,6368
87
- isar/storage/utilities.py,sha256=eTyY56WCTda5YswE9znWNeNEoTbT3jokNbwcLVmmQjA,3113
88
- robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
- robot_interface/robot_interface.py,sha256=i2qw1V9mLO-ljtS7LiRliQ7XNmmBJIwD4NG8mDfwMEI,8317
90
- robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
91
- robot_interface/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- robot_interface/models/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- robot_interface/models/exceptions/robot_exceptions.py,sha256=l1h62gq7lfLzWoHh2ytdEWgn_4lS4M-GPxHkjgAXcP4,9036
94
- robot_interface/models/initialize/__init__.py,sha256=rz5neEDr59GDbzzI_FF0DId-C-I-50l113P-h-C_QBY,48
95
- robot_interface/models/initialize/initialize_params.py,sha256=2eG5Aq5bDKU6tVkaUMAoc46GERBgyaKkqv6yLupdRLc,164
96
- robot_interface/models/inspection/__init__.py,sha256=14wfuj4XZazrigKD7fL98khFKz-eckIpEgPcYRj40Kg,227
97
- robot_interface/models/inspection/inspection.py,sha256=TVqUl5o3d3fp8IravOMwJIuRoEU8y4BltFrF1IkwvTA,2176
98
- robot_interface/models/mission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- robot_interface/models/mission/mission.py,sha256=xJ7i79TQkmO0Tv2IQeguhyliNP2J42ziS5iO-FyBpW0,839
100
- robot_interface/models/mission/status.py,sha256=R5jLmmn6M7oNX907QvbrhoAqAo4C1zB653Ed1PcxAtg,922
101
- robot_interface/models/mission/step.py,sha256=DEzU-LD-i3RTAaXBy5KwJZ6OnN5S0F3wwDaqX2DZ72M,5587
102
- robot_interface/models/mission/task.py,sha256=JJ062AIdwVoj3PUkWYmJDvRl5B7Tcu9S11J2F_0tfjE,4695
103
- robot_interface/models/robots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
- robot_interface/models/robots/robot_model.py,sha256=pZQsqhn9hh6XE3EjMZhWMzYqg5oJ4CJ4CXeOASKvEf8,452
105
- robot_interface/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- robot_interface/telemetry/mqtt_client.py,sha256=AHBmOpVvoo6pY5uXwyBY7SooN_cnpuS0DMkfLUPwpl8,2743
107
- robot_interface/telemetry/payloads.py,sha256=eMK7mjZPsLY6yvu7AK-OcdvkeUpChzDrySDY7IjQ9RM,1464
108
- robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- robot_interface/utilities/json_service.py,sha256=nU2Q_3P9Fq9hs6F_wtUjWtHfl_g1Siy-yDhXXSKwHwg,1018
110
- robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
111
- isar-1.20.2.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
112
- isar-1.20.2.dist-info/METADATA,sha256=eGOpcvDhrvMdIocMCNNBxUQ_9q4Z_F_1aZOu9kNisiI,30574
113
- isar-1.20.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
114
- isar-1.20.2.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
115
- isar-1.20.2.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
116
- isar-1.20.2.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Optional
3
-
4
- from alitra import Pose
5
-
6
-
7
- @dataclass
8
- class InitializeParams:
9
- initial_pose: Optional[Pose] = None
@@ -1,234 +0,0 @@
1
- from dataclasses import dataclass, field
2
- from typing import Any, List, Literal, Optional, Type, Union
3
-
4
- from alitra import Pose, Position
5
-
6
- from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
7
- from robot_interface.models.inspection import (
8
- Audio,
9
- Image,
10
- Inspection,
11
- ThermalImage,
12
- ThermalVideo,
13
- Video,
14
- )
15
- from robot_interface.models.mission.status import StepStatus
16
- from robot_interface.utilities.uuid_string_factory import uuid4_string
17
-
18
-
19
- @dataclass
20
- class Step:
21
- """
22
- Base class for all steps in a mission.
23
- """
24
-
25
- id: str = field(default_factory=uuid4_string, init=False)
26
- status: StepStatus = field(default=StepStatus.NotStarted, init=False)
27
- error_message: Optional[ErrorMessage] = field(default=None, init=False)
28
-
29
- def __str__(self) -> str:
30
- def add_indent(text: str) -> str:
31
- return "".join(" " + line for line in text.splitlines(True))
32
-
33
- def robot_class_to_pretty_string(obj: Step) -> str:
34
- log_message: str = ""
35
- for attr in dir(obj):
36
- if callable(getattr(obj, attr)) or attr.startswith("__"):
37
- continue
38
-
39
- value: Any = getattr(obj, attr)
40
- try:
41
- package_name: Optional[str] = (
42
- str(value.__class__).split("'")[1].split(".")[0]
43
- )
44
- except (AttributeError, IndexError):
45
- package_name = None
46
-
47
- if package_name == "robot_interface":
48
- log_message += (
49
- "\n" + attr + ": " + robot_class_to_pretty_string(value)
50
- )
51
- else:
52
- log_message += "\n" + str(attr) + ": " + str(value)
53
-
54
- return add_indent(log_message)
55
-
56
- class_name: str = type(self).__name__
57
- return class_name + robot_class_to_pretty_string(self)
58
-
59
-
60
- @dataclass
61
- class InspectionStep(Step):
62
- """
63
- Base class for all inspection steps which produce results to be uploaded.
64
- """
65
-
66
- inspections: List[Inspection] = field(default_factory=list, init=False)
67
- tag_id: Optional[str] = field(default=None, init=False)
68
- type = "inspection_type"
69
- metadata: Optional[dict] = field(default_factory=dict, init=False)
70
-
71
- @staticmethod
72
- def get_inspection_type() -> Type[Inspection]:
73
- return Inspection
74
-
75
-
76
- @dataclass
77
- class MotionStep(Step):
78
- """
79
- Base class for all steps which should move the robot, but not return a result.
80
- """
81
-
82
- pass
83
-
84
-
85
- @dataclass
86
- class ContinousInspectionStep(Step):
87
- """
88
- Base class for all continous inspection steps which produce a result to be uploaded.
89
- """
90
-
91
- pass
92
-
93
-
94
- @dataclass
95
- class DriveToPose(MotionStep):
96
- """
97
- Step which causes the robot to move to the given pose.
98
- """
99
-
100
- pose: Pose
101
- type: Literal["drive_to_pose"] = "drive_to_pose"
102
-
103
-
104
- @dataclass
105
- class DockingProcedure(MotionStep):
106
- """
107
- Step which causes the robot to dock or undock
108
- """
109
-
110
- behavior: Literal["dock", "undock"]
111
- type: Literal["docking_procedure"] = "docking_procedure"
112
-
113
-
114
- @dataclass
115
- class ReturnToHome(MotionStep):
116
- """
117
- Step which cases the robot to return home
118
- """
119
-
120
- pose: Pose
121
- type: Literal["return_to_home"] = "return_to_home"
122
-
123
-
124
- @dataclass
125
- class Localize(MotionStep):
126
- """
127
- Step which causes the robot to localize
128
- """
129
-
130
- localization_pose: Pose
131
- type: Literal["localize"] = "localize"
132
-
133
-
134
- @dataclass
135
- class MoveArm(MotionStep):
136
- """
137
- Step which causes the robot to move its arm
138
- """
139
-
140
- arm_pose: str
141
- type: Literal["move_arm"] = "move_arm"
142
-
143
-
144
- @dataclass
145
- class TakeImage(InspectionStep):
146
- """
147
- Step which causes the robot to take an image towards the given coordinate.
148
- """
149
-
150
- target: Position
151
- type: Literal["take_image"] = "take_image"
152
-
153
- @staticmethod
154
- def get_inspection_type() -> Type[Inspection]:
155
- return Image
156
-
157
-
158
- @dataclass
159
- class TakeThermalImage(InspectionStep):
160
- """
161
- Step which causes the robot to take a thermal image towards the given coordinate.
162
- """
163
-
164
- target: Position
165
- type: Literal["take_thermal_image"] = "take_thermal_image"
166
-
167
- @staticmethod
168
- def get_inspection_type() -> Type[Inspection]:
169
- return ThermalImage
170
-
171
-
172
- @dataclass
173
- class TakeVideo(InspectionStep):
174
- """
175
- Step which causes the robot to take a video towards the given coordinate.
176
-
177
- Duration of video is given in seconds.
178
- """
179
-
180
- target: Position
181
- duration: float
182
- type: Literal["take_video"] = "take_video"
183
-
184
- @staticmethod
185
- def get_inspection_type() -> Type[Inspection]:
186
- return Video
187
-
188
-
189
- @dataclass
190
- class TakeThermalVideo(InspectionStep):
191
- """
192
- Step which causes the robot to record thermal video towards the given coordinate
193
-
194
- Duration of video is given in seconds.
195
- """
196
-
197
- target: Position
198
- duration: float
199
- type: Literal["take_thermal_video"] = "take_thermal_video"
200
-
201
- @staticmethod
202
- def get_inspection_type() -> Type[Inspection]:
203
- return ThermalVideo
204
-
205
-
206
- @dataclass
207
- class RecordAudio(InspectionStep):
208
- """
209
- Step which causes the robot to record a video at its position, facing the target.
210
-
211
- Duration of audio is given in seconds.
212
- """
213
-
214
- target: Position
215
- duration: float
216
- type: Literal["record_audio"] = "record_audio"
217
-
218
- @staticmethod
219
- def get_inspection_type() -> Type[Inspection]:
220
- return Audio
221
-
222
-
223
- STEPS = Union[
224
- DriveToPose,
225
- DockingProcedure,
226
- ReturnToHome,
227
- Localize,
228
- TakeImage,
229
- TakeThermalImage,
230
- TakeVideo,
231
- TakeThermalVideo,
232
- RecordAudio,
233
- MoveArm,
234
- ]