isar 1.32.3__py3-none-any.whl → 1.33.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- isar/apis/models/models.py +6 -0
- isar/apis/schedule/scheduling_controller.py +21 -52
- isar/config/open_telemetry.py +52 -12
- isar/config/settings.py +17 -3
- isar/eventhandlers/eventhandler.py +22 -0
- isar/models/events.py +56 -27
- isar/robot/robot_status.py +3 -0
- isar/services/utilities/scheduling_utilities.py +52 -21
- isar/state_machine/state_machine.py +39 -1
- isar/state_machine/states/await_next_mission.py +3 -1
- isar/state_machine/states/home.py +3 -1
- isar/state_machine/states/monitor.py +22 -0
- isar/state_machine/states/recharging.py +44 -0
- isar/state_machine/states/returning_home.py +15 -1
- isar/state_machine/states/robot_standing_still.py +3 -1
- isar/state_machine/states/stopping.py +33 -0
- isar/state_machine/states_enum.py +1 -0
- isar/state_machine/transitions/functions/pause.py +1 -1
- isar/state_machine/transitions/functions/resume.py +1 -1
- isar/state_machine/transitions/functions/start_mission.py +11 -3
- isar/state_machine/transitions/functions/stop.py +3 -30
- isar/state_machine/transitions/mission.py +0 -2
- isar/state_machine/transitions/return_home.py +11 -1
- isar/state_machine/transitions/robot_status.py +10 -0
- isar/state_machine/utils/common_event_handlers.py +16 -4
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/METADATA +1 -1
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/RECORD +35 -34
- robot_interface/models/inspection/inspection.py +6 -15
- robot_interface/models/mission/status.py +1 -0
- robot_interface/robot_interface.py +27 -0
- robot_interface/telemetry/payloads.py +10 -0
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/WHEEL +0 -0
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/entry_points.txt +0 -0
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/licenses/LICENSE +0 -0
- {isar-1.32.3.dist-info → isar-1.33.1.dist-info}/top_level.txt +0 -0
|
@@ -23,7 +23,9 @@ class Home(EventHandlerBase):
|
|
|
23
23
|
EventHandlerMapping(
|
|
24
24
|
name="start_mission_event",
|
|
25
25
|
event=events.api_requests.start_mission.request,
|
|
26
|
-
handler=lambda event: start_mission_event_handler(
|
|
26
|
+
handler=lambda event: start_mission_event_handler(
|
|
27
|
+
state_machine, event, events.api_requests.start_mission.response
|
|
28
|
+
),
|
|
27
29
|
),
|
|
28
30
|
EventHandlerMapping(
|
|
29
31
|
name="return_home_event",
|
|
@@ -2,6 +2,7 @@ import logging
|
|
|
2
2
|
from copy import deepcopy
|
|
3
3
|
from typing import TYPE_CHECKING, Callable, List, Optional
|
|
4
4
|
|
|
5
|
+
from isar.config.settings import settings
|
|
5
6
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
6
7
|
from isar.models.events import Event
|
|
7
8
|
from isar.services.utilities.threaded_request import ThreadedRequest
|
|
@@ -23,6 +24,7 @@ class Monitor(EventHandlerBase):
|
|
|
23
24
|
def __init__(self, state_machine: "StateMachine"):
|
|
24
25
|
logger = logging.getLogger("state_machine")
|
|
25
26
|
events = state_machine.events
|
|
27
|
+
shared_state = state_machine.shared_state
|
|
26
28
|
|
|
27
29
|
def _pause_mission_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
28
30
|
if event.consume_event():
|
|
@@ -46,6 +48,21 @@ class Monitor(EventHandlerBase):
|
|
|
46
48
|
return state_machine.mission_finished # type: ignore
|
|
47
49
|
return None
|
|
48
50
|
|
|
51
|
+
def _robot_battery_level_updated_handler(
|
|
52
|
+
event: Event[float],
|
|
53
|
+
) -> Optional[Callable]:
|
|
54
|
+
battery_level: float = event.check()
|
|
55
|
+
if battery_level < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
|
|
56
|
+
state_machine.publish_mission_aborted(
|
|
57
|
+
"Robot battery too low to continue mission", True
|
|
58
|
+
)
|
|
59
|
+
state_machine._finalize()
|
|
60
|
+
state_machine.logger.warning(
|
|
61
|
+
"Cancelling current mission due to low battery"
|
|
62
|
+
)
|
|
63
|
+
return state_machine.stop # type: ignore
|
|
64
|
+
return None
|
|
65
|
+
|
|
49
66
|
event_handlers: List[EventHandlerMapping] = [
|
|
50
67
|
EventHandlerMapping(
|
|
51
68
|
name="stop_mission_event",
|
|
@@ -85,6 +102,11 @@ class Monitor(EventHandlerBase):
|
|
|
85
102
|
state_machine, _handle_task_completed, event
|
|
86
103
|
),
|
|
87
104
|
),
|
|
105
|
+
EventHandlerMapping(
|
|
106
|
+
name="robot_battery_update_event",
|
|
107
|
+
event=shared_state.robot_battery_level,
|
|
108
|
+
handler=_robot_battery_level_updated_handler,
|
|
109
|
+
),
|
|
88
110
|
]
|
|
89
111
|
super().__init__(
|
|
90
112
|
state_name="monitor",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, List
|
|
2
|
+
|
|
3
|
+
from isar.config.settings import settings
|
|
4
|
+
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
|
+
from isar.models.events import Event
|
|
6
|
+
from robot_interface.models.mission.status import RobotStatus
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from isar.state_machine.state_machine import StateMachine
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Recharging(EventHandlerBase):
|
|
13
|
+
|
|
14
|
+
def __init__(self, state_machine: "StateMachine"):
|
|
15
|
+
shared_state = state_machine.shared_state
|
|
16
|
+
|
|
17
|
+
def robot_battery_level_updated_handler(event: Event[float]):
|
|
18
|
+
battery_level: float = event.check()
|
|
19
|
+
if battery_level >= settings.ROBOT_BATTERY_RECHARGE_THRESHOLD:
|
|
20
|
+
return state_machine.robot_recharged # type: ignore
|
|
21
|
+
return None
|
|
22
|
+
|
|
23
|
+
def robot_offline_handler(event: Event[RobotStatus]):
|
|
24
|
+
robot_status: RobotStatus = event.check()
|
|
25
|
+
if robot_status == RobotStatus.Offline:
|
|
26
|
+
return state_machine.robot_went_offline # type: ignore
|
|
27
|
+
|
|
28
|
+
event_handlers: List[EventHandlerMapping] = [
|
|
29
|
+
EventHandlerMapping(
|
|
30
|
+
name="robot_battery_update_event",
|
|
31
|
+
event=shared_state.robot_battery_level,
|
|
32
|
+
handler=robot_battery_level_updated_handler,
|
|
33
|
+
),
|
|
34
|
+
EventHandlerMapping(
|
|
35
|
+
name="robot_offline_event",
|
|
36
|
+
event=shared_state.robot_status,
|
|
37
|
+
handler=robot_offline_handler,
|
|
38
|
+
),
|
|
39
|
+
]
|
|
40
|
+
super().__init__(
|
|
41
|
+
state_name="recharging",
|
|
42
|
+
state_machine=state_machine,
|
|
43
|
+
event_handler_mappings=event_handlers,
|
|
44
|
+
)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from typing import TYPE_CHECKING, Callable, List, Optional
|
|
2
2
|
|
|
3
|
+
from isar.apis.models.models import MissionStartResponse
|
|
3
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
4
5
|
from isar.models.events import Event
|
|
5
6
|
from isar.state_machine.utils.common_event_handlers import (
|
|
@@ -32,12 +33,25 @@ class ReturningHome(EventHandlerBase):
|
|
|
32
33
|
self.failed_return_home_attemps += 1
|
|
33
34
|
return state_machine.return_home_failed # type: ignore
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
37
|
+
return state_machine.starting_recharging # type: ignore
|
|
38
|
+
else:
|
|
39
|
+
return state_machine.returned_home # type: ignore
|
|
36
40
|
|
|
37
41
|
def _start_mission_event_handler(
|
|
38
42
|
event: Event[Mission],
|
|
39
43
|
) -> Optional[Callable]:
|
|
40
44
|
if event.has_event():
|
|
45
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
46
|
+
response = MissionStartResponse(
|
|
47
|
+
mission_id=None,
|
|
48
|
+
mission_started=False,
|
|
49
|
+
mission_not_started_reason="Robot battery too low",
|
|
50
|
+
)
|
|
51
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
52
|
+
response
|
|
53
|
+
)
|
|
54
|
+
return None
|
|
41
55
|
return state_machine.stop # type: ignore
|
|
42
56
|
return None
|
|
43
57
|
|
|
@@ -23,7 +23,9 @@ class RobotStandingStill(EventHandlerBase):
|
|
|
23
23
|
EventHandlerMapping(
|
|
24
24
|
name="start_mission_event",
|
|
25
25
|
event=events.api_requests.start_mission.request,
|
|
26
|
-
handler=lambda event: start_mission_event_handler(
|
|
26
|
+
handler=lambda event: start_mission_event_handler(
|
|
27
|
+
state_machine, event, events.api_requests.start_mission.response
|
|
28
|
+
),
|
|
27
29
|
),
|
|
28
30
|
EventHandlerMapping(
|
|
29
31
|
name="return_home_event",
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import TYPE_CHECKING, Callable, List, Optional
|
|
3
3
|
|
|
4
|
+
from isar.apis.models.models import ControlMissionResponse
|
|
4
5
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
6
|
from isar.models.events import Event
|
|
6
7
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
8
|
+
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
7
9
|
|
|
8
10
|
if TYPE_CHECKING:
|
|
9
11
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -15,6 +17,32 @@ class Stopping(EventHandlerBase):
|
|
|
15
17
|
logger = logging.getLogger("state_machine")
|
|
16
18
|
events = state_machine.events
|
|
17
19
|
|
|
20
|
+
def _stop_mission_cleanup() -> None:
|
|
21
|
+
if state_machine.current_mission is None:
|
|
22
|
+
state_machine._queue_empty_response()
|
|
23
|
+
state_machine.reset_state_machine()
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
state_machine.current_mission.status = MissionStatus.Cancelled
|
|
27
|
+
|
|
28
|
+
for task in state_machine.current_mission.tasks:
|
|
29
|
+
if task.status in [
|
|
30
|
+
TaskStatus.NotStarted,
|
|
31
|
+
TaskStatus.InProgress,
|
|
32
|
+
TaskStatus.Paused,
|
|
33
|
+
]:
|
|
34
|
+
task.status = TaskStatus.Cancelled
|
|
35
|
+
|
|
36
|
+
stopped_mission_response: ControlMissionResponse = (
|
|
37
|
+
state_machine._make_control_mission_response()
|
|
38
|
+
)
|
|
39
|
+
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
40
|
+
stopped_mission_response
|
|
41
|
+
)
|
|
42
|
+
state_machine.publish_task_status(task=state_machine.current_task)
|
|
43
|
+
state_machine._finalize()
|
|
44
|
+
return None
|
|
45
|
+
|
|
18
46
|
def _failed_stop_event_handler(
|
|
19
47
|
event: Event[ErrorMessage],
|
|
20
48
|
) -> Optional[Callable]:
|
|
@@ -38,6 +66,11 @@ class Stopping(EventHandlerBase):
|
|
|
38
66
|
):
|
|
39
67
|
return state_machine.return_home_mission_stopped # type: ignore
|
|
40
68
|
else:
|
|
69
|
+
_stop_mission_cleanup()
|
|
70
|
+
if (
|
|
71
|
+
not state_machine.battery_level_is_above_mission_start_threshold()
|
|
72
|
+
):
|
|
73
|
+
return state_machine.request_return_home # type: ignore
|
|
41
74
|
return state_machine.mission_stopped # type: ignore
|
|
42
75
|
return None
|
|
43
76
|
|
|
@@ -29,7 +29,7 @@ def pause_mission(state_machine: "StateMachine") -> bool:
|
|
|
29
29
|
paused_mission_response: ControlMissionResponse = (
|
|
30
30
|
state_machine._make_control_mission_response()
|
|
31
31
|
)
|
|
32
|
-
state_machine.events.api_requests.pause_mission.response.
|
|
32
|
+
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
33
33
|
paused_mission_response
|
|
34
34
|
)
|
|
35
35
|
|
|
@@ -35,7 +35,7 @@ def resume_mission(state_machine: "StateMachine") -> bool:
|
|
|
35
35
|
resume_mission_response: ControlMissionResponse = (
|
|
36
36
|
state_machine._make_control_mission_response()
|
|
37
37
|
)
|
|
38
|
-
state_machine.events.api_requests.resume_mission.response.
|
|
38
|
+
state_machine.events.api_requests.resume_mission.response.trigger_event(
|
|
39
39
|
resume_mission_response
|
|
40
40
|
)
|
|
41
41
|
|
|
@@ -3,6 +3,7 @@ from typing import TYPE_CHECKING
|
|
|
3
3
|
if TYPE_CHECKING:
|
|
4
4
|
from isar.state_machine.state_machine import StateMachine
|
|
5
5
|
|
|
6
|
+
from isar.apis.models.models import MissionStartResponse
|
|
6
7
|
from robot_interface.models.exceptions.robot_exceptions import (
|
|
7
8
|
ErrorMessage,
|
|
8
9
|
RobotException,
|
|
@@ -12,7 +13,9 @@ from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
def acknowledge_mission(state_machine: "StateMachine") -> bool:
|
|
15
|
-
state_machine.events.api_requests.start_mission.response.
|
|
16
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
17
|
+
MissionStartResponse(mission_started=True)
|
|
18
|
+
)
|
|
16
19
|
return True
|
|
17
20
|
|
|
18
21
|
|
|
@@ -63,12 +66,17 @@ def set_mission_to_in_progress(state_machine: "StateMachine") -> bool:
|
|
|
63
66
|
|
|
64
67
|
|
|
65
68
|
def trigger_start_mission_event(state_machine: "StateMachine") -> bool:
|
|
66
|
-
state_machine.events.state_machine_events.start_mission.
|
|
69
|
+
state_machine.events.state_machine_events.start_mission.trigger_event(
|
|
67
70
|
state_machine.current_mission
|
|
68
71
|
)
|
|
69
72
|
return True
|
|
70
73
|
|
|
71
74
|
|
|
72
75
|
def _initialization_failed(state_machine: "StateMachine") -> None:
|
|
73
|
-
state_machine.events.api_requests.start_mission.response.
|
|
76
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
77
|
+
MissionStartResponse(
|
|
78
|
+
mission_started=False,
|
|
79
|
+
mission_not_started_reason="Failed to initialize robot",
|
|
80
|
+
)
|
|
81
|
+
)
|
|
74
82
|
state_machine._finalize()
|
|
@@ -12,38 +12,11 @@ def trigger_stop_mission_event(state_machine: "StateMachine") -> bool:
|
|
|
12
12
|
return True
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def stop_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
16
|
-
if state_machine.current_mission is None:
|
|
17
|
-
state_machine._queue_empty_response()
|
|
18
|
-
state_machine.reset_state_machine()
|
|
19
|
-
return True
|
|
20
|
-
|
|
21
|
-
state_machine.current_mission.status = MissionStatus.Cancelled
|
|
22
|
-
|
|
23
|
-
for task in state_machine.current_mission.tasks:
|
|
24
|
-
if task.status in [
|
|
25
|
-
TaskStatus.NotStarted,
|
|
26
|
-
TaskStatus.InProgress,
|
|
27
|
-
TaskStatus.Paused,
|
|
28
|
-
]:
|
|
29
|
-
task.status = TaskStatus.Cancelled
|
|
30
|
-
|
|
31
|
-
stopped_mission_response: ControlMissionResponse = (
|
|
32
|
-
state_machine._make_control_mission_response()
|
|
33
|
-
)
|
|
34
|
-
state_machine.events.api_requests.stop_mission.response.put(
|
|
35
|
-
stopped_mission_response
|
|
36
|
-
)
|
|
37
|
-
state_machine.publish_task_status(task=state_machine.current_task)
|
|
38
|
-
state_machine._finalize()
|
|
39
|
-
return True
|
|
40
|
-
|
|
41
|
-
|
|
42
15
|
def stop_mission_failed(state_machine: "StateMachine") -> bool:
|
|
43
16
|
stopped_mission_response: ControlMissionResponse = (
|
|
44
17
|
state_machine._make_control_mission_response()
|
|
45
18
|
)
|
|
46
|
-
state_machine.events.api_requests.stop_mission.response.
|
|
19
|
+
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
47
20
|
stopped_mission_response
|
|
48
21
|
)
|
|
49
22
|
return True
|
|
@@ -69,7 +42,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
|
69
42
|
stopped_mission_response: ControlMissionResponse = (
|
|
70
43
|
state_machine._make_control_mission_response()
|
|
71
44
|
)
|
|
72
|
-
state_machine.events.api_requests.stop_mission.response.
|
|
45
|
+
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
73
46
|
stopped_mission_response
|
|
74
47
|
)
|
|
75
48
|
|
|
@@ -83,7 +56,7 @@ def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
|
|
|
83
56
|
stopped_mission_response: ControlMissionResponse = (
|
|
84
57
|
state_machine._make_control_mission_response()
|
|
85
58
|
)
|
|
86
|
-
state_machine.events.api_requests.stop_mission.response.
|
|
59
|
+
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
87
60
|
stopped_mission_response
|
|
88
61
|
)
|
|
89
62
|
return True
|
|
@@ -14,7 +14,6 @@ from isar.state_machine.transitions.functions.start_mission import (
|
|
|
14
14
|
trigger_start_mission_event,
|
|
15
15
|
)
|
|
16
16
|
from isar.state_machine.transitions.functions.stop import (
|
|
17
|
-
stop_mission_cleanup,
|
|
18
17
|
stop_mission_failed,
|
|
19
18
|
stop_return_home_mission_cleanup,
|
|
20
19
|
stop_return_home_mission_failed,
|
|
@@ -66,7 +65,6 @@ def get_mission_transitions(state_machine: "StateMachine") -> List[dict]:
|
|
|
66
65
|
"trigger": "mission_stopped",
|
|
67
66
|
"source": state_machine.stopping_state,
|
|
68
67
|
"dest": state_machine.await_next_mission_state,
|
|
69
|
-
"before": def_transition(state_machine, stop_mission_cleanup),
|
|
70
68
|
},
|
|
71
69
|
{
|
|
72
70
|
"trigger": "mission_stopping_failed",
|
|
@@ -30,13 +30,14 @@ def get_return_home_transitions(state_machine: "StateMachine") -> List[dict]:
|
|
|
30
30
|
state_machine.home_state,
|
|
31
31
|
state_machine.robot_standing_still_state,
|
|
32
32
|
state_machine.intervention_needed_state,
|
|
33
|
+
state_machine.monitor_state,
|
|
34
|
+
state_machine.stopping_state,
|
|
33
35
|
],
|
|
34
36
|
"dest": state_machine.returning_home_state,
|
|
35
37
|
"conditions": [
|
|
36
38
|
def_transition(state_machine, start_return_home_mission),
|
|
37
39
|
def_transition(state_machine, set_return_home_status),
|
|
38
40
|
def_transition(state_machine, initialize_robot),
|
|
39
|
-
def_transition(state_machine, initialize_robot),
|
|
40
41
|
],
|
|
41
42
|
"before": def_transition(state_machine, trigger_start_mission_event),
|
|
42
43
|
},
|
|
@@ -67,6 +68,15 @@ def get_return_home_transitions(state_machine: "StateMachine") -> List[dict]:
|
|
|
67
68
|
def_transition(state_machine, return_home_finished),
|
|
68
69
|
],
|
|
69
70
|
},
|
|
71
|
+
{
|
|
72
|
+
"trigger": "starting_recharging",
|
|
73
|
+
"source": state_machine.returning_home_state,
|
|
74
|
+
"dest": state_machine.recharging_state,
|
|
75
|
+
"before": [
|
|
76
|
+
def_transition(state_machine, reset_return_home_failure_counter),
|
|
77
|
+
def_transition(state_machine, return_home_finished),
|
|
78
|
+
],
|
|
79
|
+
},
|
|
70
80
|
{
|
|
71
81
|
"trigger": "return_home_failed",
|
|
72
82
|
"source": state_machine.returning_home_state,
|
|
@@ -69,5 +69,15 @@ def get_robot_status_transitions(state_machine: "StateMachine") -> List[dict]:
|
|
|
69
69
|
],
|
|
70
70
|
"dest": state_machine.unknown_status_state,
|
|
71
71
|
},
|
|
72
|
+
{
|
|
73
|
+
"trigger": "robot_went_offline",
|
|
74
|
+
"source": [state_machine.recharging_state],
|
|
75
|
+
"dest": state_machine.offline_state,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"trigger": "robot_recharged",
|
|
79
|
+
"source": [state_machine.recharging_state],
|
|
80
|
+
"dest": state_machine.home_state,
|
|
81
|
+
},
|
|
72
82
|
]
|
|
73
83
|
return robot_status_transitions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import TYPE_CHECKING, Callable, Optional
|
|
2
2
|
|
|
3
|
-
from isar.apis.models.models import ControlMissionResponse
|
|
3
|
+
from isar.apis.models.models import ControlMissionResponse, MissionStartResponse
|
|
4
4
|
from isar.models.events import Event
|
|
5
5
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
6
6
|
from robot_interface.models.mission.mission import Mission
|
|
@@ -11,10 +11,21 @@ if TYPE_CHECKING:
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def start_mission_event_handler(
|
|
14
|
-
state_machine: "StateMachine",
|
|
14
|
+
state_machine: "StateMachine",
|
|
15
|
+
event: Event[Mission],
|
|
16
|
+
response: Event[MissionStartResponse],
|
|
15
17
|
) -> Optional[Callable]:
|
|
16
18
|
mission: Optional[Mission] = event.consume_event()
|
|
17
19
|
if mission:
|
|
20
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
21
|
+
response.trigger_event(
|
|
22
|
+
MissionStartResponse(
|
|
23
|
+
mission_id=mission.id,
|
|
24
|
+
mission_started=False,
|
|
25
|
+
mission_not_started_reason="Robot battery too low",
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
return None
|
|
18
29
|
state_machine.start_mission(mission=mission)
|
|
19
30
|
return state_machine.request_mission_start # type: ignore
|
|
20
31
|
return None
|
|
@@ -24,7 +35,7 @@ def return_home_event_handler(
|
|
|
24
35
|
state_machine: "StateMachine", event: Event[bool]
|
|
25
36
|
) -> Optional[Callable]:
|
|
26
37
|
if event.consume_event():
|
|
27
|
-
state_machine.events.api_requests.return_home.response.
|
|
38
|
+
state_machine.events.api_requests.return_home.response.trigger_event(True)
|
|
28
39
|
return state_machine.request_return_home # type: ignore
|
|
29
40
|
return None
|
|
30
41
|
|
|
@@ -48,7 +59,7 @@ def stop_mission_event_handler(
|
|
|
48
59
|
if state_machine.current_mission.id == mission_id or mission_id == "":
|
|
49
60
|
return state_machine.stop # type: ignore
|
|
50
61
|
else:
|
|
51
|
-
state_machine.events.api_requests.stop_mission.response.
|
|
62
|
+
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
52
63
|
ControlMissionResponse(
|
|
53
64
|
mission_id=mission_id,
|
|
54
65
|
mission_status=state_machine.current_mission.status,
|
|
@@ -65,6 +76,7 @@ def mission_started_event_handler(
|
|
|
65
76
|
event: Event[bool],
|
|
66
77
|
) -> Optional[Callable]:
|
|
67
78
|
if event.consume_event():
|
|
79
|
+
state_machine.logger.info("Received confirmation that mission has started")
|
|
68
80
|
state_machine.mission_ongoing = True
|
|
69
81
|
return None
|
|
70
82
|
|
|
@@ -4,19 +4,19 @@ isar/script.py,sha256=LCb7CHvNyZhQz1OaQ-BUX8w7RDmu975zA0kL6FPwfzk,5912
|
|
|
4
4
|
isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
isar/apis/api.py,sha256=VM_WBlHJ4Juv9A0FvaUTeaMVYCN6a7pAojxIGCmDtf0,14154
|
|
6
6
|
isar/apis/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
isar/apis/models/models.py,sha256=
|
|
7
|
+
isar/apis/models/models.py,sha256=iRyqflpjGopm4KJjgRrOnC2swNEk3a-iwVynzw3Nm6c,1992
|
|
8
8
|
isar/apis/models/start_mission_definition.py,sha256=v-wt1XDd53Sw7DCdFAkxBBut-xd_uGJa7qMJnE3VI9k,6364
|
|
9
9
|
isar/apis/robot_control/robot_controller.py,sha256=0EHjMqOBdfJlMrCItGPz5X-4X2kc-2XlNnUU2LOcLfc,1219
|
|
10
10
|
isar/apis/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
isar/apis/schedule/scheduling_controller.py,sha256=
|
|
11
|
+
isar/apis/schedule/scheduling_controller.py,sha256=xpKlxxxBQuHZ37WP1OU8SR198YIIrr2NdWWJeaZpuEc,9366
|
|
12
12
|
isar/apis/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
isar/apis/security/authentication.py,sha256=Se2puhe2TUBmfio2RLma52-VSLRhqvWgu0Cd1bhdwMo,2000
|
|
14
14
|
isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
isar/config/configuration_error.py,sha256=rO6WOhafX6xvVib8WxV-eY483Z0PpN-9PxGsq5ATfKc,46
|
|
16
16
|
isar/config/log.py,sha256=f_mLLz5RSa0kZkdpi1m0iMdwwDc4RQp12mnT6gu2exE,1303
|
|
17
17
|
isar/config/logging.conf,sha256=a7ZBvZkrMDaPU3eRGAjL_eZz6hZsa6BaRJOfx8mbnnM,629
|
|
18
|
-
isar/config/open_telemetry.py,sha256=
|
|
19
|
-
isar/config/settings.py,sha256=
|
|
18
|
+
isar/config/open_telemetry.py,sha256=Lgu0lbRQA-zz6ZDoBKKk0whQex5w18jl1wjqWzHUGdg,3634
|
|
19
|
+
isar/config/settings.py,sha256=fUEsKeCwxWg1kMb3rlOgmIyw0V_ia9o-sqfXq2KMovA,14040
|
|
20
20
|
isar/config/certs/ca-cert.pem,sha256=qoNljfad_qcMxhXJIUMLd7nT-Qwf_d4dYSdoOFEOE8I,2179
|
|
21
21
|
isar/config/keyvault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
isar/config/keyvault/keyvault_error.py,sha256=zvPCsZLjboxsxthYkxpRERCTFxYV8R5WmACewAUQLwk,41
|
|
@@ -35,17 +35,17 @@ isar/config/predefined_mission_definition/default_turtlebot.json,sha256=20ee7q1E
|
|
|
35
35
|
isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
isar/config/predefined_missions/default.json,sha256=NWo9y5noPmpjlNUxLnZK95Sz7DIEaUR-ISYlw3MP8i0,1251
|
|
37
37
|
isar/config/predefined_missions/default_turtlebot.json,sha256=8Vk1_0P0BBsG0vwh4vwIYINiiWioErHZ0Ppjq3ctaPM,2143
|
|
38
|
-
isar/eventhandlers/eventhandler.py,sha256=
|
|
38
|
+
isar/eventhandlers/eventhandler.py,sha256=Wu4IsJA-k0I1F41q7qDT_QJl_OaUHNeGgzPufv8q5wo,3507
|
|
39
39
|
isar/mission_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
40
|
isar/mission_planner/local_planner.py,sha256=Mkg3vvUBF1jImfQnaFvXLNpKVadR21X4mwDd_wHqJ2w,2520
|
|
41
41
|
isar/mission_planner/mission_planner_interface.py,sha256=UgpPIM4FbrWOD7fGY3Ul64k3uYb8wo0FwSWGewYoVbc,485
|
|
42
42
|
isar/mission_planner/sequential_task_selector.py,sha256=66agRPHuJnEa1vArPyty4muTasAZ50XPjjrSaTdY_Cc,643
|
|
43
43
|
isar/mission_planner/task_selector_interface.py,sha256=pnLeaGPIuyXThcflZ_A7YL2b2xQjFT88hAZidkMomxU,707
|
|
44
44
|
isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
-
isar/models/events.py,sha256=
|
|
45
|
+
isar/models/events.py,sha256=M-0p4krtLpCfBMbClQvBFvfFB4NWBm55AlO1ngzVM_g,5024
|
|
46
46
|
isar/robot/robot.py,sha256=keqsYmfRlyIC4CWkMG0erDt_4uIC0IPvyG2ni4MemyI,5350
|
|
47
47
|
isar/robot/robot_start_mission.py,sha256=RPYH9VtXDFdPqhOpt6kSbT17RHkJQPKkQ6d4784_pFE,3210
|
|
48
|
-
isar/robot/robot_status.py,sha256=
|
|
48
|
+
isar/robot/robot_status.py,sha256=OXx18Qj0bvb2sKzn5-yKXWGdZ9GYyCOIgiTaGof-0Wc,2055
|
|
49
49
|
isar/robot/robot_stop_mission.py,sha256=4GZyhLU0hB6ZK0ArCVhFS9Sf3ZbqFI9DvPNfvD889Ps,2270
|
|
50
50
|
isar/robot/robot_task_status.py,sha256=jefIDfrbly7vWZztWA2zLmK5Yz1NSEytw2YUmprccNA,3161
|
|
51
51
|
isar/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -59,55 +59,56 @@ isar/services/service_connections/mqtt/robot_heartbeat_publisher.py,sha256=_bUOG
|
|
|
59
59
|
isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=AxokGk51hRPTxxD2r0P9braPJCMrf1InaCxrUBKkF4g,1402
|
|
60
60
|
isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
61
|
isar/services/utilities/robot_utilities.py,sha256=4zCigsLXfqDC8POHchktSq81zr1_pTaRve_LQsVr6Mk,514
|
|
62
|
-
isar/services/utilities/scheduling_utilities.py,sha256=
|
|
62
|
+
isar/services/utilities/scheduling_utilities.py,sha256=3vFU7t7oEZTFQNJdAxfhaADScRJIxznWhDbagHyLKOQ,13605
|
|
63
63
|
isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
|
|
64
64
|
isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
-
isar/state_machine/state_machine.py,sha256=
|
|
66
|
-
isar/state_machine/states_enum.py,sha256=
|
|
65
|
+
isar/state_machine/state_machine.py,sha256=6P88wFxvkHaYWK_WBCzTVdNkn7wqbwJVR0So-en2u_w,18038
|
|
66
|
+
isar/state_machine/states_enum.py,sha256=4Kysag9JPi2JSyC2me2B1sLH3Sfo7qGJonc-Q_IiUug,511
|
|
67
67
|
isar/state_machine/states/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
-
isar/state_machine/states/await_next_mission.py,sha256=
|
|
68
|
+
isar/state_machine/states/await_next_mission.py,sha256=yg0aH4eukcnE1xRKiPVafRxqHt3WdvqD08EATzdEojk,1961
|
|
69
69
|
isar/state_machine/states/blocked_protective_stop.py,sha256=GEOvxnHXjpCsrh3aa8Idtn1zMYv5HLQzj9qQAq8HvaU,1180
|
|
70
|
-
isar/state_machine/states/home.py,sha256=
|
|
70
|
+
isar/state_machine/states/home.py,sha256=TYv7WF5yX31Zw6Cn5MY2GHebUfypL5w510I92BEi_vE,1950
|
|
71
71
|
isar/state_machine/states/intervention_needed.py,sha256=A0QYz1vD1tDKAealihXDuoGuMLtXrRfn_AwFoaUhT_Q,1640
|
|
72
|
-
isar/state_machine/states/monitor.py,sha256=
|
|
72
|
+
isar/state_machine/states/monitor.py,sha256=GiNGyPcskrv3QDxMfsOmHUe_MRCaNA-pYuk9p6kcKp0,4623
|
|
73
73
|
isar/state_machine/states/offline.py,sha256=5wdNzC1wG0cWrpuT_r_mk8UNFHA4QSyg8ejXUTAg4Io,1137
|
|
74
74
|
isar/state_machine/states/paused.py,sha256=osmLZhm0-2jcZmNRauveeidCBYayDZvLy-1TNYv6CgQ,1091
|
|
75
|
-
isar/state_machine/states/
|
|
76
|
-
isar/state_machine/states/
|
|
77
|
-
isar/state_machine/states/
|
|
75
|
+
isar/state_machine/states/recharging.py,sha256=ni5WqFU0VDhdGC3ZfHcabSICm_5kwaS72wc3ecAB_os,1651
|
|
76
|
+
isar/state_machine/states/returning_home.py,sha256=mPwsOFxMTO6On5PzeYKW8Roy6TaQIXsoWCsbtzcV7M8,4267
|
|
77
|
+
isar/state_machine/states/robot_standing_still.py,sha256=EWG2_IPbxK6HFERHcmMFlWdN5PnXJXjwEfNlpsJnPkQ,1985
|
|
78
|
+
isar/state_machine/states/stopping.py,sha256=ROKbQcJFS4A_U0Pd8lAViG7Dz8JqfBaR3vHmpvKC2oc,3848
|
|
78
79
|
isar/state_machine/states/unknown_status.py,sha256=Y-g9cgme5zriyZ6YUzFRYhOvv9ZylCSwfaY8MJ7xEJ0,1791
|
|
79
|
-
isar/state_machine/transitions/mission.py,sha256=
|
|
80
|
-
isar/state_machine/transitions/return_home.py,sha256=
|
|
81
|
-
isar/state_machine/transitions/robot_status.py,sha256=
|
|
80
|
+
isar/state_machine/transitions/mission.py,sha256=oJiANT1lHd6YhEA_mQscDPDyfwMxwfosq7UcP0gfTNk,5456
|
|
81
|
+
isar/state_machine/transitions/return_home.py,sha256=EIR14rnukV_mEYkwtz0J_D1Dp51oVna0wV71HSbqtuw,4630
|
|
82
|
+
isar/state_machine/transitions/robot_status.py,sha256=sALt9BwZUnIFmVe35N1ptC-PyhfdHiTGu1R0GzpAQXk,3056
|
|
82
83
|
isar/state_machine/transitions/functions/fail_mission.py,sha256=jHHXhfQVYQEzCXgTEhv5e6uEK9p6iDPFFXqS9bzs_-A,720
|
|
83
84
|
isar/state_machine/transitions/functions/finish_mission.py,sha256=TRQrk7HdllmAkwsp25HRZAFAk46Y1hLx3jmkIAKrHDI,1442
|
|
84
|
-
isar/state_machine/transitions/functions/pause.py,sha256=
|
|
85
|
-
isar/state_machine/transitions/functions/resume.py,sha256=
|
|
85
|
+
isar/state_machine/transitions/functions/pause.py,sha256=Wa9XlhXVRNzxoYSsHc0w87ht4nQ5dGh50fjfA9lrAmI,1987
|
|
86
|
+
isar/state_machine/transitions/functions/resume.py,sha256=SAu4hWomPlrvO0lnpc6uM3rj79Bwq01acnaTEvNbO9U,2116
|
|
86
87
|
isar/state_machine/transitions/functions/return_home.py,sha256=5WPO40MtuRKm9-NtyrS6m0IVEit14MXfMKjgZ2sCXRU,1666
|
|
87
88
|
isar/state_machine/transitions/functions/robot_status.py,sha256=P1Cu8xVysbiKRKL4E8mSyoL2-72HfxrLvvOcdnBOlvw,889
|
|
88
|
-
isar/state_machine/transitions/functions/start_mission.py,sha256=
|
|
89
|
-
isar/state_machine/transitions/functions/stop.py,sha256=
|
|
89
|
+
isar/state_machine/transitions/functions/start_mission.py,sha256=tIpZzYXCoeC6ZWj18UB4DiZuICpxfzFUK23wfunad7Q,2864
|
|
90
|
+
isar/state_machine/transitions/functions/stop.py,sha256=4idsNh7v6CRJivD36oKnVmdKlP7mSugTLCh9n12R1-U,2114
|
|
90
91
|
isar/state_machine/transitions/functions/utils.py,sha256=Wa72Ocq4QT1E6qkpEJZQ3h5o33pGvx7Tlkt2JZ2Grbk,314
|
|
91
|
-
isar/state_machine/utils/common_event_handlers.py,sha256=
|
|
92
|
+
isar/state_machine/utils/common_event_handlers.py,sha256=yFZzTmTLVWzHU4RNW3q9gc6NU9eajNn50L-vt6geH38,6318
|
|
92
93
|
isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
94
|
isar/storage/blob_storage.py,sha256=QueyHzCJfUUyOLxBeYwK0Ot7w_CYakBEhtTtITelKAo,3026
|
|
94
95
|
isar/storage/local_storage.py,sha256=-9Bz2WmniLKwKMeAdrgoMzkj781AOLIUsfaqQERqpUk,1985
|
|
95
96
|
isar/storage/storage_interface.py,sha256=DRIiy0mRZL3KMZysG0R2Cque6hoqd5haZBw11WM53Vc,840
|
|
96
97
|
isar/storage/uploader.py,sha256=uD1DzvJ2yYtNAwQGa7UD7kNOxZfKxJ1cCdi7sfOVZ10,9443
|
|
97
98
|
isar/storage/utilities.py,sha256=oLH0Rp7UtrQQdilfITnmXO1Z0ExdeDhBImYHid55vBA,3449
|
|
98
|
-
isar-1.
|
|
99
|
+
isar-1.33.1.dist-info/licenses/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
|
|
99
100
|
robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
|
-
robot_interface/robot_interface.py,sha256
|
|
101
|
+
robot_interface/robot_interface.py,sha256=A6t19lcNU_6AfkYKY5DaF0sheym_SZEAawbfaj36Kjk,8997
|
|
101
102
|
robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
|
|
102
103
|
robot_interface/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
104
|
robot_interface/models/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
105
|
robot_interface/models/exceptions/robot_exceptions.py,sha256=VrsWPf4g0qN5sJRKhc3ER_Wt5drK0MZRuECU-csIlDA,10026
|
|
105
106
|
robot_interface/models/initialize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
107
|
robot_interface/models/inspection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
|
-
robot_interface/models/inspection/inspection.py,sha256=
|
|
108
|
+
robot_interface/models/inspection/inspection.py,sha256=cjAvekL8r82s7bgukWeXpYylHvJG_oRSCJNISPVCvZg,2238
|
|
108
109
|
robot_interface/models/mission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
109
110
|
robot_interface/models/mission/mission.py,sha256=MQ9p5cuclLXexaZu9bkDh5-aN99eunvYC0vP-Z_kUwI,960
|
|
110
|
-
robot_interface/models/mission/status.py,sha256=
|
|
111
|
+
robot_interface/models/mission/status.py,sha256=KC-79HBjM1-6xA0WmwAtZl8QC0pZu6u4wbYWb0IjGd8,816
|
|
111
112
|
robot_interface/models/mission/task.py,sha256=YzaqJ_KIIm-3S2Y2-BG4Pdkc8sjFMzMx5jj8FtXSmFg,4744
|
|
112
113
|
robot_interface/models/robots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
113
114
|
robot_interface/models/robots/battery_state.py,sha256=ktOtJ8ltdK0k_i7BoqYfhc5dbOzIG6Oo-uWC67fCWio,98
|
|
@@ -115,12 +116,12 @@ robot_interface/models/robots/media.py,sha256=8A-CuuubfngzPprs6zWB9hSaqe3jzgsE8r
|
|
|
115
116
|
robot_interface/models/robots/robot_model.py,sha256=-0jNKWPcEgtF_2klb1It3u0SCoAR0hSW9nce58Zq0Co,417
|
|
116
117
|
robot_interface/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
117
118
|
robot_interface/telemetry/mqtt_client.py,sha256=ueXdtIFNCwciTj4spvdJj9emd-IOmUuJjpsXQSSWZPY,2987
|
|
118
|
-
robot_interface/telemetry/payloads.py,sha256=
|
|
119
|
+
robot_interface/telemetry/payloads.py,sha256=T7EK-b0bVhADDTKMIAHmcPVtPxuR16csmZoOJQl9P4c,3103
|
|
119
120
|
robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
121
|
robot_interface/utilities/json_service.py,sha256=qkzVkb60Gi_pto-b5n1vNzCrQze2yqgIJqSLNLYj1Fg,1034
|
|
121
122
|
robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
|
|
122
|
-
isar-1.
|
|
123
|
-
isar-1.
|
|
124
|
-
isar-1.
|
|
125
|
-
isar-1.
|
|
126
|
-
isar-1.
|
|
123
|
+
isar-1.33.1.dist-info/METADATA,sha256=DA8JyLIr7mtdSeQwJP_9WV5phTA4QlDj8YQd0lE7ppE,31217
|
|
124
|
+
isar-1.33.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
125
|
+
isar-1.33.1.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
|
|
126
|
+
isar-1.33.1.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
|
|
127
|
+
isar-1.33.1.dist-info/RECORD,,
|