isar 1.14.4__py3-none-any.whl → 1.15.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.
@@ -1,3 +1,4 @@
1
+ import time
1
2
  from enum import Enum
2
3
  from typing import Any, Dict, List, Optional, Union
3
4
 
@@ -5,6 +6,7 @@ from alitra import Position
5
6
  from pydantic import BaseModel, Field
6
7
 
7
8
  from isar.apis.models.models import InputPose, InputPosition
9
+ from isar.config.settings import settings
8
10
  from isar.mission_planner.mission_planner_interface import MissionPlannerError
9
11
  from robot_interface.models.mission.mission import Mission
10
12
  from robot_interface.models.mission.step import (
@@ -30,7 +32,7 @@ class InspectionTypes(str, Enum):
30
32
  class StartMissionInspectionDefinition(BaseModel):
31
33
  type: InspectionTypes = Field(default=InspectionTypes.image)
32
34
  inspection_target: InputPosition
33
- analysis_types: Optional[List]
35
+ analysis_types: Optional[str]
34
36
  duration: Optional[float]
35
37
  metadata: Optional[dict]
36
38
  id: Optional[str]
@@ -46,6 +48,7 @@ class StartMissionTaskDefinition(BaseModel):
46
48
  class StartMissionDefinition(BaseModel):
47
49
  tasks: List[StartMissionTaskDefinition]
48
50
  id: Optional[str]
51
+ name: Optional[str]
49
52
 
50
53
 
51
54
  def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
@@ -101,6 +104,14 @@ def to_isar_mission(mission_definition: StartMissionDefinition) -> Mission:
101
104
 
102
105
  isar_mission: Mission = Mission(tasks=isar_tasks)
103
106
 
107
+ if mission_definition.name:
108
+ isar_mission.name = mission_definition.name
109
+ else:
110
+ isar_mission.name = _build_mission_name()
111
+
112
+ if mission_definition.id:
113
+ isar_mission.id = mission_definition.id
114
+
104
115
  return isar_mission
105
116
 
106
117
 
@@ -108,7 +119,7 @@ def create_inspection_step(
108
119
  inspection_type: InspectionTypes,
109
120
  duration: float,
110
121
  target: Position,
111
- analysis: Optional[List],
122
+ analysis: Optional[str],
112
123
  tag_id: Optional[str],
113
124
  metadata: Optional[dict],
114
125
  id: Optional[str],
@@ -151,3 +162,7 @@ def get_duplicate_ids(items: Union[List[Task], List[STEPS]]) -> List[str]:
151
162
  duplicate_ids.append(id)
152
163
 
153
164
  return duplicate_ids
165
+
166
+
167
+ def _build_mission_name() -> str:
168
+ return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
@@ -18,7 +18,6 @@ from isar.apis.models.start_mission_definition import (
18
18
  )
19
19
  from isar.config.settings import robot_settings, settings
20
20
  from isar.mission_planner.mission_planner_interface import MissionPlannerError
21
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
22
21
  from isar.services.utilities.scheduling_utilities import SchedulingUtilities
23
22
  from isar.state_machine.states_enum import States
24
23
  from robot_interface.models.mission.mission import Mission
@@ -76,10 +75,11 @@ class SchedulingController:
76
75
  )
77
76
 
78
77
  self.logger.info(f"Starting mission with ISAR Mission ID: '{mission.id}'")
79
- metadata: MissionMetadata = MissionMetadata(mission.id)
78
+
80
79
  self.scheduling_utilities.start_mission(
81
- mission=mission, initial_pose=initial_pose_alitra, mission_metadata=metadata
80
+ mission=mission, initial_pose=initial_pose_alitra
82
81
  )
82
+
83
83
  return self._api_response(mission)
84
84
 
85
85
  def start_mission(
@@ -139,10 +139,9 @@ class SchedulingController:
139
139
  initial_pose.to_alitra_pose() if initial_pose else None
140
140
  )
141
141
 
142
- metadata: MissionMetadata = MissionMetadata(mission.id)
143
142
  self.logger.info(f"Starting mission: {mission.id}")
144
143
  self.scheduling_utilities.start_mission(
145
- mission=mission, mission_metadata=metadata, initial_pose=initial_pose_alitra
144
+ mission=mission, initial_pose=initial_pose_alitra
146
145
  )
147
146
  return self._api_response(mission)
148
147
 
@@ -220,13 +219,11 @@ class SchedulingController:
220
219
  pose: Pose = target_pose.to_alitra_pose()
221
220
  step: DriveToPose = DriveToPose(pose=pose)
222
221
  mission: Mission = Mission(tasks=[Task(steps=[step])])
223
- metadata: MissionMetadata = MissionMetadata(mission.id)
222
+
224
223
  self.logger.info(
225
224
  f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
226
225
  )
227
- self.scheduling_utilities.start_mission(
228
- mission=mission, initial_pose=None, mission_metadata=metadata
229
- )
226
+ self.scheduling_utilities.start_mission(mission=mission, initial_pose=None)
230
227
  return self._api_response(mission)
231
228
 
232
229
  def start_localization_mission(
@@ -247,12 +244,13 @@ class SchedulingController:
247
244
  pose: Pose = localization_pose.to_alitra_pose()
248
245
  step: Localize = Localize(localization_pose=pose)
249
246
  mission: Mission = Mission(tasks=[Task(steps=[step])])
250
- metadata: MissionMetadata = MissionMetadata(mission.id)
247
+
251
248
  self.logger.info(
252
249
  f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
253
250
  )
254
251
  self.scheduling_utilities.start_mission(
255
- mission=mission, initial_pose=None, mission_metadata=metadata
252
+ mission=mission,
253
+ initial_pose=None,
256
254
  )
257
255
  return self._api_response(mission)
258
256
 
@@ -28,10 +28,7 @@
28
28
  "z": 0,
29
29
  "frame_name": "robot"
30
30
  },
31
- "analysis_types": [
32
- "CarSeal",
33
- "Rust"
34
- ],
31
+ "analysis_types": "CarSeal, Rust",
35
32
  "metadata": {
36
33
  "zoom": "2x"
37
34
  }
@@ -44,9 +41,8 @@
44
41
  "z": 0,
45
42
  "frame_name": "robot"
46
43
  },
47
- "analysis_types": [
48
- "GasDetection"
49
- ],
44
+ "analysis_types": "GasDetection"
45
+ ,
50
46
  "duration": 10
51
47
  }
52
48
  ]
@@ -77,10 +73,7 @@
77
73
  "z": 0,
78
74
  "frame_name": "robot"
79
75
  },
