From 3c5b07e63472367cb513d5bf7b89d967573f51a5 Mon Sep 17 00:00:00 2001 From: Torstein Lundervold Nesheim Date: Fri, 17 Mar 2023 14:37:08 +0100 Subject: [PATCH] Add RecordAudio inspection step --- .../apis/models/start_mission_definition.py | 4 +++ .../models/inspection/__init__.py | 1 + .../models/inspection/inspection.py | 14 ++++++++++ src/robot_interface/models/mission/step.py | 28 +++++++++++++++++-- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/isar/apis/models/start_mission_definition.py b/src/isar/apis/models/start_mission_definition.py index de5e9c5d..3959c5b3 100644 --- a/src/isar/apis/models/start_mission_definition.py +++ b/src/isar/apis/models/start_mission_definition.py @@ -10,6 +10,7 @@ from robot_interface.models.mission.step import ( STEPS, DriveToPose, + RecordAudio, TakeImage, TakeThermalImage, TakeThermalVideo, @@ -22,6 +23,7 @@ class InspectionTypes(str, Enum): thermal_image = "ThermalImage" video = "Video" thermal_video = "ThermalVideo" + audio = "Audio" class StartMissionInspectionDefinition(BaseModel): @@ -119,6 +121,8 @@ def create_inspection_step( inspection_step = TakeThermalImage(target=target) elif inspection_type == InspectionTypes.thermal_video.value: inspection_step = TakeThermalVideo(target=target, duration=duration) + elif inspection_type == InspectionTypes.audio.value: + inspection_step = RecordAudio(target=target, duration=duration) else: raise ValueError(f"Inspection type '{inspection_type}' not supported") diff --git a/src/robot_interface/models/inspection/__init__.py b/src/robot_interface/models/inspection/__init__.py index 67b8c45f..3bcb7748 100644 --- a/src/robot_interface/models/inspection/__init__.py +++ b/src/robot_interface/models/inspection/__init__.py @@ -1,4 +1,5 @@ from .inspection import ( + Audio, Image, ImageMetadata, Inspection, diff --git a/src/robot_interface/models/inspection/inspection.py b/src/robot_interface/models/inspection/inspection.py index 59053e4f..46f9908f 100644 --- a/src/robot_interface/models/inspection/inspection.py +++ b/src/robot_interface/models/inspection/inspection.py @@ -38,6 +38,11 @@ class ThermalVideoMetadata(InspectionMetadata): duration: Optional[float] = field(default=None) +@dataclass +class AudioMetadata(InspectionMetadata): + duration: Optional[float] = field(default=None) + + @dataclass class Inspection: id: str = field(default_factory=uuid4_string, init=False) @@ -83,3 +88,12 @@ class ThermalVideo(Inspection): @staticmethod def get_metadata_type() -> Type[InspectionMetadata]: return ThermalVideoMetadata + + +@dataclass +class Audio(Inspection): + metadata: AudioMetadata + + @staticmethod + def get_metadata_type() -> Type[InspectionMetadata]: + return AudioMetadata diff --git a/src/robot_interface/models/mission/step.py b/src/robot_interface/models/mission/step.py index 1dda9647..36a3b2af 100644 --- a/src/robot_interface/models/mission/step.py +++ b/src/robot_interface/models/mission/step.py @@ -4,8 +4,14 @@ from alitra import Pose, Position from isar.services.utilities.uuid_string_factory import uuid4_string -from robot_interface.models.inspection import Image, ThermalImage, ThermalVideo, Video -from robot_interface.models.inspection.inspection import Inspection +from robot_interface.models.inspection import ( + Audio, + Image, + Inspection, + ThermalImage, + ThermalVideo, + Video, +) from robot_interface.models.mission.status import StepStatus @@ -166,6 +172,23 @@ def get_inspection_type() -> Type[Inspection]: return ThermalVideo +@dataclass +class RecordAudio(InspectionStep): + """ + Step which causes the robot to record a video at its position, facing the target. + + Duration of audio is given in seconds. + """ + + target: Position + duration: float + type: Literal["record_audio"] = "record_audio" + + @staticmethod + def get_inspection_type() -> Type[Inspection]: + return Audio + + STEPS = Union[ DriveToPose, DockingProcedure, @@ -173,4 +196,5 @@ def get_inspection_type() -> Type[Inspection]: TakeThermalImage, TakeVideo, TakeThermalVideo, + RecordAudio, ]