diff --git a/armarx_core/time/__init__.py b/armarx_core/time/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/armarx_core/time/date_time.py b/armarx_core/time/date_time.py new file mode 100644 index 0000000000000000000000000000000000000000..c3f633ed68ce78e0b28a515fd364f2e818357085 --- /dev/null +++ b/armarx_core/time/date_time.py @@ -0,0 +1,42 @@ +import socket +import time + +import armarx +from armarx.ice_conv.ice_converter import IceConverter +from armarx_core import slice_loader + +slice_loader.load_armarx_slice("ArmarXCore", "core/time.ice") +from armarx.core.time.dto import DateTime +from armarx.core.time.dto.ClockType import ClockTypeEnum + + +MIN_LONG_CPP = -9223372036854775808 +INVALID_TIME_USEC = MIN_LONG_CPP + +# TODO: Add DateTime type corresponding to C++ type. + +def time_usec() -> int: + return int(time.time() * 1e6) + + +class DateTimeIceConverter(IceConverter): + @classmethod + def _import_dto(cls): + return DateTime + + def _from_ice(self, dto: DateTime) -> int: + return dto.timeSinceEpoch.microSeconds + + def _to_ice(self, bo: int) -> DateTime: + dto = DateTime() + dto.timeSinceEpoch.microSeconds = bo + dto.clockType = ClockTypeEnum.Monotonic + dto.hostname = socket.gethostname() + return dto + + +if __name__ == "__main__": + c = DateTimeIceConverter() + bo = time_usec() + dto = c.to_ice(bo) + bo2 = c.from_ice(dto) diff --git a/armarx_memory/aron/aron_dataclass.py b/armarx_memory/aron/aron_dataclass.py index ee0ac5127edb3e2e7ea303e91f9eb1a86e409009..c370c2abfeb6ab2581eb9313517d56f058028076 100644 --- a/armarx_memory/aron/aron_dataclass.py +++ b/armarx_memory/aron/aron_dataclass.py @@ -1,9 +1,14 @@ import dataclasses as dc import typing as ty +from armarx_memory.aron.conversion.options import ConversionOptions + @dc.dataclass class AronDataclass: + # Make ConversionOptions available to subclasses via cls.ConversionOptions. + ConversionOptions = ConversionOptions + def to_dict(self) -> ty.Dict[str, ty.Any]: from armarx_memory.aron.conversion.dataclass_from_to_pythonic import ( dataclass_to_dict, diff --git a/armarx_memory/client/detail/SpecialClientBase.py b/armarx_memory/client/detail/SpecialClientBase.py index 3e1c58d531a2aa37abbf809b1d901bd34ca1dd31..68ab5aee90c718878c3007d5fd77f3c433ecd228 100644 --- a/armarx_memory/client/detail/SpecialClientBase.py +++ b/armarx_memory/client/detail/SpecialClientBase.py @@ -79,7 +79,7 @@ class SpecialWriterBase(SpecialClientBase): if data is None: aron_class = self._get_aron_class() - data = [aron_class(**data_kwargs).to_aron()] + data = [aron_class(**data_kwargs).to_aron_ice()] if not isinstance(data, list): data = [data] for i in range(len(data)): diff --git a/armarx_memory/core/MemoryID.py b/armarx_memory/core/MemoryID.py index c1173ba98b40edf1dea7d91033ae07fe1dd9654c..7414c8a81c3d3bd40c1e21e6ca2f059b0e029aa7 100644 --- a/armarx_memory/core/MemoryID.py +++ b/armarx_memory/core/MemoryID.py @@ -7,6 +7,7 @@ from armarx_core import slice_loader slice_loader.load_armarx_slice("RobotAPI", "armem/memory.ice") from armarx import armem +from armarx_core.time import date_time from armarx_memory.ice_conv import ice_twin from armarx_memory.core.time import DateTimeIceConverter @@ -20,7 +21,7 @@ class MemoryID(ice_twin.IceTwin): core_segment_name: str = "", provider_segment_name: str = "", entity_name: str = "", - timestamp_usec: int = -1, + timestamp_usec: int = date_time.INVALID_TIME_USEC, instance_index: int = -1, ): self.memory_name = memory_name @@ -234,7 +235,7 @@ class MemoryID(ice_twin.IceTwin): self.core_segment_name = data["coreSegmentName"] self.provider_segment_name = data["providerSegmentName"] self.entity_name = data["entityName"] - self.timestamp_usec = int(data["timestamp"]) + self.timestamp_usec = int(data["timestamp"]["timeSinceEpoch"]["microSeconds"]) self.instance_index = data["instanceIndex"] return self diff --git a/armarx_memory/core/time.py b/armarx_memory/core/time.py index 47ee1cc4dff104015d827e8b7506215f7ff1e711..c162ef851558f5a987ec20a33c62f024f0e6594f 100644 --- a/armarx_memory/core/time.py +++ b/armarx_memory/core/time.py @@ -1,37 +1,2 @@ -import socket -import time - -import armarx -from armarx.ice_conv.ice_converter import IceConverter -from armarx_core import slice_loader - -slice_loader.load_armarx_slice("ArmarXCore", "core/time.ice") -from armarx.core.time.dto import DateTime -from armarx.core.time.dto.ClockType import ClockTypeEnum - - -def time_usec() -> int: - return int(time.time() * 1e6) - - -class DateTimeIceConverter(IceConverter): - @classmethod - def _import_dto(cls): - return DateTime - - def _from_ice(self, dto: DateTime) -> int: - return dto.timeSinceEpoch.microSeconds - - def _to_ice(self, bo: int) -> DateTime: - dto = DateTime() - dto.timeSinceEpoch.microSeconds = bo - dto.clockType = ClockTypeEnum.Monotonic - dto.hostname = socket.gethostname() - return dto - - -if __name__ == "__main__": - c = DateTimeIceConverter() - bo = time_usec() - dto = c.to_ice(bo) - bo2 = c.from_ice(dto) +# Legacy imports +from armarx_core.time.date_time import INVALID_TIME_USEC, DateTimeIceConverter, time_usec diff --git a/armarx_memory/ice_conv/RobotAPI/ObjectPose.py b/armarx_memory/ice_conv/RobotAPI/ObjectPose.py index cda7cc1653d2676eed3bf61219be66c7490b58e7..2684d02af74be1ab7aee4470243b13906d89c00a 100644 --- a/armarx_memory/ice_conv/RobotAPI/ObjectPose.py +++ b/armarx_memory/ice_conv/RobotAPI/ObjectPose.py @@ -4,11 +4,17 @@ from typing import Dict, Optional from armarx_core import slice_loader +from armarx_core.time import date_time from armarx_memory.ice_conv.ice_twin import IceTwin from armarx_memory.ice_conv.RobotAPI.Box import Box from armarx_memory.ice_conv.RobotAPI.ObjectID import ObjectID from armarx_memory.ice_conv.RobotAPI.PoseBase import PoseBaseConv +slice_loader.load_armarx_slice("RobotAPI", "objectpose/object_pose_types.ice") + + +date_time_conv = date_time.DateTimeIceConverter() + class ObjectPose(IceTwin): """ @@ -28,6 +34,7 @@ class ObjectPose(IceTwin): object_pose_original_frame: str = "", robot_pose=None, local_oobb: Optional[Box] = None, + timestamp_usec: Optional[int] = None, ): self.provider_name = provider_name self.object_id = ObjectID() if object_id is None else object_id @@ -53,7 +60,7 @@ class ObjectPose(IceTwin): # attachment self.confidence: float = 0.0 - self.timestamp_usec: int = -1 + self.timestamp_usec: int = timestamp_usec if timestamp_usec is not None else date_time.INVALID_TIME_USEC self.local_oobb = local_oobb @@ -64,7 +71,6 @@ class ObjectPose(IceTwin): def viz_oobb_robot(self, id: str, size_factor=1.0, **kwargs) -> "armarx.arviz.Box": import armarx.arviz as viz - return viz.Box( id, pose=self.object_pose_robot @ self.local_oobb.pose, @@ -74,14 +80,12 @@ class ObjectPose(IceTwin): @classmethod def _get_ice_cls(cls): - slice_loader.load_armarx_slice("RobotAPI", "objectpose/object_pose_types.ice") from armarx.objpose.data import ObjectPose - return ObjectPose def _set_from_ice(self, dto: "armarx.objpose.data.ObjectPose"): self.provider_name = dto.providerName - self.object_id = ObjectID(dto.objectID) + self.object_id = self.object_id.from_ice(dto.objectID) self.object_pose_robot = self._pose_conv.from_ice(dto.objectPoseRobot) self.object_pose_global = self._pose_conv.from_ice(dto.objectPoseGlobal) self.object_pose_original = self._pose_conv.from_ice(dto.objectPoseOriginal) @@ -93,7 +97,8 @@ class ObjectPose(IceTwin): self.robot_pose = self._pose_conv.from_ice(dto.robotPose) self.confidence = dto.confidence - self.timestamp_usec = dto.timestamp.timeSinceEpoch.microSeconds + + self.timestamp_usec = date_time_conv.from_ice(dto.timestamp) if all( [dto.localOOBB.position, dto.localOOBB.orientation, dto.localOOBB.extents] @@ -116,7 +121,7 @@ class ObjectPose(IceTwin): dto.robotPose = self._pose_conv.to_ice(self.robot_pose) dto.confidence = self.confidence - dto.timestamp.timeSinceEpoch.microSeconds = self.timestamp_usec + dto.timestamp = date_time_conv.to_ice(self.timestamp_usec) if dto.localOOBB is not None and all( [dto.localOOBB.position, dto.localOOBB.orientation, dto.localOOBB.extents]