80
- "analysis_types": [
81
- "ColdSpot",
82
- "HotSpot"
83
- ]
76
+ "analysis_types": "ColdSpot,HotSpot"
84
77
  },
85
78
  {
86
79
  "type": "Video",
@@ -28,10 +28,8 @@
28
28
  "z": 0,
29
29
  "frame": "robot"
30
30
  },
31
- "analysis_types": [
32
- "CarSeal",
33
- "Rust"
34
- ],
31
+ "analysis_types": "CarSeal, Rust"
32
+ ,
35
33
  "metadata": {
36
34
  "zoom": "2x"
37
35
  }
@@ -44,9 +42,7 @@
44
42
  "z": 0,
45
43
  "frame": "robot"
46
44
  },
47
- "analysis_types": [
48
- "GasDetection"
49
- ]
45
+ "analysis_types": "GasDetection"
50
46
  }
51
47
  ]
52
48
  },
@@ -77,10 +73,8 @@
77
73
  "z": 0,
78
74
  "frame": "robot"
79
75
  },
80
- "analysis_types": [
81
- "ColdSpot",
82
- "HotSpot"
83
- ]
76
+ "analysis_types": "ColdSpot, HotSpot"
77
+
84
78
  }
85
79
  ]
86
80
  },
@@ -111,10 +105,7 @@
111
105
  "z": 0,
112
106
  "frame": "robot"
113
107
  },
114
- "analysis_types": [
115
- "ColdSpot",
116
- "HotSpot"
117
- ]
108
+ "analysis_types": "ColdSpot, HotSpot"
118
109
  },
119
110
  {
120
111
  "type": "ThermalImage",
@@ -124,10 +115,7 @@
124
115
  "z": 0,
125
116
  "frame": "robot"
126
117
  },
127
- "analysis_types": [
128
- "ColdSpot",
129
- "HotSpot"
130
- ]
118
+ "analysis_types": "ColdSpot, HotSpot"
131
119
  }
132
120
  ]
133
121
  }
@@ -3,12 +3,10 @@ from typing import Optional
3
3
 
4
4
  from alitra import Pose
5
5
 
6
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
7
6
  from robot_interface.models.mission.mission import Mission
8
7
 
9
8
 
10
9
  @dataclass
11
10
  class StartMissionMessage:
12
11
  mission: Mission
13
- mission_metadata: MissionMetadata
14
12
  initial_pose: Optional[Pose]
@@ -20,6 +20,7 @@ class RobotInfoPublisher:
20
20
  robot_name=settings.ROBOT_NAME,
21
21
  robot_model=robot_settings.ROBOT_MODEL, # type: ignore
22
22
  robot_serial_number=settings.SERIAL_NUMBER,
23
+ robot_asset=settings.PLANT_SHORT_NAME,
23
24
  video_streams=settings.VIDEO_STREAMS,
24
25
  host=settings.API_HOST_VIEWED_EXTERNALLY,
25
26
  port=settings.API_PORT,
@@ -18,7 +18,6 @@ from isar.mission_planner.mission_planner_interface import (
18
18
  )
19
19
  from isar.models.communication.message import StartMissionMessage
20
20
  from isar.models.communication.queues import QueueIO, Queues, QueueTimeoutError
21
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
22
21
  from isar.services.utilities.queue_utilities import QueueUtilities
23
22
  from isar.state_machine.states_enum import States
24
23
  from robot_interface.models.mission.mission import Mission
@@ -139,7 +138,6 @@ class SchedulingUtilities:
139
138
  def start_mission(
140
139
  self,
141
140
  mission: Mission,
142
- mission_metadata: MissionMetadata,
143
141
  initial_pose: Optional[Pose],
144
142
  ) -> None:
