isar 1.22.3__py3-none-any.whl → 1.23.0__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/idle.py +2 -0
- isar/state_machine/states/initialize.py +1 -1
- isar/state_machine/states/initiate.py +10 -10
- isar/state_machine/states/monitor.py +78 -98
- isar/state_machine/states/offline.py +1 -0
- isar/state_machine/states/paused.py +1 -1
- isar/state_machine/states/stop.py +1 -1
- {isar-1.22.3.dist-info → isar-1.23.0.dist-info}/METADATA +1 -1
- {isar-1.22.3.dist-info → isar-1.23.0.dist-info}/RECORD +34 -35
- robot_interface/models/exceptions/robot_exceptions.py +3 -3
- 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.3.dist-info → isar-1.23.0.dist-info}/LICENSE +0 -0
- {isar-1.22.3.dist-info → isar-1.23.0.dist-info}/WHEEL +0 -0
- {isar-1.22.3.dist-info → isar-1.23.0.dist-info}/entry_points.txt +0 -0
- {isar-1.22.3.dist-info → isar-1.23.0.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,16 @@ from robot_interface.models.exceptions.robot_exceptions import (
|
|
|
16
15
|
ErrorMessage,
|
|
17
16
|
RobotCommunicationTimeoutException,
|
|
18
17
|
RobotException,
|
|
19
|
-
RobotMissionStatusException,
|
|
20
18
|
RobotRetrieveInspectionException,
|
|
21
19
|
RobotStepStatusException,
|
|
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 Task
|
|
25
|
+
from robot_interface.models.mission.task import (
|
|
26
|
+
InspectionTask,
|
|
27
|
+
)
|
|
27
28
|
|
|
28
29
|
if TYPE_CHECKING:
|
|
29
30
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -40,16 +41,16 @@ class Monitor(State):
|
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
self.logger = logging.getLogger("state_machine")
|
|
43
|
-
self.
|
|
44
|
+
self.task_status_thread: Optional[ThreadedRequest] = None
|
|
44
45
|
|
|
45
46
|
def start(self) -> None:
|
|
46
47
|
self.state_machine.update_state()
|
|
47
48
|
self._run()
|
|
48
49
|
|
|
49
50
|
def stop(self) -> None:
|
|
50
|
-
if self.
|
|
51
|
-
self.
|
|
52
|
-
self.
|
|
51
|
+
if self.task_status_thread:
|
|
52
|
+
self.task_status_thread.wait_for_thread()
|
|
53
|
+
self.task_status_thread = None
|
|
53
54
|
|
|
54
55
|
def _run(self) -> None:
|
|
55
56
|
transition: Callable
|
|
@@ -59,121 +60,110 @@ class Monitor(State):
|
|
|
59
60
|
break
|
|
60
61
|
|
|
61
62
|
if self.state_machine.should_pause_mission():
|
|
62
|
-
if self.state_machine.
|
|
63
|
+
if self.state_machine.run_mission_by_task:
|
|
63
64
|
transition = self.state_machine.pause # type: ignore
|
|
64
65
|
else:
|
|
65
66
|
transition = self.state_machine.pause_full_mission # type: ignore
|
|
66
67
|
break
|
|
67
68
|
|
|
68
|
-
if not self.
|
|
69
|
+
if not self.task_status_thread:
|
|
69
70
|
self._run_get_status_thread(
|
|
70
|
-
status_function=self.state_machine.robot.
|
|
71
|
+
status_function=self.state_machine.robot.task_status,
|
|
72
|
+
function_argument=self.state_machine.current_task.id,
|
|
71
73
|
thread_name="State Machine Monitor Get Step Status",
|
|
72
74
|
)
|
|
73
75
|
try:
|
|
74
|
-
status:
|
|
76
|
+
status: TaskStatus = self.task_status_thread.get_output()
|
|
75
77
|
except ThreadedRequestNotFinishedError:
|
|
76
78
|
time.sleep(self.state_machine.sleep_time)
|
|
77
79
|
continue
|
|
78
80
|
|
|
79
81
|
except RobotCommunicationTimeoutException as e:
|
|
80
|
-
|
|
81
|
-
if
|
|
82
|
-
status =
|
|
82
|
+
task_failed: bool = self._handle_communication_timeout(e)
|
|
83
|
+
if task_failed:
|
|
84
|
+
status = TaskStatus.Failed
|
|
83
85
|
else:
|
|
84
86
|
continue
|
|
85
87
|
|
|
86
88
|
except RobotStepStatusException as e:
|
|
87
|
-
self.state_machine.
|
|
89
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
88
90
|
error_reason=e.error_reason, error_description=e.error_description
|
|
89
91
|
)
|
|
90
92
|
self.logger.error(
|
|
91
|
-
f"Monitoring
|
|
93
|
+
f"Monitoring task {self.state_machine.current_task.id[:8]} failed "
|
|
92
94
|
f"because: {e.error_description}"
|
|
93
95
|
)
|
|
94
|
-
status =
|
|
96
|
+
status = TaskStatus.Failed
|
|
95
97
|
|
|
96
98
|
except RobotException as e:
|
|
97
99
|
self._set_error_message(e)
|
|
98
|
-
status =
|
|
100
|
+
status = TaskStatus.Failed
|
|
99
101
|
|
|
100
102
|
self.logger.error(
|
|
101
103
|
f"Retrieving the status failed because: {e.error_description}"
|
|
102
104
|
)
|
|
103
105
|
|
|
104
|
-
if not isinstance(status,
|
|
106
|
+
if not isinstance(status, TaskStatus):
|
|
105
107
|
self.logger.error(
|
|
106
|
-
f"Received an invalid status update when monitoring mission. Only
|
|
108
|
+
f"Received an invalid status update when monitoring mission. Only TaskStatus is expected."
|
|
107
109
|
)
|
|
108
110
|
break
|
|
109
111
|
|
|
110
112
|
if self.state_machine.current_task == None:
|
|
111
113
|
self.state_machine.iterate_current_task()
|
|
112
|
-
if self.state_machine.current_step == None:
|
|
113
|
-
self.state_machine.iterate_current_step()
|
|
114
114
|
|
|
115
|
-
self.state_machine.
|
|
115
|
+
self.state_machine.current_task.status = status
|
|
116
116
|
|
|
117
117
|
if self._should_upload_inspections():
|
|
118
|
-
|
|
118
|
+
get_inspection_thread = ThreadedRequest(
|
|
119
119
|
self._queue_inspections_for_upload
|
|
120
120
|
)
|
|
121
|
-
|
|
121
|
+
get_inspection_thread.start_thread(
|
|
122
122
|
deepcopy(self.state_machine.current_mission),
|
|
123
|
-
deepcopy(self.state_machine.
|
|
123
|
+
deepcopy(self.state_machine.current_task),
|
|
124
124
|
name="State Machine Get Inspections",
|
|
125
125
|
)
|
|
126
126
|
|
|
127
|
-
if self.state_machine.
|
|
128
|
-
if self.
|
|
129
|
-
self.
|
|
130
|
-
transition = self.state_machine.
|
|
127
|
+
if self.state_machine.run_mission_by_task:
|
|
128
|
+
if self.state_machine.current_task.is_finished():
|
|
129
|
+
self._report_task_status(self.state_machine.current_task)
|
|
130
|
+
transition = self.state_machine.task_finished # type: ignore
|
|
131
131
|
break
|
|
132
132
|
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
|
|
133
|
+
if self.state_machine.current_task.is_finished():
|
|
134
|
+
self._report_task_status(self.state_machine.current_task)
|
|
135
|
+
self.state_machine.publish_task_status(
|
|
136
|
+
task=self.state_machine.current_task
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
self.state_machine.iterate_current_task()
|
|
140
|
+
if self.state_machine.current_task == None:
|
|
141
|
+
transition = self.state_machine.full_mission_finished # type: ignore
|
|
142
|
+
break
|
|
143
|
+
|
|
144
|
+
# Report and update next task
|
|
145
|
+
self.state_machine.current_task.update_task_status()
|
|
146
|
+
self.state_machine.publish_task_status(
|
|
147
|
+
task=self.state_machine.current_task
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
self.task_status_thread = None
|
|
161
151
|
time.sleep(self.state_machine.sleep_time)
|
|
162
152
|
|
|
163
153
|
transition()
|
|
164
154
|
|
|
165
155
|
def _run_get_status_thread(
|
|
166
|
-
self, status_function: Callable, thread_name: str
|
|
156
|
+
self, status_function: Callable, function_argument: str, thread_name: str
|
|
167
157
|
) -> None:
|
|
168
|
-
self.
|
|
169
|
-
self.
|
|
158
|
+
self.task_status_thread = ThreadedRequest(request_func=status_function)
|
|
159
|
+
self.task_status_thread.start_thread(function_argument, name=thread_name)
|
|
170
160
|
|
|
171
161
|
def _queue_inspections_for_upload(
|
|
172
|
-
self, mission: Mission,
|
|
162
|
+
self, mission: Mission, current_task: InspectionTask
|
|
173
163
|
) -> None:
|
|
174
164
|
try:
|
|
175
|
-
|
|
176
|
-
|
|
165
|
+
inspection: Inspection = self.state_machine.robot.get_inspection(
|
|
166
|
+
task=current_task
|
|
177
167
|
)
|
|
178
168
|
|
|
179
169
|
except (RobotRetrieveInspectionException, RobotException) as e:
|
|
@@ -183,52 +173,42 @@ class Monitor(State):
|
|
|
183
173
|
)
|
|
184
174
|
return
|
|
185
175
|
|
|
186
|
-
if not
|
|
176
|
+
if not inspection:
|
|
187
177
|
self.logger.warning(
|
|
188
|
-
f"No inspection data retrieved for
|
|
178
|
+
f"No inspection data retrieved for task {str(current_task.id)[:8]}"
|
|
189
179
|
)
|
|
190
180
|
|
|
191
|
-
|
|
192
|
-
inspection.metadata.tag_id = current_step.tag_id
|
|
181
|
+
inspection.metadata.tag_id = current_task.tag_id
|
|
193
182
|
|
|
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:
|
|
183
|
+
message: Tuple[Inspection, Mission] = (
|
|
184
|
+
inspection,
|
|
185
|
+
mission,
|
|
186
|
+
)
|
|
187
|
+
self.state_machine.queues.upload_queue.put(message)
|
|
188
|
+
self.logger.info(f"Inspection: {str(inspection.id)[:8]} queued for upload")
|
|
189
|
+
|
|
190
|
+
def _report_task_status(self, task: Task) -> None:
|
|
191
|
+
if task.status == TaskStatus.Failed:
|
|
211
192
|
self.logger.warning(
|
|
212
|
-
f"
|
|
193
|
+
f"Task: {str(task.id)[:8]} was reported as failed by the robot"
|
|
213
194
|
)
|
|
214
|
-
elif
|
|
195
|
+
elif task.status == TaskStatus.Successful:
|
|
215
196
|
self.logger.info(
|
|
216
|
-
f"{type(
|
|
197
|
+
f"{type(task).__name__} task: {str(task.id)[:8]} completed"
|
|
217
198
|
)
|
|
218
199
|
|
|
219
200
|
def _should_upload_inspections(self) -> bool:
|
|
220
|
-
step: Step = self.state_machine.current_step
|
|
221
201
|
return (
|
|
222
|
-
self.
|
|
223
|
-
and
|
|
224
|
-
and isinstance(
|
|
202
|
+
self.state_machine.current_task.is_finished()
|
|
203
|
+
and self.state_machine.current_task.status == TaskStatus.Successful
|
|
204
|
+
and isinstance(self.state_machine.current_task, InspectionTask)
|
|
225
205
|
)
|
|
226
206
|
|
|
227
207
|
def _set_error_message(self, e: RobotException) -> None:
|
|
228
208
|
error_message: ErrorMessage = ErrorMessage(
|
|
229
209
|
error_reason=e.error_reason, error_description=e.error_description
|
|
230
210
|
)
|
|
231
|
-
self.state_machine.
|
|
211
|
+
self.state_machine.current_task.error_message = error_message
|
|
232
212
|
|
|
233
213
|
def _handle_communication_timeout(
|
|
234
214
|
self, e: RobotCommunicationTimeoutException
|
|
@@ -236,10 +216,10 @@ class Monitor(State):
|
|
|
236
216
|
self.state_machine.current_mission.error_message = ErrorMessage(
|
|
237
217
|
error_reason=e.error_reason, error_description=e.error_description
|
|
238
218
|
)
|
|
239
|
-
self.
|
|
219
|
+
self.task_status_thread = None
|
|
240
220
|
self.request_status_failure_counter += 1
|
|
241
221
|
self.logger.warning(
|
|
242
|
-
f"Monitoring
|
|
222
|
+
f"Monitoring task {self.state_machine.current_task.id} failed #: "
|
|
243
223
|
f"{self.request_status_failure_counter} failed because: {e.error_description}"
|
|
244
224
|
)
|
|
245
225
|
|
|
@@ -247,12 +227,12 @@ class Monitor(State):
|
|
|
247
227
|
self.request_status_failure_counter
|
|
248
228
|
>= self.request_status_failure_counter_limit
|
|
249
229
|
):
|
|
250
|
-
self.state_machine.
|
|
230
|
+
self.state_machine.current_task.error_message = ErrorMessage(
|
|
251
231
|
error_reason=e.error_reason,
|
|
252
232
|
error_description=e.error_description,
|
|
253
233
|
)
|
|
254
234
|
self.logger.error(
|
|
255
|
-
f"Step will be cancelled after failing to get
|
|
235
|
+
f"Step will be cancelled after failing to get task status "
|
|
256
236
|
f"{self.request_status_failure_counter} times because: "
|
|
257
237
|
f"{e.error_description}"
|
|
258
238
|
)
|
|
@@ -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
|
-
isar/state_machine/states/idle.py,sha256=
|
|
74
|
-
isar/state_machine/states/initialize.py,sha256=
|
|
75
|
-
isar/state_machine/states/initiate.py,sha256=
|
|
76
|
-
isar/state_machine/states/monitor.py,sha256=
|
|
73
|
+
isar/state_machine/states/idle.py,sha256=iAKESjETKUt9x3inE7TAPIohVM1iRsYyJjOoBeB3sVw,3079
|
|
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=_VMJU5QGqilI8TMzFR8n83KQRnaPMydvt-sAEfEf1zY,9353
|
|
77
77
|
isar/state_machine/states/off.py,sha256=jjqN_oJMpBtWuY7hP-c9f0w3p2CYCfe-NpmYHHPnmyI,544
|
|
78
|
-
isar/state_machine/states/offline.py,sha256=
|
|
79
|
-
isar/state_machine/states/paused.py,sha256=
|
|
80
|
-
isar/state_machine/states/stop.py,sha256=
|
|
78
|
+
isar/state_machine/states/offline.py,sha256=ur5wDo4NWRLn7n-p5IUY6aSYcGApmqe_0IbRRywA6qA,2169
|
|
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=pPCGp3gw7-m--XvAIe-22n5KrBov-O37LhuJhaq6C3c,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.0.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
|
|
112
|
+
isar-1.23.0.dist-info/METADATA,sha256=TH3DFUtju6iUaWfPy5nkWigRp4KpohxhL6mPbwoWrIU,30674
|
|
113
|
+
isar-1.23.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
114
|
+
isar-1.23.0.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
|
|
115
|
+
isar-1.23.0.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
|
|
116
|
+
isar-1.23.0.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
|
|
|
@@ -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"
|