From 71e9bad908fd5980a51f9d43494aadabf9304f68 Mon Sep 17 00:00:00 2001 From: Ivan Nikolic Date: Sat, 10 Jan 2026 15:00:41 +0800 Subject: [PATCH] fix lcm load speed --- dimos/msgs/sensor_msgs/CameraInfo.py | 3 ++- dimos/msgs/sensor_msgs/PointCloud2.py | 6 ++++-- dimos/protocol/pubsub/jpeg_shm.py | 26 +++++++++++++++++++++++++- dimos/protocol/pubsub/lcmpubsub.py | 22 ---------------------- dimos/protocol/pubsub/spec.py | 5 ----- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/dimos/msgs/sensor_msgs/CameraInfo.py b/dimos/msgs/sensor_msgs/CameraInfo.py index b6f85dbaca..855276b4e6 100644 --- a/dimos/msgs/sensor_msgs/CameraInfo.py +++ b/dimos/msgs/sensor_msgs/CameraInfo.py @@ -20,7 +20,6 @@ from dimos_lcm.sensor_msgs import CameraInfo as LCMCameraInfo from dimos_lcm.std_msgs.Header import Header import numpy as np -import rerun as rr # Import ROS types try: @@ -405,6 +404,8 @@ def to_rerun(self, image_plane_distance: float = 0.5): # type: ignore[no-untype Returns: rr.Pinhole archetype for logging to Rerun """ + import rerun as rr + # Extract intrinsics from K matrix # K = [fx, 0, cx, 0, fy, cy, 0, 0, 1] fx, fy = self.K[0], self.K[4] diff --git a/dimos/msgs/sensor_msgs/PointCloud2.py b/dimos/msgs/sensor_msgs/PointCloud2.py index 1f048d5eaf..772ddad7ab 100644 --- a/dimos/msgs/sensor_msgs/PointCloud2.py +++ b/dimos/msgs/sensor_msgs/PointCloud2.py @@ -23,11 +23,9 @@ ) from dimos_lcm.sensor_msgs.PointField import PointField # type: ignore[import-untyped] from dimos_lcm.std_msgs.Header import Header # type: ignore[import-untyped] -import matplotlib.pyplot as plt import numpy as np import open3d as o3d # type: ignore[import-untyped] import open3d.core as o3c # type: ignore[import-untyped] -import rerun as rr from dimos.msgs.geometry_msgs import Transform, Vector3 @@ -55,6 +53,8 @@ @functools.lru_cache(maxsize=16) def _get_matplotlib_cmap(name: str): # type: ignore[no-untyped-def] """Get a matplotlib colormap by name (cached for performance).""" + import matplotlib.pyplot as plt + return plt.get_cmap(name) @@ -626,6 +626,8 @@ def to_rerun( # type: ignore[no-untyped-def] fill_mode: str = "solid", **kwargs, # type: ignore[no-untyped-def] ): # type: ignore[no-untyped-def] + import rerun as rr + """Convert to Rerun Points3D or Boxes3D archetype. Args: diff --git a/dimos/protocol/pubsub/jpeg_shm.py b/dimos/protocol/pubsub/jpeg_shm.py index c61848c57a..de6868390c 100644 --- a/dimos/protocol/pubsub/jpeg_shm.py +++ b/dimos/protocol/pubsub/jpeg_shm.py @@ -12,8 +12,32 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.protocol.pubsub.lcmpubsub import JpegSharedMemoryEncoderMixin +from typing import Any + +from turbojpeg import TurboJPEG # type: ignore[import-untyped] + +from dimos.msgs.sensor_msgs.Image import Image +from dimos.msgs.sensor_msgs.image_impls.AbstractImage import ImageFormat from dimos.protocol.pubsub.shmpubsub import SharedMemoryPubSubBase +from dimos.protocol.pubsub.spec import PubSubEncoderMixin + + +class JpegSharedMemoryEncoderMixin(PubSubEncoderMixin[str, Image]): + def __init__(self, quality: int = 75, **kwargs) -> None: # type: ignore[no-untyped-def] + super().__init__(**kwargs) + self.jpeg = TurboJPEG() + self.quality = quality + + def encode(self, msg: Any, _topic: str) -> bytes: + if not isinstance(msg, Image): + raise ValueError("Can only encode images.") + + bgr_image = msg.to_bgr().to_opencv() + return self.jpeg.encode(bgr_image, quality=self.quality) # type: ignore[no-any-return] + + def decode(self, msg: bytes, _topic: str) -> Image: + bgr_array = self.jpeg.decode(msg) + return Image(data=bgr_array, format=ImageFormat.BGR) class JpegSharedMemory(JpegSharedMemoryEncoderMixin, SharedMemoryPubSubBase): # type: ignore[misc] diff --git a/dimos/protocol/pubsub/lcmpubsub.py b/dimos/protocol/pubsub/lcmpubsub.py index 9207e7dfc0..e07d010895 100644 --- a/dimos/protocol/pubsub/lcmpubsub.py +++ b/dimos/protocol/pubsub/lcmpubsub.py @@ -17,10 +17,6 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable -from turbojpeg import TurboJPEG # type: ignore[import-untyped] - -from dimos.msgs.sensor_msgs import Image -from dimos.msgs.sensor_msgs.image_impls.AbstractImage import ImageFormat from dimos.protocol.pubsub.spec import PickleEncoderMixin, PubSub, PubSubEncoderMixin from dimos.protocol.service.lcmservice import LCMConfig, LCMService, autoconf from dimos.utils.logging_config import setup_logger @@ -123,24 +119,6 @@ def decode(self, msg: bytes, topic: Topic) -> LCMMsg: return topic.lcm_type.lcm_jpeg_decode(msg) # type: ignore[attr-defined, no-any-return] -class JpegSharedMemoryEncoderMixin(PubSubEncoderMixin[str, Image]): - def __init__(self, quality: int = 75, **kwargs) -> None: # type: ignore[no-untyped-def] - super().__init__(**kwargs) - self.jpeg = TurboJPEG() - self.quality = quality - - def encode(self, msg: Any, _topic: str) -> bytes: - if not isinstance(msg, Image): - raise ValueError("Can only encode images.") - - bgr_image = msg.to_bgr().to_opencv() - return self.jpeg.encode(bgr_image, quality=self.quality) # type: ignore[no-any-return] - - def decode(self, msg: bytes, _topic: str) -> Image: - bgr_array = self.jpeg.decode(msg) - return Image(data=bgr_array, format=ImageFormat.BGR) - - class LCM( LCMEncoderMixin, LCMPubSubBase, diff --git a/dimos/protocol/pubsub/spec.py b/dimos/protocol/pubsub/spec.py index 28fce3faee..a43061e492 100644 --- a/dimos/protocol/pubsub/spec.py +++ b/dimos/protocol/pubsub/spec.py @@ -20,15 +20,10 @@ import pickle from typing import Any, Generic, TypeVar -from dimos.utils.logging_config import setup_logger - MsgT = TypeVar("MsgT") TopicT = TypeVar("TopicT") -logger = setup_logger() - - class PubSub(Generic[TopicT, MsgT], ABC): """Abstract base class for pub/sub implementations with sugar methods."""