isar 1.20.2__py3-none-any.whl → 1.34.13__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.
Files changed (134) hide show
  1. isar/apis/api.py +135 -86
  2. isar/apis/models/__init__.py +0 -1
  3. isar/apis/models/models.py +21 -11
  4. isar/apis/models/start_mission_definition.py +115 -170
  5. isar/apis/robot_control/robot_controller.py +41 -0
  6. isar/apis/schedule/scheduling_controller.py +123 -187
  7. isar/apis/security/authentication.py +5 -5
  8. isar/config/certs/ca-cert.pem +33 -31
  9. isar/config/keyvault/keyvault_service.py +4 -2
  10. isar/config/log.py +45 -40
  11. isar/config/logging.conf +16 -31
  12. isar/config/open_telemetry.py +102 -0
  13. isar/config/settings.py +74 -117
  14. isar/eventhandlers/eventhandler.py +123 -0
  15. isar/models/events.py +184 -0
  16. isar/models/status.py +22 -0
  17. isar/modules.py +117 -200
  18. isar/robot/robot.py +383 -0
  19. isar/robot/robot_battery.py +60 -0
  20. isar/robot/robot_monitor_mission.py +357 -0
  21. isar/robot/robot_pause_mission.py +74 -0
  22. isar/robot/robot_resume_mission.py +67 -0
  23. isar/robot/robot_start_mission.py +66 -0
  24. isar/robot/robot_status.py +61 -0
  25. isar/robot/robot_stop_mission.py +68 -0
  26. isar/robot/robot_upload_inspection.py +75 -0
  27. isar/script.py +58 -41
  28. isar/services/service_connections/mqtt/mqtt_client.py +47 -11
  29. isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +5 -2
  30. isar/services/service_connections/mqtt/robot_info_publisher.py +3 -3
  31. isar/services/service_connections/persistent_memory.py +69 -0
  32. isar/services/utilities/mqtt_utilities.py +93 -0
  33. isar/services/utilities/robot_utilities.py +20 -0
  34. isar/services/utilities/scheduling_utilities.py +386 -100
  35. isar/state_machine/state_machine.py +242 -539
  36. isar/state_machine/states/__init__.py +0 -8
  37. isar/state_machine/states/await_next_mission.py +114 -0
  38. isar/state_machine/states/blocked_protective_stop.py +60 -0
  39. isar/state_machine/states/going_to_lockdown.py +95 -0
  40. isar/state_machine/states/going_to_recharging.py +92 -0
  41. isar/state_machine/states/home.py +115 -0
  42. isar/state_machine/states/intervention_needed.py +77 -0
  43. isar/state_machine/states/lockdown.py +38 -0
  44. isar/state_machine/states/maintenance.py +43 -0
  45. isar/state_machine/states/monitor.py +137 -247
  46. isar/state_machine/states/offline.py +51 -53
  47. isar/state_machine/states/paused.py +92 -23
  48. isar/state_machine/states/pausing.py +48 -0
  49. isar/state_machine/states/pausing_return_home.py +48 -0
  50. isar/state_machine/states/recharging.py +80 -0
  51. isar/state_machine/states/resuming.py +57 -0
  52. isar/state_machine/states/resuming_return_home.py +64 -0
  53. isar/state_machine/states/return_home_paused.py +109 -0
  54. isar/state_machine/states/returning_home.py +217 -0
  55. isar/state_machine/states/stopping.py +69 -0
  56. isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
  57. isar/state_machine/states/stopping_go_to_lockdown.py +60 -0
  58. isar/state_machine/states/stopping_go_to_recharge.py +51 -0
  59. isar/state_machine/states/stopping_paused_mission.py +36 -0
  60. isar/state_machine/states/stopping_paused_return_home.py +59 -0
  61. isar/state_machine/states/stopping_return_home.py +59 -0
  62. isar/state_machine/states/unknown_status.py +74 -0
  63. isar/state_machine/states_enum.py +23 -5
  64. isar/state_machine/transitions/mission.py +225 -0
  65. isar/state_machine/transitions/return_home.py +108 -0
  66. isar/state_machine/transitions/robot_status.py +87 -0
  67. isar/state_machine/utils/common_event_handlers.py +138 -0
  68. isar/storage/blob_storage.py +70 -52
  69. isar/storage/local_storage.py +25 -12
  70. isar/storage/storage_interface.py +28 -7
  71. isar/storage/uploader.py +174 -55
  72. isar/storage/utilities.py +32 -29
  73. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/METADATA +119 -123
  74. isar-1.34.13.dist-info/RECORD +120 -0
  75. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/WHEEL +1 -1
  76. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/entry_points.txt +1 -0
  77. robot_interface/models/exceptions/robot_exceptions.py +91 -41
  78. robot_interface/models/inspection/__init__.py +0 -13
  79. robot_interface/models/inspection/inspection.py +42 -33
  80. robot_interface/models/mission/mission.py +14 -15
  81. robot_interface/models/mission/status.py +20 -26
  82. robot_interface/models/mission/task.py +154 -121
  83. robot_interface/models/robots/battery_state.py +6 -0
  84. robot_interface/models/robots/media.py +13 -0
  85. robot_interface/models/robots/robot_model.py +7 -7
  86. robot_interface/robot_interface.py +119 -84
  87. robot_interface/telemetry/mqtt_client.py +74 -12
  88. robot_interface/telemetry/payloads.py +91 -13
  89. robot_interface/utilities/json_service.py +7 -1
  90. isar/config/configuration_error.py +0 -2
  91. isar/config/keyvault/keyvault_error.py +0 -2
  92. isar/config/predefined_mission_definition/__init__.py +0 -0
  93. isar/config/predefined_mission_definition/default_exr.json +0 -51
  94. isar/config/predefined_mission_definition/default_mission.json +0 -91
  95. isar/config/predefined_mission_definition/default_turtlebot.json +0 -124
  96. isar/config/predefined_missions/__init__.py +0 -0
  97. isar/config/predefined_missions/default.json +0 -92
  98. isar/config/predefined_missions/default_turtlebot.json +0 -110
  99. isar/config/predefined_poses/__init__.py +0 -0
  100. isar/config/predefined_poses/predefined_poses.py +0 -616
  101. isar/config/settings.env +0 -25
  102. isar/mission_planner/__init__.py +0 -0
  103. isar/mission_planner/local_planner.py +0 -82
  104. isar/mission_planner/mission_planner_interface.py +0 -26
  105. isar/mission_planner/sequential_task_selector.py +0 -23
  106. isar/mission_planner/task_selector_interface.py +0 -31
  107. isar/models/communication/__init__.py +0 -0
  108. isar/models/communication/message.py +0 -12
  109. isar/models/communication/queues/__init__.py +0 -4
  110. isar/models/communication/queues/queue_io.py +0 -12
  111. isar/models/communication/queues/queue_timeout_error.py +0 -2
  112. isar/models/communication/queues/queues.py +0 -19
  113. isar/models/communication/queues/status_queue.py +0 -20
  114. isar/models/mission_metadata/__init__.py +0 -0
  115. isar/services/auth/__init__.py +0 -0
  116. isar/services/auth/azure_credentials.py +0 -14
  117. isar/services/readers/__init__.py +0 -0
  118. isar/services/readers/base_reader.py +0 -37
  119. isar/services/service_connections/request_handler.py +0 -153
  120. isar/services/service_connections/stid/__init__.py +0 -0
  121. isar/services/utilities/queue_utilities.py +0 -39
  122. isar/services/utilities/threaded_request.py +0 -68
  123. isar/state_machine/states/idle.py +0 -85
  124. isar/state_machine/states/initialize.py +0 -71
  125. isar/state_machine/states/initiate.py +0 -142
  126. isar/state_machine/states/off.py +0 -18
  127. isar/state_machine/states/stop.py +0 -95
  128. isar/storage/slimm_storage.py +0 -191
  129. isar-1.20.2.dist-info/RECORD +0 -116
  130. robot_interface/models/initialize/__init__.py +0 -1
  131. robot_interface/models/initialize/initialize_params.py +0 -9
  132. robot_interface/models/mission/step.py +0 -234
  133. {isar-1.20.2.dist-info → isar-1.34.13.dist-info/licenses}/LICENSE +0 -0
  134. {isar-1.20.2.dist-info → isar-1.34.13.dist-info}/top_level.txt +0 -0
@@ -1,19 +1,38 @@
1
1
  import json
2
2
  import time
3
3
  from abc import ABCMeta, abstractmethod
4
- from datetime import UTC, datetime
4
+ from datetime import datetime, timezone
5
5
  from queue import Queue
6
6
  from typing import Callable, Tuple
7
7
 
8
- from robot_interface.models.exceptions.robot_exceptions import RobotTelemetryException
8
+ from paho.mqtt.packettypes import PacketTypes
9
+ from paho.mqtt.properties import Properties
10
+
11
+ from isar.config.settings import settings
12
+ from robot_interface.models.exceptions.robot_exceptions import (
13
+ RobotTelemetryException,
14
+ RobotTelemetryNoUpdateException,
15
+ RobotTelemetryPoseException,
16
+ )
9
17
  from robot_interface.telemetry.payloads import CloudHealthPayload
10
18
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
11
19
 
12
20
 
21
+ def props_expiry(seconds: int) -> Properties:
22
+ p = Properties(PacketTypes.PUBLISH)
23
+ p.MessageExpiryInterval = seconds
24
+ return p
25
+
26
+
13
27
  class MqttClientInterface(metaclass=ABCMeta):
14
28
  @abstractmethod
15
29
  def publish(
16
- self, topic: str, payload: str, qos: int = 0, retain: bool = False
30
+ self,
31
+ topic: str,
32
+ payload: str,
33
+ qos: int = 0,
34
+ retain: bool = False,
35
+ properties: Properties = None,
17
36
  ) -> None:
