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.
- isar/apis/api.py +135 -86
- isar/apis/models/__init__.py +0 -1
- isar/apis/models/models.py +21 -11
- isar/apis/models/start_mission_definition.py +115 -170
- isar/apis/robot_control/robot_controller.py +41 -0
- isar/apis/schedule/scheduling_controller.py +123 -187
- isar/apis/security/authentication.py +5 -5
- isar/config/certs/ca-cert.pem +33 -31
- isar/config/keyvault/keyvault_service.py +4 -2
- isar/config/log.py +45 -40
- isar/config/logging.conf +16 -31
- isar/config/open_telemetry.py +102 -0
- isar/config/settings.py +74 -117
- isar/eventhandlers/eventhandler.py +123 -0
- isar/models/events.py +184 -0
- isar/models/status.py +22 -0
- isar/modules.py +117 -200
- isar/robot/robot.py +383 -0
- isar/robot/robot_battery.py +60 -0
- isar/robot/robot_monitor_mission.py +357 -0
- isar/robot/robot_pause_mission.py +74 -0
- isar/robot/robot_resume_mission.py +67 -0
- isar/robot/robot_start_mission.py +66 -0
- isar/robot/robot_status.py +61 -0
- isar/robot/robot_stop_mission.py +68 -0
- isar/robot/robot_upload_inspection.py +75 -0
- isar/script.py +58 -41
- isar/services/service_connections/mqtt/mqtt_client.py +47 -11
- isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +5 -2
- isar/services/service_connections/mqtt/robot_info_publisher.py +3 -3
- isar/services/service_connections/persistent_memory.py +69 -0
- isar/services/utilities/mqtt_utilities.py +93 -0
- isar/services/utilities/robot_utilities.py +20 -0
- isar/services/utilities/scheduling_utilities.py +386 -100
- isar/state_machine/state_machine.py +242 -539
- isar/state_machine/states/__init__.py +0 -8
- isar/state_machine/states/await_next_mission.py +114 -0
- isar/state_machine/states/blocked_protective_stop.py +60 -0
- isar/state_machine/states/going_to_lockdown.py +95 -0
- isar/state_machine/states/going_to_recharging.py +92 -0
- isar/state_machine/states/home.py +115 -0
- isar/state_machine/states/intervention_needed.py +77 -0
- isar/state_machine/states/lockdown.py +38 -0
- isar/state_machine/states/maintenance.py +43 -0
- isar/state_machine/states/monitor.py +137 -247
- isar/state_machine/states/offline.py +51 -53
- isar/state_machine/states/paused.py +92 -23
- isar/state_machine/states/pausing.py +48 -0
- isar/state_machine/states/pausing_return_home.py +48 -0
- isar/state_machine/states/recharging.py +80 -0
- isar/state_machine/states/resuming.py +57 -0
- isar/state_machine/states/resuming_return_home.py +64 -0
- isar/state_machine/states/return_home_paused.py +109 -0
- isar/state_machine/states/returning_home.py +217 -0
- isar/state_machine/states/stopping.py +69 -0
- isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
- isar/state_machine/states/stopping_go_to_lockdown.py +60 -0
- isar/state_machine/states/stopping_go_to_recharge.py +51 -0
- isar/state_machine/states/stopping_paused_mission.py +36 -0
- isar/state_machine/states/stopping_paused_return_home.py +59 -0
- isar/state_machine/states/stopping_return_home.py +59 -0
- isar/state_machine/states/unknown_status.py +74 -0
- isar/state_machine/states_enum.py +23 -5
- isar/state_machine/transitions/mission.py +225 -0
- isar/state_machine/transitions/return_home.py +108 -0
- isar/state_machine/transitions/robot_status.py +87 -0
- isar/state_machine/utils/common_event_handlers.py +138 -0
- isar/storage/blob_storage.py +70 -52
- isar/storage/local_storage.py +25 -12
- isar/storage/storage_interface.py +28 -7
- isar/storage/uploader.py +174 -55
- isar/storage/utilities.py +32 -29
- {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/METADATA +119 -123
- isar-1.34.13.dist-info/RECORD +120 -0
- {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/WHEEL +1 -1
- {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/entry_points.txt +1 -0
- robot_interface/models/exceptions/robot_exceptions.py +91 -41
- robot_interface/models/inspection/__init__.py +0 -13
- robot_interface/models/inspection/inspection.py +42 -33
- robot_interface/models/mission/mission.py +14 -15
- robot_interface/models/mission/status.py +20 -26
- robot_interface/models/mission/task.py +154 -121
- robot_interface/models/robots/battery_state.py +6 -0
- robot_interface/models/robots/media.py +13 -0
- robot_interface/models/robots/robot_model.py +7 -7
- robot_interface/robot_interface.py +119 -84
- robot_interface/telemetry/mqtt_client.py +74 -12
- robot_interface/telemetry/payloads.py +91 -13
- robot_interface/utilities/json_service.py +7 -1
- isar/config/configuration_error.py +0 -2
- isar/config/keyvault/keyvault_error.py +0 -2
- isar/config/predefined_mission_definition/__init__.py +0 -0
- isar/config/predefined_mission_definition/default_exr.json +0 -51
- isar/config/predefined_mission_definition/default_mission.json +0 -91
- isar/config/predefined_mission_definition/default_turtlebot.json +0 -124
- isar/config/predefined_missions/__init__.py +0 -0
- isar/config/predefined_missions/default.json +0 -92
- isar/config/predefined_missions/default_turtlebot.json +0 -110
- isar/config/predefined_poses/__init__.py +0 -0
- isar/config/predefined_poses/predefined_poses.py +0 -616
- isar/config/settings.env +0 -25
- isar/mission_planner/__init__.py +0 -0
- isar/mission_planner/local_planner.py +0 -82
- isar/mission_planner/mission_planner_interface.py +0 -26
- isar/mission_planner/sequential_task_selector.py +0 -23
- isar/mission_planner/task_selector_interface.py +0 -31
- isar/models/communication/__init__.py +0 -0
- isar/models/communication/message.py +0 -12
- isar/models/communication/queues/__init__.py +0 -4
- isar/models/communication/queues/queue_io.py +0 -12
- isar/models/communication/queues/queue_timeout_error.py +0 -2
- isar/models/communication/queues/queues.py +0 -19
- isar/models/communication/queues/status_queue.py +0 -20
- isar/models/mission_metadata/__init__.py +0 -0
- isar/services/auth/__init__.py +0 -0
- isar/services/auth/azure_credentials.py +0 -14
- isar/services/readers/__init__.py +0 -0
- isar/services/readers/base_reader.py +0 -37
- isar/services/service_connections/request_handler.py +0 -153
- isar/services/service_connections/stid/__init__.py +0 -0
- isar/services/utilities/queue_utilities.py +0 -39
- isar/services/utilities/threaded_request.py +0 -68
- isar/state_machine/states/idle.py +0 -85
- isar/state_machine/states/initialize.py +0 -71
- isar/state_machine/states/initiate.py +0 -142
- isar/state_machine/states/off.py +0 -18
- isar/state_machine/states/stop.py +0 -95
- isar/storage/slimm_storage.py +0 -191
- isar-1.20.2.dist-info/RECORD +0 -116
- robot_interface/models/initialize/__init__.py +0 -1
- robot_interface/models/initialize/initialize_params.py +0 -9
- robot_interface/models/mission/step.py +0 -234
- {isar-1.20.2.dist-info → isar-1.34.13.dist-info/licenses}/LICENSE +0 -0
- {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
|
|
8
|
-
RobotCommunicationTimeoutException
|
|
9
|
-
|
|
10
|
-
RobotInfeasibleMissionException
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
RobotRetrieveDataException
|
|
17
|
-
RobotRetrieveInspectionException
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
67
|
-
class
|
|
82
|
+
# current task.
|
|
83
|
+
class RobotInfeasibleTaskException(RobotException):
|
|
68
84
|
def __init__(self, error_description: str) -> None:
|
|
69
85
|
super().__init__(
|
|
70
|
-
error_reason=ErrorReason.
|
|
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
|
|
103
|
-
class
|
|
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.
|
|
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
|
|
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
|
|
239
|
-
|
|
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.
|
|
292
|
+
error_reason=ErrorReason.RobotAlreadyHomeException,
|
|
243
293
|
error_description=error_description,
|
|
244
294
|
)
|
|
245
295
|
|
|
@@ -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
|
-
|
|
10
|
+
robot_pose: Pose
|
|
11
|
+
target_position: Position
|
|
15
12
|
file_type: str
|
|
16
|
-
|
|
17
|
-
|
|
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:
|
|
26
|
+
duration: float
|
|
34
27
|
|
|
35
28
|
|
|
36
|
-
@dataclass
|
|
37
29
|
class ThermalVideoMetadata(InspectionMetadata):
|
|
38
|
-
duration:
|
|
30
|
+
duration: float
|
|
39
31
|
|
|
40
32
|
|
|
41
|
-
@dataclass
|
|
42
33
|
class AudioMetadata(InspectionMetadata):
|
|
43
|
-
duration:
|
|
34
|
+
duration: float
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GasMeasurementMetadata(InspectionMetadata):
|
|
38
|
+
pass
|
|
44
39
|
|
|
45
40
|
|
|
46
|
-
|
|
47
|
-
class Inspection:
|
|
48
|
-
id: str = field(default_factory=uuid4_string, init=False)
|
|
41
|
+
class Inspection(BaseModel):
|
|
49
42
|
metadata: InspectionMetadata
|
|
50
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
tasks: List[
|
|
15
|
-
|
|
16
|
-
|
|
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] =
|
|
18
|
+
error_message: Optional[ErrorMessage] = Field(default=None)
|
|
20
19
|
|
|
21
|
-
def
|
|
22
|
-
self.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
6
|
-
InProgress
|
|
7
|
-
Paused
|
|
8
|
-
Failed
|
|
9
|
-
Cancelled
|
|
10
|
-
Successful
|
|
11
|
-
PartiallySuccessful
|
|
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
|
|
24
|
-
InProgress
|
|
25
|
-
Paused
|
|
26
|
-
Failed
|
|
27
|
-
Cancelled
|
|
28
|
-
Successful
|
|
29
|
-
PartiallySuccessful
|
|
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
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
Available = "available"
|
|
26
|
+
Paused = "paused"
|
|
27
|
+
Busy = "busy"
|
|
28
|
+
Home = "home"
|
|
29
|
+
Offline = "offline"
|
|
30
|
+
BlockedProtectiveStop = "blockedprotectivestop"
|