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.

Files changed (33) hide show
  1. isar/apis/api.py +1 -0
  2. isar/apis/models/models.py +2 -7
  3. isar/apis/models/start_mission_definition.py +86 -97
  4. isar/apis/schedule/scheduling_controller.py +11 -20
  5. isar/config/predefined_missions/default.json +70 -88
  6. isar/config/predefined_missions/default_turtlebot.json +102 -106
  7. isar/config/settings.env +1 -1
  8. isar/config/settings.py +3 -3
  9. isar/mission_planner/local_planner.py +3 -0
  10. isar/mission_planner/sequential_task_selector.py +3 -3
  11. isar/mission_planner/task_selector_interface.py +4 -4
  12. isar/script.py +1 -1
  13. isar/services/service_connections/mqtt/mqtt_client.py +1 -1
  14. isar/services/utilities/scheduling_utilities.py +3 -4
  15. isar/state_machine/state_machine.py +22 -98
  16. isar/state_machine/states/initialize.py +1 -1
  17. isar/state_machine/states/initiate.py +10 -10
  18. isar/state_machine/states/monitor.py +77 -100
  19. isar/state_machine/states/paused.py +1 -1
  20. isar/state_machine/states/stop.py +1 -1
  21. {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/METADATA +1 -1
  22. {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/RECORD +32 -33
  23. robot_interface/models/exceptions/robot_exceptions.py +4 -4
  24. robot_interface/models/inspection/inspection.py +1 -1
  25. robot_interface/models/mission/mission.py +2 -2
  26. robot_interface/models/mission/status.py +0 -8
  27. robot_interface/models/mission/task.py +182 -115
  28. robot_interface/robot_interface.py +29 -54
  29. robot_interface/models/mission/step.py +0 -234
  30. {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/LICENSE +0 -0
  31. {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/WHEEL +0 -0
  32. {isar-1.22.4.dist-info → isar-1.23.1.dist-info}/entry_points.txt +0 -0
  33. {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
- RobotInfeasibleStepException,
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.stepwise_mission:
64
+ if self.state_machine.run_mission_by_task:
65
65
  self._run_initiate_thread(
66
- initiate_function=self.state_machine.robot.initiate_step,
67
- function_argument=self.state_machine.current_step,
68
- thread_name="State Machine Initiate Step",
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 RobotInfeasibleStepException as e:
85
- self.state_machine.current_step.error_message = ErrorMessage(
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 step "
90
- f"{str(self.state_machine.current_step.id)[:8]} after retrying "
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.current_step.error_message = ErrorMessage(
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
- RobotStepStatusException,
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 MissionStatus, TaskStatus
26
- from robot_interface.models.mission.step import InspectionStep, Step, StepStatus
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.step_status_thread: Optional[ThreadedRequest] = None
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.step_status_thread:
51
- self.step_status_thread.wait_for_thread()
52
- self.step_status_thread = None
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.stepwise_mission:
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.step_status_thread:
66
+ if not self.task_status_thread:
69
67
  self._run_get_status_thread(
70
- status_function=self.state_machine.robot.step_status,
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: StepStatus = self.step_status_thread.get_output()
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
- step_failed: bool = self._handle_communication_timeout(e)
81
- if step_failed:
82
- status = StepStatus.Failed
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 RobotStepStatusException as e:
87
- self.state_machine.current_step.error_message = ErrorMessage(
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 step {self.state_machine.current_step.id[:8]} failed "
90
+ f"Monitoring task {self.state_machine.current_task.id[:8]} failed "
92
91
  f"because: {e.error_description}"
93
92
  )
94
- status = StepStatus.Failed
93
+ status = TaskStatus.Failed
95
94
 
96
95
  except RobotException as e:
97
96
  self._set_error_message(e)
98
- status = StepStatus.Failed
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, StepStatus):
103
+ if not isinstance(status, TaskStatus):
105
104
  self.logger.error(
106
- f"Received an invalid status update when monitoring mission. Only StepStatus is expected."
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.current_step.status = status
112
+ self.state_machine.current_task.status = status
116
113
 
117
114
  if self._should_upload_inspections():
118
- get_inspections_thread = ThreadedRequest(
115
+ get_inspection_thread = ThreadedRequest(
119
116
  self._queue_inspections_for_upload
120
117
  )
121
- get_inspections_thread.start_thread(
118
+ get_inspection_thread.start_thread(
122
119
  deepcopy(self.state_machine.current_mission),
123
- deepcopy(self.state_machine.current_step),
120
+ deepcopy(self.state_machine.current_task),
124
121
  name="State Machine Get Inspections",
125
122
  )
126
123
 
127
- if self.state_machine.stepwise_mission:
128
- if self._is_step_finished(self.state_machine.current_step):
129
- self._report_step_status(self.state_machine.current_step)
130
- transition = self.state_machine.step_finished # type: ignore
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._is_step_finished(self.state_machine.current_step):
134
- self._report_step_status(self.state_machine.current_step)
135
-
136
- if self.state_machine.current_task.is_finished():
137
- # Report and update finished task
138
- self.state_machine.current_task.update_task_status() # Uses the updated step status to set the task status
139
- self.state_machine.publish_task_status(
140
- task=self.state_machine.current_task
141
- )
142
-
143
- self.state_machine.iterate_current_task()
144
-
145
- if self.state_machine.current_task == None:
146
- transition = self.state_machine.full_mission_finished # type: ignore
147
- break
148
-
149
- # Report and update next task
150
- self.state_machine.current_task.update_task_status()
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.step_status_thread = ThreadedRequest(request_func=status_function)
169
- self.step_status_thread.start_thread(name=thread_name)
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, current_step: InspectionStep
159
+ self, mission: Mission, current_task: InspectionTask
173
160
  ) -> None:
174
161
  try:
175
- inspections: Sequence[Inspection] = (
176
- self.state_machine.robot.get_inspections(step=current_step)
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 inspections:
173
+ if not inspection:
187
174
  self.logger.warning(
188
- f"No inspection data retrieved for step {str(current_step.id)[:8]}"
175
+ f"No inspection data retrieved for task {str(current_task.id)[:8]}"
189
176
  )
190
177
 
191
- for inspection in inspections:
192
- inspection.metadata.tag_id = current_step.tag_id
178
+ inspection.metadata.tag_id = current_task.tag_id
193
179
 
194
- message: Tuple[Inspection, Mission] = (
195
- inspection,
196
- mission,
197
- )
198
- self.state_machine.queues.upload_queue.put(message)
199
- self.logger.info(f"Inspection: {str(inspection.id)[:8]} queued for upload")
200
-
201
- def _is_step_finished(self, step: Step) -> bool:
202
- finished: bool = False
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"Step: {str(step.id)[:8]} was reported as failed by the robot"
190
+ f"Task: {str(task.id)[:8]} was reported as failed by the robot"
213
191
  )
214
- elif step.status == StepStatus.Successful:
192
+ elif task.status == TaskStatus.Successful:
215
193
  self.logger.info(
216
- f"{type(step).__name__} step: {str(step.id)[:8]} completed"
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._is_step_finished(step)
223
- and step.status == StepStatus.Successful
224
- and isinstance(step, InspectionStep)
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.current_step.error_message = error_message
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.step_status_thread = None
216
+ self.task_status_thread = None
240
217
  self.request_status_failure_counter += 1
241
218
  self.logger.warning(
242
- f"Monitoring step {self.state_machine.current_step.id} failed #: "
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.current_step.error_message = ErrorMessage(
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 step status "
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.stepwise_mission:
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.current_step.error_message = error_message
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.22.4
3
+ Version: 1.23.1
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -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=xhMMIuulPaaPTcP9-meF0xqNSPDQ7T1W_6yKK6K2RFg,5377
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=vSXfkWR7iITWbh4BsDzjEDtQrz6KS-vi2S8AeaeDc3Q,13112
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=BRm3Wl6TJHdHEKLRQ2SGDx6Y54qq8IesMbBuVO7RuxE,1757
8
- isar/apis/models/start_mission_definition.py,sha256=Ch8625e-ZDWQv5L-cVlpotTHm1b42ZrDBx2recvTIjM,7394
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=w2F-6IKBgVN9HVopAOWBb3KUgPjhsnuPLQ3eqjDNfOg,11888
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=-kivj0osAAKlInnY81ugySTlcImhVABbnj9kUoBDLu8,535
18
- isar/config/settings.py,sha256=RUsQr4ZFhsMGQRmBQFYxYZkowsP82UG2EDisenLQXes,13478
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=3J1KtQIFKxJsVoKlg0nKsj8asev-2dSz6IOrd4A57jY,2759
36
- isar/config/predefined_missions/default_turtlebot.json,sha256=gStYz_hCgQDBEeUW7W4bq_0R3OO55jRnwZt0CNYvHSM,3352
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=1Qcz7QntWXuYL1PcF6R9aZNCCdL-j_RJ2UGc1_rNZd8,3037
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=4OJ1Rvg6MaDQQxNcgAUtp2gvhHm3Srha5XJUu8X-Uzg,640
43
- isar/mission_planner/task_selector_interface.py,sha256=aXL2RXb_XmTNW-WXt6E7wFfJf_BjbownDa3zSqgQ4Ww,703
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=Aib0lqaddxW9aVXXYD7wGL9jIpr2USCCH91SQgFdIG4,3548
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=LFimEmacML3J9q-FNLfKPhcAr-R3f2rkYkbsoro0Gyo,8434
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=JrVwo3tU5lzWKlUE5oMpoE8aEte3HcVOHbjCGMIdv_c,24357
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=KUuyXVwzWK5bJNspA1JnYO_Xwu8fPPK6bnHK4mtwf5A,2359
75
- isar/state_machine/states/initiate.py,sha256=WqBROOGAh0DVB0f39RFkpqzkr0qrHMyrBGkh2svBbKw,5652
76
- isar/state_machine/states/monitor.py,sha256=Jc1ZZ4mOJQU-VI5-UQJLbKNQGqHMBruvurHeJOlGnD0,10277
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=qFSauRwalyws8K5bDZ5wkcRDVYyevTDVRtbXkiF9rZc,1174
80
- isar/state_machine/states/stop.py,sha256=zu7bVKR5zfkzU7iCrh8Pe2WRDHHzU2RBeFBxFK6Z-eA,3348
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=pY1Wuka0fTP-kCmkEndAcFytkS73cEE2zIHv-v5Fm1E,9466
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=DNlecQm2m4ld5mLLFQl1EkQ4b9XgX9H7g-b5c1EuUf4,9549
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=TVqUl5o3d3fp8IravOMwJIuRoEU8y4BltFrF1IkwvTA,2176
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=r_tYqhZeKASdJ_YIN0ZhCl6YdokuuDySI0o9IT2Qe7M,905
100
- robot_interface/models/mission/status.py,sha256=R5jLmmn6M7oNX907QvbrhoAqAo4C1zB653Ed1PcxAtg,922
101
- robot_interface/models/mission/step.py,sha256=DEzU-LD-i3RTAaXBy5KwJZ6OnN5S0F3wwDaqX2DZ72M,5587
102
- robot_interface/models/mission/task.py,sha256=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.22.4.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
113
- isar-1.22.4.dist-info/METADATA,sha256=VPlRvuOehH8dvjeIZ0zFrzoS4WiCKmHJ4_JteOg5nTM,30674
114
- isar-1.22.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
115
- isar-1.22.4.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
116
- isar-1.22.4.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
117
- isar-1.22.4.dist-info/RECORD,,
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
- RobotInfeasibleStepException: str = "robot_infeasible_step_exception"
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 RobotInfeasibleStepException(RobotException):
70
+ class RobotInfeasibleTaskException(RobotException):
71
71
  def __init__(self, error_description: str) -> None:
72
72
  super().__init__(
73
- error_reason=ErrorReason.RobotInfeasibleStepException,
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 RobotStepStatusException(RobotException):
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 Task
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[Task]
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"