isar 1.22.4__py3-none-any.whl → 1.23.1__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.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- isar/apis/api.py +1 -0
- isar/apis/models/models.py +2 -7
- isar/apis/models/start_mission_definition.py +86 -97
- isar/apis/schedule/scheduling_controller.py +11 -20
- isar/config/predefined_missions/default.json +70 -88
- isar/config/predefined_missions/default_turtlebot.json +102 -106
- isar/config/settings.env +1 -1
- isar/config/settings.py +3 -3
- isar/mission_planner/local_planner.py +3 -0
- isar/mission_planner/sequential_task_selector.py +3 -3
- isar/mission_planner/task_selector_interface.py +4 -4
- isar/script.py +1 -1
- isar/services/service_connections/mqtt/mqtt_client.py +1 -1
- isar/services/utilities/scheduling_utilities.py +3 -4
- isar/state_machine/state_machine.py +22 -98
- isar/state_machine/states/initialize.py +1 -1
- isar/state_machine/states/initiate.py +10 -10
- isar/state_machine/states/monitor.py +77 -100
- isar/state_machine/states/paused.py +1 -1
- isar/state_machine/states/stop.py +1 -1
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/METADATA +1 -1
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/RECORD +32 -33
- robot_interface/models/exceptions/robot_exceptions.py +4 -4
- robot_interface/models/inspection/inspection.py +1 -1
- robot_interface/models/mission/mission.py +2 -2
- robot_interface/models/mission/status.py +0 -8
- robot_interface/models/mission/task.py +182 -115
- robot_interface/robot_interface.py +29 -54
- robot_interface/models/mission/step.py +0 -234
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/LICENSE +0 -0
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/WHEEL +0 -0
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/entry_points.txt +0 -0
- {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/top_level.txt +0 -0
|
@@ -13,7 +13,7 @@ from robot_interface.models.exceptions.robot_exceptions import (
|
|
|
13
13
|
ErrorMessage,
|
|
14
14
|
RobotException,
|
|
15
15
|
RobotInfeasibleMissionException,
|
|
16
|
-
|
|
16
|
+
RobotInfeasibleTaskException,
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
if TYPE_CHECKING:
|
|
@@ -61,11 +61,11 @@ class Initiate(State):
|
|
|
61
61
|
break
|
|
62
62
|
|
|
63
63
|
if not self.initiate_thread:
|
|
64
|
-
if self.state_machine.
|
|
64
|
+
if self.state_machine.run_mission_by_task:
|
|
65
65
|
self._run_initiate_thread(
|
|
66
|
-
initiate_function=self.state_machine.robot.
|
|
67
|
-
function_argument=self.state_machine.
|
|
68
|
-
thread_name="State Machine Initiate
|
|
66
|
+
initiate_function=self.state_machine.robot.initiate_task,
|
|
67
|
+
function_argument=self.state_machine.current_task,
|
|
68
|
+
thread_name="State Machine Initiate Task",
|
|
69
69
|
)
|
|
70
70
|
else:
|
|
71
71
|
self._run_initiate_thread(
|
|
@@ -81,13 +81,13 @@ class Initiate(State):
|
|
|
81
81
|
except ThreadedRequestNotFinishedError:
|
|
82
82
|
time.sleep(self.state_machine.sleep_time)
|
|
83
83
|
continue
|
|
84
|
-
except
|
|
85
|
-
self.state_machine.
|
|
84
|
+
except RobotInfeasibleTaskException as e:
|
|
85
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
86
86
|
error_reason=e.error_reason, error_description=e.error_description
|
|
87
87
|
)
|
|
88
88
|
self.logger.warning(
|
|
89
|
-
f"Failed to initiate
|
|
90
|
-
f"{str(self.state_machine.
|
|
89
|
+
f"Failed to initiate task "
|
|
90
|
+
f"{str(self.state_machine.current_task.id)[:8]} after retrying "
|
|
91
91
|
f"{self.initiate_failure_counter} times because: "
|
|
92
92
|
f"{e.error_description}"
|
|
93
93
|
)
|
|
@@ -115,7 +115,7 @@ class Initiate(State):
|
|
|
115
115
|
)
|
|
116
116
|
|
|
117
117
|
if self.initiate_failure_counter >= self.initiate_failure_counter_limit:
|
|
118
|
-
self.state_machine.
|
|
118
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
119
119
|
error_reason=e.error_reason,
|
|
120
120
|
error_description=e.error_description,
|
|
121
121
|
)
|
|
@@ -7,7 +7,6 @@ from injector import inject
|
|
|
7
7
|
from transitions import State
|
|
8
8
|
|
|
9
9
|
from isar.config.settings import settings
|
|
10
|
-
from isar.mission_planner.task_selector_interface import TaskSelectorStop
|
|
11
10
|
from isar.services.utilities.threaded_request import (
|
|
12
11
|
ThreadedRequest,
|
|
13
12
|
ThreadedRequestNotFinishedError,
|
|
@@ -16,14 +15,13 @@ from robot_interface.models.exceptions.robot_exceptions import (
|
|
|
16
15
|
ErrorMessage,
|
|
17
16
|
RobotCommunicationTimeoutException,
|
|
18
17
|
RobotException,
|
|
19
|
-
RobotMissionStatusException,
|
|
20
18
|
RobotRetrieveInspectionException,
|
|
21
|
-
|
|
19
|
+
RobotTaskStatusException,
|
|
22
20
|
)
|
|
23
21
|
from robot_interface.models.inspection.inspection import Inspection
|
|
24
22
|
from robot_interface.models.mission.mission import Mission
|
|
25
|
-
from robot_interface.models.mission.status import
|
|
26
|
-
from robot_interface.models.mission.
|
|
23
|
+
from robot_interface.models.mission.status import TaskStatus
|
|
24
|
+
from robot_interface.models.mission.task import InspectionTask, Task
|
|
27
25
|
|
|
28
26
|
if TYPE_CHECKING:
|
|
29
27
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -40,16 +38,16 @@ class Monitor(State):
|
|
|
40
38
|
)
|
|
41
39
|
|
|
42
40
|
self.logger = logging.getLogger("state_machine")
|
|
43
|
-
self.
|
|
41
|
+
self.task_status_thread: Optional[ThreadedRequest] = None
|
|
44
42
|
|
|
45
43
|
def start(self) -> None:
|
|
46
44
|
self.state_machine.update_state()
|
|
47
45
|
self._run()
|
|
48
46
|
|
|
49
47
|
def stop(self) -> None:
|
|
50
|
-
if self.
|
|
51
|
-
self.
|
|
52
|
-
self.
|
|
48
|
+
if self.task_status_thread:
|
|
49
|
+
self.task_status_thread.wait_for_thread()
|
|
50
|
+
self.task_status_thread = None
|
|
53
51
|
|
|
54
52
|
def _run(self) -> None:
|
|
55
53
|
transition: Callable
|
|
@@ -59,121 +57,110 @@ class Monitor(State):
|
|
|
59
57
|
break
|
|
60
58
|
|
|
61
59
|
if self.state_machine.should_pause_mission():
|
|
62
|
-
if self.state_machine.
|
|
60
|
+
if self.state_machine.run_mission_by_task:
|
|
63
61
|
transition = self.state_machine.pause # type: ignore
|
|
64
62
|
else:
|
|
65
63
|
transition = self.state_machine.pause_full_mission # type: ignore
|
|
66
64
|
break
|
|
67
65
|
|
|
68
|
-
if not self.
|
|
66
|
+
if not self.task_status_thread:
|
|
69
67
|
self._run_get_status_thread(
|
|
70
|
-
status_function=self.state_machine.robot.
|
|
68
|
+
status_function=self.state_machine.robot.task_status,
|
|
69
|
+
function_argument=self.state_machine.current_task.id,
|
|
71
70
|
thread_name="State Machine Monitor Get Step Status",
|
|
72
71
|
)
|
|
73
72
|
try:
|
|
74
|
-
status:
|
|
73
|
+
status: TaskStatus = self.task_status_thread.get_output()
|
|
75
74
|
except ThreadedRequestNotFinishedError:
|
|
76
75
|
time.sleep(self.state_machine.sleep_time)
|
|
77
76
|
continue
|
|
78
77
|
|
|
79
78
|
except RobotCommunicationTimeoutException as e:
|
|
80
|
-
|
|
81
|
-
if
|
|
82
|
-
status =
|
|
79
|
+
task_failed: bool = self._handle_communication_timeout(e)
|
|
80
|
+
if task_failed:
|
|
81
|
+
status = TaskStatus.Failed
|
|
83
82
|
else:
|
|
84
83
|
continue
|
|
85
84
|
|
|
86
|
-
except
|
|
87
|
-
self.state_machine.
|
|
85
|
+
except RobotTaskStatusException as e:
|
|
86
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
88
87
|
error_reason=e.error_reason, error_description=e.error_description
|
|
89
88
|
)
|
|
90
89
|
self.logger.error(
|
|
91
|
-
f"Monitoring
|
|
90
|
+
f"Monitoring task {self.state_machine.current_task.id[:8]} failed "
|
|
92
91
|
f"because: {e.error_description}"
|
|
93
92
|
)
|
|
94
|
-
status =
|
|
93
|
+
status = TaskStatus.Failed
|
|
95
94
|
|
|
96
95
|
except RobotException as e:
|
|
97
96
|
self._set_error_message(e)
|
|
98
|
-
status =
|
|
97
|
+
status = TaskStatus.Failed
|
|
99
98
|
|
|
100
99
|
self.logger.error(
|
|
101
100
|
f"Retrieving the status failed because: {e.error_description}"
|
|
102
101
|
)
|
|
103
102
|
|
|
104
|
-
if not isinstance(status,
|
|
103
|
+
if not isinstance(status, TaskStatus):
|
|
105
104
|
self.logger.error(
|
|
106
|
-
f"Received an invalid status update when monitoring mission. Only
|
|
105
|
+
f"Received an invalid status update when monitoring mission. Only TaskStatus is expected."
|
|
107
106
|
)
|
|
108
107
|
break
|
|
109
108
|
|
|
110
109
|
if self.state_machine.current_task == None:
|
|
111
110
|
self.state_machine.iterate_current_task()
|
|
112
|
-
if self.state_machine.current_step == None:
|
|
113
|
-
self.state_machine.iterate_current_step()
|
|
114
111
|
|
|
115
|
-
self.state_machine.
|
|
112
|
+
self.state_machine.current_task.status = status
|
|
116
113
|
|
|
117
114
|
if self._should_upload_inspections():
|
|
118
|
-
|
|
115
|
+
get_inspection_thread = ThreadedRequest(
|
|
119
116
|
self._queue_inspections_for_upload
|
|
120
117
|
)
|
|
121
|
-
|
|
118
|
+
get_inspection_thread.start_thread(
|
|
122
119
|
deepcopy(self.state_machine.current_mission),
|
|
123
|
-
deepcopy(self.state_machine.
|
|
120
|
+
deepcopy(self.state_machine.current_task),
|
|
124
121
|
name="State Machine Get Inspections",
|
|
125
122
|
)
|
|
126
123
|
|
|
127
|
-
if self.state_machine.
|
|
128
|
-
if self.
|
|
129
|
-
self.
|
|
130
|
-
transition = self.state_machine.
|
|
124
|
+
if self.state_machine.run_mission_by_task:
|
|
125
|
+
if self.state_machine.current_task.is_finished():
|
|
126
|
+
self._report_task_status(self.state_machine.current_task)
|
|
127
|
+
transition = self.state_machine.task_finished # type: ignore
|
|
131
128
|
break
|
|
132
129
|
else:
|
|
133
|
-
if self.
|
|
134
|
-
self.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
self.state_machine.publish_task_status(
|
|
152
|
-
task=self.state_machine.current_task
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
self.state_machine.iterate_current_step()
|
|
156
|
-
|
|
157
|
-
else: # If not all steps are done
|
|
158
|
-
self.state_machine.current_task.status = TaskStatus.InProgress
|
|
159
|
-
|
|
160
|
-
self.step_status_thread = None
|
|
130
|
+
if self.state_machine.current_task.is_finished():
|
|
131
|
+
self._report_task_status(self.state_machine.current_task)
|
|
132
|
+
self.state_machine.publish_task_status(
|
|
133
|
+
task=self.state_machine.current_task
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
self.state_machine.iterate_current_task()
|
|
137
|
+
if self.state_machine.current_task == None:
|
|
138
|
+
transition = self.state_machine.full_mission_finished # type: ignore
|
|
139
|
+
break
|
|
140
|
+
|
|
141
|
+
# Report and update next task
|
|
142
|
+
self.state_machine.current_task.update_task_status()
|
|
143
|
+
self.state_machine.publish_task_status(
|
|
144
|
+
task=self.state_machine.current_task
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
self.task_status_thread = None
|
|
161
148
|
time.sleep(self.state_machine.sleep_time)
|
|
162
149
|
|
|
163
150
|
transition()
|
|
164
151
|
|
|
165
152
|
def _run_get_status_thread(
|
|
166
|
-
self, status_function: Callable, thread_name: str
|
|
153
|
+
self, status_function: Callable, function_argument: str, thread_name: str
|
|
167
154
|
) -> None:
|
|
168
|
-
self.
|
|
169
|
-
self.
|
|
155
|
+
self.task_status_thread = ThreadedRequest(request_func=status_function)
|
|
156
|
+
self.task_status_thread.start_thread(function_argument, name=thread_name)
|
|
170
157
|
|
|
171
158
|
def _queue_inspections_for_upload(
|
|
172
|
-
self, mission: Mission,
|
|
159
|
+
self, mission: Mission, current_task: InspectionTask
|
|
173
160
|
) -> None:
|
|
174
161
|
try:
|
|
175
|
-
|
|
176
|
-
|
|
162
|
+
inspection: Inspection = self.state_machine.robot.get_inspection(
|
|
163
|
+
task=current_task
|
|
177
164
|
)
|
|
178
165
|
|
|
179
166
|
except (RobotRetrieveInspectionException, RobotException) as e:
|
|
@@ -183,52 +170,42 @@ class Monitor(State):
|
|
|
183
170
|
)
|
|
184
171
|
return
|
|
185
172
|
|
|
186
|
-
if not
|
|
173
|
+
if not inspection:
|
|
187
174
|
self.logger.warning(
|
|
188
|
-
f"No inspection data retrieved for
|
|
175
|
+
f"No inspection data retrieved for task {str(current_task.id)[:8]}"
|
|
189
176
|
)
|
|
190
177
|
|
|
191
|
-
|
|
192
|
-
inspection.metadata.tag_id = current_step.tag_id
|
|
178
|
+
inspection.metadata.tag_id = current_task.tag_id
|
|
193
179
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
def
|
|
202
|
-
|
|
203
|
-
if step.status == StepStatus.Failed:
|
|
204
|
-
finished = True
|
|
205
|
-
elif step.status == StepStatus.Successful:
|
|
206
|
-
finished = True
|
|
207
|
-
return finished
|
|
208
|
-
|
|
209
|
-
def _report_step_status(self, step: Step) -> None:
|
|
210
|
-
if step.status == StepStatus.Failed:
|
|
180
|
+
message: Tuple[Inspection, Mission] = (
|
|
181
|
+
inspection,
|
|
182
|
+
mission,
|
|
183
|
+
)
|
|
184
|
+
self.state_machine.queues.upload_queue.put(message)
|
|
185
|
+
self.logger.info(f"Inspection: {str(inspection.id)[:8]} queued for upload")
|
|
186
|
+
|
|
187
|
+
def _report_task_status(self, task: Task) -> None:
|
|
188
|
+
if task.status == TaskStatus.Failed:
|
|
211
189
|
self.logger.warning(
|
|
212
|
-
f"
|
|
190
|
+
f"Task: {str(task.id)[:8]} was reported as failed by the robot"
|
|
213
191
|
)
|
|
214
|
-
elif
|
|
192
|
+
elif task.status == TaskStatus.Successful:
|
|
215
193
|
self.logger.info(
|
|
216
|
-
f"{type(
|
|
194
|
+
f"{type(task).__name__} task: {str(task.id)[:8]} completed"
|
|
217
195
|
)
|
|
218
196
|
|
|
219
197
|
def _should_upload_inspections(self) -> bool:
|
|
220
|
-
step: Step = self.state_machine.current_step
|
|
221
198
|
return (
|
|
222
|
-
self.
|
|
223
|
-
and
|
|
224
|
-
and isinstance(
|
|
199
|
+
self.state_machine.current_task.is_finished()
|
|
200
|
+
and self.state_machine.current_task.status == TaskStatus.Successful
|
|
201
|
+
and isinstance(self.state_machine.current_task, InspectionTask)
|
|
225
202
|
)
|
|
226
203
|
|
|
227
204
|
def _set_error_message(self, e: RobotException) -> None:
|
|
228
205
|
error_message: ErrorMessage = ErrorMessage(
|
|
229
206
|
error_reason=e.error_reason, error_description=e.error_description
|
|
230
207
|
)
|
|
231
|
-
self.state_machine.
|
|
208
|
+
self.state_machine.current_task.error_message = error_message
|
|
232
209
|
|
|
233
210
|
def _handle_communication_timeout(
|
|
234
211
|
self, e: RobotCommunicationTimeoutException
|
|
@@ -236,10 +213,10 @@ class Monitor(State):
|
|
|
236
213
|
self.state_machine.current_mission.error_message = ErrorMessage(
|
|
237
214
|
error_reason=e.error_reason, error_description=e.error_description
|
|
238
215
|
)
|
|
239
|
-
self.
|
|
216
|
+
self.task_status_thread = None
|
|
240
217
|
self.request_status_failure_counter += 1
|
|
241
218
|
self.logger.warning(
|
|
242
|
-
f"Monitoring
|
|
219
|
+
f"Monitoring task {self.state_machine.current_task.id} failed #: "
|
|
243
220
|
f"{self.request_status_failure_counter} failed because: {e.error_description}"
|
|
244
221
|
)
|
|
245
222
|
|
|
@@ -247,12 +224,12 @@ class Monitor(State):
|
|
|
247
224
|
self.request_status_failure_counter
|
|
248
225
|
>= self.request_status_failure_counter_limit
|
|
249
226
|
):
|
|
250
|
-
self.state_machine.
|
|
227
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
251
228
|
error_reason=e.error_reason,
|
|
252
229
|
error_description=e.error_description,
|
|
253
230
|
)
|
|
254
231
|
self.logger.error(
|
|
255
|
-
f"Step will be cancelled after failing to get
|
|
232
|
+
f"Step will be cancelled after failing to get task status "
|
|
256
233
|
f"{self.request_status_failure_counter} times because: "
|
|
257
234
|
f"{e.error_description}"
|
|
258
235
|
)
|
|
@@ -26,7 +26,7 @@ class Paused(State):
|
|
|
26
26
|
break
|
|
27
27
|
|
|
28
28
|
if self.state_machine.should_resume_mission():
|
|
29
|
-
if self.state_machine.
|
|
29
|
+
if self.state_machine.run_mission_by_task:
|
|
30
30
|
transition = self.state_machine.resume # type: ignore
|
|
31
31
|
else:
|
|
32
32
|
transition = self.state_machine.resume_full_mission # type: ignore
|
|
@@ -81,7 +81,7 @@ class Stop(State):
|
|
|
81
81
|
def handle_stop_fail(self, retry_limit: int, error_message: ErrorMessage) -> bool:
|
|
82
82
|
self._count_number_retries += 1
|
|
83
83
|
if self._count_number_retries > retry_limit:
|
|
84
|
-
self.state_machine.
|
|
84
|
+
self.state_machine.current_task.error_message = error_message
|
|
85
85
|
|
|
86
86
|
self.logger.error(
|
|
87
87
|
f"\nFailed to stop the robot after {retry_limit} attempts because: "
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
isar/__init__.py,sha256=cH8p8bVveu3FUL6kBhldcSlLaoHgD82Kd0-SwSNfGXw,87
|
|
2
2
|
isar/modules.py,sha256=aO8bLSC4i_Qo4bOJ6aFfwAZRTJAw8o9SOOfkceUGCiU,6708
|
|
3
|
-
isar/script.py,sha256=
|
|
3
|
+
isar/script.py,sha256=C6CTOZKjWu3JC-jOTN6QPd0Z6NxbydIcQcOM2tXMEXQ,5376
|
|
4
4
|
isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
isar/apis/api.py,sha256=
|
|
5
|
+
isar/apis/api.py,sha256=zrNdnMe5GS1xMtPLsF2Za0NKEyYNKMAVim4l027qQA4,13141
|
|
6
6
|
isar/apis/models/__init__.py,sha256=NI1BYyN__Ogr00Qqe0XJ-9gEVPva2brXo2RJsbrS4tM,52
|
|
7
|
-
isar/apis/models/models.py,sha256=
|
|
8
|
-
isar/apis/models/start_mission_definition.py,sha256=
|
|
7
|
+
isar/apis/models/models.py,sha256=6E8VhGBti6EKJefYTDNVERxRu_g_omg4J2MriPUPkaw,1709
|
|
8
|
+
isar/apis/models/start_mission_definition.py,sha256=EFYkKMQL2o4hqumU1Dq-lKHAS4ZzxlC15XD1AZLpULs,8168
|
|
9
9
|
isar/apis/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
-
isar/apis/schedule/scheduling_controller.py,sha256=
|
|
10
|
+
isar/apis/schedule/scheduling_controller.py,sha256=GXjvkF4OPRJTWzQEvvxbKc79x2X2uzqbl1ZOv_-9Fpw,11508
|
|
11
11
|
isar/apis/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
isar/apis/security/authentication.py,sha256=TI8U9Y_L6ihHLMeM50ZONd5EPfuHdw_XMU_Q987W4AY,1975
|
|
13
13
|
isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
isar/config/configuration_error.py,sha256=rO6WOhafX6xvVib8WxV-eY483Z0PpN-9PxGsq5ATfKc,46
|
|
15
15
|
isar/config/log.py,sha256=zHFLmGWQRn8TrcsxUS6KHpJt2JE86kYazU7b-bkcN9o,2285
|
|
16
16
|
isar/config/logging.conf,sha256=mYO1xf27gAopEMHhGzY7-mwyfN16rwRLkPNMvy3zn2g,1127
|
|
17
|
-
isar/config/settings.env,sha256
|
|
18
|
-
isar/config/settings.py,sha256=
|
|
17
|
+
isar/config/settings.env,sha256=hJFfyl4S84nmcyf70Pz8nbGlPf4KTVx0UkgP3uf6T8E,534
|
|
18
|
+
isar/config/settings.py,sha256=NgL3UegkJwsRRkV6rgbig6Xi5k4eYlHpzheaEFavFPs,13477
|
|
19
19
|
isar/config/certs/ca-cert.pem,sha256=ijutWtGOAnKx3xPydNLOVoCLip3tGkNKUpr6pTPQfJA,2179
|
|
20
20
|
isar/config/keyvault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
21
|
isar/config/keyvault/keyvault_error.py,sha256=zvPCsZLjboxsxthYkxpRERCTFxYV8R5WmACewAUQLwk,41
|
|
@@ -32,15 +32,15 @@ isar/config/predefined_mission_definition/default_exr.json,sha256=L3-kqjfgXoULDU
|
|
|
32
32
|
isar/config/predefined_mission_definition/default_mission.json,sha256=nEk1ql17RAs2I5Ws2wA-0GJ6oqJco-Q0Q0vhf4k6ajc,2926
|
|
33
33
|
isar/config/predefined_mission_definition/default_turtlebot.json,sha256=Ka379MLu8qiGIa6Fu-8p8A4OgHVccLkKYSX0RthUOeI,4060
|
|
34
34
|
isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
-
isar/config/predefined_missions/default.json,sha256=
|
|
36
|
-
isar/config/predefined_missions/default_turtlebot.json,sha256=
|
|
35
|
+
isar/config/predefined_missions/default.json,sha256=27-_KSQvYnmhv7edn1eB9jXjtodad29-pvdpT1YRxr0,1325
|
|
36
|
+
isar/config/predefined_missions/default_turtlebot.json,sha256=yjxr7-q0Yueq4aAyOG0Yw2x9NuxKTBOZDmjg5-BlYOM,1944
|
|
37
37
|
isar/config/predefined_poses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
38
|
isar/config/predefined_poses/predefined_poses.py,sha256=fhq8JF00feDLFKNBlyWeFoLfvfs5dVb__C7CmiVbwmQ,25779
|
|
39
39
|
isar/mission_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
-
isar/mission_planner/local_planner.py,sha256=
|
|
40
|
+
isar/mission_planner/local_planner.py,sha256=gNEtln8e-f2mmyP9IM_8lbXo92HNF4rdMrrIxOPMoBY,3073
|
|
41
41
|
isar/mission_planner/mission_planner_interface.py,sha256=51k6KKXqC8wZ4Mc8ZWo00Nwy8c6yNa81nEZNZelwJeo,485
|
|
42
|
-
isar/mission_planner/sequential_task_selector.py,sha256=
|
|
43
|
-
isar/mission_planner/task_selector_interface.py,sha256=
|
|
42
|
+
isar/mission_planner/sequential_task_selector.py,sha256=lzBPV97wGBfqwpEh4l_7qhijx56yQtOmIM9DhIMOGFY,649
|
|
43
|
+
isar/mission_planner/task_selector_interface.py,sha256=mzZEQfvU9BLCo_pu3fXXuYIjwjdjcr0vJ2pUCtFsr68,713
|
|
44
44
|
isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
45
|
isar/models/communication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
isar/models/communication/message.py,sha256=yN4SXYM-W_6u3Cf9yuAE3jy4e6mMrL3yUr-iVV4r55E,241
|
|
@@ -58,26 +58,26 @@ isar/services/readers/base_reader.py,sha256=_fNd5fb5dFeMtOvfWzIAGO-KIgl3zT19iEuz
|
|
|
58
58
|
isar/services/service_connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
isar/services/service_connections/request_handler.py,sha256=0LxC0lu_HXeEf_xmJWjfEsh14oAUI97cpG1IWtBlcs4,4278
|
|
60
60
|
isar/services/service_connections/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
|
-
isar/services/service_connections/mqtt/mqtt_client.py,sha256=
|
|
61
|
+
isar/services/service_connections/mqtt/mqtt_client.py,sha256=N6o9U1PUmMJdHz-EDI8TA28gnMTVmNoxo_BKlfGyzeU,3547
|
|
62
62
|
isar/services/service_connections/mqtt/robot_heartbeat_publisher.py,sha256=_bUOG7CfqBlCRvG4vh2XGoMXucBxsJarFIeXIKOH1aw,1019
|
|
63
63
|
isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=5G6ahslydhO2Z4Ug3abf5KVHeOiWdWBMxwraRbJZS_I,1456
|
|
64
64
|
isar/services/service_connections/stid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
65
|
isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
66
|
isar/services/utilities/queue_utilities.py,sha256=Pw3hehSwkXJNeDv-bDVDfs58VOwtt3i5hpiJ2ZpphuQ,1225
|
|
67
|
-
isar/services/utilities/scheduling_utilities.py,sha256=
|
|
67
|
+
isar/services/utilities/scheduling_utilities.py,sha256=cLnB97EkoZM0GN6kG5ezpzxLzACSoHU_Mv86ncyHdfM,8386
|
|
68
68
|
isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
|
|
69
69
|
isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
|
-
isar/state_machine/state_machine.py,sha256=
|
|
70
|
+
isar/state_machine/state_machine.py,sha256=A7qAaXEnErmPQ7--sM7w9VabceS0qJOProlmwMb9iaU,21299
|
|
71
71
|
isar/state_machine/states_enum.py,sha256=BlrUcBWkM5K6D_UZXRwTaUgGpAagWmVZH6HhDBGzVU4,278
|
|
72
72
|
isar/state_machine/states/__init__.py,sha256=kErbKPDTwNfCLijvdyN6_AuOqDwR23nu9F0Qovsnir4,218
|
|
73
73
|
isar/state_machine/states/idle.py,sha256=iAKESjETKUt9x3inE7TAPIohVM1iRsYyJjOoBeB3sVw,3079
|
|
74
|
-
isar/state_machine/states/initialize.py,sha256=
|
|
75
|
-
isar/state_machine/states/initiate.py,sha256=
|
|
76
|
-
isar/state_machine/states/monitor.py,sha256=
|
|
74
|
+
isar/state_machine/states/initialize.py,sha256=TVXV5Ps3N4_flM88j9pQiX88kZgLzLwzlJy_6hPbgcA,2359
|
|
75
|
+
isar/state_machine/states/initiate.py,sha256=j1wvSC3zVODgRkKOVsQROiuWkjihSBtwCs5GsoivLvc,5655
|
|
76
|
+
isar/state_machine/states/monitor.py,sha256=Nts7S9BuKYmOj73cRrkEZHHWXP5kh-2BKfSBH14MFYQ,9297
|
|
77
77
|
isar/state_machine/states/off.py,sha256=jjqN_oJMpBtWuY7hP-c9f0w3p2CYCfe-NpmYHHPnmyI,544
|
|
78
78
|
isar/state_machine/states/offline.py,sha256=ur5wDo4NWRLn7n-p5IUY6aSYcGApmqe_0IbRRywA6qA,2169
|
|
79
|
-
isar/state_machine/states/paused.py,sha256=
|
|
80
|
-
isar/state_machine/states/stop.py,sha256=
|
|
79
|
+
isar/state_machine/states/paused.py,sha256=TIg1iJvAxGUIfzE_qWp0wrq4Ka0a3zEf3GNwIWLIK0M,1177
|
|
80
|
+
isar/state_machine/states/stop.py,sha256=WVyjhndHcccy7_P9bU7SXyZB3qphsGahdSymaghGc08,3348
|
|
81
81
|
isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
82
|
isar/storage/blob_storage.py,sha256=oKdml1VVN8iTr-d_5H4Lz5E7zrhJRknCzOxHD-tO7m8,3230
|
|
83
83
|
isar/storage/local_storage.py,sha256=Bnmoi5gyN8r-oRh0aHrOdGqaH3JqRScFKMRXYojW5kY,1855
|
|
@@ -86,20 +86,19 @@ isar/storage/storage_interface.py,sha256=DYDry4I7aZpDHJhsBF6s8zrgokFAc7fdKJKfA8A
|
|
|
86
86
|
isar/storage/uploader.py,sha256=_f-uIiL5ye6GLc7nYQxHrqDXrIquoL_t5tt9SSaYoDA,6440
|
|
87
87
|
isar/storage/utilities.py,sha256=AGqOzhnyPXSStpJjBstqQ4QgUoHJioQB2DJ1NqeWn_w,3136
|
|
88
88
|
robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
89
|
-
robot_interface/robot_interface.py,sha256=
|
|
89
|
+
robot_interface/robot_interface.py,sha256=Jbfh1L7lPCjfHS6l3oQ_r0ACZw-KCazVc09PhxEIuao,8566
|
|
90
90
|
robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
|
|
91
91
|
robot_interface/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
92
|
robot_interface/models/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
|
-
robot_interface/models/exceptions/robot_exceptions.py,sha256=
|
|
93
|
+
robot_interface/models/exceptions/robot_exceptions.py,sha256=PnD5BvWHZfhxODv4abdmQ4PBLk41KcHcH-HYvOXUNNg,9549
|
|
94
94
|
robot_interface/models/initialize/__init__.py,sha256=rz5neEDr59GDbzzI_FF0DId-C-I-50l113P-h-C_QBY,48
|
|
95
95
|
robot_interface/models/initialize/initialize_params.py,sha256=2eG5Aq5bDKU6tVkaUMAoc46GERBgyaKkqv6yLupdRLc,164
|
|
96
96
|
robot_interface/models/inspection/__init__.py,sha256=14wfuj4XZazrigKD7fL98khFKz-eckIpEgPcYRj40Kg,227
|
|
97
|
-
robot_interface/models/inspection/inspection.py,sha256=
|
|
97
|
+
robot_interface/models/inspection/inspection.py,sha256=kFO3pDkZrggPrS1O5TxOsQYhGSuK-51NWnf4uM99sHs,2175
|
|
98
98
|
robot_interface/models/mission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
99
|
-
robot_interface/models/mission/mission.py,sha256=
|
|
100
|
-
robot_interface/models/mission/status.py,sha256=
|
|
101
|
-
robot_interface/models/mission/
|
|
102
|
-
robot_interface/models/mission/task.py,sha256=Nup8e_M_KYhtEtGNeV4FzVzaRH4YpDWiKfMMkLJu0ms,4788
|
|
99
|
+
robot_interface/models/mission/mission.py,sha256=FjrLagGqhk8x9y_fX7DwvApA_hdc7YJcdqT3vigB39g,907
|
|
100
|
+
robot_interface/models/mission/status.py,sha256=C_viZWNTYOncWCdurx7Pko_D9d595QmHuJZBT8YMHUg,724
|
|
101
|
+
robot_interface/models/mission/task.py,sha256=Qy2XmOmk8HChXMe1y8Dn9PvgA2W98Ypd1VqPPNK8ILM,5118
|
|
103
102
|
robot_interface/models/robots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
103
|
robot_interface/models/robots/robot_model.py,sha256=pZQsqhn9hh6XE3EjMZhWMzYqg5oJ4CJ4CXeOASKvEf8,452
|
|
105
104
|
robot_interface/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -109,9 +108,9 @@ robot_interface/telemetry/payloads.py,sha256=FafpIwsOvcTNtaBZqyOX7r5EjG7nZ2uLNhy
|
|
|
109
108
|
robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
110
109
|
robot_interface/utilities/json_service.py,sha256=nU2Q_3P9Fq9hs6F_wtUjWtHfl_g1Siy-yDhXXSKwHwg,1018
|
|
111
110
|
robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
|
|
112
|
-
isar-1.
|
|
113
|
-
isar-1.
|
|
114
|
-
isar-1.
|
|
115
|
-
isar-1.
|
|
116
|
-
isar-1.
|
|
117
|
-
isar-1.
|
|
111
|
+
isar-1.23.1.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
|
|
112
|
+
isar-1.23.1.dist-info/METADATA,sha256=iXPUWr1_LQuzNQCRRch3MEfEvyK17NF-RMs8oIgxCaI,30674
|
|
113
|
+
isar-1.23.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
114
|
+
isar-1.23.1.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
|
|
115
|
+
isar-1.23.1.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
|
|
116
|
+
isar-1.23.1.dist-info/RECORD,,
|
|
@@ -6,7 +6,7 @@ from typing import Optional
|
|
|
6
6
|
class ErrorReason(str, Enum):
|
|
7
7
|
RobotCommunicationException: str = "robot_communication_exception"
|
|
8
8
|
RobotCommunicationTimeoutException: str = "robot_communication_timeout_exception"
|
|
9
|
-
|
|
9
|
+
RobotInfeasibleTaskException: str = "robot_infeasible_step_exception"
|
|
10
10
|
RobotInfeasibleMissionException: str = "robot_infeasible_mission_exception"
|
|
11
11
|
RobotMissionStatusException: str = "robot_mission_status_exception"
|
|
12
12
|
RobotStepStatusException: str = "robot_step_status_exception"
|
|
@@ -67,10 +67,10 @@ class RobotCommunicationTimeoutException(RobotException):
|
|
|
67
67
|
|
|
68
68
|
# An exception which should be thrown by the robot package if it is unable to start the
|
|
69
69
|
# current step.
|
|
70
|
-
class
|
|
70
|
+
class RobotInfeasibleTaskException(RobotException):
|
|
71
71
|
def __init__(self, error_description: str) -> None:
|
|
72
72
|
super().__init__(
|
|
73
|
-
error_reason=ErrorReason.
|
|
73
|
+
error_reason=ErrorReason.RobotInfeasibleTaskException,
|
|
74
74
|
error_description=error_description,
|
|
75
75
|
)
|
|
76
76
|
|
|
@@ -103,7 +103,7 @@ class RobotMissionStatusException(RobotException):
|
|
|
103
103
|
|
|
104
104
|
# An exception which should be thrown by the robot package if it is unable to collect
|
|
105
105
|
# the status of the current step.
|
|
106
|
-
class
|
|
106
|
+
class RobotTaskStatusException(RobotException):
|
|
107
107
|
def __init__(self, error_description: str) -> None:
|
|
108
108
|
super().__init__(
|
|
109
109
|
error_reason=ErrorReason.RobotStepStatusException,
|
|
@@ -45,8 +45,8 @@ class AudioMetadata(InspectionMetadata):
|
|
|
45
45
|
|
|
46
46
|
@dataclass
|
|
47
47
|
class Inspection:
|
|
48
|
-
id: str = field(default_factory=uuid4_string, init=False)
|
|
49
48
|
metadata: InspectionMetadata
|
|
49
|
+
id: str = field(default_factory=uuid4_string, init=True)
|
|
50
50
|
data: Optional[bytes] = field(default=None, init=False)
|
|
51
51
|
|
|
52
52
|
@staticmethod
|
|
@@ -5,13 +5,13 @@ from alitra import Pose
|
|
|
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
|
|
9
9
|
from robot_interface.utilities.uuid_string_factory import uuid4_string
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
@dataclass
|
|
13
13
|
class Mission:
|
|
14
|
-
tasks: List[
|
|
14
|
+
tasks: List[TASKS]
|
|
15
15
|
id: str = field(default_factory=uuid4_string, init=True)
|
|
16
16
|
name: str = ""
|
|
17
17
|
start_pose: Optional[Pose] = None
|
|
@@ -11,14 +11,6 @@ class MissionStatus(str, Enum):
|
|
|
11
11
|
PartiallySuccessful: str = "partially_successful"
|
|
12
12
|
|
|
13
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"
|
|
20
|
-
|
|
21
|
-
|
|
22
14
|
class TaskStatus(str, Enum):
|
|
23
15
|
NotStarted: str = "not_started"
|
|
24
16
|
InProgress: str = "in_progress"
|