145
143
  """Start mission
@@ -153,7 +151,6 @@ class SchedulingUtilities:
153
151
  self._send_command(
154
152
  StartMissionMessage(
155
153
  mission=deepcopy(mission),
156
- mission_metadata=deepcopy(mission_metadata),
157
154
  initial_pose=initial_pose,
158
155
  ),
159
156
  self.queues.start_mission,
@@ -19,7 +19,6 @@ from isar.mission_planner.task_selector_interface import (
19
19
  )
20
20
  from isar.models.communication.message import StartMissionMessage
21
21
  from isar.models.communication.queues.queues import Queues
22
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
23
22
  from isar.state_machine.states import (
24
23
  Idle,
25
24
  Initialize,
@@ -203,7 +202,6 @@ class StateMachine(object):
203
202
 
204
203
  self.stopped: bool = False
205
204
  self.current_mission: Optional[Mission] = None
206
- self.current_mission_metadata: Optional[MissionMetadata] = None
207
205
  self.current_task: Optional[Task] = None
208
206
  self.current_step: Optional[Step] = None
209
207
  self.initial_pose: Optional[Pose] = None
@@ -436,12 +434,9 @@ class StateMachine(object):
436
434
  self.current_mission = None
437
435
  self.initial_pose = None
438
436
 
439
- def start_mission(
440
- self, mission: Mission, mission_metadata: MissionMetadata, initial_pose: Pose
441
- ):
437
+ def start_mission(self, mission: Mission, initial_pose: Pose):
442
438
  """Starts a scheduled mission."""
443
439
  self.current_mission = mission
444
- self.current_mission_metadata = mission_metadata
445
440
  self.initial_pose = initial_pose
446
441
 
447
442
  self.task_selector.initialize(tasks=self.current_mission.tasks)
@@ -31,7 +31,6 @@ class Idle(State):
31
31
  if start_mission:
32
32
  self.state_machine.start_mission(
33
33
  mission=start_mission.mission,
34
- mission_metadata=start_mission.mission_metadata,
35
34
  initial_pose=start_mission.initial_pose,
36
35
  )
37
36
  transition = self.state_machine.mission_started # type: ignore
@@ -6,7 +6,6 @@ from typing import Callable, Optional, Sequence, TYPE_CHECKING, Tuple, Union
6
6
  from injector import inject
7
7
  from transitions import State
8
8
 
9
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
10
9
  from isar.services.utilities.threaded_request import (
11
10
  ThreadedRequest,
12
11
  ThreadedRequestNotFinishedError,
@@ -129,18 +128,16 @@ class Monitor(State):
129
128
  f"No inspection data retrieved for step {str(current_step.id)[:8]}"
130
129
  )
131
130
 
132
- # A deepcopy is made to freeze the metadata before passing it to another thread
131
+ # A deepcopy is made to freeze the mission before passing it to another thread
133
132
  # through the queue
134
- mission_metadata: MissionMetadata = deepcopy(
135
- self.state_machine.current_mission_metadata
136
- )
133
+ mission: Mission = deepcopy(self.state_machine.current_mission)
137
134
 
138
135
  for inspection in inspections:
139
136
  inspection.metadata.tag_id = current_step.tag_id
140
137
 
141
- message: Tuple[Inspection, MissionMetadata] = (
138
+ message: Tuple[Inspection, Mission] = (
142
139
  inspection,
143
- mission_metadata,
140
+ mission,
144
141
  )
145
142
  self.state_machine.queues.upload_queue.put(message)
146
143
  self.logger.info(f"Inspection: {str(inspection.id)[:8]} queued for upload")
@@ -7,9 +7,9 @@ from injector import inject
7
7
 
8
8
  from isar.config.keyvault.keyvault_service import Keyvault
9
9
  from isar.config.settings import settings
10
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
10
+ from robot_interface.models.mission.mission import Mission
11
11
  from isar.storage.storage_interface import StorageException, StorageInterface
12
- from isar.storage.utilities import construct_local_paths, construct_metadata_file
12
+ from isar.storage.utilities import construct_metadata_file, construct_paths
13
13
  from robot_interface.models.inspection.inspection import Inspection
14
14
 
15
15
 
@@ -31,17 +31,17 @@ class BlobStorage(StorageInterface):
31
31
 
32
32
  self.logger = logging.getLogger("uploader")
33
33
 
34
- def store(self, inspection: Inspection, metadata: MissionMetadata) -> str:
35
- local_path, local_metadata_path = construct_local_paths(
36
- inspection=inspection, metadata=metadata
34
+ def store(self, inspection: Inspection, mission: Mission) -> str:
35
+ data_path, metadata_path = construct_paths(
36
+ inspection=inspection, mission=mission
37
37
  )
38
38
 
39
39
  metadata_bytes: bytes = construct_metadata_file(
40
- inspection=inspection, metadata=metadata, filename=local_path.name
40
+ inspection=inspection, mission=mission, filename=data_path.name
41
41
  )
42
42
 
43
- self._upload_file(path=local_metadata_path, data=metadata_bytes)
44
- return self._upload_file(path=local_path, data=inspection.data)
43
+ self._upload_file(path=metadata_path, data=metadata_bytes)
44
+ return self._upload_file(path=data_path, data=inspection.data)
45
45
 
46
46
  def _upload_file(self, path: Path, data: bytes) -> str:
47
47
  blob_client = self._get_blob_client(path)
@@ -2,9 +2,9 @@ import logging
2
2
  from pathlib import Path
3
3
 
4
4
  from isar.config.settings import settings
5
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
5
+ from robot_interface.models.mission.mission import Mission
6
6
  from isar.storage.storage_interface import StorageException, StorageInterface
7
- from isar.storage.utilities import construct_local_paths, construct_metadata_file
7
+ from isar.storage.utilities import construct_metadata_file, construct_paths
8
8
  from robot_interface.models.inspection.inspection import Inspection
9
9
 
10
10
 
@@ -13,9 +13,9 @@ class LocalStorage(StorageInterface):
13
13
  self.root_folder: Path = Path(settings.LOCAL_STORAGE_PATH)
14
14
  self.logger = logging.getLogger("uploader")
15
15
 
16
- def store(self, inspection: Inspection, metadata: MissionMetadata) -> str:
17
- local_path, local_metadata_path = construct_local_paths(
18
- inspection=inspection, metadata=metadata
16
+ def store(self, inspection: Inspection, mission: Mission) -> str:
17
+ local_path, local_metadata_path = construct_paths(
18
+ inspection=inspection, mission=mission
19
19
  )
20
20
 
21
21
  absolute_path: Path = self.root_folder.joinpath(local_path)
@@ -24,7 +24,7 @@ class LocalStorage(StorageInterface):
24
24
  absolute_path.parent.mkdir(parents=True, exist_ok=True)
25
25
 
26
26
  metadata_bytes: bytes = construct_metadata_file(
27
- inspection=inspection, metadata=metadata, filename=local_path.name
27
+ inspection=inspection, mission=mission, filename=local_path.name
28
28
  )
29
29
  try:
30
30
  with open(absolute_path, "wb") as file, open(
@@ -7,7 +7,7 @@ from requests import HTTPError, RequestException
7
7
  from requests_toolbelt import MultipartEncoder
8
8
 
9
9
  from isar.config.settings import settings
10
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
10
+ from robot_interface.models.mission.mission import Mission
11
11
  from isar.services.auth.azure_credentials import AzureCredentials
12
12
  from isar.services.service_connections.request_handler import RequestHandler
13
13
  from isar.storage.storage_interface import StorageException, StorageInterface
@@ -31,24 +31,22 @@ class SlimmStorage(StorageInterface):
31
31
 
32
32
  self.url: str = settings.SLIMM_API_URL
33
33
 
34
- def store(self, inspection: Inspection, metadata: MissionMetadata) -> str:
34
+ def store(self, inspection: Inspection, mission: Mission) -> str:
35
35
  filename: str = get_filename(
36
- mission_id=metadata.mission_id,
37
- inspection_type=type(inspection).__name__,
38
- inspection_id=inspection.id,
36
+ inspection=inspection,
39
37
  )
40
38
  filename = f"{filename}.{inspection.metadata.file_type}"
41
39
  if type(inspection) in [Video, ThermalVideo]:
42
- inspection_path = self._store_video(filename, inspection, metadata)
40
+ inspection_path = self._store_video(filename, inspection, mission)
43
41
  else:
44
- inspection_path = self._store_image(filename, inspection, metadata)
42
+ inspection_path = self._store_image(filename, inspection, mission)
45
43
  return inspection_path
46
44
 
47
45
  def _store_image(
48
- self, filename: str, inspection: Inspection, metadata: MissionMetadata
46
+ self, filename: str, inspection: Inspection, mission: Mission
49
47
  ) -> str:
50
48
  multiform_body: MultipartEncoder = self._construct_multiform_request_image(
51
- filename=filename, inspection=inspection, metadata=metadata
49
+ filename=filename, inspection=inspection, mission=mission
52
50
  )
53
51
  request_url: str = f"{self.url}/UploadSingleImage"
54
52
  inspection_path = self._ingest(
@@ -59,10 +57,10 @@ class SlimmStorage(StorageInterface):
59
57
  return inspection_path
60
58
 
61
59
  def _store_video(
62
- self, filename: str, inspection: Inspection, metadata: MissionMetadata
60
+ self, filename: str, inspection: Inspection, mission: Mission
63
61
  ) -> str:
64
62
  multiform_body: MultipartEncoder = self._construct_multiform_request_video(
65
- filename=filename, inspection=inspection, metadata=metadata
63
+ filename=filename, inspection=inspection, mission=mission
66
64
  )
67
65
  request_url = f"{self.url}/UploadSingleVideo"
68
66
  inspection_path = self._ingest(
@@ -98,23 +96,23 @@ class SlimmStorage(StorageInterface):
98
96
 
99
97
  @staticmethod
100
98
  def _construct_multiform_request_image(
101
- filename: str, inspection: Inspection, metadata: MissionMetadata
99
+ filename: str, inspection: Inspection, mission: Mission
102
100
  ):
103
101
  array_of_orientation = (
104
102
  inspection.metadata.pose.orientation.to_quat_array().tolist()
105
103
  )
106
104
  multiform_body: MultipartEncoder = MultipartEncoder(
107
105
  fields={
108
- "PlantFacilitySAPCode": metadata.plant_code,
109
- "InstCode": metadata.plant_short_name,
110
- "InternalClassification": metadata.data_classification,
106
+ "PlantFacilitySAPCode": settings.PLANT_CODE,
107
+ "InstCode": settings.PLANT_SHORT_NAME,
108
+ "InternalClassification": settings.DATA_CLASSIFICATION,
111
109
  "IsoCountryCode": "NO",
112
- "Geodetic.CoordinateReferenceSystemCode": metadata.coordinate_reference_system, # noqa: E501
113
- "Geodetic.VerticalCoordinateReferenceSystemCode": metadata.vertical_reference_system, # noqa: E501
114
- "Geodetic.OrientationReferenceSystem": metadata.media_orientation_reference_system, # noqa: E501
115
- "SensorCarrier.SensorCarrierId": metadata.isar_id,
116
- "SensorCarrier.ModelName": metadata.robot_model,
117
- "Mission.MissionId": metadata.mission_id,
110
+ "Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
111
+ "Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
112
+ "Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
113
+ "SensorCarrier.SensorCarrierId": settings.ISAR_ID,
114
+ "SensorCarrier.ModelName": settings.ROBOT_TYPE,
115
+ "Mission.MissionId": mission.id,
118
116
  "Mission.Client": "Equinor",
119
117
  "ImageMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
120
118
  "ImageMetadata.X": str(inspection.metadata.pose.position.x),
@@ -124,11 +122,13 @@ class SlimmStorage(StorageInterface):
124
122
  "ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
125
123
  "ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
126
124
  "ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
127
- "ImageMetadata.AnalysisMethods": str(inspection.metadata.analysis),
125
+ "ImageMetadata.AnalysisMethods": inspection.metadata.analysis
126
+ if inspection.metadata.analysis
127
+ else "N/A",
128
128
  "ImageMetadata.Description": str(inspection.metadata.additional),
129
129
  "ImageMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
130
130
  if inspection.metadata.tag_id
131
- else "NA",
131
+ else "N/A",
132
132
  "Filename": filename,
133
133
  "AttachedFile": (filename, inspection.data),
134
134
  }
@@ -139,26 +139,27 @@ class SlimmStorage(StorageInterface):
139
139
  def _construct_multiform_request_video(
140
140
  filename: str,
141
141
  inspection: Inspection,
142
- metadata: MissionMetadata,
142
+ mission: Mission,
143
143
  ):
144
144
  array_of_orientation = (
145
145
  inspection.metadata.pose.orientation.to_quat_array().tolist()
146
146
  )
147
147
  multiform_body: MultipartEncoder = MultipartEncoder(
148
148
  fields={
149
- "PlantFacilitySAPCode": metadata.plant_code,
150
- "InstCode": metadata.plant_short_name,
151
- "InternalClassification": metadata.data_classification,
149
+ "PlantFacilitySAPCode": settings.PLANT_CODE,
150
+ "InstCode": settings.PLANT_SHORT_NAME,
151
+ "InternalClassification": settings.DATA_CLASSIFICATION,
152
152
  "IsoCountryCode": "NO",
153
- "Geodetic.CoordinateReferenceSystemCode": metadata.coordinate_reference_system, # noqa: E501
154
- "Geodetic.VerticalCoordinateReferenceSystemCode": metadata.vertical_reference_system, # noqa: E501
155
- "Geodetic.OrientationReferenceSystem": metadata.media_orientation_reference_system, # noqa: E501
156
- "SensorCarrier.SensorCarrierId": metadata.isar_id,
157
- "SensorCarrier.ModelName": metadata.robot_model,
158
- "Mission.MissionId": metadata.mission_id,
153
+ "Geodetic.CoordinateReferenceSystemCode": settings.COORDINATE_REFERENCE_SYSTEM, # noqa: E501
154
+ "Geodetic.VerticalCoordinateReferenceSystemCode": settings.VERTICAL_REFERENCE_SYSTEM, # noqa: E501
155
+ "Geodetic.OrientationReferenceSystem": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
156
+ "SensorCarrier.SensorCarrierId": settings.ISAR_ID,
157
+ "SensorCarrier.ModelName": settings.ROBOT_TYPE,
158
+ "Mission.MissionId": mission.id,
159
159
  "Mission.Client": "Equinor",
160
160
  "VideoMetadata.Timestamp": inspection.metadata.start_time.isoformat(), # noqa: E501
161
- "VideoMetadata.Duration": str(inspection.metadata.duration), # type: ignore
161
+ # Converting to int because SLIMM expects an int, while we use floats in operations.
162
+ "VideoMetadata.Duration": str(int(inspection.metadata.duration)), # type: ignore
162
163
  "VideoMetadata.X": str(inspection.metadata.pose.position.x),
163
164
  "VideoMetadata.Y": str(inspection.metadata.pose.position.y),
164
165
  "VideoMetadata.Z": str(inspection.metadata.pose.position.z),
@@ -166,11 +167,13 @@ class SlimmStorage(StorageInterface):
166
167
  "VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
167
168
  "VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
168
169
  "VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
169
- "VideoMetadata.AnalysisMethods": str(inspection.metadata.analysis),
170
+ "VideoMetadata.AnalysisMethods": inspection.metadata.analysis
171
+ if inspection.metadata.analysis
172
+ else "N/A",
170
173
  "VideoMetadata.Description": str(inspection.metadata.additional),
171
174
  "VideoMetadata.FunctionalLocation": inspection.metadata.tag_id # noqa: E501
172
175
  if inspection.metadata.tag_id
173
- else "NA",
176
+ else "N/A",
174
177
  "Filename": filename,
175
178
  "AttachedFile": (filename, inspection.data),
176
179
  }
@@ -1,17 +1,17 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
 
3
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
3
+ from robot_interface.models.mission.mission import Mission
4
4
  from robot_interface.models.inspection.inspection import Inspection
5
5
 
6
6
 
7
7
  class StorageInterface(metaclass=ABCMeta):
8
8
  @abstractmethod
9
- def store(self, inspection: Inspection, metadata: MissionMetadata) -> str:
9
+ def store(self, inspection: Inspection, mission: Mission) -> str:
10
10
  """
