From 61160adbc864ef17b9e8cf4e4b5eac53089fb878 Mon Sep 17 00:00:00 2001 From: Ole Drange Date: Wed, 8 Feb 2023 13:27:25 +0100 Subject: [PATCH] Change name robot_id to isar_id and robot_name Add isar_id and robot_name --- main.py | 4 +++- src/isar/apis/models/models.py | 3 ++- src/isar/apis/schedule/scheduling_controller.py | 3 ++- src/isar/config/settings.env | 1 - src/isar/config/settings.py | 9 ++++++--- src/isar/models/mission/mission.py | 4 ++-- src/isar/models/mission_metadata/mission_metadata.py | 3 ++- src/isar/modules.py | 3 ++- .../service_connections/mqtt/robot_info_publisher.py | 3 ++- .../mqtt/robot_status_publisher.py | 3 ++- src/isar/state_machine/state_machine.py | 12 ++++++++---- src/isar/storage/slimm_storage.py | 4 ++-- src/isar/storage/utilities.py | 3 ++- src/robot_interface/robot_interface.py | 6 ++++-- src/robot_interface/telemetry/mqtt_client.py | 6 ++++-- src/robot_interface/telemetry/payloads.py | 8 ++++++-- tests/mocks/robot_interface.py | 4 +++- 17 files changed, 52 insertions(+), 27 deletions(-) diff --git a/main.py b/main.py index f3ea8fb3..caae4257 100644 --- a/main.py +++ b/main.py @@ -82,7 +82,9 @@ threads.append(robot_info_thread) publishers: List[Thread] = robot.get_telemetry_publishers( - queue=queues.mqtt_queue, robot_id=settings.ROBOT_ID + queue=queues.mqtt_queue, + robot_name=settings.ROBOT_NAME, + isar_id=settings.ISAR_ID, ) if publishers: threads.extend(publishers) diff --git a/src/isar/apis/models/models.py b/src/isar/apis/models/models.py index 807c4e85..daf8e625 100644 --- a/src/isar/apis/models/models.py +++ b/src/isar/apis/models/models.py @@ -31,7 +31,8 @@ class ControlMissionResponse(BaseModel): class RobotInfoResponse(BaseModel): robot_package: str - robot_id: str + isar_id: str + robot_name: str robot_capabilities: List[str] robot_map_name: str plant_short_name: str diff --git a/src/isar/apis/schedule/scheduling_controller.py b/src/isar/apis/schedule/scheduling_controller.py index 315a432a..fe8111f1 100644 --- a/src/isar/apis/schedule/scheduling_controller.py +++ b/src/isar/apis/schedule/scheduling_controller.py @@ -222,7 +222,8 @@ def drive_to( def get_info(self): return RobotInfoResponse( robot_package=settings.ROBOT_PACKAGE, - robot_id=settings.ROBOT_ID, + isar_id=settings.ISAR_ID, + robot_name=settings.ROBOT_NAME, robot_map_name=settings.DEFAULT_MAP, robot_capabilities=robot_settings.CAPABILITIES, plant_short_name=settings.STID_PLANT_NAME, diff --git a/src/isar/config/settings.env b/src/isar/config/settings.env index ff7c916c..5daff129 100644 --- a/src/isar/config/settings.env +++ b/src/isar/config/settings.env @@ -14,7 +14,6 @@ ISAR_MQTT_SSL_ENABLED = true ISAR_AUTHENTICATION_ENABLED = false -ISAR_ROBOT_ID = R2-D2 ISAR_PLANT_SHORT_NAME = KAA ISAR_STID_PLANT_NAME = KAA diff --git a/src/isar/config/settings.py b/src/isar/config/settings.py index 7f74ee30..a8413fca 100644 --- a/src/isar/config/settings.py +++ b/src/isar/config/settings.py @@ -188,8 +188,11 @@ class Settings(BaseSettings): # Type of robot ISAR is monitoring ROBOT_TYPE: str = Field(default="robot") - # Name or unique ID of robot - ROBOT_ID: str = Field(default="R2-D2") + # Name of robot + ROBOT_NAME: str = Field(default="Placebot") + + # Unique identifier for this ISAR instance. Note that this should be a generated UUID. + ISAR_ID: str = Field(default="00000000-0000-0000-0000-000000000000") # Serial number of the robot ISAR is connected to SERIAL_NUMBER: str = Field(default="0001") @@ -292,7 +295,7 @@ def set_log_levels(cls, v, values) -> dict: always=True, ) def prefix_isar_topics(cls, v, values): - return f"isar/{values['ROBOT_ID']}/{v}" + return f"isar/{values['ISAR_ID']}/{v}" class Config: with pkg_resources.path("isar.config", "settings.env") as path: diff --git a/src/isar/models/mission/mission.py b/src/isar/models/mission/mission.py index beff6575..8d8eb41d 100644 --- a/src/isar/models/mission/mission.py +++ b/src/isar/models/mission/mission.py @@ -124,10 +124,10 @@ def set_unique_id_and_metadata(self) -> None: def _set_unique_id(self) -> None: plant_short_name: str = settings.PLANT_SHORT_NAME - robot_id: str = settings.ROBOT_ID + robot_name: str = settings.ROBOT_NAME now: datetime = datetime.utcnow() self.id = ( - f"{plant_short_name.upper()}{robot_id.upper()}" + f"{plant_short_name.upper()}{robot_name.upper()}" f"{now.strftime('%d%m%Y%H%M%S%f')[:-3]}" ) diff --git a/src/isar/models/mission_metadata/mission_metadata.py b/src/isar/models/mission_metadata/mission_metadata.py index 5f59f092..75f57f94 100644 --- a/src/isar/models/mission_metadata/mission_metadata.py +++ b/src/isar/models/mission_metadata/mission_metadata.py @@ -20,6 +20,7 @@ class MissionMetadata: media_orientation_reference_system: str = ( settings.MEDIA_ORIENTATION_REFERENCE_SYSTEM ) - robot_id: str = settings.ROBOT_ID + isar_id: str = settings.ISAR_ID + robot_name: str = settings.ROBOT_NAME robot_model: str = settings.ROBOT_TYPE mission_date: date = datetime.utcnow().date() diff --git a/src/isar/modules.py b/src/isar/modules.py index 2522fac3..fbcd3539 100644 --- a/src/isar/modules.py +++ b/src/isar/modules.py @@ -184,7 +184,8 @@ def provide_task_selector(self) -> TaskSelectorInterface: "queues": (QueuesModule, "required"), "request_handler": (RequestHandlerModule, "required"), "robot_package": (RobotModule, settings.ROBOT_PACKAGE), - "robot_id": (RobotModule, settings.ROBOT_ID), + "isar_id": (RobotModule, settings.ISAR_ID), + "robot_name": (RobotModule, settings.ROBOT_NAME), "mission_planner": ( { "default": LocalPlannerModule, diff --git a/src/isar/services/service_connections/mqtt/robot_info_publisher.py b/src/isar/services/service_connections/mqtt/robot_info_publisher.py index 345e0173..18fa2ba6 100644 --- a/src/isar/services/service_connections/mqtt/robot_info_publisher.py +++ b/src/isar/services/service_connections/mqtt/robot_info_publisher.py @@ -16,7 +16,8 @@ def __init__(self, mqtt_queue: Queue): def run(self) -> None: while True: payload: RobotInfoPayload = RobotInfoPayload( - robot_name=settings.ROBOT_ID, + isar_id=settings.ISAR_ID, + robot_name=settings.ROBOT_NAME, robot_model=robot_settings.ROBOT_MODEL, # type: ignore robot_serial_number=settings.SERIAL_NUMBER, video_streams=settings.VIDEO_STREAMS, diff --git a/src/isar/services/service_connections/mqtt/robot_status_publisher.py b/src/isar/services/service_connections/mqtt/robot_status_publisher.py index f6133fcf..d4612c2c 100644 --- a/src/isar/services/service_connections/mqtt/robot_status_publisher.py +++ b/src/isar/services/service_connections/mqtt/robot_status_publisher.py @@ -52,7 +52,8 @@ def run(self) -> None: ) payload: RobotStatusPayload = RobotStatusPayload( - robot_name=settings.ROBOT_ID, + isar_id=settings.ISAR_ID, + robot_name=settings.ROBOT_NAME, robot_status=combined_status, current_isar_state=self.state_machine.current_state, current_mission_id=self.state_machine.current_mission.id diff --git a/src/isar/state_machine/state_machine.py b/src/isar/state_machine/state_machine.py index 056f400b..de2195fa 100644 --- a/src/isar/state_machine/state_machine.py +++ b/src/isar/state_machine/state_machine.py @@ -436,7 +436,8 @@ def publish_mission_status(self) -> None: return payload: str = json.dumps( { - "robot_id": settings.ROBOT_ID, + "isar_id": settings.ISAR_ID, + "robot_name": settings.ROBOT_NAME, "mission_id": self.current_mission.id if self.current_mission else None, "status": self.current_mission.status if self.current_mission else None, "timestamp": datetime.utcnow(), @@ -456,7 +457,8 @@ def publish_task_status(self) -> None: return payload: str = json.dumps( { - "robot_id": settings.ROBOT_ID, + "isar_id": settings.ISAR_ID, + "robot_name": settings.ROBOT_NAME, "mission_id": self.current_mission.id if self.current_mission else None, "task_id": self.current_task.id if self.current_task else None, "status": self.current_task.status if self.current_task else None, @@ -477,7 +479,8 @@ def publish_step_status(self) -> None: return payload: str = json.dumps( { - "robot_id": settings.ROBOT_ID, + "isar_id": settings.ISAR_ID, + "robot_name": settings.ROBOT_NAME, "mission_id": self.current_mission.id if self.current_mission else None, "task_id": self.current_task.id if self.current_task else None, "step_id": self.current_step.id if self.current_step else None, @@ -501,7 +504,8 @@ def publish_state(self) -> None: return payload: str = json.dumps( { - "robot_id": settings.ROBOT_ID, + "isar_id": settings.ISAR_ID, + "robot_name": settings.ROBOT_NAME, "state": self.current_state, "timestamp": datetime.utcnow(), }, diff --git a/src/isar/storage/slimm_storage.py b/src/isar/storage/slimm_storage.py index 65fab491..4a9544d9 100644 --- a/src/isar/storage/slimm_storage.py +++ b/src/isar/storage/slimm_storage.py @@ -109,7 +109,7 @@ def _construct_multiform_request_image( "Geodetic.CoordinateReferenceSystemCode": metadata.coordinate_reference_system, # noqa: E501 "Geodetic.VerticalCoordinateReferenceSystemCode": metadata.vertical_reference_system, # noqa: E501 "Geodetic.OrientationReferenceSystem": metadata.media_orientation_reference_system, # noqa: E501 - "SensorCarrier.SensorCarrierId": metadata.robot_id, + "SensorCarrier.SensorCarrierId": metadata.isar_id, "SensorCarrier.ModelName": metadata.robot_model, "Mission.MissionId": metadata.mission_id, "Mission.Client": "Equinor", @@ -150,7 +150,7 @@ def _construct_multiform_request_video( "Geodetic.CoordinateReferenceSystemCode": metadata.coordinate_reference_system, # noqa: E501 "Geodetic.VerticalCoordinateReferenceSystemCode": metadata.vertical_reference_system, # noqa: E501 "Geodetic.OrientationReferenceSystem": metadata.media_orientation_reference_system, # noqa: E501 - "SensorCarrier.SensorCarrierId": metadata.robot_id, + "SensorCarrier.SensorCarrierId": metadata.isar_id, "SensorCarrier.ModelName": metadata.robot_model, "Mission.MissionId": metadata.mission_id, "Mission.Client": "Equinor", diff --git a/src/isar/storage/utilities.py b/src/isar/storage/utilities.py index 24d24f84..b4a17a87 100644 --- a/src/isar/storage/utilities.py +++ b/src/isar/storage/utilities.py @@ -43,7 +43,8 @@ def construct_metadata_file( "mission_id": metadata.mission_id, "plant_name": metadata.plant_name, "mission_date": metadata.mission_date, - "robot_id": metadata.robot_id, + "isar_id": metadata.isar_id, + "robot_name": metadata.robot_name, }, "data": [ { diff --git a/src/robot_interface/robot_interface.py b/src/robot_interface/robot_interface.py index 13a46186..87e206d0 100644 --- a/src/robot_interface/robot_interface.py +++ b/src/robot_interface/robot_interface.py @@ -118,13 +118,15 @@ def initialize(self, params: InitializeParams) -> None: raise NotImplementedError @abstractmethod - def get_telemetry_publishers(self, queue: Queue, robot_id: str) -> List[Thread]: + def get_telemetry_publishers( + self, queue: Queue, isar_id: str, robot_name: str + ) -> List[Thread]: """ Set up telemetry publisher threads to publish regular updates for pose, battery level etc. from the robot to the MQTT broker. The publishers on the robot side will use the queue to pass messages to the MQTT Client on the ISAR side. - The robot_id is passed to the robot to ensure the messages are published to the + The isar_id is passed to the robot to ensure the messages are published to the correct topics. Note that this functionality will only be utilized if MQTT is enabled in the diff --git a/src/robot_interface/telemetry/mqtt_client.py b/src/robot_interface/telemetry/mqtt_client.py index ab1e7aa7..a6416105 100644 --- a/src/robot_interface/telemetry/mqtt_client.py +++ b/src/robot_interface/telemetry/mqtt_client.py @@ -60,10 +60,12 @@ def __init__( self.qos: int = qos self.retain: bool = retain - def run(self, robot_id: str) -> None: + def run(self, isar_id: str, robot_name: str) -> None: while True: try: - payload: str = self.telemetry_method(robot_id) + payload: str = self.telemetry_method( + isar_id=isar_id, robot_name=robot_name + ) except RobotInvalidTelemetryException: continue diff --git a/src/robot_interface/telemetry/payloads.py b/src/robot_interface/telemetry/payloads.py index f8dde6f3..2a960835 100644 --- a/src/robot_interface/telemetry/payloads.py +++ b/src/robot_interface/telemetry/payloads.py @@ -11,14 +11,16 @@ @dataclass class TelemetryPosePayload: pose: Pose - robot_id: str + isar_id: str + robot_name: str timestamp: datetime @dataclass class TelemetryBatteryPayload: battery_level: float - robot_id: str + isar_id: str + robot_name: str timestamp: datetime @@ -31,6 +33,7 @@ class VideoStream: @dataclass class RobotStatusPayload: + isar_id: str robot_name: str robot_status: RobotStatus current_isar_state: State @@ -42,6 +45,7 @@ class RobotStatusPayload: @dataclass class RobotInfoPayload: + isar_id: str robot_name: str robot_model: str robot_serial_number: str diff --git a/tests/mocks/robot_interface.py b/tests/mocks/robot_interface.py index 13943620..d02354d8 100644 --- a/tests/mocks/robot_interface.py +++ b/tests/mocks/robot_interface.py @@ -52,7 +52,9 @@ def get_inspections(self, step: InspectionStep) -> Sequence[Inspection]: def initialize(self, params: InitializeParams) -> None: return - def get_telemetry_publishers(self, queue: Queue, robot_id: str) -> List[Thread]: + def get_telemetry_publishers( + self, queue: Queue, isar_id: str, robot_name: str + ) -> List[Thread]: return [] def robot_status(self) -> RobotStatus: