isar 1.20.2__py3-none-any.whl → 1.34.13__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 (134) hide show
  1. isar/apis/api.py +135 -86
  2. isar/apis/models/__init__.py +0 -1
  3. isar/apis/models/models.py +21 -11
  4. isar/apis/models/start_mission_definition.py +115 -170
  5. isar/apis/robot_control/robot_controller.py +41 -0
  6. isar/apis/schedule/scheduling_controller.py +123 -187
  7. isar/apis/security/authentication.py +5 -5
  8. isar/config/certs/ca-cert.pem +33 -31
  9. isar/config/keyvault/keyvault_service.py +4 -2
  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/settings.py +74 -117
  14. isar/eventhandlers/eventhandler.py +123 -0
  15. isar/models/events.py +184 -0
  16. isar/models/status.py +22 -0
  17. isar/modules.py +117 -200
  18. isar/robot/robot.py +383 -0
  19. isar/robot/robot_battery.py +60 -0
  20. isar/robot/robot_monitor_mission.py +357 -0
  21. isar/robot/robot_pause_mission.py +74 -0
  22. isar/robot/robot_resume_mission.py +67 -0
  23. isar/robot/robot_start_mission.py +66 -0
  24. isar/robot/robot_status.py +61 -0
  25. isar/robot/robot_stop_mission.py +68 -0
  26. isar/robot/robot_upload_inspection.py +75 -0
  27. isar/script.py +58 -41
  28. isar/services/service_connections/mqtt/mqtt_client.py +47 -11
  29. isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +5 -2
  30. isar/services/service_connections/mqtt/robot_info_publisher.py +3 -3
  31. isar/services/service_connections/persistent_memory.py +69 -0
  32. isar/services/utilities/mqtt_utilities.py +93 -0
  33. isar/services/utilities/robot_utilities.py +20 -0
  34. isar/services/utilities/scheduling_utilities.py +386 -100
  35. isar/state_machine/state_machine.py +242 -539
  36. isar/state_machine/states/__init__.py +0 -8
  37. isar/state_machine/states/await_next_mission.py +114 -0
  38. isar/state_machine/states/blocked_protective_stop.py +60 -0
  39. isar/state_machine/states/going_to_lockdown.py +95 -0
  40. isar/state_machine/states/going_to_recharging.py +92 -0
  41. isar/state_machine/states/home.py +115 -0
  42. isar/state_machine/states/intervention_needed.py +77 -0
  43. isar/state_machine/states/lockdown.py +38 -0
  44. isar/state_machine/states/maintenance.py +43 -0
  45. isar/state_machine/states/monitor.py +137 -247
  46. isar/state_machine/states/offline.py +51 -53
  47. isar/state_machine/states/paused.py +92 -23
  48. isar/state_machine/states/pausing.py +48 -0
  49. isar/state_machine/states/pausing_return_home.py +48 -0
  50. isar/state_machine/states/recharging.py +80 -0
  51. isar/state_machine/states/resuming.py +57 -0
  52. isar/state_machine/states/resuming_return_home.py +64 -0
  53. isar/state_machine/states/return_home_paused.py +109 -0
  54. isar/state_machine/states/returning_home.py +217 -0
  55. isar/state_machine/states/stopping.py +69 -0
  56. isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
  57. isar/state_machine/states/stopping_go_to_lockdown.py +60 -0
  58. isar/state_machine/states/stopping_go_to_recharge.py +51 -0
  59. isar/state_machine/states/stopping_paused_mission.py +36 -0
  60. isar/state_machine/states/stopping_paused_return_home.py +59 -0
  61. isar/state_machine/states/stopping_return_home.py +59 -0
  62. isar/state_machine/states/unknown_status.py +74 -0
  63. isar/state_machine/states_enum.py +23 -5
  64. isar/state_machine/transitions/mission.py +225 -0
  65. isar/state_machine/transitions/return_home.py +108 -0
  66. isar/state_machine/transitions/robot_status.py +87 -0
  67. isar/state_machine/utils/common_event_handlers.py +138 -0
  68. isar/storage/blob_storage.py +70 -52
  69. isar/storage/local_storage.py +25 -12
  70. isar/storage/storage_interface.py +28 -7
  71. isar/storage/uploader.py +174 -55
  72. isar/storage/utilities.py +32 -29
  73. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/METADATA +119 -123
  74. isar-1.34.13.dist-info/RECORD +120 -0
  75. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/WHEEL +1 -1
  76. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/entry_points.txt +1 -0
  77. robot_interface/models/exceptions/robot_exceptions.py +91 -41
  78. robot_interface/models/inspection/__init__.py +0 -13
  79. robot_interface/models/inspection/inspection.py +42 -33
  80. robot_interface/models/mission/mission.py +14 -15
  81. robot_interface/models/mission/status.py +20 -26
  82. robot_interface/models/mission/task.py +154 -121
  83. robot_interface/models/robots/battery_state.py +6 -0
  84. robot_interface/models/robots/media.py +13 -0
  85. robot_interface/models/robots/robot_model.py +7 -7
  86. robot_interface/robot_interface.py +119 -84
  87. robot_interface/telemetry/mqtt_client.py +74 -12
  88. robot_interface/telemetry/payloads.py +91 -13
  89. robot_interface/utilities/json_service.py +7 -1
  90. isar/config/configuration_error.py +0 -2
  91. isar/config/keyvault/keyvault_error.py +0 -2
  92. isar/config/predefined_mission_definition/__init__.py +0 -0
  93. isar/config/predefined_mission_definition/default_exr.json +0 -51
  94. isar/config/predefined_mission_definition/default_mission.json +0 -91
  95. isar/config/predefined_mission_definition/default_turtlebot.json +0 -124
  96. isar/config/predefined_missions/__init__.py +0 -0
  97. isar/config/predefined_missions/default.json +0 -92
  98. isar/config/predefined_missions/default_turtlebot.json +0 -110
  99. isar/config/predefined_poses/__init__.py +0 -0
  100. isar/config/predefined_poses/predefined_poses.py +0 -616
  101. isar/config/settings.env +0 -25
  102. isar/mission_planner/__init__.py +0 -0
  103. isar/mission_planner/local_planner.py +0 -82
  104. isar/mission_planner/mission_planner_interface.py +0 -26
  105. isar/mission_planner/sequential_task_selector.py +0 -23
  106. isar/mission_planner/task_selector_interface.py +0 -31
  107. isar/models/communication/__init__.py +0 -0
  108. isar/models/communication/message.py +0 -12
  109. isar/models/communication/queues/__init__.py +0 -4
  110. isar/models/communication/queues/queue_io.py +0 -12
  111. isar/models/communication/queues/queue_timeout_error.py +0 -2
  112. isar/models/communication/queues/queues.py +0 -19
  113. isar/models/communication/queues/status_queue.py +0 -20
  114. isar/models/mission_metadata/__init__.py +0 -0
  115. isar/services/auth/__init__.py +0 -0
  116. isar/services/auth/azure_credentials.py +0 -14
  117. isar/services/readers/__init__.py +0 -0
  118. isar/services/readers/base_reader.py +0 -37
  119. isar/services/service_connections/request_handler.py +0 -153
  120. isar/services/service_connections/stid/__init__.py +0 -0
  121. isar/services/utilities/queue_utilities.py +0 -39
  122. isar/services/utilities/threaded_request.py +0 -68
  123. isar/state_machine/states/idle.py +0 -85
  124. isar/state_machine/states/initialize.py +0 -71
  125. isar/state_machine/states/initiate.py +0 -142
  126. isar/state_machine/states/off.py +0 -18
  127. isar/state_machine/states/stop.py +0 -95
  128. isar/storage/slimm_storage.py +0 -191
  129. isar-1.20.2.dist-info/RECORD +0 -116
  130. robot_interface/models/initialize/__init__.py +0 -1
  131. robot_interface/models/initialize/initialize_params.py +0 -9
  132. robot_interface/models/mission/step.py +0 -234
  133. {isar-1.20.2.dist-info → isar-1.34.13.dist-info/licenses}/LICENSE +0 -0
  134. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/top_level.txt +0 -0