11
11
  Parameters
12
12
  ----------
13
- metadata : MissionMetadata
14
- Metadata for the mission the inspection is a part of.
13
+ mission : Mission
14
+ Mission the inspection is a part of.
15
15
  inspection : Inspection
16
16
  The inspection object to be stored.
17
17
 
isar/storage/uploader.py CHANGED
@@ -9,7 +9,7 @@ from injector import inject
9
9
 
10
10
  from isar.config.settings import settings
11
11
  from isar.models.communication.queues import Queues
12
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
12
+ from robot_interface.models.mission.mission import Mission
13
13
  from isar.storage.storage_interface import StorageException, StorageInterface
14
14
  from robot_interface.models.inspection.inspection import Inspection
15
15
  from robot_interface.telemetry.mqtt_client import MqttClientInterface
@@ -19,7 +19,7 @@ from robot_interface.utilities.json_service import EnhancedJSONEncoder
19
19
  @dataclass
20
20
  class UploaderQueueItem:
21
21
  inspection: Inspection
22
- mission_metadata: MissionMetadata
22
+ mission: Mission
23
23
  storage_handler: StorageInterface
24
24
  _retry_count: int
25
25
  _next_retry_time: datetime = datetime.utcnow()
@@ -78,17 +78,17 @@ class Uploader:
78
78
  self.logger.info("Started uploader")
