isar 1.22.4__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.

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 +78 -98
  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.0.dist-info}/METADATA +1 -1
  22. {isar-1.22.4.dist-info → isar-1.23.0.dist-info}/RECORD +32 -33
  23. robot_interface/models/exceptions/robot_exceptions.py +3 -3
  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.0.dist-info}/LICENSE +0 -0
  31. {isar-1.22.4.dist-info → isar-1.23.0.dist-info}/WHEEL +0 -0
  32. {isar-1.22.4.dist-info → isar-1.23.0.dist-info}/entry_points.txt +0 -0
  33. {isar-1.22.4.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
- 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,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 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 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.step_status_thread: Optional[ThreadedRequest] = None
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.step_status_thread:
51
- self.step_status_thread.wait_for_thread()
52
- self.step_status_thread = None
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.stepwise_mission:
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.step_status_thread:
69
+ if not self.task_status_thread:
69
70
  self._run_get_status_thread(
70
- status_function=self.state_machine.robot.step_status,
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: StepStatus = self.step_status_thread.get_output()
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
- step_failed: bool = self._handle_communication_timeout(e)
81
- if step_failed:
82
- status = StepStatus.Failed
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.current_step.error_message = ErrorMessage(
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 step {self.state_machine.current_step.id[:8]} failed "
93
+ f"Monitoring task {self.state_machine.current_task.id[:8]} failed "
92
94
  f"because: {e.error_description}"
93
95
  )
94
- status = StepStatus.Failed
96
+ status = TaskStatus.Failed
95
97
 
96
98
  except RobotException as e:
97
99
  self._set_error_message(e)
98
- status = StepStatus.Failed
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, StepStatus):
106
+ if not isinstance(status, TaskStatus):
105
107
  self.logger.error(
106
- f"Received an invalid status update when monitoring mission. Only StepStatus is expected."
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.current_step.status = status
115
+ self.state_machine.current_task.status = status
116
116
 
117
117
  if self._should_upload_inspections():
118
- get_inspections_thread = ThreadedRequest(
118
+ get_inspection_thread = ThreadedRequest(
119
119
  self._queue_inspections_for_upload
120
120
  )
121
- get_inspections_thread.start_thread(
121
+ get_inspection_thread.start_thread(
122
122
  deepcopy(self.state_machine.current_mission),
123
- deepcopy(self.state_machine.current_step),
123
+ deepcopy(self.state_machine.current_task),
124
124
  name="State Machine Get Inspections",
125
125
  )
126
126
 
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
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._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
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.step_status_thread = ThreadedRequest(request_func=status_function)
169
- self.step_status_thread.start_thread(name=thread_name)
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, current_step: InspectionStep
162
+ self, mission: Mission, current_task: InspectionTask
173
163
  ) -> None:
174
164
  try:
175
- inspections: Sequence[Inspection] = (
176
- self.state_machine.robot.get_inspections(step=current_step)
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 inspections:
176
+ if not inspection:
187
177
  self.logger.warning(
188
- f"No inspection data retrieved for step {str(current_step.id)[:8]}"
178
+ f"No inspection data retrieved for task {str(current_task.id)[:8]}"
189
179
  )
190
180
 
191
- for inspection in inspections:
192
- inspection.metadata.tag_id = current_step.tag_id
181
+ inspection.metadata.tag_id = current_task.tag_id
193
182
 
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:
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"Step: {str(step.id)[:8]} was reported as failed by the robot"
193
+ f"Task: {str(task.id)[:8]} was reported as failed by the robot"
213
194
  )
214
- elif step.status == StepStatus.Successful:
195
+ elif task.status == TaskStatus.Successful:
215
196
  self.logger.info(
216
- f"{type(step).__name__} step: {str(step.id)[:8]} completed"
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._is_step_finished(step)
223
- and step.status == StepStatus.Successful
224
- and isinstance(step, InspectionStep)
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.current_step.error_message = error_message
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.step_status_thread = None
219
+ self.task_status_thread = None
240
220
  self.request_status_failure_counter += 1
241
221
  self.logger.warning(
242
- f"Monitoring step {self.state_machine.current_step.id} failed #: "
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.current_step.error_message = ErrorMessage(
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 step status "
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.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.0
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=_VMJU5QGqilI8TMzFR8n83KQRnaPMydvt-sAEfEf1zY,9353
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=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=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.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
- 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
 
@@ -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"