@@ -4,23 +4,27 @@ from typing import Optional
4
4
 
5
5
 
6
6
  class ErrorReason(str, Enum):
7
- RobotCommunicationException: str = "robot_communication_exception"
8
- RobotCommunicationTimeoutException: str = "robot_communication_timeout_exception"
9
- RobotInfeasibleStepException: str = "robot_infeasible_step_exception"
10
- RobotInfeasibleMissionException: str = "robot_infeasible_mission_exception"
11
- RobotMissionStatusException: str = "robot_mission_status_exception"
12
- RobotStepStatusException: str = "robot_step_status_exception"
13
- RobotAPIException: str = "robot_api_exception"
14
- RobotActionException: str = "robot_action_exception"
15
- RobotInitializeException: str = "robot_initialize_exception"
16
- RobotRetrieveDataException: str = "robot_retrieve_data_exception"
17
- RobotRetrieveInspectionException: str = "robot_retrieve_inspection_exception"
18
- RobotTelemetryException: str = "robot_telemetry_exception"
19
- RobotMapException: str = "robot_map_exception"
20
- RobotTransformException: str = "robot_transform_exception"
21
- RobotUnknownErrorException: str = "robot_unknown_error_exception"
22
- RobotDisconnectedException: str = "robot_disconnected_exception"
23
- RobotMissionNotSupportedException: str = "robot_mission_not_supported_exception"
7
+ RobotCommunicationException = "robot_communication_exception"
8
+ RobotCommunicationTimeoutException = "robot_communication_timeout_exception"
9
+ RobotInfeasibleTaskException = "robot_infeasible_task_exception"
10
+ RobotInfeasibleMissionException = "robot_infeasible_mission_exception"
11
+ RobotUnreliableDockingStatusException = "robot_unreliable_docking_status_exception"
12
+ RobotMissionStatusException = "robot_mission_status_exception"
13
+ RobotTaskStatusException = "robot_task_status_exception"
14
+ RobotAPIException = "robot_api_exception"
15
+ RobotActionException = "robot_action_exception"
16
+ RobotRetrieveDataException = "robot_retrieve_data_exception"
17
+ RobotRetrieveInspectionException = "robot_retrieve_inspection_exception"
18
+ RobotStillStartingMissionException = "robot_still_starting_mission_exception"
19
+ RobotTelemetryException = "robot_telemetry_exception"
20
+ RobotTelemetryNoUpdateException = "robot_telemetry_no_update_exception"
21
+ RobotTelemetryPoseException = "robot_telemetry_pose_exception"
22
+ RobotMapException = "robot_map_exception"
23
+ RobotTransformException = "robot_transform_exception"
24
+ RobotUnknownErrorException = "robot_unknown_error_exception"
25
+ RobotDisconnectedException = "robot_disconnected_exception"
26
+ RobotNoMissionRunningException = "robot_no_mission_running_exception"
27
+ RobotAlreadyHomeException = "robot_already_home_exception"
24
28
 