79
79
  while True:
80
80
  inspection: Inspection
81
- mission_metadata: MissionMetadata
81
+ mission: Mission
82
82
  try:
83
83
  if self._internal_upload_queue:
84
84
  self._process_upload_queue()
85
85
 
86
- inspection, mission_metadata = self.upload_queue.get(timeout=1)
86
+ inspection, mission = self.upload_queue.get(timeout=1)
87
87
 
88
88
  # If new item from thread queue, add one per handler to internal queue:
89
89
  for storage_handler in self.storage_handlers:
90
90
  new_item: UploaderQueueItem = UploaderQueueItem(
91
- inspection, mission_metadata, storage_handler, _retry_count=-1
91
+ inspection, mission, storage_handler, _retry_count=-1
92
92
  )
93
93
  self._internal_upload_queue.append(new_item)
94
94
  except Empty:
@@ -98,7 +98,7 @@ class Uploader:
98
98
  inspection_path = ""
99
99
  try:
100
100
  inspection_path = upload_item.storage_handler.store(
101
- inspection=upload_item.inspection, metadata=upload_item.mission_metadata
101
+ inspection=upload_item.inspection, mission=upload_item.mission
102
102
  )
103
103
  self.logger.info(
104
104
  f"Storage handler: {type(upload_item.storage_handler).__name__} "
isar/storage/utilities.py CHANGED
@@ -1,21 +1,19 @@
1
1
  import json
2
+ import time
2
3
  from pathlib import Path
3
4
  from typing import Tuple
4
5
 
5
- from isar.models.mission_metadata.mission_metadata import MissionMetadata
6
+ from robot_interface.models.mission.mission import Mission
6
7
  from robot_interface.models.inspection.inspection import Inspection
7
8
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
8
9
 
10
+ from isar.config.settings import settings
11
+ from datetime import date, datetime
9
12
 
10
- def construct_local_paths(
11
- inspection: Inspection, metadata: MissionMetadata
12
- ) -> Tuple[Path, Path]:
13
- folder: Path = Path(str(metadata.mission_id))
14
- filename: str = get_filename(
15
- mission_id=metadata.mission_id,
16
- inspection_type=type(inspection).__name__,
17
- inspection_id=inspection.id,
18
- )
13
+
14
+ def construct_paths(inspection: Inspection, mission: Mission) -> Tuple[Path, Path]:
15
+ folder: Path = Path(get_foldername(mission=mission))
16
+ filename: str = get_filename(inspection=inspection)
19
17
 
20
18
  inspection_path: Path = folder.joinpath(
21
19
  f"{filename}.{inspection.metadata.file_type}"
@@ -27,25 +25,26 @@ def construct_local_paths(
27
25
 
28
26
 
29
27
  def construct_metadata_file(
30
- inspection: Inspection, metadata: MissionMetadata, filename: str
28
+ inspection: Inspection, mission: Mission, filename: str
31
29
  ) -> bytes:
32
30
  data: dict = {
33
- "coordinate_reference_system": metadata.coordinate_reference_system,
34
- "vertical_reference_system": metadata.vertical_reference_system,
35
- "data_classification": metadata.data_classification,
31
+ "coordinate_reference_system": settings.COORDINATE_REFERENCE_SYSTEM,
32
+ "vertical_reference_system": settings.VERTICAL_REFERENCE_SYSTEM,
33
+ "data_classification": settings.DATA_CLASSIFICATION,
36
34
  "source_url": None,
37
- "plant_code": metadata.plant_code,
38
- "media_orientation_reference_system": metadata.media_orientation_reference_system, # noqa: E501
35
+ "plant_code": settings.PLANT_CODE,
36
+ "media_orientation_reference_system": settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM, # noqa: E501
39
37
  "additional_meta": {
40
- "mission_id": metadata.mission_id,
41
- "plant_name": metadata.plant_name,
42
- "mission_date": metadata.mission_date,
43
- "isar_id": metadata.isar_id,
44
- "robot_name": metadata.robot_name,
38
+ "mission_id": mission.id,
39
+ "mission_name": mission.name,
40
+ "plant_name": settings.PLANT_NAME,
41
+ "mission_date": datetime.utcnow().date(),
42
+ "isar_id": settings.ISAR_ID,
43
+ "robot_name": settings.ROBOT_NAME,
45
44
  },
46
45
  "data": [
47
46
  {
48
- "folder": f"/{metadata.mission_id}",
47
+ "folder": f"/{get_foldername(mission=mission)}",
49
48
  "files": [
50
49
  {
51
50
  "file_name": filename,
@@ -67,8 +66,13 @@ def construct_metadata_file(
67
66
 
68
67
 
69
68
  def get_filename(
70
- mission_id: str,
71
- inspection_type: str,
72
- inspection_id: str,
69
+ inspection: Inspection,
73
70
  ) -> str:
74
- return f"{mission_id}_{inspection_type}_{inspection_id}"
71
+ inspection_type: str = type(inspection).__name__
72
+ tag: str = inspection.metadata.tag_id if inspection.metadata.tag_id else "no-tag"
73
+ epoch_time: int = int(time.time())
74
+ return f"{tag}__{inspection_type}__{epoch_time}"
75
+
76
+
77
+ def get_foldername(mission: Mission) -> str:
78
+ return f"{datetime.utcnow().date()}__{settings.PLANT_SHORT_NAME}__{mission.name}__{mission.id}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.14.4
3
+ Version: 1.15.0
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Home-page: https://github.com/equinor/isar
6
6
  Author: Equinor ASA
@@ -75,7 +75,7 @@ Steps:
75
75
  For local development, please fork the repository. Then, clone and install in the repository root folder:
76
76
 
77
77
  ```
78
- git clone https://github.com/equinor/isar
78
+ git clone https://github.com/<path_to_parent>/isar
79
79
  cd isar
80
80
  pip install -e .[dev]
81
81
  ```
@@ -4,9 +4,9 @@ isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  isar/apis/api.py,sha256=-Xw4zMFItlnlF4olu3UZrzzMhKc2hfXYwkoUdZcj5Mg,12081
5
5
  isar/apis/models/__init__.py,sha256=NI1BYyN__Ogr00Qqe0XJ-9gEVPva2brXo2RJsbrS4tM,52
6
6
  isar/apis/models/models.py,sha256=MYCTlPZHHBg2yyaSklhxkBwANC3GAdRCMK8TPev16II,1750
7
- isar/apis/models/start_mission_definition.py,sha256=3L5CmZrnLlU646zIiIweeXywQ49m9M3pzLMXe98Q2UU,4935
7
+ isar/apis/models/start_mission_definition.py,sha256=b1-ZdMgdoC-1YGqCA8M-9958yeBAHiEuW7gcg1Ie4OU,5352
8
8
  isar/apis/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- isar/apis/schedule/scheduling_controller.py,sha256=eI_Cz2MeYBIliLq8Ht4uENJaRDZtv25Gotjcb_A_tEk,10542
9
+ isar/apis/schedule/scheduling_controller.py,sha256=lCA8Iwr0yq1Lcvq6eEUkqYvTU1HVMo1LZ0RmmFFBcHE,10099
10
10
  isar/apis/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  isar/apis/security/authentication.py,sha256=TI8U9Y_L6ihHLMeM50ZONd5EPfuHdw_XMU_Q987W4AY,1975
12
12
  isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -27,8 +27,8 @@ isar/config/maps/klab_compressor.json,sha256=1Vrk5u_l4WXjrTtG4YfXlrCPbOoRs4TtYHO
27
27
  isar/config/maps/klab_turtlebot.json,sha256=HcB79XFEdY0Wm96EssIFO4TMyAWzc2KENoqN7TbTT0k,823
28
28
  isar/config/maps/turtleworld.json,sha256=EKLMpSK9Gu2lAN-E9l41XOaO3f9Su5n_I97mA6z7sWY,764
29
29
  isar/config/predefined_mission_definition/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- isar/config/predefined_mission_definition/default_mission.json,sha256=i-sjgVRDcXKh2Lx-tauxBI3xLxLAuut_73wmLuYNgNc,3130
31
- isar/config/predefined_mission_definition/default_turtlebot.json,sha256=tiXgBbE1XOT6G6UR07WChEVvj-Y9oB1qn8VBc8q3ang,4410
30
+ isar/config/predefined_mission_definition/default_mission.json,sha256=nEk1ql17RAs2I5Ws2wA-0GJ6oqJco-Q0Q0vhf4k6ajc,2926
31
+ isar/config/predefined_mission_definition/default_turtlebot.json,sha256=Ka379MLu8qiGIa6Fu-8p8A4OgHVccLkKYSX0RthUOeI,4060
32
32
  isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  isar/config/predefined_missions/default.json,sha256=3J1KtQIFKxJsVoKlg0nKsj8asev-2dSz6IOrd4A57jY,2759
34
34
  isar/config/predefined_missions/default_turtlebot.json,sha256=gStYz_hCgQDBEeUW7W4bq_0R3OO55jRnwZt0CNYvHSM,3352
@@ -41,14 +41,13 @@ isar/mission_planner/sequential_task_selector.py,sha256=4OJ1Rvg6MaDQQxNcgAUtp2gv
41
41
  isar/mission_planner/task_selector_interface.py,sha256=aXL2RXb_XmTNW-WXt6E7wFfJf_BjbownDa3zSqgQ4Ww,703
42
42
  isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  isar/models/communication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- isar/models/communication/message.py,sha256=OR-p1Dg-LHVjif85m2IasOsbmNuHT3Bnx1QHrDhA2_w,353
44
+ isar/models/communication/message.py,sha256=yN4SXYM-W_6u3Cf9yuAE3jy4e6mMrL3yUr-iVV4r55E,241
45
45
  isar/models/communication/queues/__init__.py,sha256=JqwWbdBQnBeIEhSTjBOkl-O3bYBVBSmjPcWUdscsobw,146
46
46
  isar/models/communication/queues/queue_io.py,sha256=AnHWUCkZ0tunkxKKeBarq-OUkRM97IaMfA-a1pmf1cQ,394
47
47
  isar/models/communication/queues/queue_timeout_error.py,sha256=rF8TlNF7RHS_ueTZ5mp7aFkhLY1j0dcwMwH-Ba6lVpE,45
48
48
  isar/models/communication/queues/queues.py,sha256=FzoqlT4AQ4Q5Jufh6yRPV2uq5iUZd1odrpjBl77yU5o,803
49
49
  isar/models/communication/queues/status_queue.py,sha256=K_i01uzCu1eciDt9QlDXLBINJnuRLqm6fzrM-PY6qD0,467
50
50
  isar/models/mission_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- isar/models/mission_metadata/mission_metadata.py,sha256=pQ5-THG7Ut-C4IW5213ZZbU5VBnJfZZFTnD6VKNtYVA,885
52
51
  isar/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
52
  isar/services/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
53
  isar/services/auth/azure_credentials.py,sha256=9PlwGe5FrPRbW2dp0go7LMp8_l_FRvL8xOXotXwzRDo,364
@@ -58,32 +57,32 @@ isar/services/service_connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
58
57
  isar/services/service_connections/request_handler.py,sha256=0LxC0lu_HXeEf_xmJWjfEsh14oAUI97cpG1IWtBlcs4,4278
59
58
  isar/services/service_connections/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
59
  isar/services/service_connections/mqtt/mqtt_client.py,sha256=g5RJ85_dsZlHgj6saG2w0sTSetvGFWI4PW4zsb0j9DE,3516
61
- isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=rw1HKVnzFHPl0Oqdjkfwko9GNNbXltIl_CHzhjLylNQ,1270
60
+ isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=_7lXSyOaTbde584M67bG7N9sQJH51yhaSuhsjuCM02U,1325
62
61
  isar/services/service_connections/mqtt/robot_status_publisher.py,sha256=5jNQnsrFVe9Jnh9Q6F88nsFK63lEuv_ESBA-tZLnBy8,3689
63
62
  isar/services/service_connections/stid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
63
  isar/services/service_connections/stid/stid_service.py,sha256=v1D-sHa2pvYl6A4KcY9NPd2w7vf9Y5AdntFE_p8Hk44,1616
65
64
  isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
65
  isar/services/utilities/queue_utilities.py,sha256=Pw3hehSwkXJNeDv-bDVDfs58VOwtt3i5hpiJ2ZpphuQ,1225
67
- isar/services/utilities/scheduling_utilities.py,sha256=0fqxtCZ_dUaMsOQ0U_vANmjKzmOGZHRmTBbE3C26XKY,8616
66
+ isar/services/utilities/scheduling_utilities.py,sha256=LFimEmacML3J9q-FNLfKPhcAr-R3f2rkYkbsoro0Gyo,8434
68
67
  isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
69
68
  isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- isar/state_machine/state_machine.py,sha256=ObUZvXiUldEyGA8ajtWQsOkAcYkk3qxAHLJbbPizx1M,22061
69
+ isar/state_machine/state_machine.py,sha256=_ktCrQFcH_s_6utBzERBZw7YvrG-xmXDKgrboL7VIWE,21809
71
70
  isar/state_machine/states_enum.py,sha256=ks1A8gO7DOpLbSe6Vzq4-BfTCU78IsQZyoEJwQ9Wg4M,254
72
71
  isar/state_machine/states/__init__.py,sha256=gUikQDu-O-lmunwzwcN9gN6VaEmlCFlqqgdNfFAfXBc,189
73
- isar/state_machine/states/idle.py,sha256=_Ilj6ZlrnSe95WJMaSKs2wAIMIiCHv8cDOPFCGeI5Hs,1298
72
+ isar/state_machine/states/idle.py,sha256=_0MtK8Wb305agTg4J9t2x-eUq3cnXg3KSP6J6HOM3ps,1229
74
73
  isar/state_machine/states/initialize.py,sha256=KfLc-LeyhwaW-d4-xyarIafBh9PBkBtz7j1aPqS0x8A,2019
75
74
  isar/state_machine/states/initiate.py,sha256=bF7t40TuuJIJmCMsOwZq_UIErS7lAsi-MbPShucnT90,4863
76
- isar/state_machine/states/monitor.py,sha256=vwVNBct5HSZVRefTZVqHz-eOzMYuUIJprpQK2XFIBrY,7102
75
+ isar/state_machine/states/monitor.py,sha256=XaJMM1Z9m04OqLbHftYDJNXjIYj4AAziH4L1nABow8s,6962
77
76
  isar/state_machine/states/off.py,sha256=jjqN_oJMpBtWuY7hP-c9f0w3p2CYCfe-NpmYHHPnmyI,544
78
77
  isar/state_machine/states/paused.py,sha256=xVZM9WMt90FTiP5forSlA3eJ5Vt9LzZYCFDQDPIocKA,1004
79
78
  isar/state_machine/states/stop.py,sha256=N59g6MXsVCQXZNLcvvmHU5fuU5jRk1x9dFxMeXkJhbY,2721
80
79
  isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- isar/storage/blob_storage.py,sha256=qXzSEReqyQsoEDkXtpqO-5k5Ue8luzezwmp4M6-gr8w,2977
82
- isar/storage/local_storage.py,sha256=fLWSyzFsJ6JjTvKQEa7MQCvnz0NuBVn_jNq4hsi79EQ,1876
83
- isar/storage/slimm_storage.py,sha256=6VH2nSnyXRtYFHAGmZSp9n-hBb5jCv_5U4cpctp4aPE,8531
84
- isar/storage/storage_interface.py,sha256=21052cHW9PHTDz51vQJInC0R9U6xHOMjApAqQ6QZGQc,840
85
- isar/storage/uploader.py,sha256=1jcaNSEHSlqgLNxQWHqGRb9xPCJkoXTlp9IHixKOk4s,6011
86
- isar/storage/utilities.py,sha256=jI1nQmeLJ2LEkD0IIoe9zA1WonqeVxd1rS_V0JKTrvQ,2610
80
+ isar/storage/blob_storage.py,sha256=8i23s_4d3_REKYxH1DzXF_Lc04pofOlrtDYML_t7BDc,2922
81
+ isar/storage/local_storage.py,sha256=fLzVuwvdEk9l8z7od1qX2p5MeWzcsx-vN4yWvelZeFM,1836
82
+ isar/storage/slimm_storage.py,sha256=oCDpdlvPJBuyzzwSSoP9v2Tdn6icecGxfDJdflkhgiI,8588
83
+ isar/storage/storage_interface.py,sha256=v7QiYGz79dqw9jbgNoLYD1QOvXFoMrqfVT1TJX7rCsw,790
84
+ isar/storage/uploader.py,sha256=ekvPmwZoYlpioaHPKnJnoV38UKTwzT5jy5QlHvBk2IA,5934
85
+ isar/storage/utilities.py,sha256=5sTdQveRvx2OTKdzwh63IeJmBrAI3R9_oTY8At9VX5k,2873
87
86
  robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
87
  robot_interface/robot_interface.py,sha256=Q8X8N2nXj5-Lmv3OQPXuJZgCQkCub94NXO6bBQrCASE,6054
89
88
  robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
@@ -93,22 +92,22 @@ robot_interface/models/exceptions/robot_exceptions.py,sha256=URtCe1ighowz-0QvTBZ
93
92
  robot_interface/models/initialize/__init__.py,sha256=rz5neEDr59GDbzzI_FF0DId-C-I-50l113P-h-C_QBY,48
94
93
  robot_interface/models/initialize/initialize_params.py,sha256=UcsBm8aFgxIojgYMadaa6yOhvYXxTkCuCbjGuZexfuI,171
95
94
  robot_interface/models/inspection/__init__.py,sha256=14wfuj4XZazrigKD7fL98khFKz-eckIpEgPcYRj40Kg,227
96
- robot_interface/models/inspection/inspection.py,sha256=RK-FATj3s3w_fbfp7iDkMSe221SXetkZ8A9qKUULIsk,2186
95
+ robot_interface/models/inspection/inspection.py,sha256=J87AyeYY36sCEY2tx0U-U6eHprkvZSNAqQRJsmK0vGY,2177
97
96
  robot_interface/models/mission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
- robot_interface/models/mission/mission.py,sha256=sPuKvTOSt6oZMEpsAQw7yM92jXCDg823rFD7kLUZjjo,595
97
+ robot_interface/models/mission/mission.py,sha256=GyNFTZ0S6JKe9YGIlxfKzxMeOqRokAbHQI5xFDzlzAk,614
99
98
  robot_interface/models/mission/status.py,sha256=3CDuXj9a3qNyQqPTFX6XB775O6K3kqc-lbyktJsiPhs,893
100
- robot_interface/models/mission/step.py,sha256=8OspjOtbhHXe3Qv1_vNEfSneSt6PXvqJK_u4K1T259c,5129
99
+ robot_interface/models/mission/step.py,sha256=w6vZdQrr0xeAwJRuH8I0Re-As22BRy2WRlqaVTExcFw,5120
101
100
  robot_interface/models/mission/task.py,sha256=qrVg-f_90_JVaapzQH1j00bFaLToXfHtBoey_HtZHjk,3218
102
101
  robot_interface/models/robots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
102
  robot_interface/models/robots/robot_model.py,sha256=pZQsqhn9hh6XE3EjMZhWMzYqg5oJ4CJ4CXeOASKvEf8,452
104
103
  robot_interface/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- robot_interface/telemetry/mqtt_client.py,sha256=oPl-5xHWIETYFkF1YQy9gXksa3n2XMGM09yx1vsaaqQ,2311
106
- robot_interface/telemetry/payloads.py,sha256=DNasajeZz-_pJus-Z_hOU5n3imFuyZ77IBfV1pVE1xg,1078
104
+ robot_interface/telemetry/mqtt_client.py,sha256=8JmKdyHHZbB2t3HVv71DSIlDH3R0ZbpVH5jGlJS7N4U,2253
105
+ robot_interface/telemetry/payloads.py,sha256=BiLS50TDgRXZ1DSTl8aaHG1mPa8R4KnWjai82jKdKmA,1099
107
106
  robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
107
  robot_interface/utilities/json_service.py,sha256=nU2Q_3P9Fq9hs6F_wtUjWtHfl_g1Siy-yDhXXSKwHwg,1018
109
108
  robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
110
- isar-1.14.4.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
111
- isar-1.14.4.dist-info/METADATA,sha256=HOFb4vMacSU45elll4NWGVR4ojROCOKj4WSMi3lejes,14411
112
- isar-1.14.4.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
113
- isar-1.14.4.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
114
- isar-1.14.4.dist-info/RECORD,,
109
+ isar-1.15.0.dist-info/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
110
+ isar-1.15.0.dist-info/METADATA,sha256=wCLjLbM8uH0RB5vnOBERzl8HUGncEhcyGWEH4RA9-5w,14420
111
+ isar-1.15.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
112
+ isar-1.15.0.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
113
+ isar-1.15.0.dist-info/RECORD,,
@@ -13,7 +13,7 @@ class InspectionMetadata(ABC):
13
13
  start_time: datetime
14
14
  pose: Pose
15
15
  file_type: str
16
- analysis: Optional[List] = field(default_factory=list, init=False)
16
+ analysis: Optional[str] = field(default=None, init=False)
17
17
  tag_id: Optional[str] = field(default=None, init=False)
18
18
  additional: Optional[dict] = field(default_factory=dict, init=False)
19
19
 
@@ -10,6 +10,7 @@ from robot_interface.utilities.uuid_string_factory import uuid4_string
10
10
  class Mission:
11
11
  tasks: List[Task]
12
12
  id: str = field(default_factory=uuid4_string, init=True)
13
+ name: str = ""
13
14
  status: MissionStatus = MissionStatus.NotStarted
14
15
 
15
16
  def _set_unique_id(self) -> None:
@@ -64,7 +64,7 @@ class InspectionStep(Step):
64
64
  inspections: List[Inspection] = field(default_factory=list, init=False)
65
65
  tag_id: Optional[str] = field(default=None, init=False)
66
66
  type = "inspection_type"
67
- analysis: Optional[List] = field(default_factory=list, init=False)
67
+ analysis: Optional[str] = field(default=None, init=False)
68
68
  metadata: Optional[dict] = field(default_factory=dict, init=False)
69
69
 
70
70
  @staticmethod
@@ -3,9 +3,7 @@ from abc import ABCMeta, abstractmethod
3
3
  from queue import Queue
4
4
  from typing import Callable, Tuple
5
5
 
6
- from robot_interface.models.exceptions.robot_exceptions import (
7
- RobotInvalidTelemetryException,
8
- )
6
+ from robot_interface.models.exceptions import RobotException
9
7
 
10
8
 
11
9
  class MqttClientInterface(metaclass=ABCMeta):
@@ -66,7 +64,7 @@ class MqttTelemetryPublisher(MqttClientInterface):
66
64
  payload: str = self.telemetry_method(
67
65
  isar_id=isar_id, robot_name=robot_name
68
66
  )
69
- except RobotInvalidTelemetryException:
67
+ except RobotException:
70
68
  continue
71
69
 
72
70
  self.publish(
@@ -55,6 +55,7 @@ class RobotInfoPayload:
55
55
  robot_name: str
56
56
  robot_model: str
57
57
  robot_serial_number: str
58
+ robot_asset: str
58
59
  video_streams: List[VideoStream]
59
60
  host: str
60
61
  port: int
@@ -1,26 +0,0 @@
1
- from dataclasses import dataclass
2
- from datetime import date, datetime
3
- from typing import Optional
4
-
5
- from isar.config.settings import settings
6
-
7
- additional_meta: dict = {}
8
-
9
-
10
- @dataclass
11
- class MissionMetadata:
12
- mission_id: str
13
- coordinate_reference_system: str = settings.COORDINATE_REFERENCE_SYSTEM
14
- vertical_reference_system: str = settings.VERTICAL_REFERENCE_SYSTEM
15
- data_classification: str = settings.DATA_CLASSIFICATION
16
- source_url: Optional[str] = None
17
- plant_code: str = settings.PLANT_CODE
18
- plant_name: str = settings.PLANT_NAME
19
- plant_short_name: str = settings.PLANT_SHORT_NAME
20
- media_orientation_reference_system: str = (
21
- settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM
22
- )
23
- isar_id: str = settings.ISAR_ID
24
- robot_name: str = settings.ROBOT_NAME
25
- robot_model: str = settings.ROBOT_TYPE
26
- mission_date: date = datetime.utcnow().date()
File without changes
File without changes