18
37
  """
19
38
  Parameters
@@ -29,7 +48,6 @@ class MqttClientInterface(metaclass=ABCMeta):
29
48
 
30
49
  Returns
31
50
  -------
32
-
33
51
  """
34
52
  pass
35
53
 
@@ -39,9 +57,20 @@ class MqttPublisher(MqttClientInterface):
39
57
  self.mqtt_queue: Queue = mqtt_queue
40
58
 
41
59
  def publish(
42
- self, topic: str, payload: str, qos: int = 0, retain: bool = False
60
+ self,
61
+ topic: str,
62
+ payload: str,
63
+ qos: int = 0,
64
+ retain: bool = False,
65
+ properties: Properties = None,
43
66
  ) -> None:
44
- queue_message: Tuple[str, str, int, bool] = (topic, payload, qos, retain)
67
+ queue_message: Tuple[str, str, int, bool, Properties] = (
68
+ topic,
69
+ payload,
70
+ qos,
71
+ retain,
72
+ properties,
73
+ )
45
74
  self.mqtt_queue.put(queue_message)
46
75
 
47
76
 
@@ -54,6 +83,7 @@ class MqttTelemetryPublisher(MqttClientInterface):
54
83
  interval: float,
55
84
  qos: int = 0,
56
85
  retain: bool = False,
86
+ properties: Properties = None,
57
87
  ) -> None:
58
88
  self.mqtt_queue: Queue = mqtt_queue
59
89
  self.telemetry_method: Callable = telemetry_method
@@ -61,9 +91,13 @@ class MqttTelemetryPublisher(MqttClientInterface):
61
91
  self.interval: float = interval
62
92
  self.qos: int = qos
63
93
  self.retain: bool = retain
94
+ self.properties: Properties = properties
64
95
 
65
96
  def run(self, isar_id: str, robot_name: str) -> None:
66
- self.cloud_healt_topic: str = f"isar/{isar_id}/cloud_health"
97
+ self.cloud_health_topic: str = f"isar/{isar_id}/cloud_health"
98
+ self.battery_topic: str = f"isar/{isar_id}/battery"
99
+ self.pose_topic: str = f"isar/{isar_id}/pose"
100
+ self.pressure_topic: str = f"isar/{isar_id}/pressure"
67
101
  topic: str
68
102
  payload: str
69
103
 
@@ -71,19 +105,47 @@ class MqttTelemetryPublisher(MqttClientInterface):
71
105
  try:
72
106
  payload = self.telemetry_method(isar_id=isar_id, robot_name=robot_name)
73
107
  topic = self.topic
108
+ except (RobotTelemetryPoseException, RobotTelemetryNoUpdateException):
109
+ time.sleep(self.interval)
110
+ continue
74
111
  except RobotTelemetryException:
75
112
  payload = json.dumps(
76
- CloudHealthPayload(isar_id, robot_name, datetime.now(UTC)),
113
+ CloudHealthPayload(isar_id, robot_name, datetime.now(timezone.utc)),
77
114
  cls=EnhancedJSONEncoder,
78
115
  )
79
- topic = self.cloud_healt_topic
116
+ topic = self.cloud_health_topic
117
+
118
+ publish_properties = self.properties
80
119
 
81
- self.publish(topic=topic, payload=payload, qos=self.qos, retain=self.retain)
120
+ if topic in (
121
+ self.battery_topic,
122
+ self.pose_topic,
123
+ self.pressure_topic,
124
+ ):
125
+ publish_properties = props_expiry(settings.MQTT_TELEMETRY_EXPIRY)
82
126
 
127
+ self.publish(
128
+ topic=topic,
129
+ payload=payload,
130
+ qos=self.qos,
131
+ retain=self.retain,
132
+ properties=publish_properties,
133
+ )
83
134
  time.sleep(self.interval)
84
135
 
85
136
  def publish(
86
- self, topic: str, payload: str, qos: int = 0, retain: bool = False
137
+ self,
138
+ topic: str,
139
+ payload: str,
140
+ qos: int = 0,
141
+ retain: bool = False,
142
+ properties: Properties = None,
87
143
  ) -> None:
88
- queue_message: Tuple[str, str, int, bool] = (topic, payload, qos, retain)
144
+ queue_message: Tuple[str, str, int, bool, Properties] = (
145
+ topic,
146
+ payload,
147
+ qos,
148
+ retain,
149
+ properties,
150
+ )
89
151
  self.mqtt_queue.put(queue_message)
@@ -1,11 +1,15 @@
1
1
  from dataclasses import dataclass
2
2
  from datetime import datetime
3
- from typing import List
3
+ from typing import List, Optional
4
4
 
5
5
  from alitra import Pose
6
- from transitions import State
7
6
 
8
- from robot_interface.models.mission.status import RobotStatus
7
+ from isar.models.status import IsarStatus
8
+ from isar.storage.storage_interface import BlobStoragePath
9
+ from robot_interface.models.exceptions.robot_exceptions import ErrorReason
10
+ from robot_interface.models.mission.status import MissionStatus, TaskStatus
11
+ from robot_interface.models.mission.task import TaskTypes
12
+ from robot_interface.models.robots.battery_state import BatteryState
9
13
 
10
14
 
11
15
  @dataclass
@@ -30,6 +34,7 @@ class TelemetryPosePayload(TelemetryPayload):
30
34
  @dataclass
31
35
  class TelemetryBatteryPayload(TelemetryPayload):
32
36
  battery_level: float
37
+ battery_state: Optional[BatteryState] = None
33
38
 
34
39
 
35
40
  @dataclass
@@ -43,22 +48,16 @@ class TelemetryPressurePayload(TelemetryPayload):
43
48
 
44
49
 
45
50
  @dataclass
46
- class VideoStream:
51
+ class DocumentInfo:
47
52
  name: str
48
53
  url: str
49
- type: str
50
54
 
51
55
 
52
56
  @dataclass
53
- class RobotStatusPayload:
57
+ class IsarStatusPayload:
54
58
  isar_id: str
55
59
  robot_name: str
56
- robot_status: RobotStatus
57
- previous_robot_status: RobotStatus
58
- current_isar_state: State
59
- current_mission_id: str
60
- current_task_id: str
61
- current_step_id: str
60
+ status: IsarStatus
62
61
  timestamp: datetime
63
62
 
64
63
 
@@ -69,7 +68,7 @@ class RobotInfoPayload:
69
68
  robot_model: str
70
69
  robot_serial_number: str
71
70
  robot_asset: str
72
- video_streams: List[VideoStream]
71
+ documentation: List[DocumentInfo]
73
72
  host: str