25
29
 
26
30
  @dataclass
@@ -39,7 +43,7 @@ class RobotException(Exception):
39
43
 
40
44
 
41
45
  # An exception which should be thrown by the robot package if it is unable to
42
- # communicate with the robot API.
46
+ # communicate with the robot API. ISAR will retry the request.
43
47
  class RobotCommunicationException(RobotException):
44
48
  def __init__(self, error_description: str) -> None:
45
49
  super().__init__(
@@ -50,6 +54,18 @@ class RobotCommunicationException(RobotException):
50
54
  pass
51
55
 
52
56
 
57
+ # An exception which should be thrown by the robot package if it is unable to
58
+ # complete a request as there is no ongoing mission.
59
+ class RobotNoMissionRunningException(RobotException):
60
+ def __init__(self, error_description: str) -> None:
61
+ super().__init__(
62
+ error_reason=ErrorReason.RobotNoMissionRunningException,
63
+ error_description=error_description,
64
+ )
65
+
66
+ pass
67
+
68
+
53
69
  # An exception which should be thrown by the robot package if the communication has timed
54
70
  # out and ISAR should retry the request.
55
71
  class RobotCommunicationTimeoutException(RobotException):
@@ -63,11 +79,11 @@ class RobotCommunicationTimeoutException(RobotException):
63
79
 
64
80
 
65
81
  # An exception which should be thrown by the robot package if it is unable to start the
66
- # current step.
67
- class RobotInfeasibleStepException(RobotException):
82
+ # current task.
83
+ class RobotInfeasibleTaskException(RobotException):
68
84
  def __init__(self, error_description: str) -> None:
69
85
  super().__init__(
70
- error_reason=ErrorReason.RobotInfeasibleStepException,
86
+ error_reason=ErrorReason.RobotInfeasibleTaskException,
71
87
  error_description=error_description,
72
88
  )
73
89
 
@@ -86,6 +102,16 @@ class RobotInfeasibleMissionException(RobotException):
86
102
  pass
87
103
 
88
104
 
105
+ class RobotUnreliableDockingStatusException(RobotException):
106
+ def __init__(self, error_description: str) -> None:
107
+ super().__init__(
108
+ error_reason=ErrorReason.RobotUnreliableDockingStatusException,
109
+ error_description=error_description,
110
+ )
111
+
112
+ pass
113
+
114
+
89
115
  # An exception which should be thrown by the robot package if it is unable to collect
90
116
  # the status of the current mission.
91
117
  class RobotMissionStatusException(RobotException):
@@ -99,11 +125,11 @@ class RobotMissionStatusException(RobotException):
99
125
 
100
126
 
101
127
  # An exception which should be thrown by the robot package if it is unable to collect
102
- # the status of the current step.
103
- class RobotStepStatusException(RobotException):
128
+ # the status of the current task.
129
+ class RobotTaskStatusException(RobotException):
104
130
  def __init__(self, error_description: str) -> None:
105
131
  super().__init__(
106
- error_reason=ErrorReason.RobotStepStatusException,
132
+ error_reason=ErrorReason.RobotTaskStatusException,
107
133
  error_description=error_description,
108
134
  )
109
135
 
@@ -135,19 +161,6 @@ class RobotActionException(RobotException):
135
161
  pass
136
162
 
137
163
 
138
- # An exception which should be thrown by the robot package if something is wrong during
139
- # the initialization of the robot. This exception will cause the mission to fail as
140
- # initialization is performed prior to starting the mission.
141
- class RobotInitializeException(RobotException):
142
- def __init__(self, error_description: str) -> None:
143
- super().__init__(
144
- error_reason=ErrorReason.RobotInitializeException,
145
- error_description=error_description,
146
- )
147
-
148
- pass
149
-
150
-
151
164
  # An exception which should be thrown by the robot package if it is unable to retrieve
152
165
  # data from the API like currently executing missions, status of the current mission
153
166
  # and similar.
@@ -162,7 +175,7 @@ class RobotRetrieveDataException(RobotException):
162
175
 
163
176
 
164
177
  # An exception which should be thrown by the robot package if it is unable to collect
165
- # the inspections that were generated for the currently executing step or mission.
178
+ # the inspections that were generated for the currently executing task or mission.
166
179
  class RobotRetrieveInspectionException(RobotException):
167
180
  def __init__(self, error_description: str) -> None:
168
181
  super().__init__(
@@ -173,6 +186,19 @@ class RobotRetrieveInspectionException(RobotException):
173
186
  pass
174
187
 
175
188
 
189
+ # An exception which should be thrown by the robot package if it is still starting the
190
+ # mission when another action is requested. An example of this can be trying to stop
191
+ # the robot while it is still starting the mission.
192
+ class RobotStillStartingMissionException(RobotException):
193
+ def __init__(self, error_description: str) -> None:
194
+ super().__init__(
195
+ error_reason=ErrorReason.RobotStillStartingMissionException,
196
+ error_description=error_description,
197
+ )
198
+
199
+ pass
200
+
201
+
176
202
  # An exception which should be thrown by the robot package if it is unable to retrieve
177
203
  # telemetry data. It should be used exclusively by the telemetry publishers and their
178
204
  # functions.
@@ -186,6 +212,29 @@ class RobotTelemetryException(RobotException):
186
212
  pass
187
213
 
188
214
 
215
+ # An exception which should be thrown by the robot package if it is unable to retrieve
216
+ # telemetry pose data. It should be used exclusively by the telemetry pose publisher.
217
+ class RobotTelemetryPoseException(RobotException):
218
+ def __init__(self, error_description: str) -> None:
219
+ super().__init__(
220
+ error_reason=ErrorReason.RobotTelemetryPoseException,
221
+ error_description=error_description,
222
+ )
223
+
224
+ pass
225
+
226
+
227
+ # An exception which should be thrown by the robot package if there is no new telemetry update.
228
+ class RobotTelemetryNoUpdateException(RobotException):
229
+ def __init__(self, error_description: str) -> None:
230
+ super().__init__(
231
+ error_reason=ErrorReason.RobotTelemetryNoUpdateException,
232
+ error_description=error_description,
233
+ )
234
+
235
+ pass
236
+
237
+
189
238
  # An exception which should be thrown by the robot package if it is unable to load the
190
239
  # configuration for maps and transformations. This could be caused by faulty
191
240
  # configuration and this exception will cause ISAR to crash as further execution is not
@@ -235,11 +284,12 @@ class RobotDisconnectedException(RobotException):
235
284
  pass
236
285
 
237
286
 
238
- # An exception which should be thrown by the robot package if the robot is given a mission type it cannot run, such as a localisation mission
239
- class RobotMissionNotSupportedException(RobotException):
287
+ # An exception which should be thrown by the robot package if the robot receives a command
288
+ # to go home and decide to ignore this request as it is already at home.
289
+ class RobotAlreadyHomeException(RobotException):
240
290
  def __init__(self, error_description: str) -> None:
241
291
  super().__init__(
242
- error_reason=ErrorReason.RobotMissionNotSupportedException,
292
+ error_reason=ErrorReason.RobotAlreadyHomeException,
243
293
  error_description=error_description,
244
294
  )
245
295
 
@@ -1,13 +0,0 @@
1
- from .inspection import (
2
- Audio,
3
- Image,
4
- ImageMetadata,
5
- Inspection,
6
- InspectionMetadata,
7
- ThermalImage,
8
- ThermalImageMetadata,
9
- ThermalVideo,
10
- ThermalVideoMetadata,
11
- Video,
12
- VideoMetadata,
13
- )
@@ -1,61 +1,62 @@
1
- from abc import ABC
2
- from dataclasses import dataclass, field
3
1
  from datetime import datetime
4
2
  from typing import Optional, Type
5
3
 
6
- from alitra import Pose
4
+ from alitra import Pose, Position
5
+ from pydantic import BaseModel, Field
7
6
 
8
- from robot_interface.utilities.uuid_string_factory import uuid4_string
9
7
 
10
-
11
- @dataclass
12
- class InspectionMetadata(ABC):
8
+ class InspectionMetadata(BaseModel):
13
9
  start_time: datetime
14
- pose: Pose
10
+ robot_pose: Pose
11
+ target_position: Position
15
12
  file_type: str
16
- analysis_type: Optional[str] = field(default=None, init=False)
17
- tag_id: Optional[str] = field(default=None, init=False)
18
- additional: Optional[dict] = field(default_factory=dict, init=False)
13
+ tag_id: Optional[str] = None
14
+ inspection_description: Optional[str] = None
19
15
 
20
16
 
21
- @dataclass
22
17
  class ImageMetadata(InspectionMetadata):
23
18
  pass
24
19
 
25
20
 
26
- @dataclass
27
21
  class ThermalImageMetadata(InspectionMetadata):
28
22
  pass
29
23
 
30
24
 
31
- @dataclass
32
25
  class VideoMetadata(InspectionMetadata):
33
- duration: Optional[float] = field(default=None)
26
+ duration: float
34
27
 
35
28
 
36
- @dataclass
37
29
  class ThermalVideoMetadata(InspectionMetadata):
38
- duration: Optional[float] = field(default=None)
30
+ duration: float
39
31
 
40
32
 
41
- @dataclass
42
33
  class AudioMetadata(InspectionMetadata):
43
- duration: Optional[float] = field(default=None)
34
+ duration: float
35
+
36
+
37
+ class GasMeasurementMetadata(InspectionMetadata):
38
+ pass
44
39
 
45
40
 
46
- @dataclass
47
- class Inspection:
48
- id: str = field(default_factory=uuid4_string, init=False)
41
+ class Inspection(BaseModel):
49
42
  metadata: InspectionMetadata
50
- data: Optional[bytes] = field(default=None, init=False)
43
+ id: str = Field(frozen=True)
51
44
 
52
45
  @staticmethod
53
46
  def get_metadata_type() -> Type[InspectionMetadata]:
54
47
  return InspectionMetadata
55
48
 
56
49
 
57
- @dataclass
58
- class Image(Inspection):
50
+ class InspectionValue(Inspection):
51
+ value: float = Field(frozen=True)
52
+ unit: str = Field(frozen=True)
53
+
54
+
55
+ class InspectionBlob(Inspection):
56
+ data: Optional[bytes] = Field(default=None, frozen=True)
57
+
58
+
59
+ class Image(InspectionBlob):
59
60
  metadata: ImageMetadata
60
61
 
61
62
  @staticmethod
@@ -63,8 +64,7 @@ class Image(Inspection):
63
64
  return ImageMetadata
64
65
 
65
66
 
66
- @dataclass
67
- class ThermalImage(Inspection):
67
+ class ThermalImage(InspectionBlob):
68
68
  metadata: ThermalImageMetadata
69
69
 
70
70
  @staticmethod
@@ -72,8 +72,7 @@ class ThermalImage(Inspection):
72
72
  return ThermalImageMetadata
73
73
 
74
74
 
75
- @dataclass
76
- class Video(Inspection):
75
+ class Video(InspectionBlob):
77
76
  metadata: VideoMetadata
78
77
 
79
78
  @staticmethod
@@ -81,8 +80,7 @@ class Video(Inspection):
81
80
  return VideoMetadata
82
81
 
83
82
 
84
- @dataclass
85
- class ThermalVideo(Inspection):
83
+ class ThermalVideo(InspectionBlob):
86
84
  metadata: ThermalVideoMetadata
87
85
 
88
86
  @staticmethod
@@ -90,10 +88,21 @@ class ThermalVideo(Inspection):
90
88
  return ThermalVideoMetadata
91
89
 
92
90
 
93
- @dataclass
94
- class Audio(Inspection):
91
+ class Audio(InspectionBlob):
95
92
  metadata: AudioMetadata
96
93
 
97
94
  @staticmethod
98
95
  def get_metadata_type() -> Type[InspectionMetadata]:
99
96
  return AudioMetadata
97
+
98
+
99
+ class GasMeasurement(InspectionValue):
100
+ metadata: GasMeasurementMetadata
101
+
102
+ @staticmethod
103
+ def get_metadata_type() -> Type[InspectionMetadata]:
104
+ return GasMeasurementMetadata
105
+
106
+
107
+ class CO2Measurement(GasMeasurement):
108
+ pass
@@ -1,26 +1,25 @@
1
- from dataclasses import dataclass, field
2
1
  from typing import List, Optional
3
2
 
4
3
  from alitra import Pose
4
+ from pydantic import BaseModel, Field
5
5
 
6
6
  from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
7
7
  from robot_interface.models.mission.status import MissionStatus
8
- from robot_interface.models.mission.task import Task
8
+ from robot_interface.models.mission.task import TASKS, TaskTypes
9
9
  from robot_interface.utilities.uuid_string_factory import uuid4_string
10
10
 
11
11
 
12
- @dataclass
13
- class Mission:
14
- tasks: List[Task]
15
- id: str = field(default_factory=uuid4_string, init=True)
16
- name: str = ""
17
- start_pose: Optional[Pose] = None
12
+ class Mission(BaseModel):
13
+ id: str = Field(default_factory=uuid4_string, frozen=True)
14
+ tasks: List[TASKS] = Field(default_factory=list, frozen=True)
15
+ name: str = Field(frozen=True)
16
+ start_pose: Optional[Pose] = Field(default=None, frozen=True)
18
17
  status: MissionStatus = MissionStatus.NotStarted
19
- error_message: Optional[ErrorMessage] = field(default=None, init=False)
18
+ error_message: Optional[ErrorMessage] = Field(default=None)
20
19
 
21
- def _set_unique_id(self) -> None:
22
- self.id: str = uuid4_string()
23
-
24
- def __post_init__(self) -> None:
25
- if self.id is None:
26
- self._set_unique_id()
20
+ def _is_return_to_home_mission(self) -> bool:
21
+ if len(self.tasks) != 1:
22
+ return False
23
+ if self.tasks[0].type != TaskTypes.ReturnToHome:
24
+ return False
25
+ return True
@@ -2,35 +2,29 @@ from enum import Enum
2
2
 
3
3
 
4
4
  class MissionStatus(str, Enum):
5
- NotStarted: str = "not_started"
6
- InProgress: str = "in_progress"
7
- Paused: str = "paused"
8
- Failed: str = "failed"
9
- Cancelled: str = "cancelled"
10
- Successful: str = "successful"
11
- PartiallySuccessful: str = "partially_successful"
12
-
13
-
14
- class StepStatus(str, Enum):
15
- NotStarted: str = "not_started"
16
- Successful: str = "successful"
17
- InProgress: str = "in_progress"
18
- Failed: str = "failed"
19
- Cancelled: str = "cancelled"
5
+ NotStarted = "not_started"
6
+ InProgress = "in_progress"
7
+ Paused = "paused"
8
+ Failed = "failed"
9
+ Cancelled = "cancelled"
10
+ Successful = "successful"
11
+ PartiallySuccessful = "partially_successful"
20
12
 
21
13
 
22
14
  class TaskStatus(str, Enum):
23
- NotStarted: str = "not_started"
24
- InProgress: str = "in_progress"
25
- Paused: str = "paused"
26
- Failed: str = "failed"
27
- Cancelled: str = "cancelled"
28
- Successful: str = "successful"
29
- PartiallySuccessful: str = "partially_successful"
15
+ NotStarted = "not_started"
16
+ InProgress = "in_progress"
17
+ Paused = "paused"
18
+ Failed = "failed"
19
+ Cancelled = "cancelled"
20
+ Successful = "successful"
21
+ PartiallySuccessful = "partially_successful"
30
22
 
31
23
 
32
24
  class RobotStatus(Enum):
33
- Available: str = "available"
34
- Busy: str = "busy"
35
- Offline: str = "offline"
36
- Blocked: str = "blocked"
25
+ Available = "available"
26
+ Paused = "paused"
27
+ Busy = "busy"
28
+ Home = "home"
29
+ Offline = "offline"
30
+ BlockedProtectiveStop = "blockedprotectivestop"