Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion dimos/msgs/sensor_msgs/CameraInfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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]
Expand Down
6 changes: 4 additions & 2 deletions dimos/msgs/sensor_msgs/PointCloud2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)


Expand Down Expand Up @@ -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:
Expand Down
26 changes: 25 additions & 1 deletion dimos/protocol/pubsub/jpeg_shm.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
22 changes: 0 additions & 22 deletions dimos/protocol/pubsub/lcmpubsub.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
5 changes: 0 additions & 5 deletions dimos/protocol/pubsub/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""

Expand Down