74
73
  port: int
75
74
  capabilities: List[str]
@@ -81,3 +80,82 @@ class RobotHeartbeatPayload:
81
80
  isar_id: str
82
81
  robot_name: str
83
82
  timestamp: datetime
83
+
84
+
85
+ @dataclass
86
+ class MissionPayload:
87
+ isar_id: str
88
+ robot_name: str
89
+ mission_id: Optional[str]
90
+ status: Optional[MissionStatus]
91
+ error_reason: Optional[ErrorReason]
92
+ error_description: Optional[str]
93
+ timestamp: datetime
94
+
95
+
96
+ @dataclass
97
+ class MissionAbortedPayload:
98
+ isar_id: str
99
+ robot_name: str
100
+ mission_id: Optional[str]
101
+ can_be_continued: bool
102
+ timestamp: datetime
103
+ reason: Optional[str]
104
+
105
+
106
+ @dataclass
107
+ class TaskPayload:
108
+ isar_id: str
109
+ robot_name: str
110
+ mission_id: Optional[str]
111
+ task_id: Optional[str]
112
+ status: Optional[TaskStatus]
113
+ task_type: Optional[TaskTypes]
114
+ error_reason: Optional[ErrorReason]
115
+ error_description: Optional[str]
116
+ timestamp: datetime
117
+
118
+
119
+ @dataclass
120
+ class InspectionResultPayload:
121
+ isar_id: str
122
+ robot_name: str
123
+ inspection_id: str
124
+ blob_storage_data_path: BlobStoragePath
125
+ blob_storage_metadata_path: BlobStoragePath
126
+ installation_code: str
127
+ tag_id: Optional[str]
128
+ inspection_type: Optional[str]
129
+ inspection_description: Optional[str]
130
+ timestamp: datetime
131
+
132
+
133
+ @dataclass
134
+ class InspectionValuePayload:
135
+ isar_id: str
136
+ robot_name: str
137
+ inspection_id: str
138
+ installation_code: str
139
+ tag_id: Optional[str]
140
+ inspection_type: Optional[str]
141
+ inspection_description: Optional[str]
142
+ value: float
143
+ unit: str
144
+ x: float
145
+ y: float
146
+ z: float
147
+ timestamp: datetime
148
+
149
+
150
+ @dataclass
151
+ class StartUpMessagePayload:
152
+ isar_id: str
153
+ timestamp: datetime
154
+
155
+
156
+ @dataclass
157
+ class InterventionNeededPayload:
158
+ isar_id: str
159
+ robot_name: str
160
+ reason: str
161
+ timestamp: datetime
@@ -7,6 +7,7 @@ from uuid import UUID
7
7
 
8
8
  import numpy as np
9
9
  from alitra import Orientation
10
+ from pydantic import BaseModel
10
11
 
11
12
 
12
13
  class EnhancedJSONEncoder(json.JSONEncoder):
@@ -15,8 +16,13 @@ class EnhancedJSONEncoder(json.JSONEncoder):
15
16
  """
16
17
 
17
18
  def default(self, o):
19
+ if isinstance(o, BaseModel):
20
+ dump = getattr(o, "model_dump", None)
21
+ if callable(dump):
22
+ return dump()
23
+ return o.__dict__
18
24
  if is_dataclass(o):
19
- return asdict(o)
25
+ return asdict(o) # type: ignore
20
26
  if isinstance(o, UUID):
21
27
  return str(o)
22
28
  if isinstance(o, Orientation):
@@ -1,2 +0,0 @@
1
- class ConfigurationError(Exception):
2
- pass
@@ -1,2 +0,0 @@
1
- class KeyvaultError(Exception):
2
- pass
File without changes
@@ -1,51 +0,0 @@
1
- {
2
- "mission_definition": {
3
- "tasks": [
4
- {
5
- "pose": {
6
- "position": {
7
- "x": -3.2629,
8
- "y": 3.0795,
9
- "z": 0.0055,
10
- "frame_name": "robot"
11
- },
12
- "orientation": {
13
- "x": 0,
14
- "y": 0,
15
- "z": 0,
16
- "w": 1,
17
- "frame_name": "robot"
18
- },
19
- "frame_name": "robot"
20
- },
21
- "tag": "equinor_exR_tag_simulator",
22
- "inspections": [
23
- {
24
- "type": "Image",
25
- "inspection_target": {
26
- "x": 6.6550,
27
- "y": 3.7987,
28
- "z": 0.6145,
29
- "frame_name": "robot"
30
- },
31
- "analysis_types": "CarSeal, Rust",
32
- "metadata": {
33
- "zoom": "2x"
34
- }
35
- },
36
- {
37
- "type": "ThermalVideo",
38
- "inspection_target": {
39
- "x": 6.6550,
40
- "y": 3.7987,
41
- "z": 0.6145,
42
- "frame_name": "robot"
43
- },
44
- "analysis_types": "GasDetection",
45
- "duration": 10
46
- }
47
- ]
48
- }
49
- ]
50
- }
51
- }
@@ -1,91 +0,0 @@
1
- {
2
- "mission_definition": {
3
- "tasks": [
4
- {
5
- "pose": {
6
- "position": {
7
- "x": 0,
8
- "y": 0,
9
- "z": 0,
10
- "frame_name": "robot"
11
- },
12
- "orientation": {
13
- "x": 0,
14
- "y": 0,
15
- "z": 0,
16
- "w": 1,
17
- "frame_name": "robot"
18
- },
19
- "frame_name": "robot"
20
- },
21
- "tag": "1-A",
22
- "inspections": [
23
- {
24
- "type": "Image",
25
- "inspection_target": {
26
- "x": 0,
27
- "y": 0,
28
- "z": 0,
29
- "frame_name": "robot"
30
- },
31
- "analysis_types": "CarSeal, Rust",
32
- "metadata": {
33
- "zoom": "2x"
34
- }
35
- },
36
- {
37
- "type": "ThermalVideo",
38
- "inspection_target": {
39
- "x": 0,
40
- "y": 0,
41
- "z": 0,
42
- "frame_name": "robot"
43
- },
44
- "analysis_types": "GasDetection"
45
- ,
46
- "duration": 10
47
- }
48
- ]
49
- },
50
- {
51
- "pose": {
52
- "position": {
53
- "x": 1,
54
- "y": 1,
55
- "z": 1,
56
- "frame_name": "robot"
57
- },
58
- "orientation": {
59
- "x": 0,
60
- "y": 0,
61
- "z": 0,
62
- "w": 1,
63
- "frame_name": "robot"
64
- },
65
- "frame_name": "robot"
66
- },
67
- "inspections": [
68
- {
69
- "type": "ThermalImage",
70
- "inspection_target": {
71
- "x": 0,
72
- "y": 0,
73
- "z": 0,
74
- "frame_name": "robot"
75
- },
76
- "analysis_types": "ColdSpot,HotSpot"
77
- },
78
- {
79
- "type": "Video",
80
- "inspection_target": {
81
- "x": 0,
82
- "y": 0,
83
- "z": 0,
84
- "frame_name": "robot"
85
- }
86
- }
87
- ]
88
- }
89
- ]
90
- }
91
- }
@@ -1,124 +0,0 @@
1
- {
2
- "mission_definition": {
3
- "tasks": [
4
- {
5
- "pose": {
6
- "position": {
7
- "x": -3.6,
8
- "y": 4,
9
- "z": 0,
10
- "frame": "asset"
11
- },
12
- "orientation": {
13
- "x": 0,
14
- "y": 0,
15
- "z": -0.7286672256879113,
16
- "w": -0.6848660759820616,
17
- "frame": "asset"
18
- },
19
- "frame_name": "asset"
20
- },
21
- "tag": "1-A",
22
- "inspections": [
23
- {
24
- "type": "Image",
25
- "inspection_target": {
26
- "x": -4.7,
27
- "y": 4.9,
28
- "z": 0,
29
- "frame": "robot"
30
- },
31
- "analysis_types": "CarSeal, Rust"
32
- ,
33
- "metadata": {
34
- "zoom": "2x"
35
- }
36
- },
37
- {
38
- "type": "ThermalImage",
39
- "inspection_target": {
40
- "x": -4.7,
41
- "y": 4.9,
42
- "z": 0,
43
- "frame": "robot"
44
- },
45
- "analysis_types": "GasDetection"
46
- }
47
- ]
48
- },
49
- {
50
- "pose": {
51
- "position": {
52
- "x": 4.7,
53
- "y": 3,
54
- "z": 0,
55
- "frame": "asset"
56
- },
57
- "orientation": {
58
- "x": 0,
59
- "y": 0,
60
- "z": 0.5769585,
61
- "w": 0.8167734,
62
- "frame": "asset"
63
- },
64
- "frame_name": "asset"
65
- },
66
- "tag": "2-B",
67
- "inspections": [
68
- {
69
- "type": "Image",
70
- "inspection_target": {
71
- "x": 5.6,
72
- "y": 5.2,
73
- "z": 0,
74
- "frame": "robot"
75
- },
76
- "analysis_types": "ColdSpot, HotSpot"
77
-
78
- }
79
- ]
80
- },
81
- {
82
- "pose": {
83
- "position": {
84
- "x": 0.95,
85
- "y": 2.6,
86
- "z": 0,
87
- "frame": "asset"
88
- },
89
- "orientation": {
90
- "x": 0,
91
- "y": 0,
92
- "z": -0.6992469,
93
- "w": 0.7148802,
94
- "frame": "asset"
95
- },
96
- "frame_name": "asset"
97
- },
98
- "tag": "3-C",
99
- "inspections": [
100
- {
101
- "type": "Image",
102
- "inspection_target": {
103
- "x": 5.6,
104
- "y": 5.2,
105
- "z": 0,
106
- "frame": "robot"
107
- },
108
- "analysis_types": "ColdSpot, HotSpot"
109
- },
110
- {
111
- "type": "ThermalImage",
112
- "inspection_target": {
113
- "x": 1.9,
114
- "y": 1.9,
115
- "z": 0,
116
- "frame": "robot"
117
- },
118
- "analysis_types": "ColdSpot, HotSpot"
119
- }
120
- ]
121
- }
122
- ]
123
- }
124
- }
File without changes
@@ -1,92 +0,0 @@
1
- {
2
- "id": "1",
3
- "tasks": [
4
- {
5
- "steps": [
6
- {
7
- "type": "drive_to_pose",
8
- "pose": {
9
- "position": {
10
- "x": -2,
11
- "y": -2,
12
- "z": 0,
13
- "frame": "asset"
14
- },
15
- "orientation": {
16
- "x": 0,
17
- "y": 0,
18
- "z": 0.4794255,
19
- "w": 0.8775826,
20
- "frame": "asset"
21
- },
22
- "frame": "asset"
23
- }
24
- },
25
- {
26
- "type": "take_image",
27
- "target": {
28
- "x": 2,
29
- "y": 2,
30
- "z": 0,
31
- "frame": "robot"
32
- }
33
- }
34
- ]
35
- },
36
- {
37
- "steps": [
38
- {
39
- "type": "drive_to_pose",
40
- "pose": {
41
- "position": {
42
- "x": -2,
43
- "y": 2,
44
- "z": 0,
45
- "frame": "asset"
46
- },
47
- "orientation": {
48
- "x": 0,
49
- "y": 0,
50
- "z": 0.4794255,
51
- "w": 0.8775826,
52
- "frame": "asset"
53
- },
54
- "frame": "asset"
55
- }
56
- },
57
- {
58
- "type": "take_thermal_image",
59
- "target": {
60
- "x": 2,
61
- "y": 2,
62
- "z": 0,
63
- "frame": "robot"
64
- }
65
- }
66
- ]
67
- },
68
- {
69
- "steps": [
70
- {
71
- "type": "drive_to_pose",
72
- "pose": {
73
- "position": {
74
- "x": 2,
75
- "y": 2,
76
- "z": 0,
77
- "frame": "asset"
78
- },
79
- "orientation": {
80
- "x": 0,
81
- "y": 0,
82
- "z": 0.4794255,
83
- "w": 0.8775826,
84
- "frame": "asset"
85
- },
86
- "frame": "asset"
87
- }
88
- }
89
- ]
90
- }
91
- ]
92
- }